From 49b70bf799a405e0c0a6d5a3309eba18b6977de8 Mon Sep 17 00:00:00 2001 From: Jits Date: Tue, 6 Feb 2024 13:27:47 +0000 Subject: [PATCH] Initial test suites and CI --- .github/workflows/ci.yml | 78 + app/package.json | 38 +- app/pnpm-lock.yaml | 500 ++--- app/src/app/app.component.spec.ts | 30 +- app/src/app/loader-shell.component.spec.ts | 25 +- app/src/app/login/data/login.service.spec.ts | 14 +- .../feature/login-flow.component.spec.ts | 30 +- .../login/feature/login-flow.store.spec.ts | 17 + .../feature/login-page.component.spec.ts | 20 +- .../app/login/ui/login-form.component.spec.ts | 45 +- .../app/shared/auth/data/auth.service.spec.ts | 15 +- .../app/shared/auth/data/auth.store.spec.ts | 17 +- .../shared/auth/data/logout.service.spec.ts | 14 +- .../app/shared/auth/util/auth.guard.spec.ts | 14 +- app/src/app/shared/firebase/firestore.ts | 4 +- app/src/app/shared/firebase/functions.ts | 4 +- app/src/app/shared/firebase/rtdb.ts | 4 +- app/src/app/shared/firebase/storage.ts | 4 +- app/src/app/shared/runtime.service.spec.ts | 20 +- .../feature/about-page.component.spec.ts | 26 +- .../feature/home-page.component.spec.ts | 28 +- .../website/ui/auth-status.component.spec.ts | 44 +- .../website/website-shell.component.spec.ts | 27 +- app/src/testing/helpers.ts | 22 + firebase/.eslintrc.js | 7 +- firebase/.gitignore | 1 + firebase/database.rules.json | 2 +- firebase/package.json | 12 +- firebase/pnpm-lock.yaml | 1613 ++++++++++++++++- .../test/firestore/firestore-rules.spec.ts | 73 + firebase/test/helpers/constants.ts | 4 + firebase/test/helpers/firestore.ts | 17 + firebase/test/helpers/rtdb.ts | 17 + firebase/test/helpers/storage.ts | 14 + firebase/test/rtdb/rtdb-rules.spec.ts | 73 + firebase/test/storage/storage-rules.spec.ts | 57 + firebase/tsconfig.dev.json | 3 +- firebase/tsconfig.json | 5 +- firebase/tsconfig.spec.json | 4 + firebase/vite.config.ts | 11 + project.code-workspace | 3 + 41 files changed, 2424 insertions(+), 532 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 app/src/app/login/feature/login-flow.store.spec.ts create mode 100644 app/src/testing/helpers.ts create mode 100644 firebase/test/firestore/firestore-rules.spec.ts create mode 100644 firebase/test/helpers/constants.ts create mode 100644 firebase/test/helpers/firestore.ts create mode 100644 firebase/test/helpers/rtdb.ts create mode 100644 firebase/test/helpers/storage.ts create mode 100644 firebase/test/rtdb/rtdb-rules.spec.ts create mode 100644 firebase/test/storage/storage-rules.spec.ts create mode 100644 firebase/tsconfig.spec.json create mode 100644 firebase/vite.config.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..bcea35e --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,78 @@ +name: CI pipeline + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + build-and-test-all: + name: Build and test all + + runs-on: ubuntu-22.04 + + defaults: + run: + shell: bash + + steps: + - uses: actions/checkout@v4 + + - name: Cache firebase emulators + uses: actions/cache@v4 + with: + path: ~/.cache/firebase/emulators + key: ${{ runner.os }}-firebase-emulators-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-firebase-emulators- + + - name: Set up pnpm + uses: pnpm/action-setup@v3 + with: + version: 8 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version-file: ".nvmrc" + cache: "pnpm" + cache-dependency-path: "**/pnpm-lock.yaml" + + # Firebase + + - name: "Firebase: install dependencies" + run: pnpm install --frozen-lockfile + working-directory: ./firebase + + - name: "Firebase: build" + run: pnpm functions:build # Needed before lint so compiled code from `common` is available for the functions code + working-directory: ./firebase + + - name: "Firebase: lint" + run: pnpm lint + working-directory: ./firebase + + - name: "Firebase: tests" + run: pnpm test + working-directory: ./firebase + + # App + + - name: "App: install dependencies" + run: pnpm install --frozen-lockfile + working-directory: ./app + + - name: "App: lint" + run: pnpm lint + working-directory: ./app + + - name: "App: tests" + run: pnpm test:ci + working-directory: ./app + + - name: "App: build" + run: pnpm build + working-directory: ./app diff --git a/app/package.json b/app/package.json index 53b390a..1667581 100644 --- a/app/package.json +++ b/app/package.json @@ -9,24 +9,25 @@ "build": "ng build", "watch": "ng build --watch --configuration development", "test": "ng test", + "test:ci": "ng test --no-watch --no-progress --browsers=ChromeHeadless", "serve:ssr:app": "node dist/app/server/server.mjs", "lint": "ng lint" }, "private": true, "dependencies": { - "@angular/animations": "^17.1.2", + "@angular/animations": "^17.1.3", "@angular/cdk": "17.1.2", - "@angular/common": "^17.1.2", - "@angular/compiler": "^17.1.2", - "@angular/core": "^17.1.2", - "@angular/forms": "^17.1.2", + "@angular/common": "^17.1.3", + "@angular/compiler": "^17.1.3", + "@angular/core": "^17.1.3", + "@angular/forms": "^17.1.3", "@angular/material": "17.1.2", - "@angular/platform-browser": "^17.1.2", - "@angular/platform-browser-dynamic": "^17.1.2", - "@angular/platform-server": "^17.1.2", - "@angular/router": "^17.1.2", - "@angular/service-worker": "^17.1.2", - "@angular/ssr": "^17.1.2", + "@angular/platform-browser": "^17.1.3", + "@angular/platform-browser-dynamic": "^17.1.3", + "@angular/platform-server": "^17.1.3", + "@angular/router": "^17.1.3", + "@angular/service-worker": "^17.1.3", + "@angular/ssr": "^17.1.3", "@ngrx/operators": "^17.1.0", "@ngrx/signals": "^17.1.0", "express": "^4.18.2", @@ -38,32 +39,33 @@ "zone.js": "~0.14.3" }, "devDependencies": { - "@angular-devkit/build-angular": "^17.1.2", + "@angular-devkit/build-angular": "^17.1.3", "@angular-eslint/builder": "17.2.1", "@angular-eslint/eslint-plugin": "17.2.1", "@angular-eslint/eslint-plugin-template": "17.2.1", "@angular-eslint/schematics": "17.2.1", "@angular-eslint/template-parser": "17.2.1", - "@angular/cli": "^17.1.2", - "@angular/compiler-cli": "^17.1.2", + "@angular/cli": "^17.1.3", + "@angular/compiler-cli": "^17.1.3", "@types/express": "^4.17.17", "@types/jasmine": "~5.1.0", - "@types/node": "^20.11.16", + "@types/node": "^20.11.17", "@typescript-eslint/eslint-plugin": "6.21.0", "@typescript-eslint/parser": "6.21.0", "autoprefixer": "^10.4.17", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", - "jasmine-core": "~5.1.0", + "jasmine-core": "~5.1.2", "karma": "~6.4.0", "karma-chrome-launcher": "~3.2.0", "karma-coverage": "~2.2.0", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.1.0", - "postcss": "^8.4.34", + "ng-mocks": "^14.12.1", + "postcss": "^8.4.35", "prettier": "^3.2.5", "prettier-plugin-tailwindcss": "^0.5.11", "tailwindcss": "^3.4.1", "typescript": "~5.3.3" } -} +} \ No newline at end of file diff --git a/app/pnpm-lock.yaml b/app/pnpm-lock.yaml index 7a90746..244927b 100644 --- a/app/pnpm-lock.yaml +++ b/app/pnpm-lock.yaml @@ -6,50 +6,50 @@ settings: dependencies: '@angular/animations': - specifier: ^17.1.2 - version: 17.1.2(@angular/core@17.1.2) + specifier: ^17.1.3 + version: 17.1.3(@angular/core@17.1.3) '@angular/cdk': specifier: 17.1.2 - version: 17.1.2(@angular/common@17.1.2)(@angular/core@17.1.2)(rxjs@7.8.1) + version: 17.1.2(@angular/common@17.1.3)(@angular/core@17.1.3)(rxjs@7.8.1) '@angular/common': - specifier: ^17.1.2 - version: 17.1.2(@angular/core@17.1.2)(rxjs@7.8.1) + specifier: ^17.1.3 + version: 17.1.3(@angular/core@17.1.3)(rxjs@7.8.1) '@angular/compiler': - specifier: ^17.1.2 - version: 17.1.2(@angular/core@17.1.2) + specifier: ^17.1.3 + version: 17.1.3(@angular/core@17.1.3) '@angular/core': - specifier: ^17.1.2 - version: 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) + specifier: ^17.1.3 + version: 17.1.3(rxjs@7.8.1)(zone.js@0.14.3) '@angular/forms': - specifier: ^17.1.2 - version: 17.1.2(@angular/common@17.1.2)(@angular/core@17.1.2)(@angular/platform-browser@17.1.2)(rxjs@7.8.1) + specifier: ^17.1.3 + version: 17.1.3(@angular/common@17.1.3)(@angular/core@17.1.3)(@angular/platform-browser@17.1.3)(rxjs@7.8.1) '@angular/material': specifier: 17.1.2 - version: 17.1.2(@angular/animations@17.1.2)(@angular/cdk@17.1.2)(@angular/common@17.1.2)(@angular/core@17.1.2)(@angular/forms@17.1.2)(@angular/platform-browser@17.1.2)(rxjs@7.8.1) + version: 17.1.2(@angular/animations@17.1.3)(@angular/cdk@17.1.2)(@angular/common@17.1.3)(@angular/core@17.1.3)(@angular/forms@17.1.3)(@angular/platform-browser@17.1.3)(rxjs@7.8.1) '@angular/platform-browser': - specifier: ^17.1.2 - version: 17.1.2(@angular/animations@17.1.2)(@angular/common@17.1.2)(@angular/core@17.1.2) + specifier: ^17.1.3 + version: 17.1.3(@angular/animations@17.1.3)(@angular/common@17.1.3)(@angular/core@17.1.3) '@angular/platform-browser-dynamic': - specifier: ^17.1.2 - version: 17.1.2(@angular/common@17.1.2)(@angular/compiler@17.1.2)(@angular/core@17.1.2)(@angular/platform-browser@17.1.2) + specifier: ^17.1.3 + version: 17.1.3(@angular/common@17.1.3)(@angular/compiler@17.1.3)(@angular/core@17.1.3)(@angular/platform-browser@17.1.3) '@angular/platform-server': - specifier: ^17.1.2 - version: 17.1.2(@angular/animations@17.1.2)(@angular/common@17.1.2)(@angular/compiler@17.1.2)(@angular/core@17.1.2)(@angular/platform-browser@17.1.2) + specifier: ^17.1.3 + version: 17.1.3(@angular/animations@17.1.3)(@angular/common@17.1.3)(@angular/compiler@17.1.3)(@angular/core@17.1.3)(@angular/platform-browser@17.1.3) '@angular/router': - specifier: ^17.1.2 - version: 17.1.2(@angular/common@17.1.2)(@angular/core@17.1.2)(@angular/platform-browser@17.1.2)(rxjs@7.8.1) + specifier: ^17.1.3 + version: 17.1.3(@angular/common@17.1.3)(@angular/core@17.1.3)(@angular/platform-browser@17.1.3)(rxjs@7.8.1) '@angular/service-worker': - specifier: ^17.1.2 - version: 17.1.2(@angular/common@17.1.2)(@angular/core@17.1.2) + specifier: ^17.1.3 + version: 17.1.3(@angular/common@17.1.3)(@angular/core@17.1.3) '@angular/ssr': - specifier: ^17.1.2 - version: 17.1.2(@angular/common@17.1.2)(@angular/core@17.1.2) + specifier: ^17.1.3 + version: 17.1.3(@angular/common@17.1.3)(@angular/core@17.1.3) '@ngrx/operators': specifier: ^17.1.0 version: 17.1.0(rxjs@7.8.1) '@ngrx/signals': specifier: ^17.1.0 - version: 17.1.0(@angular/core@17.1.2)(rxjs@7.8.1) + version: 17.1.0(@angular/core@17.1.3)(rxjs@7.8.1) express: specifier: ^4.18.2 version: 4.18.2 @@ -58,7 +58,7 @@ dependencies: version: 10.8.0 ngxtension: specifier: ^2.0.0 - version: 2.0.0(@angular/common@17.1.2)(@angular/core@17.1.2)(@use-gesture/vanilla@10.3.0)(rxjs@7.8.1) + version: 2.0.0(@angular/common@17.1.3)(@angular/core@17.1.3)(@use-gesture/vanilla@10.3.0)(rxjs@7.8.1) rxfire: specifier: ^6.0.5 version: 6.0.5(firebase@10.8.0)(rxjs@7.8.1) @@ -74,8 +74,8 @@ dependencies: devDependencies: '@angular-devkit/build-angular': - specifier: ^17.1.2 - version: 17.1.2(@angular/compiler-cli@17.1.2)(@angular/platform-server@17.1.2)(@angular/service-worker@17.1.2)(@types/express@4.17.21)(@types/node@20.11.16)(karma@6.4.2)(tailwindcss@3.4.1)(typescript@5.3.3) + specifier: ^17.1.3 + version: 17.1.3(@angular/compiler-cli@17.1.3)(@angular/platform-server@17.1.3)(@angular/service-worker@17.1.3)(@types/express@4.17.21)(@types/node@20.11.17)(karma@6.4.2)(tailwindcss@3.4.1)(typescript@5.3.3) '@angular-eslint/builder': specifier: 17.2.1 version: 17.2.1(eslint@8.56.0)(typescript@5.3.3) @@ -87,16 +87,16 @@ devDependencies: version: 17.2.1(eslint@8.56.0)(typescript@5.3.3) '@angular-eslint/schematics': specifier: 17.2.1 - version: 17.2.1(@angular/cli@17.1.2)(eslint@8.56.0)(typescript@5.3.3) + version: 17.2.1(@angular/cli@17.1.3)(eslint@8.56.0)(typescript@5.3.3) '@angular-eslint/template-parser': specifier: 17.2.1 version: 17.2.1(eslint@8.56.0)(typescript@5.3.3) '@angular/cli': - specifier: ^17.1.2 - version: 17.1.2 + specifier: ^17.1.3 + version: 17.1.3 '@angular/compiler-cli': - specifier: ^17.1.2 - version: 17.1.2(@angular/compiler@17.1.2)(typescript@5.3.3) + specifier: ^17.1.3 + version: 17.1.3(@angular/compiler@17.1.3)(typescript@5.3.3) '@types/express': specifier: ^4.17.17 version: 4.17.21 @@ -104,8 +104,8 @@ devDependencies: specifier: ~5.1.0 version: 5.1.4 '@types/node': - specifier: ^20.11.16 - version: 20.11.16 + specifier: ^20.11.17 + version: 20.11.17 '@typescript-eslint/eslint-plugin': specifier: 6.21.0 version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) @@ -114,7 +114,7 @@ devDependencies: version: 6.21.0(eslint@8.56.0)(typescript@5.3.3) autoprefixer: specifier: ^10.4.17 - version: 10.4.17(postcss@8.4.34) + version: 10.4.17(postcss@8.4.35) eslint: specifier: ^8.56.0 version: 8.56.0 @@ -122,8 +122,8 @@ devDependencies: specifier: ^9.1.0 version: 9.1.0(eslint@8.56.0) jasmine-core: - specifier: ~5.1.0 - version: 5.1.1 + specifier: ~5.1.2 + version: 5.1.2 karma: specifier: ~6.4.0 version: 6.4.2 @@ -138,10 +138,13 @@ devDependencies: version: 5.1.0(karma@6.4.2) karma-jasmine-html-reporter: specifier: ~2.1.0 - version: 2.1.0(jasmine-core@5.1.1)(karma-jasmine@5.1.0)(karma@6.4.2) + version: 2.1.0(jasmine-core@5.1.2)(karma-jasmine@5.1.0)(karma@6.4.2) + ng-mocks: + specifier: ^14.12.1 + version: 14.12.1(@angular/common@17.1.3)(@angular/core@17.1.3)(@angular/forms@17.1.3)(@angular/platform-browser@17.1.3) postcss: - specifier: ^8.4.34 - version: 8.4.34 + specifier: ^8.4.35 + version: 8.4.35 prettier: specifier: ^3.2.5 version: 3.2.5 @@ -175,18 +178,18 @@ packages: '@jridgewell/trace-mapping': 0.3.22 dev: true - /@angular-devkit/architect@0.1701.2: - resolution: {integrity: sha512-g3gn5Ht6r9bCeFeAYF+HboZB8IvgvqqdeOnaWNaXJLI0ymEkpbqRdqrHGuVKHJV7JOMNXC7GPJEctBC6SXxOxA==} + /@angular-devkit/architect@0.1701.3: + resolution: {integrity: sha512-K5rvhslbXNwx04cCLviEJCA27MwoJRMMzALFXySi9BqjZnZUOtZnOBuuCdrTPaRmFaYqGO4Im5GNzpbb/NB8zg==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} dependencies: - '@angular-devkit/core': 17.1.2 + '@angular-devkit/core': 17.1.3 rxjs: 7.8.1 transitivePeerDependencies: - chokidar dev: true - /@angular-devkit/build-angular@17.1.2(@angular/compiler-cli@17.1.2)(@angular/platform-server@17.1.2)(@angular/service-worker@17.1.2)(@types/express@4.17.21)(@types/node@20.11.16)(karma@6.4.2)(tailwindcss@3.4.1)(typescript@5.3.3): - resolution: {integrity: sha512-QIDTP+TjiCKCYRZYb8to4ymvIV1Djcfd5c17VdgMGhRqIQAAK1V4f4A1njdhGYOrgsLajZQAnKvFfk2ZMeI37A==} + /@angular-devkit/build-angular@17.1.3(@angular/compiler-cli@17.1.3)(@angular/platform-server@17.1.3)(@angular/service-worker@17.1.3)(@types/express@4.17.21)(@types/node@20.11.17)(karma@6.4.2)(tailwindcss@3.4.1)(typescript@5.3.3): + resolution: {integrity: sha512-pusFVSWMnrm2GrF3+Fw19OhA2rNw4WkfTMUruhaKAjW5QIvZ3wHYf+pH//1Ud+tuhFBi9BH7UALP2vnJMu1ehw==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: '@angular/compiler-cli': ^17.0.0 @@ -227,12 +230,12 @@ packages: optional: true dependencies: '@ampproject/remapping': 2.2.1 - '@angular-devkit/architect': 0.1701.2 - '@angular-devkit/build-webpack': 0.1701.2(webpack-dev-server@4.15.1)(webpack@5.89.0) - '@angular-devkit/core': 17.1.2 - '@angular/compiler-cli': 17.1.2(@angular/compiler@17.1.2)(typescript@5.3.3) - '@angular/platform-server': 17.1.2(@angular/animations@17.1.2)(@angular/common@17.1.2)(@angular/compiler@17.1.2)(@angular/core@17.1.2)(@angular/platform-browser@17.1.2) - '@angular/service-worker': 17.1.2(@angular/common@17.1.2)(@angular/core@17.1.2) + '@angular-devkit/architect': 0.1701.3 + '@angular-devkit/build-webpack': 0.1701.3(webpack-dev-server@4.15.1)(webpack@5.89.0) + '@angular-devkit/core': 17.1.3 + '@angular/compiler-cli': 17.1.3(@angular/compiler@17.1.3)(typescript@5.3.3) + '@angular/platform-server': 17.1.3(@angular/animations@17.1.3)(@angular/common@17.1.3)(@angular/compiler@17.1.3)(@angular/core@17.1.3)(@angular/platform-browser@17.1.3) + '@angular/service-worker': 17.1.3(@angular/common@17.1.3)(@angular/core@17.1.3) '@babel/core': 7.23.7 '@babel/generator': 7.23.6 '@babel/helper-annotate-as-pure': 7.22.5 @@ -243,7 +246,7 @@ packages: '@babel/preset-env': 7.23.7(@babel/core@7.23.7) '@babel/runtime': 7.23.7 '@discoveryjs/json-ext': 0.5.7 - '@ngtools/webpack': 17.1.2(@angular/compiler-cli@17.1.2)(typescript@5.3.3)(webpack@5.89.0) + '@ngtools/webpack': 17.1.3(@angular/compiler-cli@17.1.3)(typescript@5.3.3)(webpack@5.89.0) '@vitejs/plugin-basic-ssl': 1.0.2(vite@5.0.12) ansi-colors: 4.1.3 autoprefixer: 10.4.16(postcss@8.4.33) @@ -289,7 +292,7 @@ packages: tslib: 2.6.2 typescript: 5.3.3 undici: 6.2.1 - vite: 5.0.12(@types/node@20.11.16)(less@4.2.0)(sass@1.69.7)(terser@5.26.0) + vite: 5.0.12(@types/node@20.11.17)(less@4.2.0)(sass@1.69.7)(terser@5.26.0) watchpack: 2.4.0 webpack: 5.89.0(esbuild@0.19.11) webpack-dev-middleware: 6.1.1(webpack@5.89.0) @@ -318,14 +321,14 @@ packages: - webpack-cli dev: true - /@angular-devkit/build-webpack@0.1701.2(webpack-dev-server@4.15.1)(webpack@5.89.0): - resolution: {integrity: sha512-LqfSO5iTbiYByDadUET/8uIun8vSHMEdtoxiil/kdZ5T0NG0p7K8QqUMnWgg6suwO6kFfYJkMiS8Dq3Y/ONUNQ==} + /@angular-devkit/build-webpack@0.1701.3(webpack-dev-server@4.15.1)(webpack@5.89.0): + resolution: {integrity: sha512-fpZtJf6yvXM7mX1T83caeYpa0e3zPv7sgKmx0ZIJKGL8+DETgNcCCeCTgui7HMBcHGCD8yj72DZ8xMMBWwVBIA==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: webpack: ^5.30.0 webpack-dev-server: ^4.0.0 dependencies: - '@angular-devkit/architect': 0.1701.2 + '@angular-devkit/architect': 0.1701.3 rxjs: 7.8.1 webpack: 5.89.0(esbuild@0.19.11) webpack-dev-server: 4.15.1(webpack@5.89.0) @@ -333,8 +336,8 @@ packages: - chokidar dev: true - /@angular-devkit/core@17.1.2: - resolution: {integrity: sha512-ku+/W/HMCBacSWFppenr9y6Lx8mDuTuQvn1IkTyBLiJOpWnzgVbx9kHDeaDchGa1PwLlJUBBrv27t3qgJOIDPw==} + /@angular-devkit/core@17.1.3: + resolution: {integrity: sha512-iuVK4hyW3YhusxIi8zGBvvVA9pWtDT3H6LQbWdVk9D3jXCZBIrEMklvAiJErqficKnUurf6gtFOeA8Fop6GotA==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: chokidar: ^3.5.2 @@ -350,11 +353,11 @@ packages: source-map: 0.7.4 dev: true - /@angular-devkit/schematics@17.1.2: - resolution: {integrity: sha512-8S9RuM8olFN/gwN+mjbuF1CwHX61f0i59EGXz9tXLnKRUTjsRR+8vVMTAmX0dvVAT5fJTG/T69X+HX7FeumdqA==} + /@angular-devkit/schematics@17.1.3: + resolution: {integrity: sha512-zKoWG1hDfvi1vR9Hqoca9hWo9vDg8evmQvGcBW5jXR5ndZi5Oit/uDcGdA8WUKvBd1EG7WMqp0FgcDR9EA9WCw==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} dependencies: - '@angular-devkit/core': 17.1.2 + '@angular-devkit/core': 17.1.3 jsonc-parser: 3.2.0 magic-string: 0.30.5 ora: 5.4.1 @@ -415,14 +418,14 @@ packages: - supports-color dev: true - /@angular-eslint/schematics@17.2.1(@angular/cli@17.1.2)(eslint@8.56.0)(typescript@5.3.3): + /@angular-eslint/schematics@17.2.1(@angular/cli@17.1.3)(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-7ldtIePI4ZTp/TBpeOZkzfv30HSAn//4TgtFuqvojudI8n8batV5FqQ0VNm1e0zitl75t8Zwtr0KYT4I6vh59g==} peerDependencies: '@angular/cli': '>= 17.0.0 < 18.0.0' dependencies: '@angular-eslint/eslint-plugin': 17.2.1(eslint@8.56.0)(typescript@5.3.3) '@angular-eslint/eslint-plugin-template': 17.2.1(eslint@8.56.0)(typescript@5.3.3) - '@angular/cli': 17.1.2 + '@angular/cli': 17.1.3 '@nx/devkit': 17.2.8(nx@17.2.8) ignore: 5.3.0 nx: 17.2.8 @@ -463,39 +466,39 @@ packages: - supports-color dev: true - /@angular/animations@17.1.2(@angular/core@17.1.2): - resolution: {integrity: sha512-ZsHa/zoWBOZdispjcNgXCoF9MAtc6Zyzc/QFUjtOFI9vigOI8tWP6GY1Wfeg4cyL+R3uDGYBgMrdr8l84VfuKg==} + /@angular/animations@17.1.3(@angular/core@17.1.3): + resolution: {integrity: sha512-AS9CHOjjKqkuAzlKEMJfAkZfkIdSoagB3D8HwvH+ZHo6GVJc9KbtLQn/okNijFK+Fg7QK/hYbQ3lJhjgk0GQDA==} engines: {node: ^18.13.0 || >=20.9.0} peerDependencies: - '@angular/core': 17.1.2 + '@angular/core': 17.1.3 dependencies: - '@angular/core': 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) + '@angular/core': 17.1.3(rxjs@7.8.1)(zone.js@0.14.3) tslib: 2.6.2 - /@angular/cdk@17.1.2(@angular/common@17.1.2)(@angular/core@17.1.2)(rxjs@7.8.1): + /@angular/cdk@17.1.2(@angular/common@17.1.3)(@angular/core@17.1.3)(rxjs@7.8.1): resolution: {integrity: sha512-eu9D60RQv213qi7oh6ae9Z+d6+AG/aqi0y70Ag9BjwqTiatDiYvSySxswxYYKdzPp0hx0ZUTGi16LqtT6pyj6Q==} peerDependencies: '@angular/common': ^17.0.0 || ^18.0.0 '@angular/core': ^17.0.0 || ^18.0.0 rxjs: ^6.5.3 || ^7.4.0 dependencies: - '@angular/common': 17.1.2(@angular/core@17.1.2)(rxjs@7.8.1) - '@angular/core': 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) + '@angular/common': 17.1.3(@angular/core@17.1.3)(rxjs@7.8.1) + '@angular/core': 17.1.3(rxjs@7.8.1)(zone.js@0.14.3) rxjs: 7.8.1 tslib: 2.6.2 optionalDependencies: parse5: 7.1.2 dev: false - /@angular/cli@17.1.2: - resolution: {integrity: sha512-U1W6XZNrfeRkXW2fO3AU25rRttqZahVkhzcK3lAtJ8+lSrStCOF7x1gz6tmFZFte1fNHQrXqD0yIDkd8H2/cvw==} + /@angular/cli@17.1.3: + resolution: {integrity: sha512-ysPWDdqo2cwfeskKVAg8p4C8xuezWcIWyW/ACSjWw6yp4OZvyVd6cGZrc0POVZzAPtTOYJSgWOpF/DCHQFluSg==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true dependencies: - '@angular-devkit/architect': 0.1701.2 - '@angular-devkit/core': 17.1.2 - '@angular-devkit/schematics': 17.1.2 - '@schematics/angular': 17.1.2 + '@angular-devkit/architect': 0.1701.3 + '@angular-devkit/core': 17.1.3 + '@angular-devkit/schematics': 17.1.3 + '@schematics/angular': 17.1.3 '@yarnpkg/lockfile': 1.1.0 ansi-colors: 4.1.3 ini: 4.1.1 @@ -516,26 +519,26 @@ packages: - supports-color dev: true - /@angular/common@17.1.2(@angular/core@17.1.2)(rxjs@7.8.1): - resolution: {integrity: sha512-y/wD+zuPaPgK3dB80Q63qBtuu5TuryKuUgjWrOmrguBWV9oiJRhKQrcp1gVw9vVrowmbDBKGtPMS622Q4oxOWQ==} + /@angular/common@17.1.3(@angular/core@17.1.3)(rxjs@7.8.1): + resolution: {integrity: sha512-AzLzoNSeRSNGBQk0K+iG0XdYG36SDeJqYqE8rfoiWuv1NDFLL05UJM2/fQfaMNg0oX5bHOlHUqHFj3sFR/NVpw==} engines: {node: ^18.13.0 || >=20.9.0} peerDependencies: - '@angular/core': 17.1.2 + '@angular/core': 17.1.3 rxjs: ^6.5.3 || ^7.4.0 dependencies: - '@angular/core': 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) + '@angular/core': 17.1.3(rxjs@7.8.1)(zone.js@0.14.3) rxjs: 7.8.1 tslib: 2.6.2 - /@angular/compiler-cli@17.1.2(@angular/compiler@17.1.2)(typescript@5.3.3): - resolution: {integrity: sha512-4P4ttCe4IF9yq7bxCDxbVW7purN7qV0nqofP5Tth1xCsgIJeGmOMMQJN5RJCZNrAPMkvMv39eV878sgcDjbpOA==} + /@angular/compiler-cli@17.1.3(@angular/compiler@17.1.3)(typescript@5.3.3): + resolution: {integrity: sha512-bNDHXo3Twub0BZK9OmXly+0REs0RuR1SUXlTAeq+0XubCvnBDvpg9peL7UTTGS5YRo9sUTBnR6faSUA1F5objQ==} engines: {node: ^18.13.0 || >=20.9.0} hasBin: true peerDependencies: - '@angular/compiler': 17.1.2 + '@angular/compiler': 17.1.3 typescript: '>=5.2 <5.4' dependencies: - '@angular/compiler': 17.1.2(@angular/core@17.1.2) + '@angular/compiler': 17.1.3(@angular/core@17.1.3) '@babel/core': 7.23.2 '@jridgewell/sourcemap-codec': 1.4.15 chokidar: 3.5.3 @@ -549,20 +552,20 @@ packages: - supports-color dev: true - /@angular/compiler@17.1.2(@angular/core@17.1.2): - resolution: {integrity: sha512-1vJuQRM5V01nC6qsLvBKrHVZXpzbK0YKubwVQUXCSfDNZBcDFak3SQcwU4C2t880rU3ZvFDB1UWfk7CKn5w9Kw==} + /@angular/compiler@17.1.3(@angular/core@17.1.3): + resolution: {integrity: sha512-k/s21gPPKStxVOLr6l4Y145OIxyBY7BhTPVOl/qEAgE+IcZ9vkiA8dYl8yjL884Kl1ZKPmFA3AofMJjWjZGNag==} engines: {node: ^18.13.0 || >=20.9.0} peerDependencies: - '@angular/core': 17.1.2 + '@angular/core': 17.1.3 peerDependenciesMeta: '@angular/core': optional: true dependencies: - '@angular/core': 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) + '@angular/core': 17.1.3(rxjs@7.8.1)(zone.js@0.14.3) tslib: 2.6.2 - /@angular/core@17.1.2(rxjs@7.8.1)(zone.js@0.14.3): - resolution: {integrity: sha512-0M787BZVgYSVogHCUzo/dFrT56TgfQoEsOQngHMpyERJZv6dycXZlRdHc6TzvHUa+Uu/MNjn/RclBR8063bdWA==} + /@angular/core@17.1.3(rxjs@7.8.1)(zone.js@0.14.3): + resolution: {integrity: sha512-2lZ4DRHN8KJ/aQads+YXIcx5Ri9yyeFIlw69m5Pn7wAi/+Rakg7IsclgLaWs7aBtWwMHG7LnqFKxAVq7CjXKtA==} engines: {node: ^18.13.0 || >=20.9.0} peerDependencies: rxjs: ^6.5.3 || ^7.4.0 @@ -572,23 +575,22 @@ packages: tslib: 2.6.2 zone.js: 0.14.3 - /@angular/forms@17.1.2(@angular/common@17.1.2)(@angular/core@17.1.2)(@angular/platform-browser@17.1.2)(rxjs@7.8.1): - resolution: {integrity: sha512-n1WsZAL2IVOB6ocROKR6CFOR14PIC9RGAB41SwTfPhJeBM1kjW48bXY0sw97TasxM4mWJKGCmFXu0jQwkoeSpQ==} + /@angular/forms@17.1.3(@angular/common@17.1.3)(@angular/core@17.1.3)(@angular/platform-browser@17.1.3)(rxjs@7.8.1): + resolution: {integrity: sha512-aNa0jGLT5d+hnKVrSo8tk3TRo/NLNu1RxLNx8RhIczKAeCK3eD8SvTMy27iJtyXmNG2GWN7QPiDeGepd75nbxQ==} engines: {node: ^18.13.0 || >=20.9.0} peerDependencies: - '@angular/common': 17.1.2 - '@angular/core': 17.1.2 - '@angular/platform-browser': 17.1.2 + '@angular/common': 17.1.3 + '@angular/core': 17.1.3 + '@angular/platform-browser': 17.1.3 rxjs: ^6.5.3 || ^7.4.0 dependencies: - '@angular/common': 17.1.2(@angular/core@17.1.2)(rxjs@7.8.1) - '@angular/core': 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) - '@angular/platform-browser': 17.1.2(@angular/animations@17.1.2)(@angular/common@17.1.2)(@angular/core@17.1.2) + '@angular/common': 17.1.3(@angular/core@17.1.3)(rxjs@7.8.1) + '@angular/core': 17.1.3(rxjs@7.8.1)(zone.js@0.14.3) + '@angular/platform-browser': 17.1.3(@angular/animations@17.1.3)(@angular/common@17.1.3)(@angular/core@17.1.3) rxjs: 7.8.1 tslib: 2.6.2 - dev: false - /@angular/material@17.1.2(@angular/animations@17.1.2)(@angular/cdk@17.1.2)(@angular/common@17.1.2)(@angular/core@17.1.2)(@angular/forms@17.1.2)(@angular/platform-browser@17.1.2)(rxjs@7.8.1): + /@angular/material@17.1.2(@angular/animations@17.1.3)(@angular/cdk@17.1.2)(@angular/common@17.1.3)(@angular/core@17.1.3)(@angular/forms@17.1.3)(@angular/platform-browser@17.1.3)(rxjs@7.8.1): resolution: {integrity: sha512-50n7JDWtWGCxfrMKVKZ2wqkdozukA3IWeypQgXxzZc+4jqgT6Vj8/U4xNvcO9OgPLMOaTvktfT+wzUmCKJ0sng==} peerDependencies: '@angular/animations': ^17.0.0 || ^18.0.0 @@ -599,12 +601,12 @@ packages: '@angular/platform-browser': ^17.0.0 || ^18.0.0 rxjs: ^6.5.3 || ^7.4.0 dependencies: - '@angular/animations': 17.1.2(@angular/core@17.1.2) - '@angular/cdk': 17.1.2(@angular/common@17.1.2)(@angular/core@17.1.2)(rxjs@7.8.1) - '@angular/common': 17.1.2(@angular/core@17.1.2)(rxjs@7.8.1) - '@angular/core': 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) - '@angular/forms': 17.1.2(@angular/common@17.1.2)(@angular/core@17.1.2)(@angular/platform-browser@17.1.2)(rxjs@7.8.1) - '@angular/platform-browser': 17.1.2(@angular/animations@17.1.2)(@angular/common@17.1.2)(@angular/core@17.1.2) + '@angular/animations': 17.1.3(@angular/core@17.1.3) + '@angular/cdk': 17.1.2(@angular/common@17.1.3)(@angular/core@17.1.3)(rxjs@7.8.1) + '@angular/common': 17.1.3(@angular/core@17.1.3)(rxjs@7.8.1) + '@angular/core': 17.1.3(rxjs@7.8.1)(zone.js@0.14.3) + '@angular/forms': 17.1.3(@angular/common@17.1.3)(@angular/core@17.1.3)(@angular/platform-browser@17.1.3)(rxjs@7.8.1) + '@angular/platform-browser': 17.1.3(@angular/animations@17.1.3)(@angular/common@17.1.3)(@angular/core@17.1.3) '@material/animation': 15.0.0-canary.7f224ddd4.0 '@material/auto-init': 15.0.0-canary.7f224ddd4.0 '@material/banner': 15.0.0-canary.7f224ddd4.0 @@ -656,92 +658,92 @@ packages: tslib: 2.6.2 dev: false - /@angular/platform-browser-dynamic@17.1.2(@angular/common@17.1.2)(@angular/compiler@17.1.2)(@angular/core@17.1.2)(@angular/platform-browser@17.1.2): - resolution: {integrity: sha512-xiWVDHbA+owDhKo5SAnzZtawA1ktGthlCl3YTI+vmkJpF6axkYOqR7YL+aEQX/y/5GSK+oR+03SgAnYcpOwKlQ==} + /@angular/platform-browser-dynamic@17.1.3(@angular/common@17.1.3)(@angular/compiler@17.1.3)(@angular/core@17.1.3)(@angular/platform-browser@17.1.3): + resolution: {integrity: sha512-0lFhcFJfDzCSSVe8l8OY+UgUiwUwcbxwpvLod3XWBpf1iEUlr5720FIMA3VJYwpW3Oj4Uey3nVm13EMtRqpqdA==} engines: {node: ^18.13.0 || >=20.9.0} peerDependencies: - '@angular/common': 17.1.2 - '@angular/compiler': 17.1.2 - '@angular/core': 17.1.2 - '@angular/platform-browser': 17.1.2 + '@angular/common': 17.1.3 + '@angular/compiler': 17.1.3 + '@angular/core': 17.1.3 + '@angular/platform-browser': 17.1.3 dependencies: - '@angular/common': 17.1.2(@angular/core@17.1.2)(rxjs@7.8.1) - '@angular/compiler': 17.1.2(@angular/core@17.1.2) - '@angular/core': 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) - '@angular/platform-browser': 17.1.2(@angular/animations@17.1.2)(@angular/common@17.1.2)(@angular/core@17.1.2) + '@angular/common': 17.1.3(@angular/core@17.1.3)(rxjs@7.8.1) + '@angular/compiler': 17.1.3(@angular/core@17.1.3) + '@angular/core': 17.1.3(rxjs@7.8.1)(zone.js@0.14.3) + '@angular/platform-browser': 17.1.3(@angular/animations@17.1.3)(@angular/common@17.1.3)(@angular/core@17.1.3) tslib: 2.6.2 dev: false - /@angular/platform-browser@17.1.2(@angular/animations@17.1.2)(@angular/common@17.1.2)(@angular/core@17.1.2): - resolution: {integrity: sha512-unfpA5OLnqDmDb/oAQR2t2iROpOg02qwZayxyFg4MUZdDdnghPCfX77L2sr6oVVa7OJfKYFlmwmBXX1H3zjcXA==} + /@angular/platform-browser@17.1.3(@angular/animations@17.1.3)(@angular/common@17.1.3)(@angular/core@17.1.3): + resolution: {integrity: sha512-onPCvdk9f/6OhOo2zP6nfGKpzLma1QIxpFqD3jymbmIJTcVMOOQDMYW3eLtY+uSX8ribcJ7GQcbDGIM4rliTFg==} engines: {node: ^18.13.0 || >=20.9.0} peerDependencies: - '@angular/animations': 17.1.2 - '@angular/common': 17.1.2 - '@angular/core': 17.1.2 + '@angular/animations': 17.1.3 + '@angular/common': 17.1.3 + '@angular/core': 17.1.3 peerDependenciesMeta: '@angular/animations': optional: true dependencies: - '@angular/animations': 17.1.2(@angular/core@17.1.2) - '@angular/common': 17.1.2(@angular/core@17.1.2)(rxjs@7.8.1) - '@angular/core': 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) + '@angular/animations': 17.1.3(@angular/core@17.1.3) + '@angular/common': 17.1.3(@angular/core@17.1.3)(rxjs@7.8.1) + '@angular/core': 17.1.3(rxjs@7.8.1)(zone.js@0.14.3) tslib: 2.6.2 - /@angular/platform-server@17.1.2(@angular/animations@17.1.2)(@angular/common@17.1.2)(@angular/compiler@17.1.2)(@angular/core@17.1.2)(@angular/platform-browser@17.1.2): - resolution: {integrity: sha512-HVjneGSjisxS5+9U7rRfkq3dcUm3FCBm3kO2eUAZNUHstdwM00TE1YCFXMYSnVMGueCN+4gf+QRsjA4nqQ6lzw==} + /@angular/platform-server@17.1.3(@angular/animations@17.1.3)(@angular/common@17.1.3)(@angular/compiler@17.1.3)(@angular/core@17.1.3)(@angular/platform-browser@17.1.3): + resolution: {integrity: sha512-EB+sk4oZuUPEbkGSM0jpHAKiZVH98IBlXaRYDcmRCRw1hjZwsxl0kAQNuInSGfwJlyjVF7WCrZ6eNCuxlxXiAQ==} engines: {node: ^18.13.0 || >=20.9.0} peerDependencies: - '@angular/animations': 17.1.2 - '@angular/common': 17.1.2 - '@angular/compiler': 17.1.2 - '@angular/core': 17.1.2 - '@angular/platform-browser': 17.1.2 - dependencies: - '@angular/animations': 17.1.2(@angular/core@17.1.2) - '@angular/common': 17.1.2(@angular/core@17.1.2)(rxjs@7.8.1) - '@angular/compiler': 17.1.2(@angular/core@17.1.2) - '@angular/core': 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) - '@angular/platform-browser': 17.1.2(@angular/animations@17.1.2)(@angular/common@17.1.2)(@angular/core@17.1.2) + '@angular/animations': 17.1.3 + '@angular/common': 17.1.3 + '@angular/compiler': 17.1.3 + '@angular/core': 17.1.3 + '@angular/platform-browser': 17.1.3 + dependencies: + '@angular/animations': 17.1.3(@angular/core@17.1.3) + '@angular/common': 17.1.3(@angular/core@17.1.3)(rxjs@7.8.1) + '@angular/compiler': 17.1.3(@angular/core@17.1.3) + '@angular/core': 17.1.3(rxjs@7.8.1)(zone.js@0.14.3) + '@angular/platform-browser': 17.1.3(@angular/animations@17.1.3)(@angular/common@17.1.3)(@angular/core@17.1.3) tslib: 2.6.2 xhr2: 0.2.1 - /@angular/router@17.1.2(@angular/common@17.1.2)(@angular/core@17.1.2)(@angular/platform-browser@17.1.2)(rxjs@7.8.1): - resolution: {integrity: sha512-8OexxiiscRdfEiB6jOKlZFyAKZtvIQvh0ugW6U7nAXPV5XsA2UL80sXkc829eH0DnJn2Wj/HS6ZNGgG81PWDHg==} + /@angular/router@17.1.3(@angular/common@17.1.3)(@angular/core@17.1.3)(@angular/platform-browser@17.1.3)(rxjs@7.8.1): + resolution: {integrity: sha512-6HigdtFjm+76UU2hiLGLE2SpOecQhD6TnAVTocDuRitpN5m0dyiffBrqxarfNwoZuMdIiXyqClJR4JRo1rJjoQ==} engines: {node: ^18.13.0 || >=20.9.0} peerDependencies: - '@angular/common': 17.1.2 - '@angular/core': 17.1.2 - '@angular/platform-browser': 17.1.2 + '@angular/common': 17.1.3 + '@angular/core': 17.1.3 + '@angular/platform-browser': 17.1.3 rxjs: ^6.5.3 || ^7.4.0 dependencies: - '@angular/common': 17.1.2(@angular/core@17.1.2)(rxjs@7.8.1) - '@angular/core': 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) - '@angular/platform-browser': 17.1.2(@angular/animations@17.1.2)(@angular/common@17.1.2)(@angular/core@17.1.2) + '@angular/common': 17.1.3(@angular/core@17.1.3)(rxjs@7.8.1) + '@angular/core': 17.1.3(rxjs@7.8.1)(zone.js@0.14.3) + '@angular/platform-browser': 17.1.3(@angular/animations@17.1.3)(@angular/common@17.1.3)(@angular/core@17.1.3) rxjs: 7.8.1 tslib: 2.6.2 dev: false - /@angular/service-worker@17.1.2(@angular/common@17.1.2)(@angular/core@17.1.2): - resolution: {integrity: sha512-SD528iC0PwJ7g3NWQ6hoyLyr97eC5SsSmMArPC+ZIuvzgnWsKBa80YAAVJjW/kT0JlspUbK2H5606ZMsnEmcIw==} + /@angular/service-worker@17.1.3(@angular/common@17.1.3)(@angular/core@17.1.3): + resolution: {integrity: sha512-DSndSwNvNnETiqtFAt/jPUMBUUfAxot7IhEUp19KFbS4HhasSZ+QxkNECN9bT6SUWjeaN7wvPcvR4gdSkQs3Pg==} engines: {node: ^18.13.0 || >=20.9.0} hasBin: true peerDependencies: - '@angular/common': 17.1.2 - '@angular/core': 17.1.2 + '@angular/common': 17.1.3 + '@angular/core': 17.1.3 dependencies: - '@angular/common': 17.1.2(@angular/core@17.1.2)(rxjs@7.8.1) - '@angular/core': 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) + '@angular/common': 17.1.3(@angular/core@17.1.3)(rxjs@7.8.1) + '@angular/core': 17.1.3(rxjs@7.8.1)(zone.js@0.14.3) tslib: 2.6.2 - /@angular/ssr@17.1.2(@angular/common@17.1.2)(@angular/core@17.1.2): - resolution: {integrity: sha512-Wkbz8qFD+jhW59sUzuoFlwOOiAOR9nB5kXviak/0XGr23M0o+9KqlNUTjq1ju3sHdjLSZROrqZlnK1AMzeuAhw==} + /@angular/ssr@17.1.3(@angular/common@17.1.3)(@angular/core@17.1.3): + resolution: {integrity: sha512-zgghp3gdh+pv//lYWWynfZOE9jkndSmflojgRWBR4FdAtapdyrm1MaE6TIwC7qT+r/sW0bKypK2fKxwN8sXpHw==} peerDependencies: '@angular/common': ^17.0.0 '@angular/core': ^17.0.0 dependencies: - '@angular/common': 17.1.2(@angular/core@17.1.2)(rxjs@7.8.1) - '@angular/core': 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) + '@angular/common': 17.1.3(@angular/core@17.1.3)(rxjs@7.8.1) + '@angular/core': 17.1.3(rxjs@7.8.1)(zone.js@0.14.3) critters: 0.0.20 tslib: 2.6.2 dev: false @@ -2727,7 +2729,7 @@ packages: engines: {node: ^8.13.0 || >=10.10.0} dependencies: '@grpc/proto-loader': 0.7.10 - '@types/node': 20.11.16 + '@types/node': 20.11.17 dev: false /@grpc/proto-loader@0.7.10: @@ -3504,7 +3506,7 @@ packages: tslib: 2.6.2 dev: false - /@ngrx/signals@17.1.0(@angular/core@17.1.2)(rxjs@7.8.1): + /@ngrx/signals@17.1.0(@angular/core@17.1.3)(rxjs@7.8.1): resolution: {integrity: sha512-CF387SNYUoPeFCh13S/vmsyFRZHXm7cZjxuwXbI3AWDS/JXO9GC2061O9f0Fy7DIyQtDisY9uGV5eOiKTYmT0w==} peerDependencies: '@angular/core': ^17.0.0 @@ -3513,20 +3515,20 @@ packages: rxjs: optional: true dependencies: - '@angular/core': 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) + '@angular/core': 17.1.3(rxjs@7.8.1)(zone.js@0.14.3) rxjs: 7.8.1 tslib: 2.6.2 dev: false - /@ngtools/webpack@17.1.2(@angular/compiler-cli@17.1.2)(typescript@5.3.3)(webpack@5.89.0): - resolution: {integrity: sha512-MdNVSIp0x8AK26L+CxMTXH4weq2sNIp4C09RSdk7y6UkfBxMA3O0jTto9tW3ehkBaaGZ4dSiWkXA8L/ydMiQmA==} + /@ngtools/webpack@17.1.3(@angular/compiler-cli@17.1.3)(typescript@5.3.3)(webpack@5.89.0): + resolution: {integrity: sha512-mszRSb7aMNKHnkh3Jrfo83KVOguX/cUamJJcGIYe9o7tnLGRIoMp4vP0fx6Og4J0/CGDRhSDG4IiJ29aOU7K8A==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: '@angular/compiler-cli': ^17.0.0 typescript: '>=5.2 <5.4' webpack: ^5.54.0 dependencies: - '@angular/compiler-cli': 17.1.2(@angular/compiler@17.1.2)(typescript@5.3.3) + '@angular/compiler-cli': 17.1.3(@angular/compiler@17.1.3)(typescript@5.3.3) typescript: 5.3.3 webpack: 5.89.0(esbuild@0.19.11) dev: true @@ -3566,7 +3568,7 @@ packages: resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: true /@npmcli/git@5.0.4: @@ -3579,7 +3581,7 @@ packages: proc-log: 3.0.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.5.4 + semver: 7.6.0 which: 4.0.0 transitivePeerDependencies: - bluebird @@ -3609,7 +3611,7 @@ packages: json-parse-even-better-errors: 3.0.1 normalize-package-data: 6.0.0 proc-log: 3.0.0 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - bluebird dev: true @@ -4040,12 +4042,12 @@ packages: dev: true optional: true - /@schematics/angular@17.1.2: - resolution: {integrity: sha512-1GlH0POaN7hVDF1sAm90E5SvAqnKK+PbD1oKSpug9l+1AUQ3vOamyGhEAaO+IxUqvNdgqZexxd5o9MyySTT2Zw==} + /@schematics/angular@17.1.3: + resolution: {integrity: sha512-hmeasOvzmniy6urtzUKhEqGO67iPuLX/dVtkF4nWp2NTtcEKlvcJobNDMc+CTlX4+ZMPVOvmhDMQqrlfekZ+NQ==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} dependencies: - '@angular-devkit/core': 17.1.2 - '@angular-devkit/schematics': 17.1.2 + '@angular-devkit/core': 17.1.3 + '@angular-devkit/schematics': 17.1.3 jsonc-parser: 3.2.0 transitivePeerDependencies: - chokidar @@ -4132,26 +4134,26 @@ packages: resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: '@types/connect': 3.4.38 - '@types/node': 20.11.16 + '@types/node': 20.11.17 dev: true /@types/bonjour@3.5.13: resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} dependencies: - '@types/node': 20.11.16 + '@types/node': 20.11.17 dev: true /@types/connect-history-api-fallback@1.5.4: resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} dependencies: '@types/express-serve-static-core': 4.17.43 - '@types/node': 20.11.16 + '@types/node': 20.11.17 dev: true /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 20.11.16 + '@types/node': 20.11.17 dev: true /@types/cookie@0.4.1: @@ -4161,7 +4163,7 @@ packages: /@types/cors@2.8.17: resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} dependencies: - '@types/node': 20.11.16 + '@types/node': 20.11.17 dev: true /@types/eslint-scope@3.7.7: @@ -4185,7 +4187,7 @@ packages: /@types/express-serve-static-core@4.17.43: resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} dependencies: - '@types/node': 20.11.16 + '@types/node': 20.11.17 '@types/qs': 6.9.11 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -4207,7 +4209,7 @@ packages: /@types/http-proxy@1.17.14: resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} dependencies: - '@types/node': 20.11.16 + '@types/node': 20.11.17 dev: true /@types/jasmine@5.1.4: @@ -4229,11 +4231,11 @@ packages: /@types/node-forge@1.3.11: resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} dependencies: - '@types/node': 20.11.16 + '@types/node': 20.11.17 dev: true - /@types/node@20.11.16: - resolution: {integrity: sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==} + /@types/node@20.11.17: + resolution: {integrity: sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==} dependencies: undici-types: 5.26.5 @@ -4257,7 +4259,7 @@ packages: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: '@types/mime': 1.3.5 - '@types/node': 20.11.16 + '@types/node': 20.11.17 dev: true /@types/serve-index@1.9.4: @@ -4271,19 +4273,19 @@ packages: dependencies: '@types/http-errors': 2.0.4 '@types/mime': 3.0.4 - '@types/node': 20.11.16 + '@types/node': 20.11.17 dev: true /@types/sockjs@0.3.36: resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} dependencies: - '@types/node': 20.11.16 + '@types/node': 20.11.17 dev: true /@types/ws@8.5.10: resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} dependencies: - '@types/node': 20.11.16 + '@types/node': 20.11.17 dev: true /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3): @@ -4520,7 +4522,7 @@ packages: peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 dependencies: - vite: 5.0.12(@types/node@20.11.16)(less@4.2.0)(sass@1.69.7)(terser@5.26.0) + vite: 5.0.12(@types/node@20.11.17)(less@4.2.0)(sass@1.69.7)(terser@5.26.0) dev: true /@webassemblyjs/ast@1.11.6: @@ -4866,7 +4868,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /autoprefixer@10.4.17(postcss@8.4.34): + /autoprefixer@10.4.17(postcss@8.4.35): resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -4878,7 +4880,7 @@ packages: fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.34 + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true @@ -5080,7 +5082,7 @@ packages: /builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: true /bytes@3.0.0: @@ -5423,7 +5425,7 @@ packages: dom-serializer: 2.0.0 domhandler: 5.0.3 htmlparser2: 8.0.2 - postcss: 8.4.34 + postcss: 8.4.35 pretty-bytes: 5.6.0 /cross-spawn@7.0.3: @@ -5441,14 +5443,14 @@ packages: peerDependencies: webpack: ^5.0.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.34) - postcss: 8.4.34 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.34) - postcss-modules-local-by-default: 4.0.4(postcss@8.4.34) - postcss-modules-scope: 3.1.1(postcss@8.4.34) - postcss-modules-values: 4.0.0(postcss@8.4.34) + icss-utils: 5.1.0(postcss@8.4.35) + postcss: 8.4.35 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.35) + postcss-modules-local-by-default: 4.0.4(postcss@8.4.35) + postcss-modules-scope: 3.1.1(postcss@8.4.35) + postcss-modules-values: 4.0.0(postcss@8.4.35) postcss-value-parser: 4.2.0 - semver: 7.5.4 + semver: 7.6.0 webpack: 5.89.0(esbuild@0.19.11) dev: true @@ -5695,7 +5697,7 @@ packages: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.17 - '@types/node': 20.11.16 + '@types/node': 20.11.17 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.4.2 @@ -6598,13 +6600,13 @@ packages: safer-buffer: 2.1.2 dev: true - /icss-utils@5.1.0(postcss@8.4.34): + /icss-utils@5.1.0(postcss@8.4.35): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.34 + postcss: 8.4.35 dev: true /idb@7.1.1: @@ -6893,8 +6895,8 @@ packages: resolution: {integrity: sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==} dev: true - /jasmine-core@5.1.1: - resolution: {integrity: sha512-UrzO3fL7nnxlQXlvTynNAenL+21oUQRlzqQFsA2U11ryb4+NLOCOePZ70PTojEaUKhiFugh7dG0Q+I58xlPdWg==} + /jasmine-core@5.1.2: + resolution: {integrity: sha512-2oIUMGn00FdUiqz6epiiJr7xcFyNYj3rDcfmnzfkBnHyBQ3cBQUs4mmyGsOb7TTLb9kxk7dBcmEmqhDKkBoDyA==} dev: true /jest-diff@29.7.0: @@ -6914,7 +6916,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.11.16 + '@types/node': 20.11.17 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -7023,14 +7025,14 @@ packages: - supports-color dev: true - /karma-jasmine-html-reporter@2.1.0(jasmine-core@5.1.1)(karma-jasmine@5.1.0)(karma@6.4.2): + /karma-jasmine-html-reporter@2.1.0(jasmine-core@5.1.2)(karma-jasmine@5.1.0)(karma@6.4.2): resolution: {integrity: sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==} peerDependencies: jasmine-core: ^4.0.0 || ^5.0.0 karma: ^6.0.0 karma-jasmine: ^5.0.0 dependencies: - jasmine-core: 5.1.1 + jasmine-core: 5.1.2 karma: 6.4.2 karma-jasmine: 5.1.0(karma@6.4.2) dev: true @@ -7572,7 +7574,21 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true - /ngxtension@2.0.0(@angular/common@17.1.2)(@angular/core@17.1.2)(@use-gesture/vanilla@10.3.0)(rxjs@7.8.1): + /ng-mocks@14.12.1(@angular/common@17.1.3)(@angular/core@17.1.3)(@angular/forms@17.1.3)(@angular/platform-browser@17.1.3): + resolution: {integrity: sha512-5OdTYYOva7IkCCi6kTtgnII1hSfw+qYOM1ScrKhyo7iaI/ViV8xI4MGa89Ts7XnH6XqISSez2Un3zFSomkFpmg==} + peerDependencies: + '@angular/common': 5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14 || 15.0.0-alpha - 15 || 16.0.0-alpha - 16 || 17.0.0-alpha - 17 + '@angular/core': 5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14 || 15.0.0-alpha - 15 || 16.0.0-alpha - 16 || 17.0.0-alpha - 17 + '@angular/forms': 5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14 || 15.0.0-alpha - 15 || 16.0.0-alpha - 16 || 17.0.0-alpha - 17 + '@angular/platform-browser': 5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14 || 15.0.0-alpha - 15 || 16.0.0-alpha - 16 || 17.0.0-alpha - 17 + dependencies: + '@angular/common': 17.1.3(@angular/core@17.1.3)(rxjs@7.8.1) + '@angular/core': 17.1.3(rxjs@7.8.1)(zone.js@0.14.3) + '@angular/forms': 17.1.3(@angular/common@17.1.3)(@angular/core@17.1.3)(@angular/platform-browser@17.1.3)(rxjs@7.8.1) + '@angular/platform-browser': 17.1.3(@angular/animations@17.1.3)(@angular/common@17.1.3)(@angular/core@17.1.3) + dev: true + + /ngxtension@2.0.0(@angular/common@17.1.3)(@angular/core@17.1.3)(@use-gesture/vanilla@10.3.0)(rxjs@7.8.1): resolution: {integrity: sha512-S/MJ2rifemopwmq4rexfWmxnURGZeBxUwivG6ymbLusHsfHuQo821RzMl+fmJwMr4Yt5nLwUsralM7Vipd7/nQ==} engines: {node: '>=18'} peerDependencies: @@ -7581,8 +7597,8 @@ packages: '@use-gesture/vanilla': ^10.0.0 rxjs: ^6.0.0 || ^7.0.0 dependencies: - '@angular/common': 17.1.2(@angular/core@17.1.2)(rxjs@7.8.1) - '@angular/core': 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) + '@angular/common': 17.1.3(@angular/core@17.1.3)(rxjs@7.8.1) + '@angular/core': 17.1.3(rxjs@7.8.1)(zone.js@0.14.3) '@nx/devkit': 17.3.2(nx@17.3.2) '@use-gesture/vanilla': 10.3.0 nx: 17.3.2 @@ -7635,7 +7651,7 @@ packages: make-fetch-happen: 13.0.0 nopt: 7.2.0 proc-log: 3.0.0 - semver: 7.5.4 + semver: 7.6.0 tar: 6.2.0 which: 4.0.0 transitivePeerDependencies: @@ -7663,7 +7679,7 @@ packages: dependencies: hosted-git-info: 7.0.1 is-core-module: 2.13.1 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-license: 3.0.4 dev: true @@ -7688,7 +7704,7 @@ packages: resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: true /npm-normalize-package-bin@3.0.1: @@ -7702,7 +7718,7 @@ packages: dependencies: hosted-git-info: 7.0.1 proc-log: 3.0.0 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-name: 5.0.0 dev: true @@ -7720,7 +7736,7 @@ packages: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 11.0.1 - semver: 7.5.4 + semver: 7.6.0 dev: true /npm-registry-fetch@16.1.0: @@ -8199,29 +8215,29 @@ packages: find-up: 6.3.0 dev: true - /postcss-import@15.1.0(postcss@8.4.34): + /postcss-import@15.1.0(postcss@8.4.35): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.34 + postcss: 8.4.35 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 dev: true - /postcss-js@4.0.1(postcss@8.4.34): + /postcss-js@4.0.1(postcss@8.4.35): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.34 + postcss: 8.4.35 dev: true - /postcss-load-config@4.0.2(postcss@8.4.34): + /postcss-load-config@4.0.2(postcss@8.4.35): resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} peerDependencies: @@ -8234,7 +8250,7 @@ packages: optional: true dependencies: lilconfig: 3.0.0 - postcss: 8.4.34 + postcss: 8.4.35 yaml: 2.3.4 dev: true @@ -8248,60 +8264,60 @@ packages: cosmiconfig: 8.3.6(typescript@5.3.3) jiti: 1.21.0 postcss: 8.4.33 - semver: 7.5.4 + semver: 7.6.0 webpack: 5.89.0(esbuild@0.19.11) transitivePeerDependencies: - typescript dev: true - /postcss-modules-extract-imports@3.0.0(postcss@8.4.34): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.35): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.34 + postcss: 8.4.35 dev: true - /postcss-modules-local-by-default@4.0.4(postcss@8.4.34): + /postcss-modules-local-by-default@4.0.4(postcss@8.4.35): resolution: {integrity: sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.34) - postcss: 8.4.34 + icss-utils: 5.1.0(postcss@8.4.35) + postcss: 8.4.35 postcss-selector-parser: 6.0.15 postcss-value-parser: 4.2.0 dev: true - /postcss-modules-scope@3.1.1(postcss@8.4.34): + /postcss-modules-scope@3.1.1(postcss@8.4.35): resolution: {integrity: sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.34 + postcss: 8.4.35 postcss-selector-parser: 6.0.15 dev: true - /postcss-modules-values@4.0.0(postcss@8.4.34): + /postcss-modules-values@4.0.0(postcss@8.4.35): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.34) - postcss: 8.4.34 + icss-utils: 5.1.0(postcss@8.4.35) + postcss: 8.4.35 dev: true - /postcss-nested@6.0.1(postcss@8.4.34): + /postcss-nested@6.0.1(postcss@8.4.35): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.34 + postcss: 8.4.35 postcss-selector-parser: 6.0.15 dev: true @@ -8326,8 +8342,8 @@ packages: source-map-js: 1.0.2 dev: true - /postcss@8.4.34: - resolution: {integrity: sha512-4eLTO36woPSocqZ1zIrFD2K1v6wH7pY1uBh0JIM2KKfrVtGvPFiAku6aNOP0W1Wr9qwnaCsF0Z+CrVnryB2A8Q==} + /postcss@8.4.35: + resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 @@ -8450,7 +8466,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.11.16 + '@types/node': 20.11.17 long: 5.2.3 dev: false @@ -8650,7 +8666,7 @@ packages: adjust-sourcemap-loader: 4.0.0 convert-source-map: 1.9.0 loader-utils: 2.0.4 - postcss: 8.4.34 + postcss: 8.4.35 source-map: 0.6.1 dev: true @@ -9298,11 +9314,11 @@ packages: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.34 - postcss-import: 15.1.0(postcss@8.4.34) - postcss-js: 4.0.1(postcss@8.4.34) - postcss-load-config: 4.0.2(postcss@8.4.34) - postcss-nested: 6.0.1(postcss@8.4.34) + postcss: 8.4.35 + postcss-import: 15.1.0(postcss@8.4.35) + postcss-js: 4.0.1(postcss@8.4.35) + postcss-load-config: 4.0.2(postcss@8.4.35) + postcss-nested: 6.0.1(postcss@8.4.35) postcss-selector-parser: 6.0.15 resolve: 1.22.8 sucrase: 3.35.0 @@ -9633,7 +9649,7 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - /vite@5.0.12(@types/node@20.11.16)(less@4.2.0)(sass@1.69.7)(terser@5.26.0): + /vite@5.0.12(@types/node@20.11.17)(less@4.2.0)(sass@1.69.7)(terser@5.26.0): resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -9661,10 +9677,10 @@ packages: terser: optional: true dependencies: - '@types/node': 20.11.16 + '@types/node': 20.11.17 esbuild: 0.19.11 less: 4.2.0 - postcss: 8.4.34 + postcss: 8.4.35 rollup: 4.9.6 sass: 1.69.7 terser: 5.26.0 diff --git a/app/src/app/app.component.spec.ts b/app/src/app/app.component.spec.ts index 695cb10..b29fd07 100644 --- a/app/src/app/app.component.spec.ts +++ b/app/src/app/app.component.spec.ts @@ -1,30 +1,18 @@ -import { TestBed } from '@angular/core/testing'; import { ServiceWorkerModule } from '@angular/service-worker'; +import { MockBuilder, MockRender } from 'ng-mocks'; import { AppComponent } from './app.component'; describe('AppComponent', () => { - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [AppComponent, ServiceWorkerModule.register('', { enabled: false })], - }).compileComponents(); - }); + beforeEach(() => + MockBuilder(AppComponent, null).keep(ServiceWorkerModule.register('', { enabled: false }), { + export: true, + }), + ); it('should create the app', () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app).toBeTruthy(); - }); + const fixture = MockRender(AppComponent); - it(`should have the 'app' title`, () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app.title).toEqual('app'); - }); - - it('should render title', () => { - const fixture = TestBed.createComponent(AppComponent); - fixture.detectChanges(); - const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('h1')?.textContent).toContain('Welcome to app'); + const app = fixture.point.componentInstance; + expect(app).toBeTruthy(); }); }); diff --git a/app/src/app/loader-shell.component.spec.ts b/app/src/app/loader-shell.component.spec.ts index 5f836e0..99b2582 100644 --- a/app/src/app/loader-shell.component.spec.ts +++ b/app/src/app/loader-shell.component.spec.ts @@ -1,21 +1,20 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - +import { MockBuilder, MockRender, ngMocks } from 'ng-mocks'; import { LoaderShellComponent } from './loader-shell.component'; describe('LoaderShellComponent', () => { - let component: LoaderShellComponent; - let fixture: ComponentFixture; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [LoaderShellComponent], - }); - fixture = TestBed.createComponent(LoaderShellComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => MockBuilder(LoaderShellComponent, null)); it('should create', () => { + const fixture = MockRender(LoaderShellComponent); + + const component = fixture.point.componentInstance; expect(component).toBeTruthy(); }); + + it('has a progress bar', () => { + MockRender(LoaderShellComponent); + + const el = ngMocks.find('mat-progress-bar'); + expect(el).toBeTruthy(); + }); }); diff --git a/app/src/app/login/data/login.service.spec.ts b/app/src/app/login/data/login.service.spec.ts index 299b0d5..b29bb30 100644 --- a/app/src/app/login/data/login.service.spec.ts +++ b/app/src/app/login/data/login.service.spec.ts @@ -1,16 +1,14 @@ -import { TestBed } from '@angular/core/testing'; - +import { FIREBASE_AUTH } from '@app-shared/firebase/auth'; +import { MockBuilder, MockRender } from 'ng-mocks'; import { LoginService } from './login.service'; describe('LoginService', () => { - let service: LoginService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(LoginService); - }); + beforeEach(() => MockBuilder(LoginService, null).mock(FIREBASE_AUTH)); it('should be created', () => { + const fixture = MockRender(LoginService); + + const service = fixture.point.componentInstance; expect(service).toBeTruthy(); }); }); diff --git a/app/src/app/login/feature/login-flow.component.spec.ts b/app/src/app/login/feature/login-flow.component.spec.ts index 15fae17..3a53e60 100644 --- a/app/src/app/login/feature/login-flow.component.spec.ts +++ b/app/src/app/login/feature/login-flow.component.spec.ts @@ -1,22 +1,26 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - +import { signal } from '@angular/core'; +import { MockBuilder, MockInstance, MockRender } from 'ng-mocks'; +import { buildRxMethodSpy } from '../../../testing/helpers'; import { LoginFlowComponent } from './login-flow.component'; +import { LoginFlowStore } from './login-flow.store'; describe('LoginFlowComponent', () => { - let component: LoginFlowComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [LoginFlowComponent], - }).compileComponents(); + MockInstance.scope(); - fixture = TestBed.createComponent(LoginFlowComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => MockBuilder(LoginFlowComponent, null).mock(LoginFlowStore)); it('should create', () => { + const handleLoginLinkIfAvailableSpy = MockInstance( + LoginFlowStore, + 'handleLoginLinkIfAvailable', + buildRxMethodSpy('handleLoginLinkIfAvailable'), + ); + MockInstance(LoginFlowStore, 'status', signal('idle' as const)); + + const fixture = MockRender(LoginFlowComponent); + + const component = fixture.point.componentInstance; expect(component).toBeTruthy(); + expect(handleLoginLinkIfAvailableSpy).toHaveBeenCalled(); }); }); diff --git a/app/src/app/login/feature/login-flow.store.spec.ts b/app/src/app/login/feature/login-flow.store.spec.ts new file mode 100644 index 0000000..e6f8921 --- /dev/null +++ b/app/src/app/login/feature/login-flow.store.spec.ts @@ -0,0 +1,17 @@ +import { ActivatedRoute, Router } from '@angular/router'; +import { MockBuilder, MockRender } from 'ng-mocks'; +import { LoginService } from '../data/login.service'; +import { LoginFlowStore } from './login-flow.store'; + +describe('LoginFlowStore', () => { + beforeEach(() => + MockBuilder(LoginFlowStore).mock(LoginService).mock(ActivatedRoute).mock(Router), + ); + + it('should be created', () => { + const fixture = MockRender(LoginFlowStore); + + const service = fixture.point.componentInstance; + expect(service).toBeTruthy(); + }); +}); diff --git a/app/src/app/login/feature/login-page.component.spec.ts b/app/src/app/login/feature/login-page.component.spec.ts index 254bc8e..dd4eab0 100644 --- a/app/src/app/login/feature/login-page.component.spec.ts +++ b/app/src/app/login/feature/login-page.component.spec.ts @@ -1,21 +1,15 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - +import { MockBuilder, MockRender } from 'ng-mocks'; import { LoginPageComponent } from './login-page.component'; describe('LoginPageComponent', () => { - let component: LoginPageComponent; - let fixture: ComponentFixture; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [LoginPageComponent], - }); - fixture = TestBed.createComponent(LoginPageComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => MockBuilder(LoginPageComponent, null)); it('should create', () => { + const fixture = MockRender(LoginPageComponent); + + const component = fixture.point.componentInstance; expect(component).toBeTruthy(); }); + + // TODO: test the `@defer` block once https://github.com/help-me-mom/ng-mocks/issues/7742 is resolved. }); diff --git a/app/src/app/login/ui/login-form.component.spec.ts b/app/src/app/login/ui/login-form.component.spec.ts index 535c10f..542c85c 100644 --- a/app/src/app/login/ui/login-form.component.spec.ts +++ b/app/src/app/login/ui/login-form.component.spec.ts @@ -1,22 +1,41 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - +import { Component, Input } from '@angular/core'; +import { MockBuilder, MockRender, ngMocks } from 'ng-mocks'; import { LoginFormComponent } from './login-form.component'; +@Component({ + standalone: true, + template: ``, + imports: [LoginFormComponent], +}) +class TestComponent { + @Input() processing = false; +} + describe('LoginFormComponent', () => { - let component: LoginFormComponent; - let fixture: ComponentFixture; + beforeEach(() => + MockBuilder(TestComponent, null).keep(LoginFormComponent, { + shallow: true, + }), + ); - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [LoginFormComponent], - }).compileComponents(); + it('should create', () => { + const fixture = MockRender(TestComponent); - fixture = TestBed.createComponent(LoginFormComponent); - component = fixture.componentInstance; - fixture.detectChanges(); + const component = fixture.point.componentInstance; + expect(component).toBeTruthy(); }); - it('should create', () => { - expect(component).toBeTruthy(); + it('renders the form', () => { + MockRender(TestComponent); + + const el = ngMocks.find('form'); + expect(el).toBeTruthy(); + }); + + it('renders the progress bar when processing', () => { + MockRender(TestComponent, { processing: true }); + + const el = ngMocks.find('mat-progress-bar'); + expect(el).toBeTruthy(); }); }); diff --git a/app/src/app/shared/auth/data/auth.service.spec.ts b/app/src/app/shared/auth/data/auth.service.spec.ts index f1251ca..3708fb5 100644 --- a/app/src/app/shared/auth/data/auth.service.spec.ts +++ b/app/src/app/shared/auth/data/auth.service.spec.ts @@ -1,16 +1,15 @@ -import { TestBed } from '@angular/core/testing'; - +import { FIREBASE_AUTH } from '@app-shared/firebase/auth'; +import { RuntimeService } from '@app-shared/runtime.service'; +import { MockBuilder, MockRender } from 'ng-mocks'; import { AuthService } from './auth.service'; describe('AuthService', () => { - let service: AuthService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(AuthService); - }); + beforeEach(() => MockBuilder(AuthService).mock(RuntimeService).mock(FIREBASE_AUTH)); it('should be created', () => { + const fixture = MockRender(AuthService); + + const service = fixture.point.componentInstance; expect(service).toBeTruthy(); }); }); diff --git a/app/src/app/shared/auth/data/auth.store.spec.ts b/app/src/app/shared/auth/data/auth.store.spec.ts index aff4c0a..7283856 100644 --- a/app/src/app/shared/auth/data/auth.store.spec.ts +++ b/app/src/app/shared/auth/data/auth.store.spec.ts @@ -1,16 +1,19 @@ -import { TestBed } from '@angular/core/testing'; - +import { MockBuilder, MockInstance, MockRender } from 'ng-mocks'; +import { of } from 'rxjs'; +import { AuthService } from './auth.service'; import { AuthStore } from './auth.store'; describe('AuthStore', () => { - let service: AuthStore; + MockInstance.scope(); - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(AuthStore); - }); + beforeEach(() => MockBuilder(AuthStore).mock(AuthService)); it('should be created', () => { + MockInstance(AuthService, 'user$', of(null)); + + const fixture = MockRender(AuthStore); + + const service = fixture.point.componentInstance; expect(service).toBeTruthy(); }); }); diff --git a/app/src/app/shared/auth/data/logout.service.spec.ts b/app/src/app/shared/auth/data/logout.service.spec.ts index 234af9d..409a9cd 100644 --- a/app/src/app/shared/auth/data/logout.service.spec.ts +++ b/app/src/app/shared/auth/data/logout.service.spec.ts @@ -1,16 +1,14 @@ -import { TestBed } from '@angular/core/testing'; - +import { FIREBASE_AUTH } from '@app-shared/firebase/auth'; +import { MockBuilder, MockRender } from 'ng-mocks'; import { LogoutService } from './logout.service'; describe('LogoutService', () => { - let service: LogoutService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(LogoutService); - }); + beforeEach(() => MockBuilder(LogoutService).mock(FIREBASE_AUTH)); it('should be created', () => { + const fixture = MockRender(LogoutService); + + const service = fixture.point.componentInstance; expect(service).toBeTruthy(); }); }); diff --git a/app/src/app/shared/auth/util/auth.guard.spec.ts b/app/src/app/shared/auth/util/auth.guard.spec.ts index f1ada9d..224f92e 100644 --- a/app/src/app/shared/auth/util/auth.guard.spec.ts +++ b/app/src/app/shared/auth/util/auth.guard.spec.ts @@ -1,15 +1,15 @@ import { TestBed } from '@angular/core/testing'; -import { CanActivateFn } from '@angular/router'; - +import { CanMatchFn } from '@angular/router'; +import { RuntimeService } from '@app-shared/runtime.service'; +import { MockBuilder } from 'ng-mocks'; +import { AuthStore } from '../data/auth.store'; import { authGuard } from './auth.guard'; describe('authGuard', () => { - const executeGuard: CanActivateFn = (...guardParameters) => - TestBed.runInInjectionContext(() => authGuard(...guardParameters)); + const executeGuard: CanMatchFn = (...guardParameters) => + TestBed.runInInjectionContext(() => authGuard('authed')(...guardParameters)); - beforeEach(() => { - TestBed.configureTestingModule({}); - }); + beforeEach(() => MockBuilder().mock(RuntimeService).mock(AuthStore)); it('should be created', () => { expect(executeGuard).toBeTruthy(); diff --git a/app/src/app/shared/firebase/firestore.ts b/app/src/app/shared/firebase/firestore.ts index df09985..6abdf5d 100644 --- a/app/src/app/shared/firebase/firestore.ts +++ b/app/src/app/shared/firebase/firestore.ts @@ -13,4 +13,6 @@ function firestoreFactory(_: Auth) { return firestore; } -export const [injectFirestore] = createInjectionToken(firestoreFactory, { deps: [FIREBASE_AUTH] }); +export const [injectFirestore, , FIREBASE_FIRESTORE] = createInjectionToken(firestoreFactory, { + deps: [FIREBASE_AUTH], +}); diff --git a/app/src/app/shared/firebase/functions.ts b/app/src/app/shared/firebase/functions.ts index 8f8bc50..84c4f88 100644 --- a/app/src/app/shared/firebase/functions.ts +++ b/app/src/app/shared/firebase/functions.ts @@ -16,4 +16,6 @@ function functionsFactory(_: Auth) { return functions; } -export const [injectFunctions] = createInjectionToken(functionsFactory, { deps: [FIREBASE_AUTH] }); +export const [injectFunctions, , FIREBASE_FUNCTIONS] = createInjectionToken(functionsFactory, { + deps: [FIREBASE_AUTH], +}); diff --git a/app/src/app/shared/firebase/rtdb.ts b/app/src/app/shared/firebase/rtdb.ts index 13b4dd0..676f763 100644 --- a/app/src/app/shared/firebase/rtdb.ts +++ b/app/src/app/shared/firebase/rtdb.ts @@ -13,4 +13,6 @@ function rtdbFactory(_: Auth) { return rtdb; } -export const [injectRtdb] = createInjectionToken(rtdbFactory, { deps: [FIREBASE_AUTH] }); +export const [injectRtdb, , FIREBASE_RTDB] = createInjectionToken(rtdbFactory, { + deps: [FIREBASE_AUTH], +}); diff --git a/app/src/app/shared/firebase/storage.ts b/app/src/app/shared/firebase/storage.ts index 2909e6b..d68b79d 100644 --- a/app/src/app/shared/firebase/storage.ts +++ b/app/src/app/shared/firebase/storage.ts @@ -13,4 +13,6 @@ function storageFactory(_: Auth) { return storage; } -export const [injectStorage] = createInjectionToken(storageFactory, { deps: [FIREBASE_AUTH] }); +export const [injectStorage, , FIREBASE_STORAGE] = createInjectionToken(storageFactory, { + deps: [FIREBASE_AUTH], +}); diff --git a/app/src/app/shared/runtime.service.spec.ts b/app/src/app/shared/runtime.service.spec.ts index c811b86..9527fd8 100644 --- a/app/src/app/shared/runtime.service.spec.ts +++ b/app/src/app/shared/runtime.service.spec.ts @@ -1,16 +1,20 @@ -import { TestBed } from '@angular/core/testing'; - +import { MockBuilder, MockRender } from 'ng-mocks'; import { RuntimeService } from './runtime.service'; describe('RuntimeService', () => { - let service: RuntimeService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(RuntimeService); - }); + beforeAll(() => MockBuilder(RuntimeService, null)); it('should be created', () => { + const fixture = MockRender(RuntimeService); + + const service = fixture.point.componentInstance; expect(service).toBeTruthy(); }); + + it('should be running on the client', () => { + const fixture = MockRender(RuntimeService); + + const service = fixture.point.componentInstance; + expect(service.isServer).toBeFalse(); + }); }); diff --git a/app/src/app/website/feature/about-page.component.spec.ts b/app/src/app/website/feature/about-page.component.spec.ts index 245c40b..f8f610f 100644 --- a/app/src/app/website/feature/about-page.component.spec.ts +++ b/app/src/app/website/feature/about-page.component.spec.ts @@ -1,21 +1,21 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - +import { MockBuilder, MockRender, ngMocks } from 'ng-mocks'; import { AboutPageComponent } from './about-page.component'; describe('AboutPageComponent', () => { - let component: AboutPageComponent; - let fixture: ComponentFixture; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [AboutPageComponent], - }); - fixture = TestBed.createComponent(AboutPageComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => MockBuilder(AboutPageComponent, null)); it('should create', () => { + const fixture = MockRender(AboutPageComponent); + + const component = fixture.point.componentInstance; expect(component).toBeTruthy(); }); + + it('has a heading', () => { + MockRender(AboutPageComponent); + + const el = ngMocks.find('h1'); + expect(el).toBeTruthy(); + expect(el.nativeElement.textContent).toContain('About'); + }); }); diff --git a/app/src/app/website/feature/home-page.component.spec.ts b/app/src/app/website/feature/home-page.component.spec.ts index 4c4af9c..5ea9f8c 100644 --- a/app/src/app/website/feature/home-page.component.spec.ts +++ b/app/src/app/website/feature/home-page.component.spec.ts @@ -1,21 +1,23 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - +import { MockBuilder, MockRender, ngMocks } from 'ng-mocks'; import { HomePageComponent } from './home-page.component'; describe('HomePageComponent', () => { - let component: HomePageComponent; - let fixture: ComponentFixture; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [HomePageComponent], - }); - fixture = TestBed.createComponent(HomePageComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => MockBuilder(HomePageComponent, null)); it('should create', () => { + const fixture = MockRender(HomePageComponent); + + const component = fixture.point.componentInstance; expect(component).toBeTruthy(); }); + + it('has a heading', () => { + MockRender(HomePageComponent); + + const el = ngMocks.find('h1'); + expect(el).toBeTruthy(); + expect(el.nativeElement.textContent).toContain( + 'This is the FullStacks.dev Angular and Firebase template running on Firebase', + ); + }); }); diff --git a/app/src/app/website/ui/auth-status.component.spec.ts b/app/src/app/website/ui/auth-status.component.spec.ts index 9ba6438..2a2bcd2 100644 --- a/app/src/app/website/ui/auth-status.component.spec.ts +++ b/app/src/app/website/ui/auth-status.component.spec.ts @@ -1,22 +1,40 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - +import { signal } from '@angular/core'; +import { AuthStore } from '@app-shared/auth/data/auth.store'; +import { LogoutService } from '@app-shared/auth/data/logout.service'; +import { MockBuilder, MockInstance, MockRender, ngMocks } from 'ng-mocks'; import { AuthStatusComponent } from './auth-status.component'; describe('AuthStatusComponent', () => { - let component: AuthStatusComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [AuthStatusComponent], - }).compileComponents(); + MockInstance.scope(); - fixture = TestBed.createComponent(AuthStatusComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => MockBuilder(AuthStatusComponent, null).mock(AuthStore).mock(LogoutService)); it('should create', () => { + MockInstance(AuthStore, 'isAuthenticated', signal(false)); + + const fixture = MockRender(AuthStatusComponent); + + const component = fixture.point.componentInstance; expect(component).toBeTruthy(); }); + + it('shows a log in link when not authenticated', () => { + MockInstance(AuthStore, 'isAuthenticated', signal(false)); + + MockRender(AuthStatusComponent); + + const el = ngMocks.find('a'); + expect(el).toBeTruthy(); + expect(el.nativeElement.textContent).toContain('Log in'); + }); + + it('shows a log out button when authenticated', () => { + MockInstance(AuthStore, 'isAuthenticated', signal(true)); + + MockRender(AuthStatusComponent); + + const el = ngMocks.find('button'); + expect(el).toBeTruthy(); + expect(el.nativeElement.textContent).toContain('Log out'); + }); }); diff --git a/app/src/app/website/website-shell.component.spec.ts b/app/src/app/website/website-shell.component.spec.ts index 46ea859..6fc99ac 100644 --- a/app/src/app/website/website-shell.component.spec.ts +++ b/app/src/app/website/website-shell.component.spec.ts @@ -1,21 +1,22 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - +import { MockBuilder, MockRender, ngMocks } from 'ng-mocks'; import { WebsiteShellComponent } from './website-shell.component'; describe('WebsiteShellComponent', () => { - let component: WebsiteShellComponent; - let fixture: ComponentFixture; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [WebsiteShellComponent], - }); - fixture = TestBed.createComponent(WebsiteShellComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => MockBuilder(WebsiteShellComponent, null)); it('should create', () => { + const fixture = MockRender(WebsiteShellComponent); + + const component = fixture.point.componentInstance; expect(component).toBeTruthy(); }); + + it('has a header', () => { + MockRender(WebsiteShellComponent); + + const el = ngMocks.find('header'); + expect(el).toBeTruthy(); + }); + + // TODO: test the `@defer` block once https://github.com/help-me-mom/ng-mocks/issues/7742 is resolved. }); diff --git a/app/src/testing/helpers.ts b/app/src/testing/helpers.ts new file mode 100644 index 0000000..701c583 --- /dev/null +++ b/app/src/testing/helpers.ts @@ -0,0 +1,22 @@ +import type { Signal } from '@angular/core'; +import { noop, type Observable, type Unsubscribable } from 'rxjs'; + +// This reproduces the same types from @ngrx/signals (which aren't exported) +type RxMethodInput = Input | Observable | Signal; +type RxMethod = ((input: RxMethodInput) => Unsubscribable) & Unsubscribable; + +export const buildRxMethodSpy = (name: string) => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const rxMethodFn = (input: RxMethodInput) => { + return { + unsubscribe: noop, + }; + }; + rxMethodFn.unsubscribe = noop; + const spy = jasmine.createSpy>(name, rxMethodFn) as unknown as jasmine.Spy< + RxMethod + > & + Unsubscribable; + spy.unsubscribe = noop; + return spy; +}; diff --git a/firebase/.eslintrc.js b/firebase/.eslintrc.js index 369556f..af509bc 100644 --- a/firebase/.eslintrc.js +++ b/firebase/.eslintrc.js @@ -25,7 +25,12 @@ module.exports = { "prettier", ], parserOptions: { - project: ["tsconfig.json", "tsconfig.dev.json", "common/tsconfig.json"], + project: [ + "tsconfig.json", + "tsconfig.dev.json", + "tsconfig.spec.json", + "common/tsconfig.json", + ], sourceType: "module", }, rules: { diff --git a/firebase/.gitignore b/firebase/.gitignore index 4d56f3f..5e11d13 100644 --- a/firebase/.gitignore +++ b/firebase/.gitignore @@ -69,3 +69,4 @@ dist service-account* +*-coverage.html diff --git a/firebase/database.rules.json b/firebase/database.rules.json index 0caf5d2..f136602 100644 --- a/firebase/database.rules.json +++ b/firebase/database.rules.json @@ -1,6 +1,6 @@ { "rules": { - ".read": true, + ".read": false, ".write": false } } diff --git a/firebase/package.json b/firebase/package.json index b17a91a..a2a70f6 100644 --- a/firebase/package.json +++ b/firebase/package.json @@ -10,6 +10,7 @@ "functions:logs": "firebase functions:log", "emulators": "firebase emulators:start --project=demo-local --import=local/data --export-on-exit", "dev": "run-p functions:dev emulators", + "test": "firebase emulators:exec --project=demo-test \"pnpm vitest\"", "deploy:live": "firebase deploy -P live" }, "engines": { @@ -18,20 +19,23 @@ "main": "functions/lib/index.js", "dependencies": { "@google-cloud/functions-framework": "^3.3.0", - "firebase-admin": "^11.11.1", - "firebase-functions": "^4.5.0" + "firebase-admin": "^12.0.0", + "firebase-functions": "^4.7.0", + "ufo": "^1.4.0" }, "devDependencies": { + "@firebase/rules-unit-testing": "^3.0.1", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-import": "^2.29.1", "firebase-functions-test": "^3.1.1", - "firebase-tools": "^13.1.0", + "firebase-tools": "^13.2.1", "npm-run-all": "^4.1.5", "prettier": "^3.2.5", - "typescript": "~5.3.3" + "typescript": "~5.3.3", + "vitest": "^1.2.2" }, "private": true } diff --git a/firebase/pnpm-lock.yaml b/firebase/pnpm-lock.yaml index 7f039fd..23c00f7 100644 --- a/firebase/pnpm-lock.yaml +++ b/firebase/pnpm-lock.yaml @@ -9,13 +9,19 @@ dependencies: specifier: ^3.3.0 version: 3.3.0 firebase-admin: - specifier: ^11.11.1 - version: 11.11.1 + specifier: ^12.0.0 + version: 12.0.0 firebase-functions: - specifier: ^4.5.0 - version: 4.6.0(firebase-admin@11.11.1) + specifier: ^4.7.0 + version: 4.7.0(firebase-admin@12.0.0) + ufo: + specifier: ^1.4.0 + version: 1.4.0 devDependencies: + '@firebase/rules-unit-testing': + specifier: ^3.0.1 + version: 3.0.1(firebase@10.8.0) '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) @@ -33,10 +39,10 @@ devDependencies: version: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint@8.56.0) firebase-functions-test: specifier: ^3.1.1 - version: 3.1.1(firebase-admin@11.11.1)(firebase-functions@4.6.0)(jest@29.7.0) + version: 3.1.1(firebase-admin@12.0.0)(firebase-functions@4.7.0)(jest@29.7.0) firebase-tools: - specifier: ^13.1.0 - version: 13.1.0 + specifier: ^13.2.1 + version: 13.2.1 npm-run-all: specifier: ^4.1.5 version: 4.1.5 @@ -46,6 +52,9 @@ devDependencies: typescript: specifier: ~5.3.3 version: 5.3.3 + vitest: + specifier: ^1.2.2 + version: 1.2.2 packages: @@ -191,6 +200,7 @@ packages: resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} engines: {node: '>=6.9.0'} requiresBuild: true + dev: true /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} @@ -226,6 +236,7 @@ packages: hasBin: true dependencies: '@babel/types': 7.23.9 + dev: true /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} @@ -390,6 +401,7 @@ packages: '@babel/helper-string-parser': 7.23.4 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + dev: true /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -415,6 +427,213 @@ packages: kuler: 2.0.0 dev: true + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -458,62 +677,465 @@ packages: dependencies: text-decoding: 1.0.0 + /@fastify/busboy@2.1.0: + resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} + engines: {node: '>=14'} + dev: true + + /@firebase/analytics-compat@0.2.7(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27): + resolution: {integrity: sha512-17VCly4P0VFBDqaaal7m1nhyYQwsygtaTpSsnc51sFPRrr9XIYtnD8ficon9fneEGEoJQ2g7OtASvhwX9EbK8g==} + peerDependencies: + '@firebase/app-compat': 0.x + dependencies: + '@firebase/analytics': 0.10.1(@firebase/app@0.9.27) + '@firebase/analytics-types': 0.8.0 + '@firebase/app-compat': 0.2.27 + '@firebase/component': 0.6.5 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + dev: true + + /@firebase/analytics-types@0.8.0: + resolution: {integrity: sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==} + dev: true + + /@firebase/analytics@0.10.1(@firebase/app@0.9.27): + resolution: {integrity: sha512-5mnH1aQa99J5lZMJwTNzIoRc4yGXHf+fOn+EoEWhCDA3XGPweGHcylCbqq+G1wVJmfILL57fohDMa8ftMZ+44g==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/installations': 0.6.5(@firebase/app@0.9.27) + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + dev: true + + /@firebase/app-check-compat@0.3.9(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27): + resolution: {integrity: sha512-7LxyupQ8XeEHRh72mO+tqm69kHT6KbWi2KtFMGedJ6tNbwzFzojcXESMKN8RpADXbYoQgY3loWMJjMx4r2Zt7w==} + peerDependencies: + '@firebase/app-compat': 0.x + dependencies: + '@firebase/app-check': 0.8.2(@firebase/app@0.9.27) + '@firebase/app-check-types': 0.5.0 + '@firebase/app-compat': 0.2.27 + '@firebase/component': 0.6.5 + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + dev: true + + /@firebase/app-check-interop-types@0.3.0: + resolution: {integrity: sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==} + + /@firebase/app-check-types@0.5.0: + resolution: {integrity: sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==} + dev: true + + /@firebase/app-check@0.8.2(@firebase/app@0.9.27): + resolution: {integrity: sha512-A2B5+ldOguYAeqW1quFN5qNdruSNRrg4W59ag1Eq6QzxuHNIkrE+TrapfrW/z5NYFjCxAYqr/unVCgmk80Dwcg==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + dev: true + + /@firebase/app-compat@0.2.27: + resolution: {integrity: sha512-SYlqocfUDKPHR6MSFC8hree0BTiWFu5o8wbf6zFlYXyG41w7TcHp4wJi4H/EL5V6cM4kxwruXTJtqXX/fRAZtw==} + dependencies: + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + dev: true + /@firebase/app-types@0.9.0: resolution: {integrity: sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==} + /@firebase/app@0.9.27: + resolution: {integrity: sha512-p2Dvl1ge4kRsyK5+wWcmdAIE9MSwZ0pDKAYB51LZgZuz6wciUZk4E1yAEdkfQlRxuHehn+Ol9WP5Qk2XQZiHGg==} + dependencies: + '@firebase/component': 0.6.5 + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + idb: 7.1.1 + tslib: 2.6.2 + dev: true + + /@firebase/auth-compat@0.5.2(@firebase/app-compat@0.2.27)(@firebase/app-types@0.9.0)(@firebase/app@0.9.27): + resolution: {integrity: sha512-pRgje5BPCNR1vXyvGOVXwOHtv88A2WooXfklI8sV7/jWi03ExFqNfpJT26GUo/oD39NoKJ3Kt6rD5gVvdV7lMw==} + peerDependencies: + '@firebase/app-compat': 0.x + dependencies: + '@firebase/app-compat': 0.2.27 + '@firebase/auth': 1.6.0(@firebase/app@0.9.27) + '@firebase/auth-types': 0.12.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.4) + '@firebase/component': 0.6.5 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + undici: 5.26.5 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + - '@react-native-async-storage/async-storage' + dev: true + /@firebase/auth-interop-types@0.2.1: resolution: {integrity: sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==} - /@firebase/component@0.6.4: - resolution: {integrity: sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==} + /@firebase/auth-types@0.12.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.4): + resolution: {integrity: sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + dependencies: + '@firebase/app-types': 0.9.0 + '@firebase/util': 1.9.4 + dev: true + + /@firebase/auth@1.6.0(@firebase/app@0.9.27): + resolution: {integrity: sha512-Qhl35eJTV6BwvuueTPCY6x8kUlYyzALtjp/Ws0X3fw3AnjVVfuVb7oQ3Xh5VPVfMFhaIuUAd1KXwcAuIklkSDw==} + peerDependencies: + '@firebase/app': 0.x + '@react-native-async-storage/async-storage': ^1.18.1 + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + dependencies: + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + undici: 5.26.5 + dev: true + + /@firebase/component@0.6.5: + resolution: {integrity: sha512-2tVDk1ixi12sbDmmfITK8lxSjmcb73BMF6Qwc3U44hN/J1Fi1QY/Hnnb6klFlbB9/G16a3J3d4nXykye2EADTw==} + dependencies: + '@firebase/util': 1.9.4 + tslib: 2.6.2 + + /@firebase/database-compat@1.0.3: + resolution: {integrity: sha512-7tHEOcMbK5jJzHWyphPux4osogH/adWwncxdMxdBpB9g1DNIyY4dcz1oJdlkXGM/i/AjUBesZsd5CuwTRTBNTw==} + dependencies: + '@firebase/component': 0.6.5 + '@firebase/database': 1.0.3 + '@firebase/database-types': 1.0.1 + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + + /@firebase/database-types@1.0.1: + resolution: {integrity: sha512-Tmcmx5XgiI7UVF/4oGg2P3AOTfq3WKEPsm2yf+uXtN7uG/a4WTWhVMrXGYRY2ZUL1xPxv9V33wQRJ+CcrUhVXw==} + dependencies: + '@firebase/app-types': 0.9.0 + '@firebase/util': 1.9.4 + + /@firebase/database@1.0.3: + resolution: {integrity: sha512-9fjqLt9JzL46gw9+NRqsgQEMjgRwfd8XtzcKqG+UYyhVeFCdVRQ0Wp6Dw/dvYHnbH5vNEKzNv36dcB4p+PIAAA==} + dependencies: + '@firebase/app-check-interop-types': 0.3.0 + '@firebase/auth-interop-types': 0.2.1 + '@firebase/component': 0.6.5 + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + faye-websocket: 0.11.4 + tslib: 2.6.2 + + /@firebase/firestore-compat@0.3.25(@firebase/app-compat@0.2.27)(@firebase/app-types@0.9.0)(@firebase/app@0.9.27): + resolution: {integrity: sha512-+xI7WmsgZCBhMn/+uhDKcg+lsOUJ9FJyt5PGTzkFPbCsozWfeQZ7eVnfPh0rMkUOf0yIQ924RIe04gwvEIbcoQ==} + peerDependencies: + '@firebase/app-compat': 0.x + dependencies: + '@firebase/app-compat': 0.2.27 + '@firebase/component': 0.6.5 + '@firebase/firestore': 4.4.2(@firebase/app@0.9.27) + '@firebase/firestore-types': 3.0.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.4) + '@firebase/util': 1.9.4 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + dev: true + + /@firebase/firestore-types@3.0.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.4): + resolution: {integrity: sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + dependencies: + '@firebase/app-types': 0.9.0 + '@firebase/util': 1.9.4 + dev: true + + /@firebase/firestore@4.4.2(@firebase/app@0.9.27): + resolution: {integrity: sha512-YaX6ypa/RzU6OkxzUQlpSxwhOIWdTraCNz7sMsbaSEjjl/pj/QvX6TqjkdWGzuBYh2S6rz7ErhDO0g39oZZw/g==} + engines: {node: '>=10.10.0'} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + '@firebase/webchannel-wrapper': 0.10.5 + '@grpc/grpc-js': 1.9.14 + '@grpc/proto-loader': 0.7.10 + tslib: 2.6.2 + undici: 5.26.5 + dev: true + + /@firebase/functions-compat@0.3.7(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27): + resolution: {integrity: sha512-uXe6Kmku5lNogp3OpPBcOJbSvnaCOn+YxS3zlXKNU6Q/NLwcvO3RY1zwYyctCos2RemEw3KEQ7YdzcECXjHWLw==} + peerDependencies: + '@firebase/app-compat': 0.x + dependencies: + '@firebase/app-compat': 0.2.27 + '@firebase/component': 0.6.5 + '@firebase/functions': 0.11.1(@firebase/app@0.9.27) + '@firebase/functions-types': 0.6.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + dev: true + + /@firebase/functions-types@0.6.0: + resolution: {integrity: sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==} + dev: true + + /@firebase/functions@0.11.1(@firebase/app@0.9.27): + resolution: {integrity: sha512-3uUa1hB79Gmy6E1gHTfzoHeZolBeHc/I/n3+lOCDe6BOos9AHmzRjKygcFE/7VA2FJjitCE0K+OHI6+OuoY8fQ==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.9.27 + '@firebase/app-check-interop-types': 0.3.0 + '@firebase/auth-interop-types': 0.2.1 + '@firebase/component': 0.6.5 + '@firebase/messaging-interop-types': 0.2.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + undici: 5.26.5 + dev: true + + /@firebase/installations-compat@0.2.5(@firebase/app-compat@0.2.27)(@firebase/app-types@0.9.0)(@firebase/app@0.9.27): + resolution: {integrity: sha512-usvoIaog5CHEw082HXLrKAZ1qd4hIC3N/LDe2NqBgI3pkGE/7auLVM4Gn5gvyryp0x8z/IP1+d9fkGUj2OaGLQ==} + peerDependencies: + '@firebase/app-compat': 0.x + dependencies: + '@firebase/app-compat': 0.2.27 + '@firebase/component': 0.6.5 + '@firebase/installations': 0.6.5(@firebase/app@0.9.27) + '@firebase/installations-types': 0.5.0(@firebase/app-types@0.9.0) + '@firebase/util': 1.9.4 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + dev: true + + /@firebase/installations-types@0.5.0(@firebase/app-types@0.9.0): + resolution: {integrity: sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==} + peerDependencies: + '@firebase/app-types': 0.x + dependencies: + '@firebase/app-types': 0.9.0 + dev: true + + /@firebase/installations@0.6.5(@firebase/app@0.9.27): + resolution: {integrity: sha512-0xxnQWw8rSRzu0ZOCkZaO+MJ0LkDAfwwTB2Z1SxRK6FAz5xkxD1ZUwM0WbCRni49PKubCrZYOJ6yg7tSjU7AKA==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/util': 1.9.4 + idb: 7.1.1 + tslib: 2.6.2 + dev: true + + /@firebase/logger@0.4.0: + resolution: {integrity: sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==} + dependencies: + tslib: 2.6.2 + + /@firebase/messaging-compat@0.2.6(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27): + resolution: {integrity: sha512-Q2xC1s4L7Vpss7P7Gy6GuIS+xmJrf/vm9+gX76IK1Bo1TjoKwleCLHt1LHkPz5Rvqg5pTgzzI8qqPhBpZosFCg==} + peerDependencies: + '@firebase/app-compat': 0.x + dependencies: + '@firebase/app-compat': 0.2.27 + '@firebase/component': 0.6.5 + '@firebase/messaging': 0.12.6(@firebase/app@0.9.27) + '@firebase/util': 1.9.4 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + dev: true + + /@firebase/messaging-interop-types@0.2.0: + resolution: {integrity: sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==} + dev: true + + /@firebase/messaging@0.12.6(@firebase/app@0.9.27): + resolution: {integrity: sha512-IORsPp9IPWq4j4yEhTOZ6GAGi3gQwGc+4yexmTAlya+qeBRSdRnJg2iIU/aj+tcKDQYr9RQuQPgHHOdFIx//vA==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/installations': 0.6.5(@firebase/app@0.9.27) + '@firebase/messaging-interop-types': 0.2.0 + '@firebase/util': 1.9.4 + idb: 7.1.1 + tslib: 2.6.2 + dev: true + + /@firebase/performance-compat@0.2.5(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27): + resolution: {integrity: sha512-jJwJkVyDcIMBaVGrZ6CRGs4m5FCZsWB5QCWYI3FdsHyIa9/TfteNDilxj9wGciF2naFIHDW7TgE69U5dAH9Ktg==} + peerDependencies: + '@firebase/app-compat': 0.x + dependencies: + '@firebase/app-compat': 0.2.27 + '@firebase/component': 0.6.5 + '@firebase/logger': 0.4.0 + '@firebase/performance': 0.6.5(@firebase/app@0.9.27) + '@firebase/performance-types': 0.2.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + dev: true + + /@firebase/performance-types@0.2.0: + resolution: {integrity: sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==} + dev: true + + /@firebase/performance@0.6.5(@firebase/app@0.9.27): + resolution: {integrity: sha512-OzAGcWhOqEFH9GdwUuY0oC5FSlnMejcnmSAhR+EjpI7exdDvixyLyCR4txjSHYNTbumrFBG+EP8GO11CNXRaJA==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/installations': 0.6.5(@firebase/app@0.9.27) + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + dev: true + + /@firebase/remote-config-compat@0.2.5(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27): + resolution: {integrity: sha512-ImkNnLuGrD/bylBHDJigSY6LMwRrwt37wQbsGZhWG4QQ6KLzHzSf0nnFRRFvkOZodEUE57Ib8l74d6Yn/6TDUQ==} + peerDependencies: + '@firebase/app-compat': 0.x dependencies: - '@firebase/util': 1.9.3 + '@firebase/app-compat': 0.2.27 + '@firebase/component': 0.6.5 + '@firebase/logger': 0.4.0 + '@firebase/remote-config': 0.4.5(@firebase/app@0.9.27) + '@firebase/remote-config-types': 0.3.0 + '@firebase/util': 1.9.4 tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + dev: true - /@firebase/database-compat@0.3.4: - resolution: {integrity: sha512-kuAW+l+sLMUKBThnvxvUZ+Q1ZrF/vFJ58iUY9kAcbX48U03nVzIF6Tmkf0p3WVQwMqiXguSgtOPIB6ZCeF+5Gg==} + /@firebase/remote-config-types@0.3.0: + resolution: {integrity: sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==} + dev: true + + /@firebase/remote-config@0.4.5(@firebase/app@0.9.27): + resolution: {integrity: sha512-rGLqc/4OmxrS39RA9kgwa6JmgWytQuMo+B8pFhmGp3d++x2Hf9j+MLQfhOLyyUo64fNw20J19mLXhrXvKHsjZQ==} + peerDependencies: + '@firebase/app': 0.x dependencies: - '@firebase/component': 0.6.4 - '@firebase/database': 0.14.4 - '@firebase/database-types': 0.10.4 + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/installations': 0.6.5(@firebase/app@0.9.27) '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.3 + '@firebase/util': 1.9.4 tslib: 2.6.2 + dev: true - /@firebase/database-types@0.10.4: - resolution: {integrity: sha512-dPySn0vJ/89ZeBac70T+2tWWPiJXWbmRygYv0smT5TfE3hDrQ09eKMF3Y+vMlTdrMWq7mUdYW5REWPSGH4kAZQ==} + /@firebase/rules-unit-testing@3.0.1(firebase@10.8.0): + resolution: {integrity: sha512-nqKPJzzCub4Pskr0b58BQlevm1TjDIDskjFzEO9hhqVO2Oko4MXXTwxEjw/SIl1uz/rVd73jc0JgUrZ69PmEoQ==} + engines: {node: '>=10.10.0'} + peerDependencies: + firebase: ^10.0.0 dependencies: - '@firebase/app-types': 0.9.0 - '@firebase/util': 1.9.3 + firebase: 10.8.0 + node-fetch: 2.6.7 + transitivePeerDependencies: + - encoding + dev: true - /@firebase/database@0.14.4: - resolution: {integrity: sha512-+Ea/IKGwh42jwdjCyzTmeZeLM3oy1h0mFPsTy6OqCWzcu/KFqRAr5Tt1HRCOBlNOdbh84JPZC47WLU18n2VbxQ==} + /@firebase/storage-compat@0.3.4(@firebase/app-compat@0.2.27)(@firebase/app-types@0.9.0)(@firebase/app@0.9.27): + resolution: {integrity: sha512-Y0m5e2gS/wB9Ioth2X/Sgz76vcxvqgQrCmfa9qwhss/N31kxY2Gks6Frv0nrE18AjVfcSmcfDitqUwxcMOTRSg==} + peerDependencies: + '@firebase/app-compat': 0.x dependencies: - '@firebase/auth-interop-types': 0.2.1 - '@firebase/component': 0.6.4 - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.3 - faye-websocket: 0.11.4 + '@firebase/app-compat': 0.2.27 + '@firebase/component': 0.6.5 + '@firebase/storage': 0.12.1(@firebase/app@0.9.27) + '@firebase/storage-types': 0.8.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.4) + '@firebase/util': 1.9.4 tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + dev: true - /@firebase/logger@0.4.0: - resolution: {integrity: sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==} + /@firebase/storage-types@0.8.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.4): + resolution: {integrity: sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + dependencies: + '@firebase/app-types': 0.9.0 + '@firebase/util': 1.9.4 + dev: true + + /@firebase/storage@0.12.1(@firebase/app@0.9.27): + resolution: {integrity: sha512-KJ5NV7FUh54TeTlEjdkTTX60ciCKOp9EqlbLnpdcXUYRJg0Z4810TXbilPc1z7fTIG4iPjtdi95bGE9n4dBX8A==} + peerDependencies: + '@firebase/app': 0.x dependencies: + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/util': 1.9.4 tslib: 2.6.2 + undici: 5.26.5 + dev: true - /@firebase/util@1.9.3: - resolution: {integrity: sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==} + /@firebase/util@1.9.4: + resolution: {integrity: sha512-WLonYmS1FGHT97TsUmRN3qnTh5TeeoJp1Gg5fithzuAgdZOUtsYECfy7/noQ3llaguios8r5BuXSEiK82+UrxQ==} dependencies: tslib: 2.6.2 - /@google-cloud/firestore@6.8.0: - resolution: {integrity: sha512-JRpk06SmZXLGz0pNx1x7yU3YhkUXheKgH5hbDZ4kMsdhtfV5qPLJLRI4wv69K0cZorIk+zTMOwptue7hizo0eA==} - engines: {node: '>=12.0.0'} + /@firebase/webchannel-wrapper@0.10.5: + resolution: {integrity: sha512-eSkJsnhBWv5kCTSU1tSUVl9mpFu+5NXXunZc83le8GMjMlsWwQArSc7cJJ4yl+aDFY0NGLi0AjZWMn1axOrkRg==} + dev: true + + /@google-cloud/firestore@7.3.0: + resolution: {integrity: sha512-2IftQLAbCuVp0nTd3neeu+d3OYIegJpV/V9R4USQj51LzJcXPe8h8jZ7j3+svSNhJVGy6JsN0T1QqlJdMDhTwg==} + engines: {node: '>=14.0.0'} requiresBuild: true dependencies: fast-deep-equal: 3.1.3 functional-red-black-tree: 1.0.1 - google-gax: 3.6.1 + google-gax: 4.3.0 protobufjs: 7.2.6 transitivePeerDependencies: - encoding @@ -537,15 +1159,6 @@ packages: - supports-color dev: false - /@google-cloud/paginator@3.0.7: - resolution: {integrity: sha512-jJNutk0arIQhmpUUQJPJErsojqo834KcyB6X7a1mxuic8i1tKXxde8E69IZxNZawRIlZdIK2QY4WALvlK5MzYQ==} - engines: {node: '>=10'} - requiresBuild: true - dependencies: - arrify: 2.0.1 - extend: 3.0.2 - optional: true - /@google-cloud/paginator@4.0.1: resolution: {integrity: sha512-6G1ui6bWhNyHjmbYwavdN7mpVPRBtyDg/bfqBTAlwr413On2TnFNfDxc9UhTJctkgoCDgQXEKiRPLPR9USlkbQ==} engines: {node: '>=12.0.0'} @@ -554,6 +1167,15 @@ packages: extend: 3.0.2 dev: true + /@google-cloud/paginator@5.0.0: + resolution: {integrity: sha512-87aeg6QQcEPxGCOthnpUjvw4xAZ57G7pL8FS0C4e/81fr3FjkpUpibf1s2v5XGyGhUVGF4Jfg7yEcxqn2iUw1w==} + engines: {node: '>=14.0.0'} + requiresBuild: true + dependencies: + arrify: 2.0.1 + extend: 3.0.2 + optional: true + /@google-cloud/precise-date@3.0.1: resolution: {integrity: sha512-crK2rgNFfvLoSgcKJY7ZBOLW91IimVNmPfi1CL+kMTf78pTJYd29XqEVedAeBu4DwCJc0EDIp1MpctLgoPq+Uw==} engines: {node: '>=12.0.0'} @@ -562,15 +1184,22 @@ packages: /@google-cloud/projectify@3.0.0: resolution: {integrity: sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA==} engines: {node: '>=12.0.0'} + dev: true + + /@google-cloud/projectify@4.0.0: + resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==} + engines: {node: '>=14.0.0'} + requiresBuild: true + optional: true /@google-cloud/promisify@2.0.4: resolution: {integrity: sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA==} engines: {node: '>=10'} dev: true - /@google-cloud/promisify@3.0.1: - resolution: {integrity: sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA==} - engines: {node: '>=12'} + /@google-cloud/promisify@4.0.0: + resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==} + engines: {node: '>=14'} requiresBuild: true optional: true @@ -599,28 +1228,27 @@ packages: - supports-color dev: true - /@google-cloud/storage@6.12.0: - resolution: {integrity: sha512-78nNAY7iiZ4O/BouWMWTD/oSF2YtYgYB3GZirn0To6eBOugjXVoK+GXgUXOl+HlqbAOyHxAVXOlsj3snfbQ1dw==} - engines: {node: '>=12'} + /@google-cloud/storage@7.7.0: + resolution: {integrity: sha512-EMCEY+6JiIkx7Dt8NXVGGjy1vRdSGdHkoqZoqjJw7cEBkT7ZkX0c7puedfn1MamnzW5SX4xoa2jVq5u7OWBmkQ==} + engines: {node: '>=14'} requiresBuild: true dependencies: - '@google-cloud/paginator': 3.0.7 - '@google-cloud/projectify': 3.0.0 - '@google-cloud/promisify': 3.0.1 + '@google-cloud/paginator': 5.0.0 + '@google-cloud/projectify': 4.0.0 + '@google-cloud/promisify': 4.0.0 abort-controller: 3.0.0 async-retry: 1.3.3 compressible: 2.0.18 duplexify: 4.1.2 ent: 2.2.0 - extend: 3.0.2 fast-xml-parser: 4.3.4 - gaxios: 5.1.3 - google-auth-library: 8.9.0 + gaxios: 6.2.0 + google-auth-library: 9.6.3 mime: 3.0.0 mime-types: 2.1.35 p-limit: 3.1.0 - retry-request: 5.0.2 - teeny-request: 8.0.3 + retry-request: 7.0.2 + teeny-request: 9.0.0 uuid: 8.3.2 transitivePeerDependencies: - encoding @@ -634,6 +1262,15 @@ packages: dependencies: '@grpc/proto-loader': 0.7.10 '@types/node': 20.11.16 + dev: true + + /@grpc/grpc-js@1.9.14: + resolution: {integrity: sha512-nOpuzZ2G3IuMFN+UPPpKrC6NsLmWsTqSsm66IRfnBt1D4pwTqE27lmbpcPM+l2Ua4gE7PfjRHI6uedAy7hoXUw==} + engines: {node: ^8.13.0 || >=10.10.0} + requiresBuild: true + dependencies: + '@grpc/proto-loader': 0.7.10 + '@types/node': 20.11.16 /@grpc/proto-loader@0.7.10: resolution: {integrity: sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==} @@ -950,6 +1587,7 @@ packages: requiresBuild: true dependencies: lodash: 4.17.21 + dev: true /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -1067,6 +1705,110 @@ packages: /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + /@rollup/rollup-android-arm-eabi@4.9.6: + resolution: {integrity: sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.9.6: + resolution: {integrity: sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.9.6: + resolution: {integrity: sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.9.6: + resolution: {integrity: sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.9.6: + resolution: {integrity: sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.9.6: + resolution: {integrity: sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.9.6: + resolution: {integrity: sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.9.6: + resolution: {integrity: sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.9.6: + resolution: {integrity: sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.9.6: + resolution: {integrity: sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.9.6: + resolution: {integrity: sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.9.6: + resolution: {integrity: sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.9.6: + resolution: {integrity: sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true @@ -1128,6 +1870,11 @@ packages: '@types/connect': 3.4.38 '@types/node': 20.11.16 + /@types/caseless@0.12.5: + resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} + requiresBuild: true + optional: true + /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: @@ -1144,6 +1891,10 @@ packages: '@types/node': 20.11.16 dev: true + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true + /@types/express-serve-static-core@4.17.43: resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} dependencies: @@ -1182,6 +1933,7 @@ packages: dependencies: '@types/minimatch': 5.1.2 '@types/node': 20.11.16 + dev: true /@types/graceful-fs@4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -1224,6 +1976,7 @@ packages: /@types/linkify-it@3.0.5: resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} requiresBuild: true + dev: true /@types/lodash@4.14.202: resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} @@ -1238,10 +1991,12 @@ packages: dependencies: '@types/linkify-it': 3.0.5 '@types/mdurl': 1.0.5 + dev: true /@types/mdurl@1.0.5: resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} requiresBuild: true + dev: true /@types/mime@1.3.5: resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -1252,6 +2007,7 @@ packages: /@types/minimatch@5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} requiresBuild: true + dev: true /@types/node@20.11.16: resolution: {integrity: sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==} @@ -1268,12 +2024,23 @@ packages: /@types/range-parser@1.2.7: resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + /@types/request@2.48.12: + resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} + requiresBuild: true + dependencies: + '@types/caseless': 0.12.5 + '@types/node': 20.11.16 + '@types/tough-cookie': 4.0.5 + form-data: 2.5.1 + optional: true + /@types/rimraf@3.0.2: resolution: {integrity: sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==} requiresBuild: true dependencies: '@types/glob': 8.1.0 '@types/node': 20.11.16 + dev: true /@types/semver@7.5.6: resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} @@ -1296,6 +2063,11 @@ packages: resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} dev: true + /@types/tough-cookie@4.0.5: + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + requiresBuild: true + optional: true + /@types/triple-beam@1.3.5: resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} dev: true @@ -1446,6 +2218,45 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true + /@vitest/expect@1.2.2: + resolution: {integrity: sha512-3jpcdPAD7LwHUUiT2pZTj2U82I2Tcgg2oVPvKxhn6mDI2On6tfvPQTjAI4628GUGDZrCm4Zna9iQHm5cEexOAg==} + dependencies: + '@vitest/spy': 1.2.2 + '@vitest/utils': 1.2.2 + chai: 4.4.1 + dev: true + + /@vitest/runner@1.2.2: + resolution: {integrity: sha512-JctG7QZ4LSDXr5CsUweFgcpEvrcxOV1Gft7uHrvkQ+fsAVylmWQvnaAr/HDp3LAH1fztGMQZugIheTWjaGzYIg==} + dependencies: + '@vitest/utils': 1.2.2 + p-limit: 5.0.0 + pathe: 1.1.2 + dev: true + + /@vitest/snapshot@1.2.2: + resolution: {integrity: sha512-SmGY4saEw1+bwE1th6S/cZmPxz/Q4JWsl7LvbQIky2tKE35US4gd0Mjzqfr84/4OD0tikGWaWdMja/nWL5NIPA==} + dependencies: + magic-string: 0.30.7 + pathe: 1.1.2 + pretty-format: 29.7.0 + dev: true + + /@vitest/spy@1.2.2: + resolution: {integrity: sha512-k9Gcahssw8d7X3pSLq3e3XEu/0L78mUkCjivUqCQeXJm9clfXR/Td8+AP+VC1O6fKPIDLcHDTAmBOINVuv6+7g==} + dependencies: + tinyspy: 2.2.1 + dev: true + + /@vitest/utils@1.2.2: + resolution: {integrity: sha512-WKITBHLsBHlpjnDQahr+XK6RE7MiAsgrIkr0pGhQ9ygoxBfUeG0lUG5iLlzqjmKSlBv3+j5EGsriBzh+C3Tq9g==} + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true + /abbrev@2.0.0: resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -1472,11 +2283,18 @@ packages: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: acorn: 8.11.3 + dev: true + + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + dev: true /acorn@8.11.3: resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} hasBin: true + dev: true /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} @@ -1494,7 +2312,6 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} @@ -1653,6 +2470,7 @@ packages: /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true /array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} @@ -1749,6 +2567,10 @@ packages: resolution: {integrity: sha512-1Sd1LrodN0XYxYeZcN1J4xYZvmvTwD5tDWaPUGPIzH1mFsmzsPnVtd2exWhecMjtZk/wYWjNZJiD3b1SLCeJqg==} dev: true + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + /ast-types@0.13.4: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} @@ -1779,7 +2601,6 @@ packages: /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true /available-typed-arrays@1.0.6: resolution: {integrity: sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==} @@ -1859,6 +2680,7 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -1898,6 +2720,7 @@ packages: /bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} requiresBuild: true + dev: true /body-parser@1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} @@ -1956,11 +2779,13 @@ packages: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 + dev: true /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 + dev: true /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} @@ -1974,8 +2799,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001584 - electron-to-chromium: 1.4.657 + caniuse-lite: 1.0.30001585 + electron-to-chromium: 1.4.661 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.3) dev: true @@ -2013,6 +2838,11 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + /cacache@18.0.2: resolution: {integrity: sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==} engines: {node: ^16.14.0 || >=18.0.0} @@ -2061,8 +2891,8 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001584: - resolution: {integrity: sha512-LOz7CCQ9M1G7OjJOF9/mzmqmj3jE/7VOmrfw6Mgs0E8cjOsbRXQJHsPBfmBOXDskXKrHLyyW3n7kpDW/4BsfpQ==} + /caniuse-lite@1.0.30001585: + resolution: {integrity: sha512-yr2BWR1yLXQ8fMpdS/4ZZXpseBgE7o4g41x3a6AJOqZuOi+iE/WdJYAuZ6Y95i4Ohd2Y+9MzIWRR+uGABH4s3Q==} dev: true /cardinal@2.1.1: @@ -2079,6 +2909,20 @@ packages: requiresBuild: true dependencies: lodash: 4.17.21 + dev: true + + /chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -2094,6 +2938,7 @@ packages: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 + dev: true /chalk@5.3.0: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} @@ -2109,6 +2954,12 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 + dev: true + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -2281,7 +3132,6 @@ packages: engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 - dev: true /commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} @@ -2326,6 +3176,7 @@ packages: /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true /config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -2518,6 +3369,13 @@ packages: optional: true dev: true + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -2529,6 +3387,7 @@ packages: /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} @@ -2571,7 +3430,6 @@ packages: /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - dev: true /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} @@ -2642,8 +3500,8 @@ packages: /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - /electron-to-chromium@1.4.657: - resolution: {integrity: sha512-On2ymeleg6QbRuDk7wNgDdXtNqlJLM2w4Agx1D/RiTmItiL+a9oq5p7HUa2ZtkAtGBe/kil2dq/7rPfkbe0r5w==} + /electron-to-chromium@1.4.661: + resolution: {integrity: sha512-AFg4wDHSOk5F+zA8aR+SVIOabu7m0e7BiJnigCvPXzIGy731XENw/lmNxTySpVFtkFEy+eyt4oHhh5FF3NjQNw==} dev: true /emittery@0.13.1: @@ -2690,6 +3548,7 @@ packages: /entities@2.1.0: resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} requiresBuild: true + dev: true /env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} @@ -2786,6 +3645,37 @@ packages: is-symbol: 1.0.4 dev: true + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + dev: true + /escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -2805,6 +3695,7 @@ packages: /escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} + dev: true /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} @@ -2823,6 +3714,7 @@ packages: optionator: 0.8.3 optionalDependencies: source-map: 0.6.1 + dev: true /escodegen@2.1.0: resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} @@ -2930,6 +3822,7 @@ packages: /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true /eslint@8.56.0: resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} @@ -2985,11 +3878,13 @@ packages: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 + dev: true /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + dev: true /esquery@1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} @@ -3009,14 +3904,23 @@ packages: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} requiresBuild: true + dev: true /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + dev: true + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.5 + dev: true /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + dev: true /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} @@ -3045,6 +3949,21 @@ packages: strip-final-newline: 2.0.0 dev: true + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.2.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + /exegesis-express@4.0.0: resolution: {integrity: sha512-V2hqwTtYRj0bj43K4MCtm0caD97YWkqOUHFMRCBW5L1x9IjyqOEc7Xa4oQjjiFbeFOSQzzwPV+BzXsQjSz08fw==} engines: {node: '>=6.0.0', npm: '>5.0.0'} @@ -3171,9 +4090,11 @@ packages: /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true /fast-text-encoding@1.0.6: resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==} + dev: true /fast-url-parser@1.1.3: resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} @@ -3281,26 +4202,26 @@ packages: path-exists: 4.0.0 dev: true - /firebase-admin@11.11.1: - resolution: {integrity: sha512-UyEbq+3u6jWzCYbUntv/HuJiTixwh36G1R9j0v71mSvGAx/YZEWEW7uSGLYxBYE6ckVRQoKMr40PYUEzrm/4dg==} + /firebase-admin@12.0.0: + resolution: {integrity: sha512-wBrrSSsKV++/+O8E7O/C7/wL0nbG/x4Xv4yatz/+sohaZ+LsnWtYUcrd3gZutO86hLpDex7xgyrkKbgulmtVyQ==} engines: {node: '>=14'} dependencies: '@fastify/busboy': 1.2.1 - '@firebase/database-compat': 0.3.4 - '@firebase/database-types': 0.10.4 + '@firebase/database-compat': 1.0.3 + '@firebase/database-types': 1.0.1 '@types/node': 20.11.16 jsonwebtoken: 9.0.2 jwks-rsa: 3.1.0 node-forge: 1.3.1 uuid: 9.0.1 optionalDependencies: - '@google-cloud/firestore': 6.8.0 - '@google-cloud/storage': 6.12.0 + '@google-cloud/firestore': 7.3.0 + '@google-cloud/storage': 7.7.0 transitivePeerDependencies: - encoding - supports-color - /firebase-functions-test@3.1.1(firebase-admin@11.11.1)(firebase-functions@4.6.0)(jest@29.7.0): + /firebase-functions-test@3.1.1(firebase-admin@12.0.0)(firebase-functions@4.7.0)(jest@29.7.0): resolution: {integrity: sha512-IlDzcd+8rUd87hD1ZAPXsc3cX5JGdfpKmKlUJWdZJlErdyznwXssPQzbRPX8rh929ZhwmzGpubFBt7itkXAg+A==} engines: {node: '>=14.0.0'} peerDependencies: @@ -3309,15 +4230,15 @@ packages: jest: '>=28.0.0' dependencies: '@types/lodash': 4.14.202 - firebase-admin: 11.11.1 - firebase-functions: 4.6.0(firebase-admin@11.11.1) + firebase-admin: 12.0.0 + firebase-functions: 4.7.0(firebase-admin@12.0.0) jest: 29.7.0 lodash: 4.17.21 ts-deepmerge: 2.0.7 dev: true - /firebase-functions@4.6.0(firebase-admin@11.11.1): - resolution: {integrity: sha512-mY3wuU/Qe+vjVyoCIv0TGXcqr5iQhsMlccLBSAHJ+cWgbszo915mcFP8E9adtXoitqf/4CVzzTwYcfPdCQo2RQ==} + /firebase-functions@4.7.0(firebase-admin@12.0.0): + resolution: {integrity: sha512-YgWqA9otWlBUouY4I2yd0vq9SyQdQ6GJxfH7wGJclzS2pzBQHcU5HhE1Vz/xTrWcKJyw8uPN98WtSE9/APUJJg==} engines: {node: '>=14.10.0'} hasBin: true peerDependencies: @@ -3327,15 +4248,15 @@ packages: '@types/express': 4.17.3 cors: 2.8.5 express: 4.18.2 - firebase-admin: 11.11.1 + firebase-admin: 12.0.0 node-fetch: 2.7.0 protobufjs: 7.2.6 transitivePeerDependencies: - encoding - supports-color - /firebase-tools@13.1.0: - resolution: {integrity: sha512-kY3p3nCv3kjf90AZMhrMu4PT6/otI1kcZGpJJkN9cqBbvj/nNYnnCVy4bXdCVqgCX1+s4G4FwuoW07f9xv/kXw==} + /firebase-tools@13.2.1: + resolution: {integrity: sha512-Dx0h9P4m0T1wWz6Yjk+VOZA/Fef1iM09gpbAxBl+2GAO3KcN3kQf8fvhlzkisCqAnVxB8U2rYRI6ZR1JwY+cqQ==} engines: {node: '>=18.0.0 || >=20.0.0'} hasBin: true dependencies: @@ -3405,6 +4326,39 @@ packages: - utf-8-validate dev: true + /firebase@10.8.0: + resolution: {integrity: sha512-UJpC24vw8JFuHEOQyArBGKTUd7+kohLISCzHyn0M/prP0KOTx2io1eyLliEid330QqnWI7FOlPxoU97qecCSfQ==} + dependencies: + '@firebase/analytics': 0.10.1(@firebase/app@0.9.27) + '@firebase/analytics-compat': 0.2.7(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27) + '@firebase/app': 0.9.27 + '@firebase/app-check': 0.8.2(@firebase/app@0.9.27) + '@firebase/app-check-compat': 0.3.9(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27) + '@firebase/app-compat': 0.2.27 + '@firebase/app-types': 0.9.0 + '@firebase/auth': 1.6.0(@firebase/app@0.9.27) + '@firebase/auth-compat': 0.5.2(@firebase/app-compat@0.2.27)(@firebase/app-types@0.9.0)(@firebase/app@0.9.27) + '@firebase/database': 1.0.3 + '@firebase/database-compat': 1.0.3 + '@firebase/firestore': 4.4.2(@firebase/app@0.9.27) + '@firebase/firestore-compat': 0.3.25(@firebase/app-compat@0.2.27)(@firebase/app-types@0.9.0)(@firebase/app@0.9.27) + '@firebase/functions': 0.11.1(@firebase/app@0.9.27) + '@firebase/functions-compat': 0.3.7(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27) + '@firebase/installations': 0.6.5(@firebase/app@0.9.27) + '@firebase/installations-compat': 0.2.5(@firebase/app-compat@0.2.27)(@firebase/app-types@0.9.0)(@firebase/app@0.9.27) + '@firebase/messaging': 0.12.6(@firebase/app@0.9.27) + '@firebase/messaging-compat': 0.2.6(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27) + '@firebase/performance': 0.6.5(@firebase/app@0.9.27) + '@firebase/performance-compat': 0.2.5(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27) + '@firebase/remote-config': 0.4.5(@firebase/app@0.9.27) + '@firebase/remote-config-compat': 0.2.5(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27) + '@firebase/storage': 0.12.1(@firebase/app@0.9.27) + '@firebase/storage-compat': 0.3.4(@firebase/app-compat@0.2.27)(@firebase/app-types@0.9.0)(@firebase/app@0.9.27) + '@firebase/util': 1.9.4 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + dev: true + /flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -3437,6 +4391,16 @@ packages: dev: true optional: true + /form-data@2.5.1: + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + engines: {node: '>= 0.12'} + requiresBuild: true + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + optional: true + /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -3494,6 +4458,7 @@ packages: /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true /fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -3551,6 +4516,21 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: true + + /gaxios@6.2.0: + resolution: {integrity: sha512-H6+bHeoEAU5D6XNc6mPKeN5dLZqEDs9Gpk6I+SZBEzK5So58JVrHPmevNi35fRl1J9Y5TaeLW0kYx3pCJ1U2mQ==} + engines: {node: '>=14'} + requiresBuild: true + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.2 + is-stream: 2.0.1 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + - supports-color + optional: true /gcp-metadata@4.3.1: resolution: {integrity: sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==} @@ -3568,11 +4548,24 @@ packages: engines: {node: '>=12'} requiresBuild: true dependencies: - gaxios: 5.1.3 + gaxios: 5.1.3 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /gcp-metadata@6.1.0: + resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==} + engines: {node: '>=14'} + requiresBuild: true + dependencies: + gaxios: 6.2.0 json-bigint: 1.0.0 transitivePeerDependencies: - encoding - supports-color + optional: true /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} @@ -3584,6 +4577,10 @@ packages: engines: {node: 6.* || 8.* || >= 10.*} requiresBuild: true + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true + /get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} @@ -3604,6 +4601,11 @@ packages: engines: {node: '>=10'} dev: true + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + /get-symbol-description@1.0.1: resolution: {integrity: sha512-KmuibvwbWaM4BHcBRYwJfZ1JxyJeBwB8ct9YYu67SvYdbEIlcQ2e56dHxfbobqW38GXo8/zDFqJeGtHiVbWyQw==} engines: {node: '>= 0.4'} @@ -3673,6 +4675,7 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 + dev: true /glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} @@ -3684,6 +4687,7 @@ packages: inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 + dev: true /global-dirs@3.0.1: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} @@ -3757,6 +4761,23 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: true + + /google-auth-library@9.6.3: + resolution: {integrity: sha512-4CacM29MLC2eT9Cey5GDVK4Q8t+MMp8+OEdOaqD9MG6b0dOyLORaaeJMPQ7EESVgm/+z5EKYyFLxgzBJlJgyHQ==} + engines: {node: '>=14'} + requiresBuild: true + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 6.2.0 + gcp-metadata: 6.1.0 + gtoken: 7.1.0 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + optional: true /google-gax@3.6.1: resolution: {integrity: sha512-g/lcUjGcB6DSw2HxgEmCDOrI/CByOwqRvsuUvNalHUK2iPPPlmAIpbMbl62u0YufGMr8zgE3JL7th6dCb1Ry+w==} @@ -3781,6 +4802,29 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: true + + /google-gax@4.3.0: + resolution: {integrity: sha512-SWHX72gbccNfpPoeTkNmZJxmLyKWeLr0+5Ch6qtrf4oAN8KFXnyXe5EixatILnJWufM3L59MRZ4hSJWVJ3IQqw==} + engines: {node: '>=14'} + requiresBuild: true + dependencies: + '@grpc/grpc-js': 1.9.14 + '@grpc/proto-loader': 0.7.10 + '@types/long': 4.0.2 + abort-controller: 3.0.0 + duplexify: 4.1.2 + google-auth-library: 9.6.3 + node-fetch: 2.7.0 + object-hash: 3.0.0 + proto3-json-serializer: 2.0.1 + protobufjs: 7.2.6 + retry-request: 7.0.2 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + optional: true /google-p12-pem@3.1.4: resolution: {integrity: sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg==} @@ -3797,6 +4841,7 @@ packages: requiresBuild: true dependencies: node-forge: 1.3.1 + dev: true /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} @@ -3809,6 +4854,7 @@ packages: /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -3837,6 +4883,19 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: true + + /gtoken@7.1.0: + resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} + engines: {node: '>=14.0.0'} + requiresBuild: true + dependencies: + gaxios: 6.2.0 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + optional: true /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} @@ -3849,6 +4908,7 @@ packages: /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + dev: true /has-property-descriptors@1.0.1: resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} @@ -3950,13 +5010,17 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} dev: true + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -3972,6 +5036,10 @@ packages: dev: true optional: true + /idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + dev: true + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: true @@ -4020,6 +5088,7 @@ packages: dependencies: once: 1.4.0 wrappy: 1.0.2 + dev: true /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -4250,11 +5319,17 @@ packages: /is-stream-ended@0.1.4: resolution: {integrity: sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==} + dev: true /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -4862,6 +5937,7 @@ packages: requiresBuild: true dependencies: xmlcreate: 2.0.4 + dev: true /jsdoc@4.0.2: resolution: {integrity: sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==} @@ -4884,6 +5960,7 @@ packages: requizzle: 0.2.4 strip-json-comments: 3.1.1 underscore: 1.13.6 + dev: true /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} @@ -4941,6 +6018,10 @@ packages: hasBin: true dev: true + /jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + dev: true + /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: @@ -5020,6 +6101,7 @@ packages: requiresBuild: true dependencies: graceful-fs: 4.2.11 + dev: true /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} @@ -5049,6 +6131,7 @@ packages: dependencies: prelude-ls: 1.1.2 type-check: 0.3.2 + dev: true /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} @@ -5079,6 +6162,7 @@ packages: requiresBuild: true dependencies: uc.micro: 1.0.6 + dev: true /load-json-file@4.0.0: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} @@ -5090,6 +6174,14 @@ packages: strip-bom: 3.0.0 dev: true + /local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + dependencies: + mlly: 1.5.0 + pkg-types: 1.0.3 + dev: true + /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -5167,6 +6259,7 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true /log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} @@ -5191,6 +6284,12 @@ packages: /long@5.2.3: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + dependencies: + get-func-name: 2.0.2 + dev: true + /lru-cache@10.2.0: resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} @@ -5227,6 +6326,13 @@ packages: lodash.clonedeep: 4.5.0 lru-cache: 4.0.2 + /magic-string@0.30.7: + resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -5277,6 +6383,7 @@ packages: dependencies: '@types/markdown-it': 12.2.3 markdown-it: 12.3.2 + dev: true /markdown-it@12.3.2: resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} @@ -5288,6 +6395,7 @@ packages: linkify-it: 3.0.3 mdurl: 1.0.1 uc.micro: 1.0.6 + dev: true /marked-terminal@5.2.0(marked@4.3.0): resolution: {integrity: sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==} @@ -5308,10 +6416,12 @@ packages: resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} engines: {node: '>= 12'} hasBin: true + dev: true /mdurl@1.0.1: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} requiresBuild: true + dev: true /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} @@ -5380,16 +6490,23 @@ packages: engines: {node: '>=6'} dev: true + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 + dev: true /minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 + dev: true /minimatch@6.2.0: resolution: {integrity: sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==} @@ -5495,6 +6612,16 @@ packages: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true + dev: true + + /mlly@1.5.0: + resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==} + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.0.3 + ufo: 1.4.0 + dev: true /morgan@1.10.0: resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} @@ -5528,6 +6655,12 @@ packages: dev: true optional: true + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -5551,6 +6684,18 @@ packages: lodash: 4.17.21 dev: true + /node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + /node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -5641,6 +6786,13 @@ packages: path-key: 3.1.1 dev: true + /npm-run-path@5.2.0: + resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -5732,6 +6884,13 @@ packages: mimic-fn: 2.1.0 dev: true + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + /open@6.4.0: resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} engines: {node: '>=8'} @@ -5756,6 +6915,7 @@ packages: prelude-ls: 1.1.2 type-check: 0.3.2 word-wrap: 1.2.5 + dev: true /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} @@ -5806,6 +6966,13 @@ packages: dependencies: yocto-queue: 0.1.0 + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -5892,6 +7059,7 @@ packages: /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} + dev: true /path-key@2.0.1: resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} @@ -5903,6 +7071,11 @@ packages: engines: {node: '>=8'} dev: true + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -5937,6 +7110,14 @@ packages: engines: {node: '>=8'} dev: true + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true @@ -5969,6 +7150,14 @@ packages: find-up: 4.1.0 dev: true + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.1 + mlly: 1.5.0 + pathe: 1.1.2 + dev: true + /portfinder@1.0.32: resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} engines: {node: '>= 0.12.0'} @@ -5980,10 +7169,20 @@ packages: - supports-color dev: true + /postcss@8.4.35: + resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} requiresBuild: true + dev: true /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -6058,6 +7257,15 @@ packages: requiresBuild: true dependencies: protobufjs: 7.2.6 + dev: true + + /proto3-json-serializer@2.0.1: + resolution: {integrity: sha512-8awBvjO+FwkMd6gNoGFZyqkHZXCFd54CIYTb6De7dPaufGJ2XNW+QUNqbMr8MaAocMdb+KpsD4rxEOaTBDCffA==} + engines: {node: '>=14.0.0'} + requiresBuild: true + dependencies: + protobufjs: 7.2.6 + optional: true /protobufjs-cli@1.1.1(protobufjs@7.2.4): resolution: {integrity: sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==} @@ -6078,6 +7286,7 @@ packages: semver: 7.6.0 tmp: 0.2.1 uglify-js: 3.17.4 + dev: true /protobufjs@7.2.4: resolution: {integrity: sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==} @@ -6096,6 +7305,7 @@ packages: '@protobufjs/utf8': 1.1.0 '@types/node': 20.11.16 long: 5.2.3 + dev: true /protobufjs@7.2.6: resolution: {integrity: sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==} @@ -6340,6 +7550,7 @@ packages: requiresBuild: true dependencies: lodash: 4.17.21 + dev: true /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} @@ -6388,6 +7599,20 @@ packages: extend: 3.0.2 transitivePeerDependencies: - supports-color + dev: true + + /retry-request@7.0.2: + resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==} + engines: {node: '>=14'} + requiresBuild: true + dependencies: + '@types/request': 2.48.12 + extend: 3.0.2 + teeny-request: 9.0.0 + transitivePeerDependencies: + - encoding + - supports-color + optional: true /retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} @@ -6410,6 +7635,30 @@ packages: hasBin: true dependencies: glob: 7.2.3 + dev: true + + /rollup@4.9.6: + resolution: {integrity: sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.9.6 + '@rollup/rollup-android-arm64': 4.9.6 + '@rollup/rollup-darwin-arm64': 4.9.6 + '@rollup/rollup-darwin-x64': 4.9.6 + '@rollup/rollup-linux-arm-gnueabihf': 4.9.6 + '@rollup/rollup-linux-arm64-gnu': 4.9.6 + '@rollup/rollup-linux-arm64-musl': 4.9.6 + '@rollup/rollup-linux-riscv64-gnu': 4.9.6 + '@rollup/rollup-linux-x64-gnu': 4.9.6 + '@rollup/rollup-linux-x64-musl': 4.9.6 + '@rollup/rollup-win32-arm64-msvc': 4.9.6 + '@rollup/rollup-win32-ia32-msvc': 4.9.6 + '@rollup/rollup-win32-x64-msvc': 4.9.6 + fsevents: 2.3.3 + dev: true /router@1.3.8: resolution: {integrity: sha512-461UFH44NtSfIlS83PUg2N7OZo86BC/kB3dY77gJdsODsBhhw7+2uE0tzTINxrY9CahCUVk1VhpWCA5i1yoIEg==} @@ -6588,6 +7837,10 @@ packages: get-intrinsic: 1.2.4 object-inspect: 1.13.1 + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true @@ -6597,7 +7850,6 @@ packages: engines: {node: '>=14'} requiresBuild: true dev: true - optional: true /simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -6638,6 +7890,11 @@ packages: smart-buffer: 4.2.0 dev: true + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + /source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} dependencies: @@ -6648,6 +7905,7 @@ packages: /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + dev: true /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -6691,6 +7949,10 @@ packages: escape-string-regexp: 2.0.0 dev: true + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -6700,6 +7962,10 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + /std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + dev: true + /stream-chain@2.2.5: resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} dev: true @@ -6823,6 +8089,11 @@ packages: engines: {node: '>=6'} dev: true + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -6831,6 +8102,13 @@ packages: /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + dev: true + + /strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + dependencies: + acorn: 8.11.3 + dev: true /strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} @@ -6883,6 +8161,7 @@ packages: engines: {node: '>=8'} dependencies: has-flag: 4.0.0 + dev: true /supports-color@8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} @@ -6935,9 +8214,9 @@ packages: - supports-color dev: true - /teeny-request@8.0.3: - resolution: {integrity: sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww==} - engines: {node: '>=12'} + /teeny-request@9.0.0: + resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} + engines: {node: '>=14'} requiresBuild: true dependencies: http-proxy-agent: 5.0.0 @@ -6974,6 +8253,20 @@ packages: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true + /tinybench@2.6.0: + resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + dev: true + + /tinypool@0.8.2: + resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + dev: true + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -6986,6 +8279,7 @@ packages: engines: {node: '>=8.17.0'} dependencies: rimraf: 3.0.2 + dev: true /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -6995,6 +8289,7 @@ packages: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} requiresBuild: true + dev: true /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -7052,6 +8347,7 @@ packages: requiresBuild: true dependencies: prelude-ls: 1.1.2 + dev: true /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -7150,12 +8446,17 @@ packages: /uc.micro@1.0.6: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} requiresBuild: true + dev: true + + /ufo@1.4.0: + resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true + dev: true /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} @@ -7169,10 +8470,18 @@ packages: /underscore@1.13.6: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} requiresBuild: true + dev: true /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + /undici@5.26.5: + resolution: {integrity: sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.0 + dev: true + /unique-filename@3.0.0: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -7314,6 +8623,118 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + /vite-node@1.2.2: + resolution: {integrity: sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.1.1 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite@5.1.1: + resolution: {integrity: sha512-wclpAgY3F1tR7t9LL5CcHC41YPkQIpKUGeIuT8MdNwNZr6OqOTLs7JX5vIHAtzqLWXts0T+GDrh9pN2arneKqg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.19.12 + postcss: 8.4.35 + rollup: 4.9.6 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitest@1.2.2: + resolution: {integrity: sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': ^1.0.0 + '@vitest/ui': ^1.0.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@vitest/expect': 1.2.2 + '@vitest/runner': 1.2.2 + '@vitest/snapshot': 1.2.2 + '@vitest/spy': 1.2.2 + '@vitest/utils': 1.2.2 + acorn-walk: 8.3.2 + cac: 6.7.14 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.7 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 1.3.0 + tinybench: 2.6.0 + tinypool: 0.8.2 + vite: 5.1.1 + vite-node: 1.2.2 + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: @@ -7396,6 +8817,15 @@ packages: dev: true optional: true + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + /widest-line@3.1.0: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} engines: {node: '>=8'} @@ -7433,6 +8863,7 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} requiresBuild: true + dev: true /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} @@ -7504,6 +8935,7 @@ packages: /xmlcreate@2.0.4: resolution: {integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==} requiresBuild: true + dev: true /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} @@ -7546,6 +8978,11 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + /zip-stream@4.1.1: resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} engines: {node: '>= 10'} diff --git a/firebase/test/firestore/firestore-rules.spec.ts b/firebase/test/firestore/firestore-rules.spec.ts new file mode 100644 index 0000000..667a4e4 --- /dev/null +++ b/firebase/test/firestore/firestore-rules.spec.ts @@ -0,0 +1,73 @@ +import { + RulesTestEnvironment, + assertFails, + initializeTestEnvironment, +} from '@firebase/rules-unit-testing'; +import { deleteDoc, doc, getDoc, setDoc, setLogLevel } from 'firebase/firestore'; +import { createWriteStream, readFileSync } from 'node:fs'; +import { get as httpGet } from 'node:http'; +import { afterAll, beforeAll, beforeEach, describe, test } from 'vitest'; +import { TEST_PROJECT_ID } from '../helpers/constants'; +import { getFirestoreMeta } from '../helpers/firestore'; + +let testEnv: RulesTestEnvironment; + +beforeAll(async () => { + // Silence expected rules rejections from Firestore SDK. Unexpected rejections + // will still bubble up and will be thrown as an error (failing the tests as needed). + setLogLevel('error'); + const { host, port } = getFirestoreMeta(TEST_PROJECT_ID); + testEnv = await initializeTestEnvironment({ + projectId: TEST_PROJECT_ID, + firestore: { + host, + port, + rules: readFileSync('firestore.rules', 'utf8'), + }, + }); +}); + +afterAll(async () => { + await testEnv.cleanup(); + + // Write the coverage report to a file + const { coverageUrl } = getFirestoreMeta(TEST_PROJECT_ID); + const coverageFile = './firestore-coverage.html'; + const fstream = createWriteStream(coverageFile); + await new Promise((resolve, reject) => { + httpGet(coverageUrl, (res) => { + res.pipe(fstream, { end: true }); + res.on('end', resolve); + res.on('error', reject); + }); + }); + console.log(`View firestore rule coverage information at ${coverageFile}\n`); +}); + +beforeEach(async () => { + await testEnv.clearFirestore(); +}); + +describe('Firestore security rules', () => { + test('does not allow any reads, writes or deletes to an unused collection by an unauthenticated user', async () => { + const db = testEnv.unauthenticatedContext().firestore(); + const docRef = doc(db, 'unused/1'); + + await assertFails(getDoc(docRef)); + + await assertFails(setDoc(docRef, { name: 'someone' })); + + await assertFails(deleteDoc(docRef)); + }); + + test('does not allow any reads, writes or deletes to an unused collection by an authenticated user', async () => { + const db = testEnv.authenticatedContext('alice').firestore(); + const docRef = doc(db, 'unused/1'); + + await assertFails(getDoc(docRef)); + + await assertFails(setDoc(docRef, { name: 'someone' })); + + await assertFails(deleteDoc(docRef)); + }); +}); diff --git a/firebase/test/helpers/constants.ts b/firebase/test/helpers/constants.ts new file mode 100644 index 0000000..e460db1 --- /dev/null +++ b/firebase/test/helpers/constants.ts @@ -0,0 +1,4 @@ +if (!process.env.GCLOUD_PROJECT) { + throw new Error('Missing GCLOUD_PROJECT env var'); +} +export const TEST_PROJECT_ID = process.env.GCLOUD_PROJECT; diff --git a/firebase/test/helpers/firestore.ts b/firebase/test/helpers/firestore.ts new file mode 100644 index 0000000..c54a126 --- /dev/null +++ b/firebase/test/helpers/firestore.ts @@ -0,0 +1,17 @@ +import { parseHost } from 'ufo'; + +export function getFirestoreMeta(projectId: string) { + const { hostname: host, port } = parseHost(process.env.FIRESTORE_EMULATOR_HOST); + + if (!host || !port) { + throw new Error('Could not parse host and/or port from FIRESTORE_EMULATOR_HOST'); + } + + const coverageUrl = `http://${host}:${port}/emulator/v1/projects/${projectId}:ruleCoverage.html`; + + return { + host, + port: Number(port), + coverageUrl, + }; +} diff --git a/firebase/test/helpers/rtdb.ts b/firebase/test/helpers/rtdb.ts new file mode 100644 index 0000000..015ed7d --- /dev/null +++ b/firebase/test/helpers/rtdb.ts @@ -0,0 +1,17 @@ +import { parseHost } from 'ufo'; + +export function getRtdbMeta(databaseName: string) { + const { hostname: host, port } = parseHost(process.env.FIREBASE_DATABASE_EMULATOR_HOST); + + if (!host || !port) { + throw new Error('Could not parse host and/or port from FIREBASE_DATABASE_EMULATOR_HOST'); + } + + const coverageUrl = `http://${host}:${port}/.inspect/coverage?ns=${databaseName}`; + + return { + host, + port: Number(port), + coverageUrl, + }; +} diff --git a/firebase/test/helpers/storage.ts b/firebase/test/helpers/storage.ts new file mode 100644 index 0000000..68e1f13 --- /dev/null +++ b/firebase/test/helpers/storage.ts @@ -0,0 +1,14 @@ +import { parseHost } from 'ufo'; + +export function getStorageMeta() { + const { hostname: host, port } = parseHost(process.env.FIREBASE_STORAGE_EMULATOR_HOST); + + if (!host || !port) { + throw new Error('Could not parse host and/or port from FIREBASE_STORAGE_EMULATOR_HOST'); + } + + return { + host, + port: Number(port), + }; +} diff --git a/firebase/test/rtdb/rtdb-rules.spec.ts b/firebase/test/rtdb/rtdb-rules.spec.ts new file mode 100644 index 0000000..b5d50b4 --- /dev/null +++ b/firebase/test/rtdb/rtdb-rules.spec.ts @@ -0,0 +1,73 @@ +import { + RulesTestEnvironment, + assertFails, + initializeTestEnvironment, +} from '@firebase/rules-unit-testing'; +import { get, ref, remove, set } from 'firebase/database'; +import { createWriteStream, readFileSync } from 'node:fs'; +import { get as httpGet } from 'node:http'; +import { afterAll, beforeAll, beforeEach, describe, test } from 'vitest'; +import { TEST_PROJECT_ID } from '../helpers/constants'; +import { getRtdbMeta } from '../helpers/rtdb'; + +const DATABASE_NAME = 'demo-test-rtdb'; + +let testEnv: RulesTestEnvironment; + +beforeAll(async () => { + const { host, port } = getRtdbMeta(DATABASE_NAME); + testEnv = await initializeTestEnvironment({ + projectId: TEST_PROJECT_ID, + database: { + port, + host, + rules: readFileSync('database.rules.json', 'utf8'), + }, + }); +}); + +afterAll(async () => { + await testEnv.cleanup(); + + // Write the coverage report to a file + const { coverageUrl } = getRtdbMeta(DATABASE_NAME); + const coverageFile = './rtdb-coverage.html'; + const fstream = createWriteStream(coverageFile); + await new Promise((resolve, reject) => { + httpGet(coverageUrl, (res) => { + res.pipe(fstream, { end: true }); + res.on('end', resolve); + res.on('error', reject); + }); + }); + + console.log(`View database rule coverage information at ${coverageFile}\n`); +}); + +beforeEach(async () => { + await testEnv.clearDatabase(); +}); + +describe('RTDB security rules', () => { + test('does not allow any reads, writes or deletes to an unused key by an unauthenticated user', async () => { + const db = testEnv.unauthenticatedContext().database(); + const valueRef = ref(db, 'unusedKey'); + + await assertFails(get(valueRef)); + + await assertFails(set(valueRef, 'foo')); + + await assertFails(remove(valueRef)); + }); + + test('does not allow any reads, writes or deletes to an unused key by an authenticated user', async () => { + const db = testEnv.authenticatedContext('alice').database(); + const valueRef = ref(db, 'unusedKey'); + + await assertFails(get(valueRef)); + + await assertFails(set(valueRef, 'foo')); + + await assertFails(remove(valueRef)); + }); +}); diff --git a/firebase/test/storage/storage-rules.spec.ts b/firebase/test/storage/storage-rules.spec.ts new file mode 100644 index 0000000..71c8e97 --- /dev/null +++ b/firebase/test/storage/storage-rules.spec.ts @@ -0,0 +1,57 @@ +import { + RulesTestEnvironment, + assertFails, + initializeTestEnvironment, +} from '@firebase/rules-unit-testing'; +import { deleteObject, getDownloadURL, ref, updateMetadata } from 'firebase/storage'; +import { readFileSync } from 'node:fs'; +import { afterAll, beforeAll, beforeEach, describe, test } from 'vitest'; +import { TEST_PROJECT_ID } from '../helpers/constants'; +import { getStorageMeta } from '../helpers/storage'; + +let testEnv: RulesTestEnvironment; + +beforeAll(async () => { + const { host, port } = getStorageMeta(); + testEnv = await initializeTestEnvironment({ + projectId: TEST_PROJECT_ID, + storage: { + port, + host, + rules: readFileSync('storage.rules', 'utf8'), + }, + }); +}); + +afterAll(async () => { + await testEnv.cleanup(); +}); + +beforeEach(async () => { + await testEnv.clearStorage(); +}); + +describe('Storage security rules', () => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + test('does not allow any reads, writes or deletes to an unused object by an unauthenticated user', async () => { + const storage = testEnv.unauthenticatedContext().storage(); + const objectRef = ref(storage, 'unused.jpg'); + + await assertFails(getDownloadURL(objectRef)); + + await assertFails(updateMetadata(objectRef, { cacheControl: 'public, max-age=300' })); + + await assertFails(deleteObject(objectRef)); + }); + + test('does not allow any reads, writes or deletes to an unused object by an authenticated user', async () => { + const storage = testEnv.authenticatedContext('alice').storage(); + const objectRef = ref(storage, 'unused.jpg'); + + await assertFails(getDownloadURL(objectRef)); + + await assertFails(updateMetadata(objectRef, { cacheControl: 'public, max-age=300' })); + + await assertFails(deleteObject(objectRef)); + }); +}); diff --git a/firebase/tsconfig.dev.json b/firebase/tsconfig.dev.json index c0f990d..ea73316 100644 --- a/firebase/tsconfig.dev.json +++ b/firebase/tsconfig.dev.json @@ -1,3 +1,4 @@ { - "include": [".eslintrc.js"] + "extends": "./tsconfig.json", + "include": [".eslintrc.js", "vite.config.ts"] } diff --git a/firebase/tsconfig.json b/firebase/tsconfig.json index 5812f4d..258fae8 100644 --- a/firebase/tsconfig.json +++ b/firebase/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { "baseUrl": "./", + "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "module": "commonjs", "noFallthroughCasesInSwitch": true, @@ -12,9 +13,9 @@ "rootDir": "functions/src", "sourceMap": true, "strict": true, - "target": "es2017", + "target": "es2017" }, "compileOnSave": true, "include": ["functions/src"], - "references": [{ "path": "./common" }], + "references": [{ "path": "./common" }] } diff --git a/firebase/tsconfig.spec.json b/firebase/tsconfig.spec.json new file mode 100644 index 0000000..1530e73 --- /dev/null +++ b/firebase/tsconfig.spec.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "include": ["test"] +} diff --git a/firebase/vite.config.ts b/firebase/vite.config.ts new file mode 100644 index 0000000..8595dd3 --- /dev/null +++ b/firebase/vite.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from 'vitest/config'; + +// https://vitejs.dev/config/ +export default defineConfig({ + test: { + typecheck: { + enabled: true, + tsconfig: './tsconfig.spec.json', + }, + }, +}); diff --git a/project.code-workspace b/project.code-workspace index 3bb3e79..6247fa3 100644 --- a/project.code-workspace +++ b/project.code-workspace @@ -1,5 +1,8 @@ { "folders": [ + { + "path": ".github" + }, { "path": "app" },