diff --git a/src/.eslintrc.json b/src/.eslintrc.json index e6a80eef..9e92a48b 100644 --- a/src/.eslintrc.json +++ b/src/.eslintrc.json @@ -1,23 +1,24 @@ { "root": true, - "ignorePatterns": [ - "projects/**/*" - ], + "ignorePatterns": ["projects/**/*"], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "./tsconfig.json", // <-- Point to your project's "tsconfig.json" or create a new one. + "ecmaVersion": 2020, + "sourceType": "module" + }, + "plugins": ["unused-imports", "optimize-regex", "simple-import-sort"], "overrides": [ { - "files": [ - "*.ts" - ], + "files": ["*.ts"], "parserOptions": { - "project": [ - "tsconfig.json", - "e2e/tsconfig.json" - ], + "project": ["tsconfig.json", "e2e/tsconfig.json"], "createDefaultProgram": true }, "extends": [ "plugin:@angular-eslint/recommended", - "plugin:@angular-eslint/template/process-inline-templates" + "plugin:@angular-eslint/template/process-inline-templates", + "plugin:deprecation/recommended" ], "rules": { "@angular-eslint/directive-selector": [ @@ -35,18 +36,27 @@ "prefix": "app", "style": "kebab-case" } - ] + ], + "no-unused-vars": "off", // or "@typescript-eslint/no-unused-vars": "off", + "unused-imports/no-unused-imports": "error", + "unused-imports/no-unused-vars": [ + "warn", + { + "vars": "all", + "varsIgnorePattern": "^_", + "args": "after-used", + "argsIgnorePattern": "^_" + } + ], + "optimize-regex/optimize-regex": "warn", + "simple-import-sort/imports": "warn", + "simple-import-sort/exports": "warn" } }, { - "files": [ - "*.html" - ], - "extends": [ - "plugin:@angular-eslint/template/recommended" - ], - "rules": { - } + "files": ["*.html"], + "extends": ["plugin:@angular-eslint/template/recommended"], + "rules": {} } ] } diff --git a/src/angular.json b/src/angular.json index 02b445b1..4c94f3bb 100644 --- a/src/angular.json +++ b/src/angular.json @@ -177,8 +177,7 @@ "schematicCollections": [ "@cypress/schematic", "@angular-eslint/schematics", - "@angular-eslint/schematics", "@schematics/angular" ] } -} \ No newline at end of file +} diff --git a/src/cypress/tsconfig.json b/src/cypress/tsconfig.json index 79d78d7e..0bffa078 100644 --- a/src/cypress/tsconfig.json +++ b/src/cypress/tsconfig.json @@ -2,7 +2,7 @@ "extends": "../tsconfig.json", "include": ["**/*.ts"], "compilerOptions": { - "sourceMap": false, + "sourceMap": true, "types": ["cypress"] } } diff --git a/src/dependency-tree.txt b/src/dependency-tree.txt new file mode 100644 index 00000000..2015381e --- /dev/null +++ b/src/dependency-tree.txt @@ -0,0 +1,4197 @@ +dynamicbible@4.0.0 /Users/walljm/projects/walljm/dynamicbible/src +├─┬ @angular-devkit/architect@0.1702.1 +│ ├─┬ @angular-devkit/core@17.2.1 +│ │ ├─┬ ajv-formats@2.1.1 +│ │ │ └── ajv@8.12.0 deduped +│ │ ├─┬ ajv@8.12.0 +│ │ │ ├── fast-deep-equal@3.1.3 deduped +│ │ │ ├── json-schema-traverse@1.0.0 deduped +│ │ │ ├── require-from-string@2.0.2 +│ │ │ └── uri-js@4.4.1 deduped +│ │ ├── chokidar@3.6.0 deduped +│ │ ├── jsonc-parser@3.2.1 deduped +│ │ ├── picomatch@4.0.1 deduped +│ │ ├── rxjs@7.8.1 deduped +│ │ └── source-map@0.7.4 +│ └── rxjs@7.8.1 deduped +├─┬ @angular-devkit/build-angular@17.2.1 +│ ├─┬ @ampproject/remapping@2.2.1 +│ │ ├─┬ @jridgewell/gen-mapping@0.3.4 +│ │ │ ├── @jridgewell/set-array@1.1.2 +│ │ │ ├── @jridgewell/sourcemap-codec@1.4.15 deduped +│ │ │ └── @jridgewell/trace-mapping@0.3.23 deduped +│ │ └─┬ @jridgewell/trace-mapping@0.3.23 +│ │ ├── @jridgewell/resolve-uri@3.1.2 +│ │ └── @jridgewell/sourcemap-codec@1.4.15 deduped +│ ├── @angular-devkit/architect@0.1702.1 deduped +│ ├─┬ @angular-devkit/build-webpack@0.1702.1 +│ │ ├── @angular-devkit/architect@0.1702.1 deduped +│ │ ├── rxjs@7.8.1 deduped +│ │ ├── webpack-dev-server@4.15.1 deduped +│ │ └── webpack@5.90.1 deduped +│ ├── @angular-devkit/core@17.2.1 deduped +│ ├── @angular/compiler-cli@17.2.3 deduped +│ ├── UNMET OPTIONAL DEPENDENCY @angular/localize@^17.0.0 +│ ├── UNMET OPTIONAL DEPENDENCY @angular/platform-server@^17.0.0 +│ ├── UNMET OPTIONAL DEPENDENCY @angular/service-worker@^17.0.0 +│ ├─┬ @babel/core@7.23.9 +│ │ ├── @ampproject/remapping@2.2.1 deduped +│ │ ├─┬ @babel/code-frame@7.23.5 +│ │ │ ├─┬ @babel/highlight@7.23.4 +│ │ │ │ ├── @babel/helper-validator-identifier@7.22.20 deduped +│ │ │ │ ├── chalk@2.4.2 deduped +│ │ │ │ └── js-tokens@4.0.0 +│ │ │ └─┬ chalk@2.4.2 +│ │ │ ├─┬ ansi-styles@3.2.1 +│ │ │ │ └─┬ color-convert@1.9.3 +│ │ │ │ └── color-name@1.1.3 +│ │ │ ├── escape-string-regexp@1.0.5 deduped +│ │ │ └─┬ supports-color@5.5.0 +│ │ │ └── has-flag@3.0.0 +│ │ ├── @babel/generator@7.23.6 deduped +│ │ ├─┬ @babel/helper-compilation-targets@7.23.6 +│ │ │ ├── @babel/compat-data@7.23.5 deduped +│ │ │ ├── @babel/helper-validator-option@7.23.5 deduped +│ │ │ ├── browserslist@4.23.0 deduped +│ │ │ ├─┬ lru-cache@5.1.1 +│ │ │ │ └── yallist@3.1.1 +│ │ │ └── semver@6.3.1 +│ │ ├─┬ @babel/helper-module-transforms@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-environment-visitor@7.22.20 deduped +│ │ │ ├── @babel/helper-module-imports@7.22.15 deduped +│ │ │ ├─┬ @babel/helper-simple-access@7.22.5 +│ │ │ │ └── @babel/types@7.24.0 deduped +│ │ │ ├── @babel/helper-split-export-declaration@7.22.6 deduped +│ │ │ └── @babel/helper-validator-identifier@7.22.20 +│ │ ├─┬ @babel/helpers@7.24.0 +│ │ │ ├── @babel/template@7.24.0 deduped +│ │ │ ├── @babel/traverse@7.24.0 deduped +│ │ │ └── @babel/types@7.24.0 deduped +│ │ ├── @babel/parser@7.24.0 +│ │ ├─┬ @babel/template@7.24.0 +│ │ │ ├── @babel/code-frame@7.23.5 deduped +│ │ │ ├── @babel/parser@7.24.0 deduped +│ │ │ └── @babel/types@7.24.0 deduped +│ │ ├─┬ @babel/traverse@7.24.0 +│ │ │ ├── @babel/code-frame@7.23.5 deduped +│ │ │ ├── @babel/generator@7.23.6 deduped +│ │ │ ├── @babel/helper-environment-visitor@7.22.20 deduped +│ │ │ ├─┬ @babel/helper-function-name@7.23.0 +│ │ │ │ ├── @babel/template@7.24.0 deduped +│ │ │ │ └── @babel/types@7.24.0 deduped +│ │ │ ├─┬ @babel/helper-hoist-variables@7.22.5 +│ │ │ │ └── @babel/types@7.24.0 deduped +│ │ │ ├── @babel/helper-split-export-declaration@7.22.6 deduped +│ │ │ ├── @babel/parser@7.24.0 deduped +│ │ │ ├── @babel/types@7.24.0 deduped +│ │ │ ├── debug@4.3.4 deduped +│ │ │ └── globals@11.12.0 +│ │ ├─┬ @babel/types@7.24.0 +│ │ │ ├── @babel/helper-string-parser@7.23.4 +│ │ │ ├── @babel/helper-validator-identifier@7.22.20 deduped +│ │ │ └── to-fast-properties@2.0.0 +│ │ ├── convert-source-map@2.0.0 +│ │ ├── debug@4.3.4 deduped +│ │ ├── gensync@1.0.0-beta.2 +│ │ ├── json5@2.2.3 +│ │ └── semver@6.3.1 +│ ├─┬ @babel/generator@7.23.6 +│ │ ├── @babel/types@7.24.0 deduped +│ │ ├── @jridgewell/gen-mapping@0.3.4 deduped +│ │ ├── @jridgewell/trace-mapping@0.3.23 deduped +│ │ └── jsesc@2.5.2 +│ ├─┬ @babel/helper-annotate-as-pure@7.22.5 +│ │ └── @babel/types@7.24.0 deduped +│ ├─┬ @babel/helper-split-export-declaration@7.22.6 +│ │ └── @babel/types@7.24.0 deduped +│ ├─┬ @babel/plugin-transform-async-generator-functions@7.23.9 +│ │ ├── @babel/core@7.23.9 deduped +│ │ ├── @babel/helper-environment-visitor@7.22.20 +│ │ ├── @babel/helper-plugin-utils@7.24.0 +│ │ ├─┬ @babel/helper-remap-async-to-generator@7.22.20 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-annotate-as-pure@7.22.5 deduped +│ │ │ ├── @babel/helper-environment-visitor@7.22.20 deduped +│ │ │ └─┬ @babel/helper-wrap-function@7.22.20 +│ │ │ ├── @babel/helper-function-name@7.23.0 deduped +│ │ │ ├── @babel/template@7.24.0 deduped +│ │ │ └── @babel/types@7.24.0 deduped +│ │ └─┬ @babel/plugin-syntax-async-generators@7.8.4 +│ │ ├── @babel/core@7.23.9 deduped +│ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ ├─┬ @babel/plugin-transform-async-to-generator@7.23.3 +│ │ ├── @babel/core@7.23.9 deduped +│ │ ├─┬ @babel/helper-module-imports@7.22.15 +│ │ │ └── @babel/types@7.24.0 deduped +│ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ └── @babel/helper-remap-async-to-generator@7.22.20 deduped +│ ├─┬ @babel/plugin-transform-runtime@7.23.9 +│ │ ├── @babel/core@7.23.9 deduped +│ │ ├── @babel/helper-module-imports@7.22.15 deduped +│ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ babel-plugin-polyfill-corejs2@0.4.8 +│ │ │ ├── @babel/compat-data@7.23.5 deduped +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├─┬ @babel/helper-define-polyfill-provider@0.5.0 +│ │ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ │ ├── @babel/helper-compilation-targets@7.23.6 deduped +│ │ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ │ ├── debug@4.3.4 deduped +│ │ │ │ ├── lodash.debounce@4.0.8 +│ │ │ │ └── resolve@1.22.8 deduped +│ │ │ └── semver@6.3.1 +│ │ ├─┬ babel-plugin-polyfill-corejs3@0.9.0 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-define-polyfill-provider@0.5.0 deduped +│ │ │ └── core-js-compat@3.36.0 deduped +│ │ ├─┬ babel-plugin-polyfill-regenerator@0.5.5 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-define-polyfill-provider@0.5.0 deduped +│ │ └── semver@6.3.1 +│ ├─┬ @babel/preset-env@7.23.9 +│ │ ├── @babel/compat-data@7.23.5 +│ │ ├── @babel/core@7.23.9 deduped +│ │ ├── @babel/helper-compilation-targets@7.23.6 deduped +│ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├── @babel/helper-validator-option@7.23.5 +│ │ ├─┬ @babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ ├─┬ @babel/helper-skip-transparent-expression-wrappers@7.22.5 +│ │ │ │ └── @babel/types@7.24.0 deduped +│ │ │ └── @babel/plugin-transform-optional-chaining@7.23.4 deduped +│ │ ├─┬ @babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-environment-visitor@7.22.20 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2 +│ │ │ └── @babel/core@7.23.9 deduped +│ │ ├── @babel/plugin-syntax-async-generators@7.8.4 deduped +│ │ ├─┬ @babel/plugin-syntax-class-properties@7.12.13 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-syntax-class-static-block@7.14.5 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-syntax-dynamic-import@7.8.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-syntax-export-namespace-from@7.8.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-syntax-import-assertions@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-syntax-import-attributes@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-syntax-import-meta@7.10.4 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-syntax-json-strings@7.8.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-syntax-logical-assignment-operators@7.10.4 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-syntax-nullish-coalescing-operator@7.8.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-syntax-numeric-separator@7.10.4 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-syntax-object-rest-spread@7.8.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-syntax-optional-catch-binding@7.8.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-syntax-optional-chaining@7.8.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-syntax-private-property-in-object@7.14.5 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-syntax-top-level-await@7.14.5 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-syntax-unicode-sets-regex@7.18.6 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├─┬ @babel/helper-create-regexp-features-plugin@7.22.15 +│ │ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ │ ├── @babel/helper-annotate-as-pure@7.22.5 deduped +│ │ │ │ ├─┬ regexpu-core@5.3.2 +│ │ │ │ │ ├── @babel/regjsgen@0.8.0 +│ │ │ │ │ ├─┬ regenerate-unicode-properties@10.1.1 +│ │ │ │ │ │ └── regenerate@1.4.2 deduped +│ │ │ │ │ ├── regenerate@1.4.2 +│ │ │ │ │ ├─┬ regjsparser@0.9.1 +│ │ │ │ │ │ └── jsesc@0.5.0 +│ │ │ │ │ ├─┬ unicode-match-property-ecmascript@2.0.0 +│ │ │ │ │ │ ├── unicode-canonical-property-names-ecmascript@2.0.0 +│ │ │ │ │ │ └── unicode-property-aliases-ecmascript@2.1.0 +│ │ │ │ │ └── unicode-match-property-value-ecmascript@2.1.0 +│ │ │ │ └── semver@6.3.1 +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-arrow-functions@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├── @babel/plugin-transform-async-generator-functions@7.23.9 deduped +│ │ ├── @babel/plugin-transform-async-to-generator@7.23.3 deduped +│ │ ├─┬ @babel/plugin-transform-block-scoped-functions@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-block-scoping@7.23.4 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-class-properties@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├─┬ @babel/helper-create-class-features-plugin@7.24.0 +│ │ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ │ ├── @babel/helper-annotate-as-pure@7.22.5 deduped +│ │ │ │ ├── @babel/helper-environment-visitor@7.22.20 deduped +│ │ │ │ ├── @babel/helper-function-name@7.23.0 deduped +│ │ │ │ ├─┬ @babel/helper-member-expression-to-functions@7.23.0 +│ │ │ │ │ └── @babel/types@7.24.0 deduped +│ │ │ │ ├─┬ @babel/helper-optimise-call-expression@7.22.5 +│ │ │ │ │ └── @babel/types@7.24.0 deduped +│ │ │ │ ├── @babel/helper-replace-supers@7.22.20 deduped +│ │ │ │ ├── @babel/helper-skip-transparent-expression-wrappers@7.22.5 deduped +│ │ │ │ ├── @babel/helper-split-export-declaration@7.22.6 deduped +│ │ │ │ └── semver@6.3.1 +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-class-static-block@7.23.4 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-create-class-features-plugin@7.24.0 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ └── @babel/plugin-syntax-class-static-block@7.14.5 deduped +│ │ ├─┬ @babel/plugin-transform-classes@7.23.8 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-annotate-as-pure@7.22.5 deduped +│ │ │ ├── @babel/helper-compilation-targets@7.23.6 deduped +│ │ │ ├── @babel/helper-environment-visitor@7.22.20 deduped +│ │ │ ├── @babel/helper-function-name@7.23.0 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ ├─┬ @babel/helper-replace-supers@7.22.20 +│ │ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ │ ├── @babel/helper-environment-visitor@7.22.20 deduped +│ │ │ │ ├── @babel/helper-member-expression-to-functions@7.23.0 deduped +│ │ │ │ └── @babel/helper-optimise-call-expression@7.22.5 deduped +│ │ │ ├── @babel/helper-split-export-declaration@7.22.6 deduped +│ │ │ └── globals@11.12.0 deduped +│ │ ├─┬ @babel/plugin-transform-computed-properties@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ └── @babel/template@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-destructuring@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-dotall-regex@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-create-regexp-features-plugin@7.22.15 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-duplicate-keys@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-dynamic-import@7.23.4 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ └── @babel/plugin-syntax-dynamic-import@7.8.3 deduped +│ │ ├─┬ @babel/plugin-transform-exponentiation-operator@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├─┬ @babel/helper-builder-binary-assignment-operator-visitor@7.22.15 +│ │ │ │ └── @babel/types@7.24.0 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-export-namespace-from@7.23.4 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ └── @babel/plugin-syntax-export-namespace-from@7.8.3 deduped +│ │ ├─┬ @babel/plugin-transform-for-of@7.23.6 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ └── @babel/helper-skip-transparent-expression-wrappers@7.22.5 deduped +│ │ ├─┬ @babel/plugin-transform-function-name@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-compilation-targets@7.23.6 deduped +│ │ │ ├── @babel/helper-function-name@7.23.0 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-json-strings@7.23.4 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ └── @babel/plugin-syntax-json-strings@7.8.3 deduped +│ │ ├─┬ @babel/plugin-transform-literals@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-logical-assignment-operators@7.23.4 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ └── @babel/plugin-syntax-logical-assignment-operators@7.10.4 deduped +│ │ ├─┬ @babel/plugin-transform-member-expression-literals@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-modules-amd@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-module-transforms@7.23.3 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-modules-commonjs@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-module-transforms@7.23.3 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ └── @babel/helper-simple-access@7.22.5 deduped +│ │ ├─┬ @babel/plugin-transform-modules-systemjs@7.23.9 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-hoist-variables@7.22.5 deduped +│ │ │ ├── @babel/helper-module-transforms@7.23.3 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ └── @babel/helper-validator-identifier@7.22.20 deduped +│ │ ├─┬ @babel/plugin-transform-modules-umd@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-module-transforms@7.23.3 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-named-capturing-groups-regex@7.22.5 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-create-regexp-features-plugin@7.22.15 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-new-target@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-nullish-coalescing-operator@7.23.4 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ └── @babel/plugin-syntax-nullish-coalescing-operator@7.8.3 deduped +│ │ ├─┬ @babel/plugin-transform-numeric-separator@7.23.4 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ └── @babel/plugin-syntax-numeric-separator@7.10.4 deduped +│ │ ├─┬ @babel/plugin-transform-object-rest-spread@7.24.0 +│ │ │ ├── @babel/compat-data@7.23.5 deduped +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-compilation-targets@7.23.6 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ ├── @babel/plugin-syntax-object-rest-spread@7.8.3 deduped +│ │ │ └── @babel/plugin-transform-parameters@7.23.3 deduped +│ │ ├─┬ @babel/plugin-transform-object-super@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ └── @babel/helper-replace-supers@7.22.20 deduped +│ │ ├─┬ @babel/plugin-transform-optional-catch-binding@7.23.4 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ └── @babel/plugin-syntax-optional-catch-binding@7.8.3 deduped +│ │ ├─┬ @babel/plugin-transform-optional-chaining@7.23.4 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ ├── @babel/helper-skip-transparent-expression-wrappers@7.22.5 deduped +│ │ │ └── @babel/plugin-syntax-optional-chaining@7.8.3 deduped +│ │ ├─┬ @babel/plugin-transform-parameters@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-private-methods@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-create-class-features-plugin@7.24.0 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-private-property-in-object@7.23.4 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-annotate-as-pure@7.22.5 deduped +│ │ │ ├── @babel/helper-create-class-features-plugin@7.24.0 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ └── @babel/plugin-syntax-private-property-in-object@7.14.5 deduped +│ │ ├─┬ @babel/plugin-transform-property-literals@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-regenerator@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ └─┬ regenerator-transform@0.15.2 +│ │ │ └── @babel/runtime@7.23.9 deduped +│ │ ├─┬ @babel/plugin-transform-reserved-words@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-shorthand-properties@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-spread@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ └── @babel/helper-skip-transparent-expression-wrappers@7.22.5 deduped +│ │ ├─┬ @babel/plugin-transform-sticky-regex@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-template-literals@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-typeof-symbol@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-unicode-escapes@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-unicode-property-regex@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-create-regexp-features-plugin@7.22.15 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-unicode-regex@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-create-regexp-features-plugin@7.22.15 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/plugin-transform-unicode-sets-regex@7.23.3 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-create-regexp-features-plugin@7.22.15 deduped +│ │ │ └── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @babel/preset-modules@0.1.6-no-external-plugins +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ │ ├── @babel/types@7.24.0 deduped +│ │ │ └── esutils@2.0.3 deduped +│ │ ├── babel-plugin-polyfill-corejs2@0.4.8 deduped +│ │ ├── babel-plugin-polyfill-corejs3@0.9.0 deduped +│ │ ├── babel-plugin-polyfill-regenerator@0.5.5 deduped +│ │ ├─┬ core-js-compat@3.36.0 +│ │ │ └── browserslist@4.23.0 deduped +│ │ └── semver@6.3.1 +│ ├─┬ @babel/runtime@7.23.9 +│ │ └── regenerator-runtime@0.14.1 +│ ├── @discoveryjs/json-ext@0.5.7 +│ ├─┬ @ngtools/webpack@17.2.1 +│ │ ├── @angular/compiler-cli@17.2.3 deduped +│ │ ├── typescript@5.3.3 deduped +│ │ └── webpack@5.90.1 deduped +│ ├─┬ @vitejs/plugin-basic-ssl@1.1.0 +│ │ └── vite@5.0.12 deduped +│ ├── UNMET OPTIONAL DEPENDENCY @web/test-runner@^0.18.0 +│ ├── ansi-colors@4.1.3 +│ ├─┬ autoprefixer@10.4.17 +│ │ ├── browserslist@4.23.0 deduped +│ │ ├── caniuse-lite@1.0.30001591 +│ │ ├── fraction.js@4.3.7 +│ │ ├── normalize-range@0.1.2 +│ │ ├── picocolors@1.0.0 deduped +│ │ ├── postcss-value-parser@4.2.0 +│ │ └── postcss@8.4.35 deduped +│ ├─┬ babel-loader@9.1.3 +│ │ ├── @babel/core@7.23.9 deduped +│ │ ├─┬ find-cache-dir@4.0.0 +│ │ │ ├── common-path-prefix@3.0.0 +│ │ │ └─┬ pkg-dir@7.0.0 +│ │ │ └─┬ find-up@6.3.0 +│ │ │ ├─┬ locate-path@7.2.0 +│ │ │ │ └─┬ p-locate@6.0.0 +│ │ │ │ └─┬ p-limit@4.0.0 +│ │ │ │ └── yocto-queue@1.0.0 +│ │ │ └── path-exists@5.0.0 +│ │ ├─┬ schema-utils@4.2.0 +│ │ │ ├── @types/json-schema@7.0.15 deduped +│ │ │ ├── ajv-formats@2.1.1 deduped +│ │ │ ├─┬ ajv-keywords@5.1.0 +│ │ │ │ ├── ajv@8.12.0 deduped +│ │ │ │ └── fast-deep-equal@3.1.3 deduped +│ │ │ └── ajv@8.12.0 deduped +│ │ └── webpack@5.90.1 deduped +│ ├─┬ babel-plugin-istanbul@6.1.1 +│ │ ├── @babel/helper-plugin-utils@7.24.0 deduped +│ │ ├─┬ @istanbuljs/load-nyc-config@1.1.0 +│ │ │ ├── camelcase@5.3.1 +│ │ │ ├─┬ find-up@4.1.0 +│ │ │ │ ├─┬ locate-path@5.0.0 +│ │ │ │ │ └─┬ p-locate@4.1.0 +│ │ │ │ │ └─┬ p-limit@2.3.0 +│ │ │ │ │ └── p-try@2.2.0 +│ │ │ │ └── path-exists@4.0.0 deduped +│ │ │ ├── get-package-type@0.1.0 +│ │ │ ├── js-yaml@3.14.1 deduped +│ │ │ └── resolve-from@5.0.0 +│ │ ├── @istanbuljs/schema@0.1.3 +│ │ ├─┬ istanbul-lib-instrument@5.2.1 +│ │ │ ├── @babel/core@7.23.9 deduped +│ │ │ ├── @babel/parser@7.24.0 deduped +│ │ │ ├── @istanbuljs/schema@0.1.3 deduped +│ │ │ ├── istanbul-lib-coverage@3.2.2 deduped +│ │ │ └── semver@6.3.1 +│ │ └─┬ test-exclude@6.0.0 +│ │ ├── @istanbuljs/schema@0.1.3 deduped +│ │ ├── glob@7.2.3 deduped +│ │ └─┬ minimatch@3.1.2 +│ │ └─┬ brace-expansion@1.1.11 +│ │ ├── balanced-match@1.0.2 deduped +│ │ └── concat-map@0.0.1 deduped +│ ├── UNMET OPTIONAL DEPENDENCY browser-sync@^3.0.2 +│ ├─┬ browserslist@4.23.0 +│ │ ├── caniuse-lite@1.0.30001591 deduped +│ │ ├── electron-to-chromium@1.4.685 +│ │ ├── node-releases@2.0.14 +│ │ └─┬ update-browserslist-db@1.0.13 +│ │ ├── browserslist@4.23.0 deduped +│ │ ├── escalade@3.1.2 deduped +│ │ └── picocolors@1.0.0 deduped +│ ├─┬ copy-webpack-plugin@11.0.0 +│ │ ├── fast-glob@3.3.2 deduped +│ │ ├─┬ glob-parent@6.0.2 +│ │ │ └── is-glob@4.0.3 deduped +│ │ ├─┬ globby@13.2.2 +│ │ │ ├─┬ dir-glob@3.0.1 +│ │ │ │ └── path-type@4.0.0 +│ │ │ ├── fast-glob@3.3.2 deduped +│ │ │ ├── ignore@5.3.0 deduped +│ │ │ ├── merge2@1.4.1 deduped +│ │ │ └── slash@4.0.0 +│ │ ├── normalize-path@3.0.0 +│ │ ├── schema-utils@4.2.0 deduped +│ │ ├─┬ serialize-javascript@6.0.2 +│ │ │ └─┬ randombytes@2.1.0 +│ │ │ └── safe-buffer@5.2.1 deduped +│ │ └── webpack@5.90.1 deduped +│ ├─┬ critters@0.0.20 +│ │ ├─┬ chalk@4.1.2 +│ │ │ ├─┬ ansi-styles@4.3.0 +│ │ │ │ └─┬ color-convert@2.0.1 +│ │ │ │ └── color-name@1.1.4 +│ │ │ └─┬ supports-color@7.2.0 +│ │ │ └── has-flag@4.0.0 +│ │ ├─┬ css-select@5.1.0 +│ │ │ ├── boolbase@1.0.0 +│ │ │ ├── css-what@6.1.0 +│ │ │ ├── domhandler@5.0.3 deduped +│ │ │ ├─┬ domutils@3.1.0 +│ │ │ │ ├── dom-serializer@2.0.0 deduped +│ │ │ │ ├── domelementtype@2.3.0 deduped +│ │ │ │ └── domhandler@5.0.3 deduped +│ │ │ └─┬ nth-check@2.1.1 +│ │ │ └── boolbase@1.0.0 deduped +│ │ ├─┬ dom-serializer@2.0.0 +│ │ │ ├── domelementtype@2.3.0 +│ │ │ ├── domhandler@5.0.3 deduped +│ │ │ └── entities@4.5.0 deduped +│ │ ├─┬ domhandler@5.0.3 +│ │ │ └── domelementtype@2.3.0 deduped +│ │ ├─┬ htmlparser2@8.0.2 +│ │ │ ├── domelementtype@2.3.0 deduped +│ │ │ ├── domhandler@5.0.3 deduped +│ │ │ ├── domutils@3.1.0 deduped +│ │ │ └── entities@4.5.0 deduped +│ │ ├── postcss@8.4.35 deduped +│ │ └── pretty-bytes@5.6.0 deduped +│ ├─┬ css-loader@6.10.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @rspack/core@0.x || 1.x +│ │ ├─┬ icss-utils@5.1.0 +│ │ │ └── postcss@8.4.35 deduped +│ │ ├─┬ postcss-modules-extract-imports@3.0.0 +│ │ │ └── postcss@8.4.35 deduped +│ │ ├─┬ postcss-modules-local-by-default@4.0.4 +│ │ │ ├── icss-utils@5.1.0 deduped +│ │ │ ├─┬ postcss-selector-parser@6.0.15 +│ │ │ │ ├── cssesc@3.0.0 +│ │ │ │ └── util-deprecate@1.0.2 deduped +│ │ │ ├── postcss-value-parser@4.2.0 deduped +│ │ │ └── postcss@8.4.35 deduped +│ │ ├─┬ postcss-modules-scope@3.1.1 +│ │ │ ├── postcss-selector-parser@6.0.15 deduped +│ │ │ └── postcss@8.4.35 deduped +│ │ ├─┬ postcss-modules-values@4.0.0 +│ │ │ ├── icss-utils@5.1.0 deduped +│ │ │ └── postcss@8.4.35 deduped +│ │ ├── postcss-value-parser@4.2.0 deduped +│ │ ├── postcss@8.4.35 deduped +│ │ ├── semver@7.6.0 deduped +│ │ └── webpack@5.90.1 deduped +│ ├── esbuild-wasm@0.20.0 +│ ├─┬ esbuild@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/aix-ppc64@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/android-arm@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/android-arm64@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/android-x64@0.20.0 +│ │ ├── @esbuild/darwin-arm64@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/darwin-x64@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/freebsd-arm64@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/freebsd-x64@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/linux-arm@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/linux-arm64@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/linux-ia32@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/linux-loong64@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/linux-mips64el@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/linux-ppc64@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/linux-riscv64@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/linux-s390x@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/linux-x64@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/netbsd-x64@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/openbsd-x64@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/sunos-x64@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/win32-arm64@0.20.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/win32-ia32@0.20.0 +│ │ └── UNMET OPTIONAL DEPENDENCY @esbuild/win32-x64@0.20.0 +│ ├─┬ fast-glob@3.3.2 +│ │ ├── @nodelib/fs.stat@2.0.5 +│ │ ├── @nodelib/fs.walk@1.2.8 deduped +│ │ ├─┬ glob-parent@5.1.2 +│ │ │ └── is-glob@4.0.3 deduped +│ │ ├── merge2@1.4.1 +│ │ └─┬ micromatch@4.0.5 +│ │ ├── braces@3.0.2 deduped +│ │ └── picomatch@2.3.1 +│ ├─┬ http-proxy-middleware@2.0.6 +│ │ ├─┬ @types/express@4.17.21 +│ │ │ ├─┬ @types/body-parser@1.19.5 +│ │ │ │ ├─┬ @types/connect@3.4.38 +│ │ │ │ │ └── @types/node@20.11.21 deduped +│ │ │ │ └── @types/node@20.11.21 deduped +│ │ │ ├─┬ @types/express-serve-static-core@4.17.43 +│ │ │ │ ├── @types/node@20.11.21 deduped +│ │ │ │ ├── @types/qs@6.9.12 deduped +│ │ │ │ ├── @types/range-parser@1.2.7 +│ │ │ │ └─┬ @types/send@0.17.4 +│ │ │ │ ├── @types/mime@1.3.5 deduped +│ │ │ │ └── @types/node@20.11.21 deduped +│ │ │ ├── @types/qs@6.9.12 +│ │ │ └── @types/serve-static@1.15.5 deduped +│ │ ├─┬ @types/http-proxy@1.17.14 +│ │ │ └── @types/node@20.11.21 deduped +│ │ ├── http-proxy@1.18.1 deduped +│ │ ├── is-glob@4.0.3 deduped +│ │ ├── is-plain-obj@3.0.0 +│ │ └── micromatch@4.0.5 deduped +│ ├─┬ https-proxy-agent@7.0.2 +│ │ ├─┬ agent-base@7.1.0 +│ │ │ └── debug@4.3.4 deduped +│ │ └── debug@4.3.4 deduped +│ ├─┬ inquirer@9.2.14 +│ │ ├── @ljharb/through@2.3.12 deduped +│ │ ├── ansi-escapes@4.3.2 deduped +│ │ ├── chalk@5.3.0 +│ │ ├── cli-cursor@3.1.0 deduped +│ │ ├── cli-width@4.1.0 deduped +│ │ ├── external-editor@3.1.0 deduped +│ │ ├── figures@3.2.0 deduped +│ │ ├── lodash@4.17.21 deduped +│ │ ├── mute-stream@1.0.0 deduped +│ │ ├── ora@5.4.1 deduped +│ │ ├── run-async@3.0.0 deduped +│ │ ├── rxjs@7.8.1 deduped +│ │ ├── string-width@4.2.3 deduped +│ │ ├── strip-ansi@6.0.1 deduped +│ │ └─┬ wrap-ansi@6.2.0 +│ │ ├─┬ ansi-styles@4.3.0 +│ │ │ └─┬ color-convert@2.0.1 +│ │ │ └── color-name@1.1.4 +│ │ ├── string-width@4.2.3 deduped +│ │ └── strip-ansi@6.0.1 deduped +│ ├── UNMET OPTIONAL DEPENDENCY jest-environment-jsdom@^29.5.0 +│ ├── UNMET OPTIONAL DEPENDENCY jest@^29.5.0 +│ ├── jsonc-parser@3.2.1 +│ ├─┬ karma-source-map-support@1.4.0 +│ │ └── source-map-support@0.5.21 deduped +│ ├── karma@6.4.3 deduped +│ ├─┬ less-loader@11.1.0 +│ │ ├── klona@2.0.6 +│ │ ├── less@4.2.0 deduped +│ │ └── webpack@5.90.1 deduped +│ ├─┬ less@4.2.0 +│ │ ├─┬ copy-anything@2.0.6 +│ │ │ └── is-what@3.14.1 +│ │ ├─┬ errno@0.1.8 +│ │ │ └── prr@1.0.1 +│ │ ├── graceful-fs@4.2.11 +│ │ ├── image-size@0.5.5 +│ │ ├─┬ make-dir@2.1.0 +│ │ │ ├── pify@4.0.1 +│ │ │ └── semver@5.7.2 +│ │ ├── mime@1.6.0 +│ │ ├─┬ needle@3.3.1 +│ │ │ ├─┬ iconv-lite@0.6.3 +│ │ │ │ └── safer-buffer@2.1.2 deduped +│ │ │ └── sax@1.3.0 +│ │ ├── parse-node-version@1.0.1 +│ │ ├── source-map@0.6.1 +│ │ └── tslib@2.6.2 deduped +│ ├─┬ license-webpack-plugin@4.0.2 +│ │ └── webpack-sources@3.2.3 +│ ├── loader-utils@3.2.1 +│ ├─┬ magic-string@0.30.7 +│ │ └── @jridgewell/sourcemap-codec@1.4.15 deduped +│ ├─┬ mini-css-extract-plugin@2.8.0 +│ │ ├── schema-utils@4.2.0 deduped +│ │ ├── tapable@2.2.1 +│ │ └── webpack@5.90.1 deduped +│ ├── mrmime@2.0.0 +│ ├── UNMET OPTIONAL DEPENDENCY ng-packagr@^17.0.0 +│ ├─┬ open@8.4.2 +│ │ ├── define-lazy-prop@2.0.0 +│ │ ├── is-docker@2.2.1 +│ │ └─┬ is-wsl@2.2.0 +│ │ └── is-docker@2.2.1 deduped +│ ├─┬ ora@5.4.1 +│ │ ├─┬ bl@4.1.0 +│ │ │ ├── buffer@5.7.1 deduped +│ │ │ ├── inherits@2.0.4 deduped +│ │ │ └── readable-stream@3.6.2 deduped +│ │ ├─┬ chalk@4.1.2 +│ │ │ ├─┬ ansi-styles@4.3.0 +│ │ │ │ └─┬ color-convert@2.0.1 +│ │ │ │ └── color-name@1.1.4 +│ │ │ └─┬ supports-color@7.2.0 +│ │ │ └── has-flag@4.0.0 +│ │ ├── cli-cursor@3.1.0 deduped +│ │ ├── cli-spinners@2.6.1 +│ │ ├── is-interactive@1.0.0 +│ │ ├── is-unicode-supported@0.1.0 +│ │ ├── log-symbols@4.1.0 deduped +│ │ ├── strip-ansi@6.0.1 deduped +│ │ └─┬ wcwidth@1.0.1 +│ │ └─┬ defaults@1.0.4 +│ │ └── clone@1.0.4 +│ ├─┬ parse5-html-rewriting-stream@7.0.0 +│ │ ├── entities@4.5.0 +│ │ ├─┬ parse5-sax-parser@7.0.0 +│ │ │ └── parse5@7.1.2 deduped +│ │ └── parse5@7.1.2 deduped +│ ├── picomatch@4.0.1 +│ ├─┬ piscina@4.3.1 +│ │ └─┬ nice-napi@1.0.2 +│ │ ├── node-addon-api@3.2.1 +│ │ └── node-gyp-build@4.8.0 +│ ├─┬ postcss-loader@8.1.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @rspack/core@0.x || 1.x +│ │ ├─┬ cosmiconfig@9.0.0 +│ │ │ ├── env-paths@2.2.1 deduped +│ │ │ ├── import-fresh@3.3.0 deduped +│ │ │ ├─┬ js-yaml@4.1.0 +│ │ │ │ └── argparse@2.0.1 +│ │ │ ├─┬ parse-json@5.2.0 +│ │ │ │ ├── @babel/code-frame@7.23.5 deduped +│ │ │ │ ├─┬ error-ex@1.3.2 +│ │ │ │ │ └── is-arrayish@0.2.1 +│ │ │ │ ├── json-parse-even-better-errors@2.3.1 +│ │ │ │ └── lines-and-columns@1.2.4 +│ │ │ └── typescript@5.3.3 deduped +│ │ ├── jiti@1.21.0 +│ │ ├── postcss@8.4.35 deduped +│ │ ├── semver@7.6.0 deduped +│ │ └── webpack@5.90.1 deduped +│ ├─┬ postcss@8.4.35 +│ │ ├── nanoid@3.3.7 +│ │ ├── picocolors@1.0.0 deduped +│ │ └── source-map-js@1.0.2 +│ ├── UNMET OPTIONAL DEPENDENCY protractor@^7.0.0 +│ ├─┬ resolve-url-loader@5.0.0 +│ │ ├─┬ adjust-sourcemap-loader@4.0.0 +│ │ │ ├─┬ loader-utils@2.0.4 +│ │ │ │ ├── big.js@5.2.2 deduped +│ │ │ │ ├── emojis-list@3.0.0 deduped +│ │ │ │ └── json5@2.2.3 deduped +│ │ │ └── regex-parser@2.3.0 +│ │ ├── convert-source-map@1.9.0 deduped +│ │ ├─┬ loader-utils@2.0.4 +│ │ │ ├── big.js@5.2.2 +│ │ │ ├── emojis-list@3.0.0 +│ │ │ └── json5@2.2.3 deduped +│ │ ├── postcss@8.4.35 deduped +│ │ └── source-map@0.6.1 +│ ├── rxjs@7.8.1 deduped +│ ├─┬ sass-loader@14.1.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY @rspack/core@0.x || 1.x +│ │ ├── neo-async@2.6.2 +│ │ ├── UNMET OPTIONAL DEPENDENCY node-sass@^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY sass-embedded@* +│ │ ├── sass@1.70.0 deduped +│ │ └── webpack@5.90.1 deduped +│ ├─┬ sass@1.70.0 +│ │ ├── chokidar@3.6.0 deduped +│ │ ├── immutable@4.3.5 +│ │ └── source-map-js@1.0.2 deduped +│ ├─┬ semver@7.6.0 +│ │ └─┬ lru-cache@6.0.0 +│ │ └── yallist@4.0.0 +│ ├─┬ source-map-loader@5.0.0 +│ │ ├─┬ iconv-lite@0.6.3 +│ │ │ └── safer-buffer@2.1.2 +│ │ ├── source-map-js@1.0.2 deduped +│ │ └── webpack@5.90.1 deduped +│ ├─┬ source-map-support@0.5.21 +│ │ ├── buffer-from@1.1.2 +│ │ └── source-map@0.6.1 +│ ├── UNMET OPTIONAL DEPENDENCY tailwindcss@^2.0.0 || ^3.0.0 +│ ├─┬ terser@5.27.0 +│ │ ├─┬ @jridgewell/source-map@0.3.5 +│ │ │ ├── @jridgewell/gen-mapping@0.3.4 deduped +│ │ │ └── @jridgewell/trace-mapping@0.3.23 deduped +│ │ ├── acorn@8.11.3 deduped +│ │ ├── commander@2.20.3 +│ │ └── source-map-support@0.5.21 deduped +│ ├── tree-kill@1.2.2 +│ ├── tslib@2.6.2 deduped +│ ├── typescript@5.3.3 deduped +│ ├─┬ undici@6.6.2 +│ │ └── @fastify/busboy@2.1.0 +│ ├─┬ vite@5.0.12 +│ │ ├── @types/node@20.11.21 deduped +│ │ ├─┬ esbuild@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/aix-ppc64@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/android-arm@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/android-arm64@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/android-x64@0.19.12 +│ │ │ ├── @esbuild/darwin-arm64@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/darwin-x64@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/freebsd-arm64@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/freebsd-x64@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/linux-arm@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/linux-arm64@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/linux-ia32@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/linux-loong64@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/linux-mips64el@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/linux-ppc64@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/linux-riscv64@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/linux-s390x@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/linux-x64@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/netbsd-x64@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/openbsd-x64@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/sunos-x64@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/win32-arm64@0.19.12 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @esbuild/win32-ia32@0.19.12 +│ │ │ └── UNMET OPTIONAL DEPENDENCY @esbuild/win32-x64@0.19.12 +│ │ ├── fsevents@2.3.3 +│ │ ├── less@4.2.0 deduped +│ │ ├── UNMET OPTIONAL DEPENDENCY lightningcss@^1.21.0 +│ │ ├── postcss@8.4.35 deduped +│ │ ├─┬ rollup@4.12.0 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @rollup/rollup-android-arm-eabi@4.12.0 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @rollup/rollup-android-arm64@4.12.0 +│ │ │ ├── @rollup/rollup-darwin-arm64@4.12.0 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @rollup/rollup-darwin-x64@4.12.0 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @rollup/rollup-linux-arm-gnueabihf@4.12.0 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @rollup/rollup-linux-arm64-gnu@4.12.0 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @rollup/rollup-linux-arm64-musl@4.12.0 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @rollup/rollup-linux-riscv64-gnu@4.12.0 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @rollup/rollup-linux-x64-gnu@4.12.0 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @rollup/rollup-linux-x64-musl@4.12.0 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @rollup/rollup-win32-arm64-msvc@4.12.0 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @rollup/rollup-win32-ia32-msvc@4.12.0 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY @rollup/rollup-win32-x64-msvc@4.12.0 +│ │ │ ├── @types/estree@1.0.5 deduped +│ │ │ └── fsevents@2.3.3 deduped +│ │ ├── sass@1.70.0 deduped +│ │ ├── UNMET OPTIONAL DEPENDENCY stylus@* +│ │ ├── UNMET OPTIONAL DEPENDENCY sugarss@* +│ │ └── terser@5.27.0 deduped +│ ├─┬ watchpack@2.4.0 +│ │ ├── glob-to-regexp@0.4.1 +│ │ └── graceful-fs@4.2.11 +│ ├─┬ webpack-dev-middleware@6.1.1 +│ │ ├── colorette@2.0.20 deduped +│ │ ├─┬ memfs@3.5.3 +│ │ │ └── fs-monkey@1.0.5 +│ │ ├─┬ mime-types@2.1.35 +│ │ │ └── mime-db@1.52.0 +│ │ ├── range-parser@1.2.1 deduped +│ │ ├── schema-utils@4.2.0 deduped +│ │ └── webpack@5.90.1 deduped +│ ├─┬ webpack-dev-server@4.15.1 +│ │ ├─┬ @types/bonjour@3.5.13 +│ │ │ └── @types/node@20.11.21 deduped +│ │ ├─┬ @types/connect-history-api-fallback@1.5.4 +│ │ │ ├── @types/express-serve-static-core@4.17.43 deduped +│ │ │ └── @types/node@20.11.21 deduped +│ │ ├── @types/express@4.17.21 deduped +│ │ ├─┬ @types/serve-index@1.9.4 +│ │ │ └── @types/express@4.17.21 deduped +│ │ ├─┬ @types/serve-static@1.15.5 +│ │ │ ├── @types/http-errors@2.0.4 +│ │ │ ├── @types/mime@1.3.5 +│ │ │ └── @types/node@20.11.21 deduped +│ │ ├─┬ @types/sockjs@0.3.36 +│ │ │ └── @types/node@20.11.21 deduped +│ │ ├─┬ @types/ws@8.5.10 +│ │ │ └── @types/node@20.11.21 deduped +│ │ ├── ansi-html-community@0.0.8 +│ │ ├─┬ bonjour-service@1.2.1 +│ │ │ ├── fast-deep-equal@3.1.3 deduped +│ │ │ └─┬ multicast-dns@7.2.5 +│ │ │ ├─┬ dns-packet@5.6.1 +│ │ │ │ └── @leichtgewicht/ip-codec@2.0.4 +│ │ │ └── thunky@1.1.0 +│ │ ├── chokidar@3.6.0 deduped +│ │ ├── colorette@2.0.20 deduped +│ │ ├─┬ compression@1.7.4 +│ │ │ ├── accepts@1.3.8 deduped +│ │ │ ├── bytes@3.0.0 +│ │ │ ├─┬ compressible@2.0.18 +│ │ │ │ └── mime-db@1.52.0 deduped +│ │ │ ├─┬ debug@2.6.9 +│ │ │ │ └── ms@2.0.0 +│ │ │ ├── on-headers@1.0.2 deduped +│ │ │ ├── safe-buffer@5.1.2 +│ │ │ └── vary@1.1.2 deduped +│ │ ├── connect-history-api-fallback@2.0.0 +│ │ ├─┬ default-gateway@6.0.3 +│ │ │ └─┬ execa@5.1.1 +│ │ │ ├── cross-spawn@7.0.3 deduped +│ │ │ ├── get-stream@6.0.1 +│ │ │ ├── human-signals@2.1.0 +│ │ │ ├── is-stream@2.0.1 deduped +│ │ │ ├── merge-stream@2.0.0 deduped +│ │ │ ├── npm-run-path@4.0.1 deduped +│ │ │ ├── onetime@5.1.2 deduped +│ │ │ ├── signal-exit@3.0.7 deduped +│ │ │ └── strip-final-newline@2.0.0 deduped +│ │ ├── express@4.18.2 deduped +│ │ ├── graceful-fs@4.2.11 +│ │ ├── html-entities@2.4.0 +│ │ ├── http-proxy-middleware@2.0.6 deduped +│ │ ├── ipaddr.js@2.1.0 +│ │ ├─┬ launch-editor@2.6.1 +│ │ │ ├── picocolors@1.0.0 deduped +│ │ │ └── shell-quote@1.8.1 +│ │ ├─┬ open@8.4.2 +│ │ │ ├── define-lazy-prop@2.0.0 +│ │ │ ├── is-docker@2.2.1 +│ │ │ └─┬ is-wsl@2.2.0 +│ │ │ └── is-docker@2.2.1 deduped +│ │ ├─┬ p-retry@4.6.2 +│ │ │ ├── @types/retry@0.12.0 +│ │ │ └── retry@0.13.1 deduped +│ │ ├─┬ rimraf@3.0.2 +│ │ │ └── glob@7.2.3 deduped +│ │ ├── schema-utils@4.2.0 deduped +│ │ ├─┬ selfsigned@2.4.1 +│ │ │ ├─┬ @types/node-forge@1.3.11 +│ │ │ │ └── @types/node@20.11.21 deduped +│ │ │ └── node-forge@1.3.1 +│ │ ├─┬ serve-index@1.9.1 +│ │ │ ├── accepts@1.3.8 deduped +│ │ │ ├── batch@0.6.1 +│ │ │ ├─┬ debug@2.6.9 +│ │ │ │ └── ms@2.0.0 +│ │ │ ├── escape-html@1.0.3 deduped +│ │ │ ├─┬ http-errors@1.6.3 +│ │ │ │ ├── depd@1.1.2 +│ │ │ │ ├── inherits@2.0.3 +│ │ │ │ ├── setprototypeof@1.1.0 +│ │ │ │ └── statuses@1.5.0 deduped +│ │ │ ├── mime-types@2.1.35 deduped +│ │ │ └── parseurl@1.3.3 deduped +│ │ ├─┬ sockjs@0.3.24 +│ │ │ ├── faye-websocket@0.11.4 deduped +│ │ │ ├── uuid@8.3.2 deduped +│ │ │ └─┬ websocket-driver@0.7.4 +│ │ │ ├── http-parser-js@0.5.8 +│ │ │ ├── safe-buffer@5.2.1 deduped +│ │ │ └── websocket-extensions@0.1.4 +│ │ ├─┬ spdy@4.0.2 +│ │ │ ├── debug@4.3.4 deduped +│ │ │ ├── handle-thing@2.0.1 +│ │ │ ├── http-deceiver@1.2.7 +│ │ │ ├── select-hose@2.0.0 +│ │ │ └─┬ spdy-transport@3.0.0 +│ │ │ ├── debug@4.3.4 deduped +│ │ │ ├── detect-node@2.1.0 +│ │ │ ├─┬ hpack.js@2.1.6 +│ │ │ │ ├── inherits@2.0.4 deduped +│ │ │ │ ├── obuf@1.1.2 deduped +│ │ │ │ ├─┬ readable-stream@2.3.8 +│ │ │ │ │ ├── core-util-is@1.0.2 deduped +│ │ │ │ │ ├── inherits@2.0.4 deduped +│ │ │ │ │ ├── isarray@1.0.0 deduped +│ │ │ │ │ ├── process-nextick-args@2.0.1 deduped +│ │ │ │ │ ├── safe-buffer@5.1.2 +│ │ │ │ │ ├─┬ string_decoder@1.1.1 +│ │ │ │ │ │ └── safe-buffer@5.1.2 deduped +│ │ │ │ │ └── util-deprecate@1.0.2 deduped +│ │ │ │ └── wbuf@1.7.3 deduped +│ │ │ ├── obuf@1.1.2 +│ │ │ ├── readable-stream@3.6.2 deduped +│ │ │ └─┬ wbuf@1.7.3 +│ │ │ └── minimalistic-assert@1.0.1 +│ │ ├─┬ webpack-dev-middleware@5.3.3 +│ │ │ ├── colorette@2.0.20 deduped +│ │ │ ├── memfs@3.5.3 deduped +│ │ │ ├── mime-types@2.1.35 deduped +│ │ │ ├── range-parser@1.2.1 deduped +│ │ │ ├── schema-utils@4.2.0 deduped +│ │ │ └── webpack@5.90.1 deduped +│ │ ├── webpack@5.90.1 deduped +│ │ └─┬ ws@8.16.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY bufferutil@^4.0.1 +│ │ └── UNMET OPTIONAL DEPENDENCY utf-8-validate@>=5.0.2 +│ ├─┬ webpack-merge@5.10.0 +│ │ ├─┬ clone-deep@4.0.1 +│ │ │ ├─┬ is-plain-object@2.0.4 +│ │ │ │ └── isobject@3.0.1 +│ │ │ ├── kind-of@6.0.3 +│ │ │ └─┬ shallow-clone@3.0.1 +│ │ │ └── kind-of@6.0.3 deduped +│ │ ├── flat@5.0.2 +│ │ └── wildcard@2.0.1 +│ ├─┬ webpack-subresource-integrity@5.1.0 +│ │ ├── UNMET OPTIONAL DEPENDENCY html-webpack-plugin@>= 5.0.0-beta.1 < 6 +│ │ ├── typed-assert@1.0.9 +│ │ └── webpack@5.90.1 deduped +│ └─┬ webpack@5.90.1 +│ ├─┬ @types/eslint-scope@3.7.7 +│ │ ├─┬ @types/eslint@8.56.4 +│ │ │ ├── @types/estree@1.0.5 deduped +│ │ │ └── @types/json-schema@7.0.15 deduped +│ │ └── @types/estree@1.0.5 deduped +│ ├── @types/estree@1.0.5 +│ ├─┬ @webassemblyjs/ast@1.11.6 +│ │ ├─┬ @webassemblyjs/helper-numbers@1.11.6 +│ │ │ ├── @webassemblyjs/floating-point-hex-parser@1.11.6 +│ │ │ ├── @webassemblyjs/helper-api-error@1.11.6 deduped +│ │ │ └── @xtuc/long@4.2.2 +│ │ └── @webassemblyjs/helper-wasm-bytecode@1.11.6 +│ ├─┬ @webassemblyjs/wasm-edit@1.11.6 +│ │ ├── @webassemblyjs/ast@1.11.6 deduped +│ │ ├── @webassemblyjs/helper-buffer@1.11.6 +│ │ ├── @webassemblyjs/helper-wasm-bytecode@1.11.6 deduped +│ │ ├─┬ @webassemblyjs/helper-wasm-section@1.11.6 +│ │ │ ├── @webassemblyjs/ast@1.11.6 deduped +│ │ │ ├── @webassemblyjs/helper-buffer@1.11.6 deduped +│ │ │ ├── @webassemblyjs/helper-wasm-bytecode@1.11.6 deduped +│ │ │ └── @webassemblyjs/wasm-gen@1.11.6 deduped +│ │ ├─┬ @webassemblyjs/wasm-gen@1.11.6 +│ │ │ ├── @webassemblyjs/ast@1.11.6 deduped +│ │ │ ├── @webassemblyjs/helper-wasm-bytecode@1.11.6 deduped +│ │ │ ├── @webassemblyjs/ieee754@1.11.6 deduped +│ │ │ ├── @webassemblyjs/leb128@1.11.6 deduped +│ │ │ └── @webassemblyjs/utf8@1.11.6 deduped +│ │ ├─┬ @webassemblyjs/wasm-opt@1.11.6 +│ │ │ ├── @webassemblyjs/ast@1.11.6 deduped +│ │ │ ├── @webassemblyjs/helper-buffer@1.11.6 deduped +│ │ │ ├── @webassemblyjs/wasm-gen@1.11.6 deduped +│ │ │ └── @webassemblyjs/wasm-parser@1.11.6 deduped +│ │ ├── @webassemblyjs/wasm-parser@1.11.6 deduped +│ │ └─┬ @webassemblyjs/wast-printer@1.11.6 +│ │ ├── @webassemblyjs/ast@1.11.6 deduped +│ │ └── @xtuc/long@4.2.2 deduped +│ ├─┬ @webassemblyjs/wasm-parser@1.11.6 +│ │ ├── @webassemblyjs/ast@1.11.6 deduped +│ │ ├── @webassemblyjs/helper-api-error@1.11.6 +│ │ ├── @webassemblyjs/helper-wasm-bytecode@1.11.6 deduped +│ │ ├─┬ @webassemblyjs/ieee754@1.11.6 +│ │ │ └── @xtuc/ieee754@1.2.0 +│ │ ├─┬ @webassemblyjs/leb128@1.11.6 +│ │ │ └── @xtuc/long@4.2.2 deduped +│ │ └── @webassemblyjs/utf8@1.11.6 +│ ├─┬ acorn-import-assertions@1.9.0 +│ │ └── acorn@8.11.3 deduped +│ ├── acorn@8.11.3 deduped +│ ├── browserslist@4.23.0 deduped +│ ├── chrome-trace-event@1.0.3 +│ ├─┬ enhanced-resolve@5.15.1 +│ │ ├── graceful-fs@4.2.11 +│ │ └── tapable@2.2.1 deduped +│ ├── es-module-lexer@1.4.1 +│ ├─┬ eslint-scope@5.1.1 +│ │ ├── esrecurse@4.3.0 deduped +│ │ └── estraverse@4.3.0 +│ ├── events@3.3.0 +│ ├── glob-to-regexp@0.4.1 deduped +│ ├── graceful-fs@4.2.11 +│ ├── json-parse-even-better-errors@2.3.1 +│ ├── loader-runner@4.3.0 +│ ├── mime-types@2.1.35 deduped +│ ├── neo-async@2.6.2 deduped +│ ├─┬ schema-utils@3.3.0 +│ │ ├── @types/json-schema@7.0.15 deduped +│ │ ├─┬ ajv-keywords@3.5.2 +│ │ │ └── ajv@6.12.6 deduped +│ │ └─┬ ajv@6.12.6 +│ │ ├── fast-deep-equal@3.1.3 deduped +│ │ ├── fast-json-stable-stringify@2.1.0 deduped +│ │ ├── json-schema-traverse@0.4.1 +│ │ └── uri-js@4.4.1 deduped +│ ├── tapable@2.2.1 deduped +│ ├─┬ terser-webpack-plugin@5.3.10 +│ │ ├── @jridgewell/trace-mapping@0.3.23 deduped +│ │ ├─┬ jest-worker@27.5.1 +│ │ │ ├── @types/node@20.11.21 deduped +│ │ │ ├── merge-stream@2.0.0 deduped +│ │ │ └─┬ supports-color@8.1.1 +│ │ │ └── has-flag@4.0.0 +│ │ ├─┬ schema-utils@3.3.0 +│ │ │ ├── @types/json-schema@7.0.15 deduped +│ │ │ ├─┬ ajv-keywords@3.5.2 +│ │ │ │ └── ajv@6.12.6 deduped +│ │ │ └─┬ ajv@6.12.6 +│ │ │ ├── fast-deep-equal@3.1.3 deduped +│ │ │ ├── fast-json-stable-stringify@2.1.0 deduped +│ │ │ ├── json-schema-traverse@0.4.1 +│ │ │ └── uri-js@4.4.1 deduped +│ │ ├── serialize-javascript@6.0.2 deduped +│ │ ├── terser@5.27.0 deduped +│ │ └── webpack@5.90.1 deduped +│ ├── watchpack@2.4.0 deduped +│ └── webpack-sources@3.2.3 deduped +├─┬ @angular-eslint/builder@17.2.1 +│ ├─┬ @nx/devkit@17.2.8 +│ │ ├─┬ @nrwl/devkit@17.2.8 +│ │ │ └── @nx/devkit@17.2.8 deduped +│ │ ├─┬ ejs@3.1.9 +│ │ │ └─┬ jake@10.8.7 +│ │ │ ├── async@3.2.5 deduped +│ │ │ ├─┬ chalk@4.1.2 +│ │ │ │ ├─┬ ansi-styles@4.3.0 +│ │ │ │ │ └─┬ color-convert@2.0.1 +│ │ │ │ │ └── color-name@1.1.4 +│ │ │ │ └─┬ supports-color@7.2.0 +│ │ │ │ └── has-flag@4.0.0 +│ │ │ ├─┬ filelist@1.0.4 +│ │ │ │ └─┬ minimatch@5.1.6 +│ │ │ │ └── brace-expansion@2.0.1 deduped +│ │ │ └─┬ minimatch@3.1.2 +│ │ │ └─┬ brace-expansion@1.1.11 +│ │ │ ├── balanced-match@1.0.2 deduped +│ │ │ └── concat-map@0.0.1 deduped +│ │ ├── enquirer@2.3.6 deduped +│ │ ├── ignore@5.3.0 deduped +│ │ ├── nx@17.2.8 deduped +│ │ ├─┬ semver@7.5.3 +│ │ │ └─┬ lru-cache@6.0.0 +│ │ │ └── yallist@4.0.0 +│ │ ├── tmp@0.2.1 deduped +│ │ └── tslib@2.6.2 deduped +│ ├── eslint@8.57.0 deduped +│ ├─┬ nx@17.2.8 +│ │ ├─┬ @nrwl/tao@17.2.8 +│ │ │ ├── nx@17.2.8 deduped +│ │ │ └── tslib@2.6.2 deduped +│ │ ├── @nx/nx-darwin-arm64@17.2.8 +│ │ ├── UNMET OPTIONAL DEPENDENCY @nx/nx-darwin-x64@17.2.8 +│ │ ├── UNMET OPTIONAL DEPENDENCY @nx/nx-freebsd-x64@17.2.8 +│ │ ├── UNMET OPTIONAL DEPENDENCY @nx/nx-linux-arm-gnueabihf@17.2.8 +│ │ ├── UNMET OPTIONAL DEPENDENCY @nx/nx-linux-arm64-gnu@17.2.8 +│ │ ├── UNMET OPTIONAL DEPENDENCY @nx/nx-linux-arm64-musl@17.2.8 +│ │ ├── UNMET OPTIONAL DEPENDENCY @nx/nx-linux-x64-gnu@17.2.8 +│ │ ├── UNMET OPTIONAL DEPENDENCY @nx/nx-linux-x64-musl@17.2.8 +│ │ ├── UNMET OPTIONAL DEPENDENCY @nx/nx-win32-arm64-msvc@17.2.8 +│ │ ├── UNMET OPTIONAL DEPENDENCY @nx/nx-win32-x64-msvc@17.2.8 +│ │ ├── UNMET OPTIONAL DEPENDENCY @swc-node/register@^1.6.7 +│ │ ├── UNMET OPTIONAL DEPENDENCY @swc/core@^1.3.85 +│ │ ├── @yarnpkg/lockfile@1.1.0 deduped +│ │ ├─┬ @yarnpkg/parsers@3.0.0-rc.46 +│ │ │ ├── js-yaml@3.14.1 deduped +│ │ │ └── tslib@2.6.2 deduped +│ │ ├─┬ @zkochan/js-yaml@0.0.6 +│ │ │ └── argparse@2.0.1 +│ │ ├─┬ axios@1.6.7 +│ │ │ ├── follow-redirects@1.15.5 deduped +│ │ │ ├─┬ form-data@4.0.0 +│ │ │ │ ├── asynckit@0.4.0 deduped +│ │ │ │ ├── combined-stream@1.0.8 deduped +│ │ │ │ └── mime-types@2.1.35 deduped +│ │ │ └── proxy-from-env@1.1.0 +│ │ ├─┬ chalk@4.1.2 +│ │ │ ├─┬ ansi-styles@4.3.0 +│ │ │ │ └─┬ color-convert@2.0.1 +│ │ │ │ └── color-name@1.1.4 +│ │ │ └─┬ supports-color@7.2.0 +│ │ │ └── has-flag@4.0.0 +│ │ ├── cli-cursor@3.1.0 deduped +│ │ ├── cli-spinners@2.6.1 deduped +│ │ ├─┬ cliui@8.0.1 +│ │ │ ├── string-width@4.2.3 deduped +│ │ │ ├── strip-ansi@6.0.1 deduped +│ │ │ └── wrap-ansi@7.0.0 deduped +│ │ ├── dotenv-expand@10.0.0 +│ │ ├── dotenv@16.3.2 +│ │ ├── enquirer@2.3.6 deduped +│ │ ├── figures@3.2.0 deduped +│ │ ├── flat@5.0.2 deduped +│ │ ├─┬ fs-extra@11.2.0 +│ │ │ ├── graceful-fs@4.2.11 +│ │ │ ├─┬ jsonfile@6.1.0 +│ │ │ │ ├── graceful-fs@4.2.11 deduped +│ │ │ │ └── universalify@2.0.1 deduped +│ │ │ └── universalify@2.0.1 +│ │ ├─┬ glob@7.1.4 +│ │ │ ├── fs.realpath@1.0.0 deduped +│ │ │ ├── inflight@1.0.6 deduped +│ │ │ ├── inherits@2.0.4 deduped +│ │ │ ├── minimatch@3.0.5 deduped +│ │ │ ├── once@1.4.0 deduped +│ │ │ └── path-is-absolute@1.0.1 deduped +│ │ ├── ignore@5.3.0 deduped +│ │ ├─┬ jest-diff@29.7.0 +│ │ │ ├─┬ chalk@4.1.2 +│ │ │ │ ├─┬ ansi-styles@4.3.0 +│ │ │ │ │ └─┬ color-convert@2.0.1 +│ │ │ │ │ └── color-name@1.1.4 +│ │ │ │ └─┬ supports-color@7.2.0 +│ │ │ │ └── has-flag@4.0.0 +│ │ │ ├── diff-sequences@29.6.3 +│ │ │ ├── jest-get-type@29.6.3 +│ │ │ └─┬ pretty-format@29.7.0 +│ │ │ ├─┬ @jest/schemas@29.6.3 +│ │ │ │ └── @sinclair/typebox@0.27.8 +│ │ │ ├── ansi-styles@5.2.0 +│ │ │ └── react-is@18.2.0 +│ │ ├─┬ js-yaml@4.1.0 +│ │ │ └── argparse@2.0.1 +│ │ ├── jsonc-parser@3.2.0 +│ │ ├── lines-and-columns@2.0.4 +│ │ ├─┬ minimatch@3.0.5 +│ │ │ └─┬ brace-expansion@1.1.11 +│ │ │ ├── balanced-match@1.0.2 deduped +│ │ │ └── concat-map@0.0.1 deduped +│ │ ├── node-machine-id@1.1.12 +│ │ ├─┬ npm-run-path@4.0.1 +│ │ │ └── path-key@3.1.1 deduped +│ │ ├─┬ open@8.4.2 +│ │ │ ├── define-lazy-prop@2.0.0 +│ │ │ ├── is-docker@2.2.1 +│ │ │ └─┬ is-wsl@2.2.0 +│ │ │ └── is-docker@2.2.1 deduped +│ │ ├─┬ semver@7.5.3 +│ │ │ └─┬ lru-cache@6.0.0 +│ │ │ └── yallist@4.0.0 +│ │ ├── string-width@4.2.3 deduped +│ │ ├─┬ strong-log-transformer@2.1.0 +│ │ │ ├── duplexer@0.1.2 +│ │ │ ├── minimist@1.2.8 deduped +│ │ │ └── through@2.3.8 deduped +│ │ ├─┬ tar-stream@2.2.0 +│ │ │ ├── bl@4.1.0 deduped +│ │ │ ├─┬ end-of-stream@1.4.4 +│ │ │ │ └── once@1.4.0 deduped +│ │ │ ├── fs-constants@1.0.0 +│ │ │ ├── inherits@2.0.4 deduped +│ │ │ └── readable-stream@3.6.2 deduped +│ │ ├── tmp@0.2.1 deduped +│ │ ├─┬ tsconfig-paths@4.2.0 +│ │ │ ├── json5@2.2.3 deduped +│ │ │ ├── minimist@1.2.8 deduped +│ │ │ └── strip-bom@3.0.0 +│ │ ├── tslib@2.6.2 deduped +│ │ ├── yargs-parser@21.1.1 +│ │ └── yargs@17.7.2 deduped +│ └── typescript@5.3.3 deduped +├─┬ @angular-eslint/eslint-plugin-template@17.2.1 +│ ├── @angular-eslint/bundled-angular-compiler@17.2.1 +│ ├─┬ @angular-eslint/utils@17.2.1 +│ │ ├── @angular-eslint/bundled-angular-compiler@17.2.1 deduped +│ │ ├── @typescript-eslint/utils@6.19.0 deduped +│ │ ├── eslint@8.57.0 deduped +│ │ └── typescript@5.3.3 deduped +│ ├─┬ @typescript-eslint/type-utils@6.19.0 +│ │ ├─┬ @typescript-eslint/typescript-estree@6.19.0 +│ │ │ ├── @typescript-eslint/types@6.19.0 +│ │ │ ├─┬ @typescript-eslint/visitor-keys@6.19.0 +│ │ │ │ ├── @typescript-eslint/types@6.19.0 deduped +│ │ │ │ └── eslint-visitor-keys@3.4.3 deduped +│ │ │ ├── debug@4.3.4 deduped +│ │ │ ├── globby@11.1.0 deduped +│ │ │ ├── is-glob@4.0.3 deduped +│ │ │ ├── minimatch@9.0.3 deduped +│ │ │ ├── semver@7.6.0 deduped +│ │ │ └── ts-api-utils@1.2.1 deduped +│ │ ├── @typescript-eslint/utils@6.19.0 deduped +│ │ ├── debug@4.3.4 deduped +│ │ ├── eslint@8.57.0 deduped +│ │ └── ts-api-utils@1.2.1 deduped +│ ├─┬ @typescript-eslint/utils@6.19.0 +│ │ ├── @eslint-community/eslint-utils@4.4.0 deduped +│ │ ├── @types/json-schema@7.0.15 +│ │ ├── @types/semver@7.5.8 +│ │ ├─┬ @typescript-eslint/scope-manager@6.19.0 +│ │ │ ├── @typescript-eslint/types@6.19.0 deduped +│ │ │ └─┬ @typescript-eslint/visitor-keys@6.19.0 +│ │ │ ├── @typescript-eslint/types@6.19.0 deduped +│ │ │ └── eslint-visitor-keys@3.4.3 deduped +│ │ ├── @typescript-eslint/types@6.19.0 +│ │ ├─┬ @typescript-eslint/typescript-estree@6.19.0 +│ │ │ ├── @typescript-eslint/types@6.19.0 deduped +│ │ │ ├── @typescript-eslint/visitor-keys@6.19.0 deduped +│ │ │ ├── debug@4.3.4 deduped +│ │ │ ├── globby@11.1.0 deduped +│ │ │ ├── is-glob@4.0.3 deduped +│ │ │ ├── minimatch@9.0.3 deduped +│ │ │ ├── semver@7.6.0 deduped +│ │ │ └── ts-api-utils@1.2.1 deduped +│ │ ├── eslint@8.57.0 deduped +│ │ └── semver@7.6.0 deduped +│ ├─┬ aria-query@5.3.0 +│ │ └── dequal@2.0.3 +│ ├─┬ axobject-query@4.0.0 +│ │ └── dequal@2.0.3 deduped +│ ├── eslint@8.57.0 deduped +│ └── typescript@5.3.3 deduped +├─┬ @angular-eslint/eslint-plugin@17.2.1 +│ ├── @angular-eslint/utils@17.2.1 deduped +│ ├── @typescript-eslint/utils@6.19.0 deduped +│ ├── eslint@8.57.0 deduped +│ └── typescript@5.3.3 deduped +├─┬ @angular-eslint/schematics@17.2.1 +│ ├── @angular-eslint/eslint-plugin-template@17.2.1 deduped +│ ├── @angular-eslint/eslint-plugin@17.2.1 deduped +│ ├── @angular/cli@17.2.1 deduped +│ ├── @nx/devkit@17.2.8 deduped +│ ├── ignore@5.3.0 +│ ├── nx@17.2.8 deduped +│ ├── strip-json-comments@3.1.1 +│ └─┬ tmp@0.2.1 +│ └─┬ rimraf@3.0.2 +│ └── glob@7.2.3 deduped +├─┬ @angular-eslint/template-parser@17.2.1 +│ ├── @angular-eslint/bundled-angular-compiler@17.2.1 deduped +│ ├─┬ eslint-scope@8.0.0 +│ │ ├─┬ esrecurse@4.3.0 +│ │ │ └── estraverse@5.3.0 deduped +│ │ └── estraverse@5.3.0 +│ ├── eslint@8.57.0 deduped +│ └── typescript@5.3.3 deduped +├─┬ @angular/animations@17.2.3 +│ ├── @angular/core@17.2.3 deduped +│ └── tslib@2.6.2 deduped +├─┬ @angular/cdk@17.2.1 +│ ├── @angular/common@17.2.3 deduped +│ ├── @angular/core@17.2.3 deduped +│ ├─┬ parse5@7.1.2 +│ │ └── entities@4.5.0 deduped +│ ├── rxjs@7.8.1 deduped +│ └── tslib@2.6.2 deduped +├─┬ @angular/cli@17.2.1 +│ ├── @angular-devkit/architect@0.1702.1 deduped +│ ├── @angular-devkit/core@17.2.1 deduped +│ ├─┬ @angular-devkit/schematics@17.2.1 +│ │ ├── @angular-devkit/core@17.2.1 deduped +│ │ ├── jsonc-parser@3.2.1 deduped +│ │ ├── magic-string@0.30.7 deduped +│ │ ├── ora@5.4.1 deduped +│ │ └── rxjs@7.8.1 deduped +│ ├─┬ @schematics/angular@17.2.1 +│ │ ├── @angular-devkit/core@17.2.1 deduped +│ │ ├── @angular-devkit/schematics@17.2.1 deduped +│ │ └── jsonc-parser@3.2.1 deduped +│ ├── @yarnpkg/lockfile@1.1.0 +│ ├── ansi-colors@4.1.3 deduped +│ ├── ini@4.1.1 +│ ├─┬ inquirer@9.2.14 +│ │ ├── @ljharb/through@2.3.12 deduped +│ │ ├── ansi-escapes@4.3.2 deduped +│ │ ├── chalk@5.3.0 +│ │ ├── cli-cursor@3.1.0 deduped +│ │ ├── cli-width@4.1.0 deduped +│ │ ├── external-editor@3.1.0 deduped +│ │ ├── figures@3.2.0 deduped +│ │ ├── lodash@4.17.21 deduped +│ │ ├── mute-stream@1.0.0 deduped +│ │ ├── ora@5.4.1 deduped +│ │ ├── run-async@3.0.0 deduped +│ │ ├── rxjs@7.8.1 deduped +│ │ ├── string-width@4.2.3 deduped +│ │ ├── strip-ansi@6.0.1 deduped +│ │ └─┬ wrap-ansi@6.2.0 +│ │ ├─┬ ansi-styles@4.3.0 +│ │ │ └─┬ color-convert@2.0.1 +│ │ │ └── color-name@1.1.4 +│ │ ├── string-width@4.2.3 deduped +│ │ └── strip-ansi@6.0.1 deduped +│ ├── jsonc-parser@3.2.1 deduped +│ ├─┬ npm-package-arg@11.0.1 +│ │ ├─┬ hosted-git-info@7.0.1 +│ │ │ └── lru-cache@10.2.0 +│ │ ├── proc-log@3.0.0 +│ │ ├── semver@7.6.0 deduped +│ │ └─┬ validate-npm-package-name@5.0.0 +│ │ └─┬ builtins@5.0.1 +│ │ └── semver@7.6.0 deduped +│ ├─┬ npm-pick-manifest@9.0.0 +│ │ ├─┬ npm-install-checks@6.3.0 +│ │ │ └── semver@7.6.0 deduped +│ │ ├── npm-normalize-package-bin@3.0.1 +│ │ ├── npm-package-arg@11.0.1 deduped +│ │ └── semver@7.6.0 deduped +│ ├─┬ open@8.4.2 +│ │ ├── define-lazy-prop@2.0.0 +│ │ ├── is-docker@2.2.1 +│ │ └─┬ is-wsl@2.2.0 +│ │ └── is-docker@2.2.1 deduped +│ ├── ora@5.4.1 deduped +│ ├─┬ pacote@17.0.6 +│ │ ├─┬ @npmcli/git@5.0.4 +│ │ │ ├── @npmcli/promise-spawn@7.0.1 deduped +│ │ │ ├── lru-cache@10.2.0 +│ │ │ ├── npm-pick-manifest@9.0.0 deduped +│ │ │ ├── proc-log@3.0.0 deduped +│ │ │ ├── promise-inflight@1.0.1 +│ │ │ ├── promise-retry@2.0.1 deduped +│ │ │ ├── semver@7.6.0 deduped +│ │ │ └─┬ which@4.0.0 +│ │ │ └── isexe@3.1.1 +│ │ ├─┬ @npmcli/installed-package-contents@2.0.2 +│ │ │ ├─┬ npm-bundled@3.0.0 +│ │ │ │ └── npm-normalize-package-bin@3.0.1 deduped +│ │ │ └── npm-normalize-package-bin@3.0.1 deduped +│ │ ├─┬ @npmcli/promise-spawn@7.0.1 +│ │ │ └─┬ which@4.0.0 +│ │ │ └── isexe@3.1.1 +│ │ ├─┬ @npmcli/run-script@7.0.4 +│ │ │ ├── @npmcli/node-gyp@3.0.0 +│ │ │ ├─┬ @npmcli/package-json@5.0.0 +│ │ │ │ ├── @npmcli/git@5.0.4 deduped +│ │ │ │ ├─┬ glob@10.3.10 +│ │ │ │ │ ├── foreground-child@3.1.1 deduped +│ │ │ │ │ ├── jackspeak@2.3.6 deduped +│ │ │ │ │ ├── minimatch@9.0.3 deduped +│ │ │ │ │ ├── minipass@7.0.4 deduped +│ │ │ │ │ └── path-scurry@1.10.1 deduped +│ │ │ │ ├── hosted-git-info@7.0.1 deduped +│ │ │ │ ├── json-parse-even-better-errors@3.0.1 deduped +│ │ │ │ ├── normalize-package-data@6.0.0 deduped +│ │ │ │ ├── proc-log@3.0.0 deduped +│ │ │ │ └── semver@7.6.0 deduped +│ │ │ ├── @npmcli/promise-spawn@7.0.1 deduped +│ │ │ ├─┬ node-gyp@10.0.1 +│ │ │ │ ├── env-paths@2.2.1 deduped +│ │ │ │ ├── exponential-backoff@3.1.1 +│ │ │ │ ├─┬ glob@10.3.10 +│ │ │ │ │ ├── foreground-child@3.1.1 deduped +│ │ │ │ │ ├── jackspeak@2.3.6 deduped +│ │ │ │ │ ├── minimatch@9.0.3 deduped +│ │ │ │ │ ├── minipass@7.0.4 deduped +│ │ │ │ │ └── path-scurry@1.10.1 deduped +│ │ │ │ ├── graceful-fs@4.2.11 +│ │ │ │ ├── make-fetch-happen@13.0.0 deduped +│ │ │ │ ├─┬ nopt@7.2.0 +│ │ │ │ │ └── abbrev@2.0.0 +│ │ │ │ ├── proc-log@3.0.0 deduped +│ │ │ │ ├── semver@7.6.0 deduped +│ │ │ │ ├── tar@6.2.0 deduped +│ │ │ │ └─┬ which@4.0.0 +│ │ │ │ └── isexe@3.1.1 +│ │ │ └─┬ which@4.0.0 +│ │ │ └── isexe@3.1.1 +│ │ ├─┬ cacache@18.0.2 +│ │ │ ├─┬ @npmcli/fs@3.1.0 +│ │ │ │ └── semver@7.6.0 deduped +│ │ │ ├── fs-minipass@3.0.3 deduped +│ │ │ ├─┬ glob@10.3.10 +│ │ │ │ ├─┬ foreground-child@3.1.1 +│ │ │ │ │ ├── cross-spawn@7.0.3 deduped +│ │ │ │ │ └── signal-exit@4.1.0 +│ │ │ │ ├─┬ jackspeak@2.3.6 +│ │ │ │ │ ├─┬ @isaacs/cliui@8.0.2 +│ │ │ │ │ │ ├─┬ string-width-cjs@npm:string-width@4.2.3 +│ │ │ │ │ │ │ ├── emoji-regex@8.0.0 deduped +│ │ │ │ │ │ │ ├── is-fullwidth-code-point@3.0.0 deduped +│ │ │ │ │ │ │ └── strip-ansi@6.0.1 deduped +│ │ │ │ │ │ ├─┬ string-width@5.1.2 +│ │ │ │ │ │ │ ├── eastasianwidth@0.2.0 +│ │ │ │ │ │ │ ├── emoji-regex@9.2.2 +│ │ │ │ │ │ │ └── strip-ansi@7.1.0 deduped +│ │ │ │ │ │ ├─┬ strip-ansi-cjs@npm:strip-ansi@6.0.1 +│ │ │ │ │ │ │ └── ansi-regex@5.0.1 deduped +│ │ │ │ │ │ ├─┬ strip-ansi@7.1.0 +│ │ │ │ │ │ │ └── ansi-regex@6.0.1 +│ │ │ │ │ │ ├─┬ wrap-ansi-cjs@npm:wrap-ansi@7.0.0 +│ │ │ │ │ │ │ ├─┬ ansi-styles@4.3.0 +│ │ │ │ │ │ │ │ └─┬ color-convert@2.0.1 +│ │ │ │ │ │ │ │ └── color-name@1.1.4 +│ │ │ │ │ │ │ ├── string-width@4.2.3 deduped +│ │ │ │ │ │ │ └── strip-ansi@6.0.1 deduped +│ │ │ │ │ │ └─┬ wrap-ansi@8.1.0 +│ │ │ │ │ │ ├── ansi-styles@6.2.1 +│ │ │ │ │ │ ├── string-width@5.1.2 deduped +│ │ │ │ │ │ └── strip-ansi@7.1.0 deduped +│ │ │ │ │ └── @pkgjs/parseargs@0.11.0 +│ │ │ │ ├── minimatch@9.0.3 deduped +│ │ │ │ ├── minipass@7.0.4 deduped +│ │ │ │ └── path-scurry@1.10.1 deduped +│ │ │ ├── lru-cache@10.2.0 +│ │ │ ├─┬ minipass-collect@2.0.1 +│ │ │ │ └── minipass@7.0.4 deduped +│ │ │ ├─┬ minipass-flush@1.0.5 +│ │ │ │ └─┬ minipass@3.3.6 +│ │ │ │ └── yallist@4.0.0 +│ │ │ ├─┬ minipass-pipeline@1.2.4 +│ │ │ │ └─┬ minipass@3.3.6 +│ │ │ │ └── yallist@4.0.0 +│ │ │ ├── minipass@7.0.4 deduped +│ │ │ ├── p-map@4.0.0 deduped +│ │ │ ├── ssri@10.0.5 deduped +│ │ │ ├── tar@6.2.0 deduped +│ │ │ └─┬ unique-filename@3.0.0 +│ │ │ └─┬ unique-slug@4.0.0 +│ │ │ └── imurmurhash@0.1.4 deduped +│ │ ├─┬ fs-minipass@3.0.3 +│ │ │ └── minipass@7.0.4 deduped +│ │ ├── minipass@7.0.4 +│ │ ├── npm-package-arg@11.0.1 deduped +│ │ ├─┬ npm-packlist@8.0.2 +│ │ │ └─┬ ignore-walk@6.0.4 +│ │ │ └── minimatch@9.0.3 deduped +│ │ ├── npm-pick-manifest@9.0.0 deduped +│ │ ├─┬ npm-registry-fetch@16.1.0 +│ │ │ ├─┬ make-fetch-happen@13.0.0 +│ │ │ │ ├─┬ @npmcli/agent@2.2.1 +│ │ │ │ │ ├── agent-base@7.1.0 deduped +│ │ │ │ │ ├── http-proxy-agent@7.0.2 deduped +│ │ │ │ │ ├── https-proxy-agent@7.0.2 deduped +│ │ │ │ │ ├── lru-cache@10.2.0 +│ │ │ │ │ └── socks-proxy-agent@8.0.2 deduped +│ │ │ │ ├── cacache@18.0.2 deduped +│ │ │ │ ├── http-cache-semantics@4.1.1 +│ │ │ │ ├── is-lambda@1.0.1 +│ │ │ │ ├── minipass-fetch@3.0.4 deduped +│ │ │ │ ├── minipass-flush@1.0.5 deduped +│ │ │ │ ├── minipass-pipeline@1.2.4 deduped +│ │ │ │ ├── minipass@7.0.4 deduped +│ │ │ │ ├── negotiator@0.6.3 deduped +│ │ │ │ ├── promise-retry@2.0.1 deduped +│ │ │ │ └── ssri@10.0.5 deduped +│ │ │ ├─┬ minipass-fetch@3.0.4 +│ │ │ │ ├── encoding@0.1.13 deduped +│ │ │ │ ├─┬ minipass-sized@1.0.3 +│ │ │ │ │ └─┬ minipass@3.3.6 +│ │ │ │ │ └── yallist@4.0.0 +│ │ │ │ ├── minipass@7.0.4 deduped +│ │ │ │ └── minizlib@2.1.2 deduped +│ │ │ ├─┬ minipass-json-stream@1.0.1 +│ │ │ │ ├── jsonparse@1.3.1 +│ │ │ │ └─┬ minipass@3.3.6 +│ │ │ │ └── yallist@4.0.0 +│ │ │ ├── minipass@7.0.4 deduped +│ │ │ ├── minizlib@2.1.2 deduped +│ │ │ ├── npm-package-arg@11.0.1 deduped +│ │ │ └── proc-log@3.0.0 deduped +│ │ ├── proc-log@3.0.0 deduped +│ │ ├─┬ promise-retry@2.0.1 +│ │ │ ├── err-code@2.0.3 +│ │ │ └── retry@0.12.0 +│ │ ├─┬ read-package-json-fast@3.0.2 +│ │ │ ├── json-parse-even-better-errors@3.0.1 +│ │ │ └── npm-normalize-package-bin@3.0.1 deduped +│ │ ├─┬ read-package-json@7.0.0 +│ │ │ ├─┬ glob@10.3.10 +│ │ │ │ ├── foreground-child@3.1.1 deduped +│ │ │ │ ├── jackspeak@2.3.6 deduped +│ │ │ │ ├── minimatch@9.0.3 deduped +│ │ │ │ ├── minipass@7.0.4 deduped +│ │ │ │ └── path-scurry@1.10.1 deduped +│ │ │ ├── json-parse-even-better-errors@3.0.1 deduped +│ │ │ ├─┬ normalize-package-data@6.0.0 +│ │ │ │ ├── hosted-git-info@7.0.1 deduped +│ │ │ │ ├── is-core-module@2.13.1 deduped +│ │ │ │ ├── semver@7.6.0 deduped +│ │ │ │ └─┬ validate-npm-package-license@3.0.4 +│ │ │ │ ├─┬ spdx-correct@3.2.0 +│ │ │ │ │ ├── spdx-expression-parse@3.0.1 deduped +│ │ │ │ │ └── spdx-license-ids@3.0.17 +│ │ │ │ └─┬ spdx-expression-parse@3.0.1 +│ │ │ │ ├── spdx-exceptions@2.5.0 +│ │ │ │ └── spdx-license-ids@3.0.17 deduped +│ │ │ └── npm-normalize-package-bin@3.0.1 deduped +│ │ ├─┬ sigstore@2.2.2 +│ │ │ ├─┬ @sigstore/bundle@2.2.0 +│ │ │ │ └── @sigstore/protobuf-specs@0.3.0 deduped +│ │ │ ├── @sigstore/core@1.0.0 +│ │ │ ├── @sigstore/protobuf-specs@0.3.0 +│ │ │ ├─┬ @sigstore/sign@2.2.3 +│ │ │ │ ├── @sigstore/bundle@2.2.0 deduped +│ │ │ │ ├── @sigstore/core@1.0.0 deduped +│ │ │ │ ├── @sigstore/protobuf-specs@0.3.0 deduped +│ │ │ │ └── make-fetch-happen@13.0.0 deduped +│ │ │ ├─┬ @sigstore/tuf@2.3.1 +│ │ │ │ ├── @sigstore/protobuf-specs@0.3.0 deduped +│ │ │ │ └─┬ tuf-js@2.2.0 +│ │ │ │ ├─┬ @tufjs/models@2.0.0 +│ │ │ │ │ ├── @tufjs/canonical-json@2.0.0 +│ │ │ │ │ └── minimatch@9.0.3 deduped +│ │ │ │ ├── debug@4.3.4 deduped +│ │ │ │ └── make-fetch-happen@13.0.0 deduped +│ │ │ └─┬ @sigstore/verify@1.1.0 +│ │ │ ├── @sigstore/bundle@2.2.0 deduped +│ │ │ ├── @sigstore/core@1.0.0 deduped +│ │ │ └── @sigstore/protobuf-specs@0.3.0 deduped +│ │ ├─┬ ssri@10.0.5 +│ │ │ └── minipass@7.0.4 deduped +│ │ └── tar@6.2.0 deduped +│ ├─┬ resolve@1.22.8 +│ │ ├─┬ is-core-module@2.13.1 +│ │ │ └─┬ hasown@2.0.1 +│ │ │ └── function-bind@1.1.2 deduped +│ │ ├── path-parse@1.0.7 +│ │ └── supports-preserve-symlinks-flag@1.0.0 +│ ├── semver@7.6.0 deduped +│ ├── symbol-observable@4.0.0 +│ └─┬ yargs@17.7.2 +│ ├── cliui@8.0.1 deduped +│ ├── escalade@3.1.2 +│ ├── get-caller-file@2.0.5 +│ ├── require-directory@2.1.1 +│ ├── string-width@4.2.3 deduped +│ ├── y18n@5.0.8 +│ └── yargs-parser@21.1.1 deduped +├─┬ @angular/common@17.2.3 +│ ├── @angular/core@17.2.3 deduped +│ ├── rxjs@7.8.1 deduped +│ └── tslib@2.6.2 deduped +├─┬ @angular/compiler-cli@17.2.3 +│ ├── @angular/compiler@17.2.3 deduped +│ ├── @babel/core@7.23.9 deduped +│ ├── @jridgewell/sourcemap-codec@1.4.15 +│ ├─┬ chokidar@3.6.0 +│ │ ├─┬ anymatch@3.1.3 +│ │ │ ├── normalize-path@3.0.0 deduped +│ │ │ └── picomatch@2.3.1 +│ │ ├── braces@3.0.2 deduped +│ │ ├── fsevents@2.3.3 deduped +│ │ ├── glob-parent@5.1.2 deduped +│ │ ├─┬ is-binary-path@2.1.0 +│ │ │ └── binary-extensions@2.2.0 +│ │ ├── is-glob@4.0.3 deduped +│ │ ├── normalize-path@3.0.0 deduped +│ │ └─┬ readdirp@3.6.0 +│ │ └── picomatch@2.3.1 +│ ├── convert-source-map@1.9.0 +│ ├── reflect-metadata@0.2.1 +│ ├── semver@7.6.0 deduped +│ ├── tslib@2.6.2 deduped +│ ├── typescript@5.3.3 deduped +│ └── yargs@17.7.2 deduped +├─┬ @angular/compiler@17.2.3 +│ ├── @angular/core@17.2.3 deduped +│ └── tslib@2.6.2 deduped +├─┬ @angular/core@17.2.3 +│ ├── rxjs@7.8.1 deduped +│ ├── tslib@2.6.2 deduped +│ └── zone.js@0.14.4 deduped +├─┬ @angular/fire@17.0.1 +│ ├── @angular-devkit/schematics@17.2.1 deduped +│ ├── @angular/common@17.2.3 deduped +│ ├── @angular/core@17.2.3 deduped +│ ├── @angular/platform-browser-dynamic@17.2.3 deduped +│ ├── @angular/platform-browser@17.2.3 deduped +│ ├── @schematics/angular@17.2.1 deduped +│ ├── firebase-tools@13.4.0 deduped +│ ├── firebase@10.8.1 deduped +│ ├─┬ fs-extra@8.1.0 +│ │ ├── graceful-fs@4.2.11 +│ │ ├─┬ jsonfile@4.0.0 +│ │ │ └── graceful-fs@4.2.11 +│ │ └── universalify@0.1.2 +│ ├── fuzzy@0.1.3 deduped +│ ├─┬ inquirer-autocomplete-prompt@1.4.0 +│ │ ├── ansi-escapes@4.3.2 deduped +│ │ ├─┬ chalk@4.1.2 +│ │ │ ├─┬ ansi-styles@4.3.0 +│ │ │ │ └─┬ color-convert@2.0.1 +│ │ │ │ └── color-name@1.1.4 +│ │ │ └─┬ supports-color@7.2.0 +│ │ │ └── has-flag@4.0.0 +│ │ ├── figures@3.2.0 deduped +│ │ ├── inquirer@8.2.6 deduped +│ │ ├── run-async@2.4.1 +│ │ └─┬ rxjs@6.6.7 +│ │ └── tslib@1.14.1 +│ ├─┬ inquirer@8.2.6 +│ │ ├── ansi-escapes@4.3.2 deduped +│ │ ├── chalk@4.1.2 deduped +│ │ ├── cli-cursor@3.1.0 deduped +│ │ ├── cli-width@3.0.0 +│ │ ├── external-editor@3.1.0 deduped +│ │ ├── figures@3.2.0 deduped +│ │ ├── lodash@4.17.21 deduped +│ │ ├── mute-stream@0.0.8 +│ │ ├── ora@5.4.1 deduped +│ │ ├── run-async@2.4.1 deduped +│ │ ├── rxjs@7.8.1 deduped +│ │ ├── string-width@4.2.3 deduped +│ │ ├── strip-ansi@6.0.1 deduped +│ │ ├── through@2.3.8 +│ │ └─┬ wrap-ansi@6.2.0 +│ │ ├── ansi-styles@4.3.0 deduped +│ │ ├── string-width@4.2.3 deduped +│ │ └── strip-ansi@6.0.1 deduped +│ ├── jsonc-parser@3.2.1 deduped +│ ├─┬ node-fetch@2.7.0 +│ │ ├─┬ encoding@0.1.13 +│ │ │ └─┬ iconv-lite@0.6.3 +│ │ │ └── safer-buffer@2.1.2 deduped +│ │ └─┬ whatwg-url@5.0.0 +│ │ ├── tr46@0.0.3 +│ │ └── webidl-conversions@3.0.1 +│ ├─┬ open@8.4.2 +│ │ ├── define-lazy-prop@2.0.0 +│ │ ├── is-docker@2.2.1 +│ │ └─┬ is-wsl@2.2.0 +│ │ └── is-docker@2.2.1 deduped +│ ├── ora@5.4.1 deduped +│ ├─┬ rxfire@6.0.5 +│ │ ├── firebase@10.8.1 deduped +│ │ └── rxjs@7.8.1 deduped +│ ├── rxjs@7.8.1 deduped +│ ├── semver@7.6.0 deduped +│ ├── triple-beam@1.4.1 +│ ├── tslib@2.6.2 deduped +│ └─┬ winston@3.11.0 +│ ├── @colors/colors@1.6.0 +│ ├─┬ @dabh/diagnostics@2.0.3 +│ │ ├─┬ colorspace@1.1.4 +│ │ │ ├─┬ color@3.2.1 +│ │ │ │ ├── color-convert@1.9.3 deduped +│ │ │ │ └─┬ color-string@1.9.1 +│ │ │ │ ├── color-name@1.1.3 deduped +│ │ │ │ └─┬ simple-swizzle@0.2.2 +│ │ │ │ └── is-arrayish@0.3.2 +│ │ │ └── text-hex@1.0.0 +│ │ ├── enabled@2.0.0 +│ │ └── kuler@2.0.0 +│ ├── async@3.2.5 +│ ├── is-stream@2.0.1 +│ ├─┬ logform@2.6.0 +│ │ ├── @colors/colors@1.6.0 +│ │ ├── @types/triple-beam@1.3.5 +│ │ ├── fecha@4.2.3 +│ │ ├── ms@2.1.2 deduped +│ │ ├── safe-stable-stringify@2.4.3 deduped +│ │ └── triple-beam@1.4.1 deduped +│ ├─┬ one-time@1.0.0 +│ │ └── fn.name@1.1.0 +│ ├─┬ readable-stream@3.6.2 +│ │ ├── inherits@2.0.4 deduped +│ │ ├─┬ string_decoder@1.3.0 +│ │ │ └── safe-buffer@5.2.1 deduped +│ │ └── util-deprecate@1.0.2 +│ ├── safe-stable-stringify@2.4.3 +│ ├── stack-trace@0.0.10 +│ ├── triple-beam@1.4.1 deduped +│ └── winston-transport@4.7.0 deduped +├─┬ @angular/forms@17.2.3 +│ ├── @angular/common@17.2.3 deduped +│ ├── @angular/core@17.2.3 deduped +│ ├── @angular/platform-browser@17.2.3 deduped +│ ├── rxjs@7.8.1 deduped +│ └── tslib@2.6.2 deduped +├─┬ @angular/material@17.2.1 +│ ├── @angular/animations@17.2.3 deduped +│ ├── @angular/cdk@17.2.1 deduped +│ ├── @angular/common@17.2.3 deduped +│ ├── @angular/core@17.2.3 deduped +│ ├── @angular/forms@17.2.3 deduped +│ ├── @angular/platform-browser@17.2.3 deduped +│ ├─┬ @material/animation@15.0.0-canary.7f224ddd4.0 +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/auto-init@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/banner@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/button@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/shape@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├─┬ @material/tokens@15.0.0-canary.7f224ddd4.0 +│ │ │ └── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/base@15.0.0-canary.7f224ddd4.0 +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/button@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/density@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├─┬ @material/focus-ring@15.0.0-canary.7f224ddd4.0 +│ │ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ │ └── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/shape@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tokens@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/touch-target@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/card@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/shape@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tokens@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/checkbox@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/density@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/focus-ring@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/touch-target@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/chips@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/checkbox@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/density@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/focus-ring@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/shape@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tokens@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/touch-target@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── safevalues@0.3.4 +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/circular-progress@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├─┬ @material/progress-indicator@15.0.0-canary.7f224ddd4.0 +│ │ │ └── tslib@2.6.2 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/data-table@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/checkbox@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/density@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/icon-button@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/linear-progress@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/list@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/menu@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/select@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/shape@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tokens@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/touch-target@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/density@15.0.0-canary.7f224ddd4.0 +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/dialog@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/button@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/icon-button@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/shape@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tokens@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/touch-target@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/dom@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/drawer@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/list@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/shape@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/elevation@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/fab@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/focus-ring@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/shape@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tokens@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/touch-target@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/feature-targeting@15.0.0-canary.7f224ddd4.0 +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/floating-label@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/form-field@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/icon-button@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/density@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/focus-ring@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/touch-target@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/image-list@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/shape@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/layout-grid@15.0.0-canary.7f224ddd4.0 +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/line-ripple@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/linear-progress@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/progress-indicator@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/list@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/density@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/shape@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tokens@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/menu-surface@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/shape@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/menu@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/list@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/menu-surface@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/shape@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tokens@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/notched-outline@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/floating-label@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/shape@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/radio@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/density@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/focus-ring@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/touch-target@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/ripple@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/rtl@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/segmented-button@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/touch-target@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/select@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/density@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/floating-label@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/line-ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/list@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/menu-surface@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/menu@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/notched-outline@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/shape@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tokens@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/shape@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/slider@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tokens@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/snackbar@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/button@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/icon-button@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/shape@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tokens@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/switch@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/density@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/focus-ring@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/shape@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tokens@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── safevalues@0.3.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/tab-bar@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/density@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tab-indicator@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tab-scroller@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tab@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tokens@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/tab-indicator@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/tab-scroller@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tab@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/tab@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/focus-ring@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tab-indicator@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tokens@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/textfield@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/density@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/floating-label@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/line-ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/notched-outline@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/shape@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tokens@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/theme@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/tooltip@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/button@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/dom@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/shape@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/tokens@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── safevalues@0.3.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/top-app-bar@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/animation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/elevation@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/ripple@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/shape@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/typography@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/touch-target@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/base@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/rtl@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @material/typography@15.0.0-canary.7f224ddd4.0 +│ │ ├── @material/feature-targeting@15.0.0-canary.7f224ddd4.0 deduped +│ │ ├── @material/theme@15.0.0-canary.7f224ddd4.0 deduped +│ │ └── tslib@2.6.2 deduped +│ ├── rxjs@7.8.1 deduped +│ └── tslib@2.6.2 deduped +├─┬ @angular/platform-browser-dynamic@17.2.3 +│ ├── @angular/common@17.2.3 deduped +│ ├── @angular/compiler@17.2.3 deduped +│ ├── @angular/core@17.2.3 deduped +│ ├── @angular/platform-browser@17.2.3 deduped +│ └── tslib@2.6.2 deduped +├─┬ @angular/platform-browser@17.2.3 +│ ├── @angular/animations@17.2.3 deduped +│ ├── @angular/common@17.2.3 deduped +│ ├── @angular/core@17.2.3 deduped +│ └── tslib@2.6.2 deduped +├─┬ @angular/router@17.2.3 +│ ├── @angular/common@17.2.3 deduped +│ ├── @angular/core@17.2.3 deduped +│ ├── @angular/platform-browser@17.2.3 deduped +│ ├── rxjs@7.8.1 deduped +│ └── tslib@2.6.2 deduped +├─┬ @capacitor/android@5.7.0 +│ └── @capacitor/core@5.7.0 deduped +├─┬ @capacitor/cli@5.7.0 +│ ├─┬ @ionic/cli-framework-output@2.2.8 +│ │ ├── @ionic/utils-terminal@2.3.5 deduped +│ │ ├── debug@4.3.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @ionic/utils-fs@3.1.7 +│ │ ├─┬ @types/fs-extra@8.1.5 +│ │ │ └── @types/node@20.11.21 deduped +│ │ ├── debug@4.3.4 deduped +│ │ ├─┬ fs-extra@9.1.0 +│ │ │ ├── at-least-node@1.0.0 deduped +│ │ │ ├── graceful-fs@4.2.11 +│ │ │ ├─┬ jsonfile@6.1.0 +│ │ │ │ ├── graceful-fs@4.2.11 deduped +│ │ │ │ └── universalify@2.0.1 deduped +│ │ │ └── universalify@2.0.1 +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @ionic/utils-subprocess@2.1.14 +│ │ ├─┬ @ionic/utils-array@2.1.6 +│ │ │ ├── debug@4.3.4 deduped +│ │ │ └── tslib@2.6.2 deduped +│ │ ├── @ionic/utils-fs@3.1.7 deduped +│ │ ├─┬ @ionic/utils-process@2.1.11 +│ │ │ ├─┬ @ionic/utils-object@2.1.6 +│ │ │ │ ├── debug@4.3.4 deduped +│ │ │ │ └── tslib@2.6.2 deduped +│ │ │ ├─┬ @ionic/utils-terminal@2.3.4 +│ │ │ │ ├── @types/slice-ansi@4.0.0 deduped +│ │ │ │ ├── debug@4.3.4 deduped +│ │ │ │ ├── signal-exit@3.0.7 deduped +│ │ │ │ ├── slice-ansi@4.0.0 deduped +│ │ │ │ ├── string-width@4.2.3 deduped +│ │ │ │ ├── strip-ansi@6.0.1 deduped +│ │ │ │ ├── tslib@2.6.2 deduped +│ │ │ │ ├── untildify@4.0.0 deduped +│ │ │ │ └── wrap-ansi@7.0.0 deduped +│ │ │ ├── debug@4.3.4 deduped +│ │ │ ├── signal-exit@3.0.7 deduped +│ │ │ ├── tree-kill@1.2.2 deduped +│ │ │ └── tslib@2.6.2 deduped +│ │ ├─┬ @ionic/utils-stream@3.1.6 +│ │ │ ├── debug@4.3.4 deduped +│ │ │ └── tslib@2.6.2 deduped +│ │ ├─┬ @ionic/utils-terminal@2.3.4 +│ │ │ ├── @types/slice-ansi@4.0.0 deduped +│ │ │ ├── debug@4.3.4 deduped +│ │ │ ├── signal-exit@3.0.7 deduped +│ │ │ ├── slice-ansi@4.0.0 deduped +│ │ │ ├── string-width@4.2.3 deduped +│ │ │ ├── strip-ansi@6.0.1 deduped +│ │ │ ├── tslib@2.6.2 deduped +│ │ │ ├── untildify@4.0.0 deduped +│ │ │ └── wrap-ansi@7.0.0 deduped +│ │ ├── cross-spawn@7.0.3 deduped +│ │ ├── debug@4.3.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @ionic/utils-terminal@2.3.5 +│ │ ├── @types/slice-ansi@4.0.0 +│ │ ├── debug@4.3.4 deduped +│ │ ├── signal-exit@3.0.7 +│ │ ├─┬ slice-ansi@4.0.0 +│ │ │ ├─┬ ansi-styles@4.3.0 +│ │ │ │ └─┬ color-convert@2.0.1 +│ │ │ │ └── color-name@1.1.4 +│ │ │ ├── astral-regex@2.0.0 +│ │ │ └── is-fullwidth-code-point@3.0.0 deduped +│ │ ├── string-width@4.2.3 deduped +│ │ ├── strip-ansi@6.0.1 deduped +│ │ ├── tslib@2.6.2 deduped +│ │ ├── untildify@4.0.0 deduped +│ │ └─┬ wrap-ansi@7.0.0 +│ │ ├─┬ ansi-styles@4.3.0 +│ │ │ └─┬ color-convert@2.0.1 +│ │ │ └── color-name@1.1.4 +│ │ ├── string-width@4.2.3 deduped +│ │ └── strip-ansi@6.0.1 deduped +│ ├── commander@9.5.0 +│ ├─┬ debug@4.3.4 +│ │ └── ms@2.1.2 +│ ├── env-paths@2.2.1 +│ ├── kleur@4.1.5 +│ ├─┬ native-run@2.0.1 +│ │ ├── @ionic/utils-fs@3.1.7 deduped +│ │ ├── @ionic/utils-terminal@2.3.5 deduped +│ │ ├─┬ bplist-parser@0.3.2 +│ │ │ └── big-integer@1.6.52 +│ │ ├── debug@4.3.4 deduped +│ │ ├─┬ elementtree@0.1.7 +│ │ │ └── sax@1.1.4 deduped +│ │ ├── ini@4.1.1 deduped +│ │ ├── plist@3.1.0 deduped +│ │ ├── split2@4.2.0 +│ │ ├─┬ through2@4.0.2 +│ │ │ └── readable-stream@3.6.2 deduped +│ │ ├── tslib@2.6.2 deduped +│ │ └── yauzl@2.10.0 deduped +│ ├─┬ open@8.4.2 +│ │ ├── define-lazy-prop@2.0.0 +│ │ ├── is-docker@2.2.1 +│ │ └─┬ is-wsl@2.2.0 +│ │ └── is-docker@2.2.1 deduped +│ ├─┬ plist@3.1.0 +│ │ ├── @xmldom/xmldom@0.8.10 +│ │ ├── base64-js@1.5.1 +│ │ └── xmlbuilder@15.1.1 +│ ├─┬ prompts@2.4.2 +│ │ ├── kleur@3.0.3 +│ │ └── sisteransi@1.0.5 +│ ├─┬ rimraf@4.4.1 +│ │ └─┬ glob@9.3.5 +│ │ ├── fs.realpath@1.0.0 deduped +│ │ ├─┬ minimatch@8.0.4 +│ │ │ └── brace-expansion@2.0.1 deduped +│ │ ├── minipass@4.2.8 +│ │ └─┬ path-scurry@1.10.1 +│ │ ├── lru-cache@10.2.0 +│ │ └── minipass@7.0.4 deduped +│ ├── semver@7.6.0 deduped +│ ├─┬ tar@6.2.0 +│ │ ├── chownr@2.0.0 +│ │ ├─┬ fs-minipass@2.1.0 +│ │ │ └─┬ minipass@3.3.6 +│ │ │ └── yallist@4.0.0 deduped +│ │ ├── minipass@5.0.0 +│ │ ├─┬ minizlib@2.1.2 +│ │ │ ├─┬ minipass@3.3.6 +│ │ │ │ └── yallist@4.0.0 deduped +│ │ │ └── yallist@4.0.0 +│ │ ├── mkdirp@1.0.4 +│ │ └── yallist@4.0.0 +│ ├── tslib@2.6.2 deduped +│ └─┬ xml2js@0.5.0 +│ ├── sax@1.1.4 +│ └── xmlbuilder@11.0.1 +├─┬ @capacitor/core@5.7.0 +│ └── tslib@2.6.2 deduped +├─┬ @capacitor/ios@5.7.0 +│ └── @capacitor/core@5.7.0 deduped +├─┬ @codetrix-studio/capacitor-google-auth@3.4.0-rc.0 +│ └── @capacitor/core@5.7.0 deduped +├─┬ @cypress/schematic@2.5.1 +│ ├── @angular/cli@17.2.1 deduped +│ ├── @angular/core@17.2.3 deduped +│ ├── jsonc-parser@3.2.1 deduped +│ └─┬ rxjs@6.6.7 +│ └── tslib@1.14.1 +├─┬ @ngx-pwa/local-storage@17.0.0 +│ ├── @angular/common@17.2.3 deduped +│ ├── @angular/core@17.2.3 deduped +│ ├── rxjs@7.8.1 deduped +│ └── tslib@2.6.2 deduped +├── @types/jasmine@5.1.4 +├─┬ @types/jasminewd2@2.0.13 +│ └── @types/jasmine@5.1.4 deduped +├─┬ @types/node@20.11.21 +│ └── undici-types@5.26.5 +├─┬ @typescript-eslint/eslint-plugin@7.1.0 +│ ├── @eslint-community/regexpp@4.10.0 +│ ├── @typescript-eslint/parser@7.1.0 deduped +│ ├─┬ @typescript-eslint/scope-manager@7.1.0 +│ │ ├── @typescript-eslint/types@7.1.0 deduped +│ │ └── @typescript-eslint/visitor-keys@7.1.0 deduped +│ ├─┬ @typescript-eslint/type-utils@7.1.0 +│ │ ├── @typescript-eslint/typescript-estree@7.1.0 deduped +│ │ ├── @typescript-eslint/utils@7.1.0 deduped +│ │ ├── debug@4.3.4 deduped +│ │ ├── eslint@8.57.0 deduped +│ │ └── ts-api-utils@1.2.1 deduped +│ ├─┬ @typescript-eslint/utils@7.1.0 +│ │ ├── @eslint-community/eslint-utils@4.4.0 deduped +│ │ ├── @types/json-schema@7.0.15 deduped +│ │ ├── @types/semver@7.5.8 deduped +│ │ ├── @typescript-eslint/scope-manager@7.1.0 deduped +│ │ ├── @typescript-eslint/types@7.1.0 deduped +│ │ ├── @typescript-eslint/typescript-estree@7.1.0 deduped +│ │ ├── eslint@8.57.0 deduped +│ │ └── semver@7.6.0 deduped +│ ├─┬ @typescript-eslint/visitor-keys@7.1.0 +│ │ ├── @typescript-eslint/types@7.1.0 deduped +│ │ └── eslint-visitor-keys@3.4.3 deduped +│ ├── debug@4.3.4 deduped +│ ├── eslint@8.57.0 deduped +│ ├── graphemer@1.4.0 +│ ├── ignore@5.3.0 deduped +│ ├── natural-compare@1.4.0 +│ ├── semver@7.6.0 deduped +│ └─┬ ts-api-utils@1.2.1 +│ └── typescript@5.3.3 deduped +├─┬ @typescript-eslint/parser@7.1.0 +│ ├── @typescript-eslint/scope-manager@7.1.0 deduped +│ ├── @typescript-eslint/types@7.1.0 +│ ├─┬ @typescript-eslint/typescript-estree@7.1.0 +│ │ ├── @typescript-eslint/types@7.1.0 deduped +│ │ ├── @typescript-eslint/visitor-keys@7.1.0 deduped +│ │ ├── debug@4.3.4 deduped +│ │ ├─┬ globby@11.1.0 +│ │ │ ├── array-union@2.1.0 +│ │ │ ├── dir-glob@3.0.1 deduped +│ │ │ ├── fast-glob@3.3.2 deduped +│ │ │ ├── ignore@5.3.0 deduped +│ │ │ ├── merge2@1.4.1 deduped +│ │ │ └── slash@3.0.0 +│ │ ├── is-glob@4.0.3 deduped +│ │ ├─┬ minimatch@9.0.3 +│ │ │ └─┬ brace-expansion@2.0.1 +│ │ │ └── balanced-match@1.0.2 deduped +│ │ ├── semver@7.6.0 deduped +│ │ └── ts-api-utils@1.2.1 deduped +│ ├── @typescript-eslint/visitor-keys@7.1.0 deduped +│ ├── debug@4.3.4 deduped +│ └── eslint@8.57.0 deduped +├── angular2-uuid@1.1.1 +├─┬ cypress@13.6.6 +│ ├─┬ @cypress/request@3.0.1 +│ │ ├── aws-sign2@0.7.0 +│ │ ├── aws4@1.12.0 +│ │ ├── caseless@0.12.0 +│ │ ├─┬ combined-stream@1.0.8 +│ │ │ └── delayed-stream@1.0.0 +│ │ ├── extend@3.0.2 +│ │ ├── forever-agent@0.6.1 +│ │ ├─┬ form-data@2.3.3 +│ │ │ ├── asynckit@0.4.0 deduped +│ │ │ ├── combined-stream@1.0.8 deduped +│ │ │ └── mime-types@2.1.35 deduped +│ │ ├─┬ http-signature@1.3.6 +│ │ │ ├── assert-plus@1.0.0 +│ │ │ ├─┬ jsprim@2.0.2 +│ │ │ │ ├── assert-plus@1.0.0 deduped +│ │ │ │ ├── extsprintf@1.3.0 +│ │ │ │ ├── json-schema@0.4.0 +│ │ │ │ └─┬ verror@1.10.0 +│ │ │ │ ├── assert-plus@1.0.0 deduped +│ │ │ │ ├── core-util-is@1.0.2 deduped +│ │ │ │ └── extsprintf@1.3.0 deduped +│ │ │ └─┬ sshpk@1.18.0 +│ │ │ ├─┬ asn1@0.2.6 +│ │ │ │ └── safer-buffer@2.1.2 deduped +│ │ │ ├── assert-plus@1.0.0 deduped +│ │ │ ├─┬ bcrypt-pbkdf@1.0.2 +│ │ │ │ └── tweetnacl@0.14.5 deduped +│ │ │ ├─┬ dashdash@1.14.1 +│ │ │ │ └── assert-plus@1.0.0 deduped +│ │ │ ├─┬ ecc-jsbn@0.1.2 +│ │ │ │ ├── jsbn@0.1.1 +│ │ │ │ └── safer-buffer@2.1.2 deduped +│ │ │ ├─┬ getpass@0.1.7 +│ │ │ │ └── assert-plus@1.0.0 deduped +│ │ │ ├── jsbn@0.1.1 +│ │ │ ├── safer-buffer@2.1.2 deduped +│ │ │ └── tweetnacl@0.14.5 +│ │ ├── is-typedarray@1.0.0 +│ │ ├── isstream@0.1.2 +│ │ ├── json-stringify-safe@5.0.1 +│ │ ├── mime-types@2.1.35 deduped +│ │ ├── performance-now@2.1.0 +│ │ ├─┬ qs@6.10.4 +│ │ │ └─┬ side-channel@1.0.5 +│ │ │ ├── call-bind@1.0.7 deduped +│ │ │ ├── es-errors@1.3.0 deduped +│ │ │ ├── get-intrinsic@1.2.4 deduped +│ │ │ └── object-inspect@1.13.1 +│ │ ├── safe-buffer@5.2.1 +│ │ ├─┬ tough-cookie@4.1.3 +│ │ │ ├── psl@1.9.0 +│ │ │ ├── punycode@2.3.1 +│ │ │ ├── universalify@0.2.0 +│ │ │ └─┬ url-parse@1.5.10 +│ │ │ ├── querystringify@2.2.0 +│ │ │ └── requires-port@1.0.0 deduped +│ │ ├─┬ tunnel-agent@0.6.0 +│ │ │ └── safe-buffer@5.2.1 deduped +│ │ └── uuid@8.3.2 deduped +│ ├─┬ @cypress/xvfb@1.2.4 +│ │ ├─┬ debug@3.2.7 +│ │ │ └── ms@2.1.2 deduped +│ │ └── lodash.once@4.1.1 +│ ├── @types/sinonjs__fake-timers@8.1.1 +│ ├── @types/sizzle@2.3.8 +│ ├── arch@2.2.0 +│ ├── blob-util@2.0.2 +│ ├── bluebird@3.7.2 +│ ├─┬ buffer@5.7.1 +│ │ ├── base64-js@1.5.1 deduped +│ │ └── ieee754@1.2.1 +│ ├── cachedir@2.4.0 +│ ├─┬ chalk@4.1.2 +│ │ ├─┬ ansi-styles@4.3.0 +│ │ │ └─┬ color-convert@2.0.1 +│ │ │ └── color-name@1.1.4 +│ │ └─┬ supports-color@7.2.0 +│ │ └── has-flag@4.0.0 deduped +│ ├── check-more-types@2.24.0 +│ ├─┬ cli-cursor@3.1.0 +│ │ └─┬ restore-cursor@3.1.0 +│ │ ├── onetime@5.1.2 deduped +│ │ └── signal-exit@3.0.7 deduped +│ ├─┬ cli-table3@0.6.3 +│ │ ├── @colors/colors@1.5.0 deduped +│ │ └── string-width@4.2.3 deduped +│ ├── commander@6.2.1 +│ ├── common-tags@1.8.2 +│ ├── dayjs@1.11.10 +│ ├── debug@4.3.4 deduped +│ ├─┬ enquirer@2.3.6 +│ │ └── ansi-colors@4.1.3 deduped +│ ├── eventemitter2@6.4.7 +│ ├─┬ execa@4.1.0 +│ │ ├── cross-spawn@7.0.3 deduped +│ │ ├─┬ get-stream@5.2.0 +│ │ │ └── pump@3.0.0 deduped +│ │ ├── human-signals@1.1.1 +│ │ ├── is-stream@2.0.1 deduped +│ │ ├── merge-stream@2.0.0 +│ │ ├── npm-run-path@4.0.1 deduped +│ │ ├─┬ onetime@5.1.2 +│ │ │ └── mimic-fn@2.1.0 +│ │ ├── signal-exit@3.0.7 deduped +│ │ └── strip-final-newline@2.0.0 +│ ├─┬ executable@4.1.1 +│ │ └── pify@2.3.0 +│ ├─┬ extract-zip@2.0.1 +│ │ ├─┬ @types/yauzl@2.10.3 +│ │ │ └── @types/node@20.11.21 deduped +│ │ ├── debug@4.3.4 deduped +│ │ ├── get-stream@5.2.0 deduped +│ │ └── yauzl@2.10.0 deduped +│ ├─┬ figures@3.2.0 +│ │ └── escape-string-regexp@1.0.5 +│ ├─┬ fs-extra@9.1.0 +│ │ ├── at-least-node@1.0.0 +│ │ ├── graceful-fs@4.2.11 +│ │ ├─┬ jsonfile@6.1.0 +│ │ │ ├── graceful-fs@4.2.11 deduped +│ │ │ └── universalify@2.0.1 deduped +│ │ └── universalify@2.0.1 +│ ├─┬ getos@3.2.1 +│ │ └── async@3.2.5 deduped +│ ├─┬ is-ci@3.0.1 +│ │ └── ci-info@3.9.0 +│ ├─┬ is-installed-globally@0.4.0 +│ │ ├─┬ global-dirs@3.0.1 +│ │ │ └── ini@2.0.0 +│ │ └── is-path-inside@3.0.3 deduped +│ ├── lazy-ass@1.6.0 +│ ├─┬ listr2@3.14.0 +│ │ ├─┬ cli-truncate@2.1.0 +│ │ │ ├─┬ slice-ansi@3.0.0 +│ │ │ │ ├─┬ ansi-styles@4.3.0 +│ │ │ │ │ └─┬ color-convert@2.0.1 +│ │ │ │ │ └── color-name@1.1.4 +│ │ │ │ ├── astral-regex@2.0.0 deduped +│ │ │ │ └── is-fullwidth-code-point@3.0.0 deduped +│ │ │ └── string-width@4.2.3 deduped +│ │ ├── colorette@2.0.20 deduped +│ │ ├── enquirer@2.3.6 deduped +│ │ ├─┬ log-update@4.0.0 +│ │ │ ├── ansi-escapes@4.3.2 deduped +│ │ │ ├── cli-cursor@3.1.0 deduped +│ │ │ ├── slice-ansi@4.0.0 deduped +│ │ │ └─┬ wrap-ansi@6.2.0 +│ │ │ ├─┬ ansi-styles@4.3.0 +│ │ │ │ └─┬ color-convert@2.0.1 +│ │ │ │ └── color-name@1.1.4 +│ │ │ ├── string-width@4.2.3 deduped +│ │ │ └── strip-ansi@6.0.1 deduped +│ │ ├─┬ p-map@4.0.0 +│ │ │ └─┬ aggregate-error@3.1.0 +│ │ │ ├── clean-stack@2.2.0 +│ │ │ └── indent-string@4.0.0 +│ │ ├── rfdc@1.3.1 +│ │ ├── rxjs@7.8.1 deduped +│ │ ├── through@2.3.8 deduped +│ │ └── wrap-ansi@7.0.0 deduped +│ ├── lodash@4.17.21 +│ ├─┬ log-symbols@4.1.0 +│ │ ├─┬ chalk@4.1.2 +│ │ │ ├─┬ ansi-styles@4.3.0 +│ │ │ │ └─┬ color-convert@2.0.1 +│ │ │ │ └── color-name@1.1.4 +│ │ │ └─┬ supports-color@7.2.0 +│ │ │ └── has-flag@4.0.0 +│ │ └── is-unicode-supported@0.1.0 deduped +│ ├── minimist@1.2.8 +│ ├── ospath@1.2.2 +│ ├── pretty-bytes@5.6.0 +│ ├── process@0.11.10 +│ ├── proxy-from-env@1.0.0 +│ ├─┬ request-progress@3.0.0 +│ │ └── throttleit@1.0.1 +│ ├── semver@7.6.0 deduped +│ ├─┬ supports-color@8.1.1 +│ │ └── has-flag@4.0.0 +│ ├── tmp@0.2.1 deduped +│ ├── untildify@4.0.0 +│ └─┬ yauzl@2.10.0 +│ ├── buffer-crc32@0.2.13 +│ └─┬ fd-slicer@1.1.0 +│ └── pend@1.2.0 +├─┬ eslint-plugin-deprecation@2.0.0 +│ ├── @typescript-eslint/utils@6.19.0 deduped +│ ├── eslint@8.57.0 deduped +│ ├── tslib@2.6.2 deduped +│ ├─┬ tsutils@3.21.0 +│ │ ├── tslib@1.14.1 +│ │ └── typescript@5.3.3 deduped +│ └── typescript@5.3.3 deduped +├─┬ eslint-plugin-optimize-regex@1.2.1 +│ └── regexp-tree@0.1.27 +├─┬ eslint-plugin-simple-import-sort@12.0.0 +│ └── eslint@8.57.0 deduped +├─┬ eslint-plugin-unused-imports@3.1.0 +│ ├── @typescript-eslint/eslint-plugin@7.1.0 deduped +│ ├── eslint-rule-composer@0.3.0 +│ └── eslint@8.57.0 deduped +├─┬ eslint@8.57.0 +│ ├─┬ @eslint-community/eslint-utils@4.4.0 +│ │ ├── eslint-visitor-keys@3.4.3 deduped +│ │ └── eslint@8.57.0 deduped +│ ├── @eslint-community/regexpp@4.10.0 deduped +│ ├─┬ @eslint/eslintrc@2.1.4 +│ │ ├─┬ ajv@6.12.6 +│ │ │ ├── fast-deep-equal@3.1.3 deduped +│ │ │ ├── fast-json-stable-stringify@2.1.0 deduped +│ │ │ ├── json-schema-traverse@0.4.1 +│ │ │ └── uri-js@4.4.1 deduped +│ │ ├── debug@4.3.4 deduped +│ │ ├── espree@9.6.1 deduped +│ │ ├─┬ globals@13.24.0 +│ │ │ └── type-fest@0.20.2 +│ │ ├── ignore@5.3.0 deduped +│ │ ├─┬ import-fresh@3.3.0 +│ │ │ ├─┬ parent-module@1.0.1 +│ │ │ │ └── callsites@3.1.0 +│ │ │ └── resolve-from@4.0.0 +│ │ ├─┬ js-yaml@4.1.0 +│ │ │ └── argparse@2.0.1 +│ │ ├─┬ minimatch@3.1.2 +│ │ │ └─┬ brace-expansion@1.1.11 +│ │ │ ├── balanced-match@1.0.2 deduped +│ │ │ └── concat-map@0.0.1 deduped +│ │ └── strip-json-comments@3.1.1 deduped +│ ├── @eslint/js@8.57.0 +│ ├─┬ @humanwhocodes/config-array@0.11.14 +│ │ ├── @humanwhocodes/object-schema@2.0.2 +│ │ ├── debug@4.3.4 deduped +│ │ └─┬ minimatch@3.1.2 +│ │ └─┬ brace-expansion@1.1.11 +│ │ ├── balanced-match@1.0.2 deduped +│ │ └── concat-map@0.0.1 deduped +│ ├── @humanwhocodes/module-importer@1.0.1 +│ ├─┬ @nodelib/fs.walk@1.2.8 +│ │ ├─┬ @nodelib/fs.scandir@2.1.5 +│ │ │ ├── @nodelib/fs.stat@2.0.5 deduped +│ │ │ └─┬ run-parallel@1.2.0 +│ │ │ └── queue-microtask@1.2.3 +│ │ └─┬ fastq@1.17.1 +│ │ └── reusify@1.0.4 +│ ├── @ungap/structured-clone@1.2.0 +│ ├─┬ ajv@6.12.6 +│ │ ├── fast-deep-equal@3.1.3 deduped +│ │ ├── fast-json-stable-stringify@2.1.0 +│ │ ├── json-schema-traverse@0.4.1 +│ │ └─┬ uri-js@4.4.1 +│ │ └── punycode@2.3.1 +│ ├─┬ chalk@4.1.2 +│ │ ├─┬ ansi-styles@4.3.0 +│ │ │ └─┬ color-convert@2.0.1 +│ │ │ └── color-name@1.1.4 +│ │ └─┬ supports-color@7.2.0 +│ │ └── has-flag@4.0.0 +│ ├─┬ cross-spawn@7.0.3 +│ │ ├── path-key@3.1.1 +│ │ ├─┬ shebang-command@2.0.0 +│ │ │ └── shebang-regex@3.0.0 +│ │ └─┬ which@2.0.2 +│ │ └── isexe@2.0.0 deduped +│ ├── debug@4.3.4 deduped +│ ├─┬ doctrine@3.0.0 +│ │ └── esutils@2.0.3 deduped +│ ├── escape-string-regexp@4.0.0 +│ ├─┬ eslint-scope@7.2.2 +│ │ ├── esrecurse@4.3.0 deduped +│ │ └── estraverse@5.3.0 deduped +│ ├── eslint-visitor-keys@3.4.3 +│ ├─┬ espree@9.6.1 +│ │ ├─┬ acorn-jsx@5.3.2 +│ │ │ └── acorn@8.11.3 deduped +│ │ ├── acorn@8.11.3 deduped +│ │ └── eslint-visitor-keys@3.4.3 deduped +│ ├─┬ esquery@1.5.0 +│ │ └── estraverse@5.3.0 deduped +│ ├── esutils@2.0.3 +│ ├── fast-deep-equal@3.1.3 +│ ├─┬ file-entry-cache@6.0.1 +│ │ └─┬ flat-cache@3.2.0 +│ │ ├── flatted@3.3.1 deduped +│ │ ├─┬ keyv@4.5.4 +│ │ │ └── json-buffer@3.0.1 +│ │ └─┬ rimraf@3.0.2 +│ │ └── glob@7.2.3 deduped +│ ├─┬ find-up@5.0.0 +│ │ ├─┬ locate-path@6.0.0 +│ │ │ └─┬ p-locate@5.0.0 +│ │ │ └── p-limit@3.1.0 deduped +│ │ └── path-exists@4.0.0 +│ ├─┬ glob-parent@6.0.2 +│ │ └── is-glob@4.0.3 deduped +│ ├─┬ globals@13.24.0 +│ │ └── type-fest@0.20.2 +│ ├── graphemer@1.4.0 deduped +│ ├── ignore@5.3.0 deduped +│ ├── imurmurhash@0.1.4 +│ ├─┬ is-glob@4.0.3 +│ │ └── is-extglob@2.1.1 +│ ├── is-path-inside@3.0.3 +│ ├─┬ js-yaml@4.1.0 +│ │ └── argparse@2.0.1 +│ ├── json-stable-stringify-without-jsonify@1.0.1 +│ ├─┬ levn@0.4.1 +│ │ ├── prelude-ls@1.2.1 +│ │ └─┬ type-check@0.4.0 +│ │ └── prelude-ls@1.2.1 deduped +│ ├── lodash.merge@4.6.2 +│ ├─┬ minimatch@3.1.2 +│ │ └─┬ brace-expansion@1.1.11 +│ │ ├── balanced-match@1.0.2 +│ │ └── concat-map@0.0.1 +│ ├── natural-compare@1.4.0 deduped +│ ├─┬ optionator@0.9.3 +│ │ ├── @aashutoshrathi/word-wrap@1.2.6 +│ │ ├── deep-is@0.1.4 +│ │ ├── fast-levenshtein@2.0.6 +│ │ ├── levn@0.4.1 deduped +│ │ ├── prelude-ls@1.2.1 deduped +│ │ └── type-check@0.4.0 deduped +│ ├─┬ strip-ansi@6.0.1 +│ │ └── ansi-regex@5.0.1 +│ └── text-table@0.2.0 +├─┬ firebase-tools@13.4.0 +│ ├─┬ @google-cloud/pubsub@3.7.5 +│ │ ├─┬ @google-cloud/paginator@4.0.1 +│ │ │ ├── arrify@2.0.1 deduped +│ │ │ └── extend@3.0.2 deduped +│ │ ├── @google-cloud/precise-date@3.0.1 +│ │ ├── @google-cloud/projectify@3.0.0 +│ │ ├── @google-cloud/promisify@2.0.4 +│ │ ├── @opentelemetry/api@1.7.0 +│ │ ├── @opentelemetry/semantic-conventions@1.3.1 +│ │ ├─┬ @types/duplexify@3.6.4 +│ │ │ └── @types/node@20.11.21 deduped +│ │ ├── @types/long@4.0.2 +│ │ ├── arrify@2.0.1 +│ │ ├── extend@3.0.2 deduped +│ │ ├─┬ google-auth-library@8.9.0 +│ │ │ ├── arrify@2.0.1 deduped +│ │ │ ├── base64-js@1.5.1 deduped +│ │ │ ├── ecdsa-sig-formatter@1.0.11 deduped +│ │ │ ├── fast-text-encoding@1.0.6 deduped +│ │ │ ├─┬ gaxios@5.1.3 +│ │ │ │ ├── extend@3.0.2 deduped +│ │ │ │ ├─┬ https-proxy-agent@5.0.1 +│ │ │ │ │ ├─┬ agent-base@6.0.2 +│ │ │ │ │ │ └── debug@4.3.4 deduped +│ │ │ │ │ └── debug@4.3.4 deduped +│ │ │ │ ├── is-stream@2.0.1 deduped +│ │ │ │ └── node-fetch@2.7.0 deduped +│ │ │ ├─┬ gcp-metadata@5.3.0 +│ │ │ │ ├── gaxios@5.1.3 deduped +│ │ │ │ └── json-bigint@1.0.0 deduped +│ │ │ ├─┬ gtoken@6.1.2 +│ │ │ │ ├── gaxios@5.1.3 deduped +│ │ │ │ ├─┬ google-p12-pem@4.0.1 +│ │ │ │ │ └── node-forge@1.3.1 deduped +│ │ │ │ └── jws@4.0.0 deduped +│ │ │ ├── jws@4.0.0 deduped +│ │ │ └─┬ lru-cache@6.0.0 +│ │ │ └── yallist@4.0.0 +│ │ ├─┬ google-gax@3.6.1 +│ │ │ ├─┬ @grpc/grpc-js@1.8.21 +│ │ │ │ ├── @grpc/proto-loader@0.7.10 deduped +│ │ │ │ └── @types/node@20.11.21 deduped +│ │ │ ├── @grpc/proto-loader@0.7.10 deduped +│ │ │ ├── @types/long@4.0.2 deduped +│ │ │ ├─┬ @types/rimraf@3.0.2 +│ │ │ │ ├─┬ @types/glob@8.1.0 +│ │ │ │ │ ├── @types/minimatch@5.1.2 +│ │ │ │ │ └── @types/node@20.11.21 deduped +│ │ │ │ └── @types/node@20.11.21 deduped +│ │ │ ├── abort-controller@3.0.0 deduped +│ │ │ ├─┬ duplexify@4.1.2 +│ │ │ │ ├── end-of-stream@1.4.4 deduped +│ │ │ │ ├── inherits@2.0.4 deduped +│ │ │ │ ├── readable-stream@3.6.2 deduped +│ │ │ │ └── stream-shift@1.0.3 +│ │ │ ├── fast-text-encoding@1.0.6 deduped +│ │ │ ├─┬ google-auth-library@8.9.0 +│ │ │ │ ├── arrify@2.0.1 deduped +│ │ │ │ ├── base64-js@1.5.1 deduped +│ │ │ │ ├── ecdsa-sig-formatter@1.0.11 deduped +│ │ │ │ ├── fast-text-encoding@1.0.6 deduped +│ │ │ │ ├─┬ gaxios@5.1.3 +│ │ │ │ │ ├── extend@3.0.2 deduped +│ │ │ │ │ ├─┬ https-proxy-agent@5.0.1 +│ │ │ │ │ │ ├─┬ agent-base@6.0.2 +│ │ │ │ │ │ │ └── debug@4.3.4 deduped +│ │ │ │ │ │ └── debug@4.3.4 deduped +│ │ │ │ │ ├── is-stream@2.0.1 deduped +│ │ │ │ │ └── node-fetch@2.7.0 deduped +│ │ │ │ ├─┬ gcp-metadata@5.3.0 +│ │ │ │ │ ├── gaxios@5.1.3 deduped +│ │ │ │ │ └── json-bigint@1.0.0 deduped +│ │ │ │ ├─┬ gtoken@6.1.2 +│ │ │ │ │ ├── gaxios@5.1.3 deduped +│ │ │ │ │ ├─┬ google-p12-pem@4.0.1 +│ │ │ │ │ │ └── node-forge@1.3.1 deduped +│ │ │ │ │ └── jws@4.0.0 deduped +│ │ │ │ ├── jws@4.0.0 deduped +│ │ │ │ └─┬ lru-cache@6.0.0 +│ │ │ │ └── yallist@4.0.0 +│ │ │ ├── is-stream-ended@0.1.4 deduped +│ │ │ ├── node-fetch@2.7.0 deduped +│ │ │ ├── object-hash@3.0.0 +│ │ │ ├─┬ proto3-json-serializer@1.1.1 +│ │ │ │ └── protobufjs@7.2.6 deduped +│ │ │ ├─┬ protobufjs-cli@1.1.1 +│ │ │ │ ├─┬ chalk@4.1.2 +│ │ │ │ │ ├─┬ ansi-styles@4.3.0 +│ │ │ │ │ │ └─┬ color-convert@2.0.1 +│ │ │ │ │ │ └── color-name@1.1.4 +│ │ │ │ │ └─┬ supports-color@7.2.0 +│ │ │ │ │ └── has-flag@4.0.0 +│ │ │ │ ├─┬ escodegen@1.14.3 +│ │ │ │ │ ├── esprima@4.0.1 deduped +│ │ │ │ │ ├── estraverse@4.3.0 +│ │ │ │ │ ├── esutils@2.0.3 deduped +│ │ │ │ │ ├─┬ optionator@0.8.3 +│ │ │ │ │ │ ├── deep-is@0.1.4 deduped +│ │ │ │ │ │ ├── fast-levenshtein@2.0.6 deduped +│ │ │ │ │ │ ├─┬ levn@0.3.0 +│ │ │ │ │ │ │ ├── prelude-ls@1.1.2 deduped +│ │ │ │ │ │ │ └── type-check@0.3.2 deduped +│ │ │ │ │ │ ├── prelude-ls@1.1.2 +│ │ │ │ │ │ ├─┬ type-check@0.3.2 +│ │ │ │ │ │ │ └── prelude-ls@1.1.2 deduped +│ │ │ │ │ │ └── word-wrap@1.2.5 +│ │ │ │ │ └── source-map@0.6.1 +│ │ │ │ ├── espree@9.6.1 deduped +│ │ │ │ ├── estraverse@5.3.0 deduped +│ │ │ │ ├─┬ glob@8.1.0 +│ │ │ │ │ ├── fs.realpath@1.0.0 deduped +│ │ │ │ │ ├── inflight@1.0.6 deduped +│ │ │ │ │ ├── inherits@2.0.4 deduped +│ │ │ │ │ ├─┬ minimatch@5.1.6 +│ │ │ │ │ │ └── brace-expansion@2.0.1 deduped +│ │ │ │ │ └── once@1.4.0 deduped +│ │ │ │ ├─┬ jsdoc@4.0.2 +│ │ │ │ │ ├── @babel/parser@7.24.0 deduped +│ │ │ │ │ ├─┬ @jsdoc/salty@0.2.7 +│ │ │ │ │ │ └── lodash@4.17.21 deduped +│ │ │ │ │ ├─┬ @types/markdown-it@12.2.3 +│ │ │ │ │ │ ├── @types/linkify-it@3.0.5 +│ │ │ │ │ │ └── @types/mdurl@1.0.5 +│ │ │ │ │ ├── bluebird@3.7.2 deduped +│ │ │ │ │ ├─┬ catharsis@0.9.0 +│ │ │ │ │ │ └── lodash@4.17.21 deduped +│ │ │ │ │ ├── escape-string-regexp@2.0.0 +│ │ │ │ │ ├─┬ js2xmlparser@4.0.2 +│ │ │ │ │ │ └── xmlcreate@2.0.4 +│ │ │ │ │ ├─┬ klaw@3.0.0 +│ │ │ │ │ │ └── graceful-fs@4.2.11 +│ │ │ │ │ ├─┬ markdown-it-anchor@8.6.7 +│ │ │ │ │ │ ├── @types/markdown-it@12.2.3 deduped +│ │ │ │ │ │ └── markdown-it@12.3.2 deduped +│ │ │ │ │ ├─┬ markdown-it@12.3.2 +│ │ │ │ │ │ ├── argparse@2.0.1 +│ │ │ │ │ │ ├── entities@2.1.0 +│ │ │ │ │ │ ├─┬ linkify-it@3.0.3 +│ │ │ │ │ │ │ └── uc.micro@1.0.6 deduped +│ │ │ │ │ │ ├── mdurl@1.0.1 +│ │ │ │ │ │ └── uc.micro@1.0.6 +│ │ │ │ │ ├── marked@4.3.0 +│ │ │ │ │ ├── mkdirp@1.0.4 +│ │ │ │ │ ├─┬ requizzle@0.2.4 +│ │ │ │ │ │ └── lodash@4.17.21 deduped +│ │ │ │ │ ├── strip-json-comments@3.1.1 deduped +│ │ │ │ │ └── underscore@1.13.6 +│ │ │ │ ├── minimist@1.2.8 deduped +│ │ │ │ ├── protobufjs@7.2.6 deduped +│ │ │ │ ├── semver@7.6.0 deduped +│ │ │ │ ├── tmp@0.2.1 deduped +│ │ │ │ └── uglify-js@3.17.4 +│ │ │ ├─┬ protobufjs@7.2.4 +│ │ │ │ ├── @protobufjs/aspromise@1.1.2 +│ │ │ │ ├── @protobufjs/base64@1.1.2 +│ │ │ │ ├── @protobufjs/codegen@2.0.4 +│ │ │ │ ├── @protobufjs/eventemitter@1.1.0 +│ │ │ │ ├─┬ @protobufjs/fetch@1.1.0 +│ │ │ │ │ ├── @protobufjs/aspromise@1.1.2 deduped +│ │ │ │ │ └── @protobufjs/inquire@1.1.0 deduped +│ │ │ │ ├── @protobufjs/float@1.0.2 +│ │ │ │ ├── @protobufjs/inquire@1.1.0 +│ │ │ │ ├── @protobufjs/path@1.1.2 +│ │ │ │ ├── @protobufjs/pool@1.1.0 +│ │ │ │ ├── @protobufjs/utf8@1.1.0 +│ │ │ │ ├── @types/node@20.11.21 deduped +│ │ │ │ └── long@5.2.3 deduped +│ │ │ └─┬ retry-request@5.0.2 +│ │ │ ├── debug@4.3.4 deduped +│ │ │ └── extend@3.0.2 deduped +│ │ ├── heap-js@2.3.0 +│ │ ├── is-stream-ended@0.1.4 +│ │ ├── lodash.snakecase@4.1.1 +│ │ └── p-defer@3.0.0 +│ ├─┬ abort-controller@3.0.0 +│ │ └── event-target-shim@5.0.1 +│ ├─┬ ajv@6.12.6 +│ │ ├── fast-deep-equal@3.1.3 deduped +│ │ ├── fast-json-stable-stringify@2.1.0 deduped +│ │ ├── json-schema-traverse@0.4.1 +│ │ └── uri-js@4.4.1 deduped +│ ├─┬ archiver@5.3.2 +│ │ ├─┬ archiver-utils@2.1.0 +│ │ │ ├── glob@7.2.3 deduped +│ │ │ ├── graceful-fs@4.2.11 +│ │ │ ├─┬ lazystream@1.0.1 +│ │ │ │ └─┬ readable-stream@2.3.8 +│ │ │ │ ├── core-util-is@1.0.2 deduped +│ │ │ │ ├── inherits@2.0.4 deduped +│ │ │ │ ├── isarray@1.0.0 deduped +│ │ │ │ ├── process-nextick-args@2.0.1 deduped +│ │ │ │ ├── safe-buffer@5.1.2 +│ │ │ │ ├─┬ string_decoder@1.1.1 +│ │ │ │ │ └── safe-buffer@5.1.2 deduped +│ │ │ │ └── util-deprecate@1.0.2 deduped +│ │ │ ├── lodash.defaults@4.2.0 +│ │ │ ├── lodash.difference@4.5.0 +│ │ │ ├── lodash.flatten@4.4.0 +│ │ │ ├── lodash.isplainobject@4.0.6 deduped +│ │ │ ├── lodash.union@4.6.0 +│ │ │ ├── normalize-path@3.0.0 deduped +│ │ │ └─┬ readable-stream@2.3.8 +│ │ │ ├── core-util-is@1.0.2 +│ │ │ ├── inherits@2.0.4 deduped +│ │ │ ├── isarray@1.0.0 +│ │ │ ├── process-nextick-args@2.0.1 +│ │ │ ├── safe-buffer@5.1.2 +│ │ │ ├─┬ string_decoder@1.1.1 +│ │ │ │ └── safe-buffer@5.1.2 deduped +│ │ │ └── util-deprecate@1.0.2 deduped +│ │ ├── async@3.2.5 deduped +│ │ ├── buffer-crc32@0.2.13 deduped +│ │ ├── readable-stream@3.6.2 deduped +│ │ ├─┬ readdir-glob@1.1.3 +│ │ │ └─┬ minimatch@5.1.6 +│ │ │ └── brace-expansion@2.0.1 deduped +│ │ ├── tar-stream@2.2.0 deduped +│ │ └─┬ zip-stream@4.1.1 +│ │ ├─┬ archiver-utils@3.0.4 +│ │ │ ├── glob@7.2.3 deduped +│ │ │ ├── graceful-fs@4.2.11 +│ │ │ ├── lazystream@1.0.1 deduped +│ │ │ ├── lodash.defaults@4.2.0 deduped +│ │ │ ├── lodash.difference@4.5.0 deduped +│ │ │ ├── lodash.flatten@4.4.0 deduped +│ │ │ ├── lodash.isplainobject@4.0.6 deduped +│ │ │ ├── lodash.union@4.6.0 deduped +│ │ │ ├── normalize-path@3.0.0 deduped +│ │ │ └── readable-stream@3.6.2 deduped +│ │ ├─┬ compress-commons@4.1.2 +│ │ │ ├── buffer-crc32@0.2.13 deduped +│ │ │ ├─┬ crc32-stream@4.0.3 +│ │ │ │ ├── crc-32@1.2.2 +│ │ │ │ └── readable-stream@3.6.2 deduped +│ │ │ ├── normalize-path@3.0.0 deduped +│ │ │ └── readable-stream@3.6.2 deduped +│ │ └── readable-stream@3.6.2 deduped +│ ├── async-lock@1.3.2 +│ ├─┬ body-parser@1.20.2 +│ │ ├── bytes@3.1.2 +│ │ ├── content-type@1.0.5 +│ │ ├─┬ debug@2.6.9 +│ │ │ └── ms@2.0.0 +│ │ ├── depd@2.0.0 +│ │ ├── destroy@1.2.0 +│ │ ├─┬ http-errors@2.0.0 +│ │ │ ├── depd@2.0.0 deduped +│ │ │ ├── inherits@2.0.4 deduped +│ │ │ ├── setprototypeof@1.2.0 deduped +│ │ │ ├── statuses@2.0.1 +│ │ │ └── toidentifier@1.0.1 +│ │ ├─┬ iconv-lite@0.4.24 +│ │ │ └── safer-buffer@2.1.2 deduped +│ │ ├─┬ on-finished@2.4.1 +│ │ │ └── ee-first@1.1.1 +│ │ ├─┬ qs@6.11.0 +│ │ │ └── side-channel@1.0.5 deduped +│ │ ├─┬ raw-body@2.5.2 +│ │ │ ├── bytes@3.1.2 deduped +│ │ │ ├── http-errors@2.0.0 deduped +│ │ │ ├── iconv-lite@0.4.24 deduped +│ │ │ └── unpipe@1.0.0 deduped +│ │ ├─┬ type-is@1.6.18 +│ │ │ ├── media-typer@0.3.0 +│ │ │ └── mime-types@2.1.35 deduped +│ │ └── unpipe@1.0.0 +│ ├── chokidar@3.6.0 deduped +│ ├─┬ cjson@0.3.3 +│ │ └─┬ json-parse-helpfulerror@1.0.3 +│ │ └── jju@1.4.0 +│ ├─┬ cli-table@0.3.11 +│ │ └── colors@1.0.3 +│ ├── colorette@2.0.20 +│ ├── commander@4.1.1 +│ ├─┬ configstore@5.0.1 +│ │ ├─┬ dot-prop@5.3.0 +│ │ │ └── is-obj@2.0.0 +│ │ ├── graceful-fs@4.2.11 +│ │ ├─┬ make-dir@3.1.0 +│ │ │ └── semver@6.3.1 +│ │ ├─┬ unique-string@2.0.0 +│ │ │ └── crypto-random-string@2.0.0 +│ │ ├─┬ write-file-atomic@3.0.3 +│ │ │ ├── imurmurhash@0.1.4 deduped +│ │ │ ├── is-typedarray@1.0.0 deduped +│ │ │ ├── signal-exit@3.0.7 deduped +│ │ │ └─┬ typedarray-to-buffer@3.1.5 +│ │ │ └── is-typedarray@1.0.0 deduped +│ │ └── xdg-basedir@4.0.0 +│ ├─┬ cors@2.8.5 +│ │ ├── object-assign@4.1.1 +│ │ └── vary@1.1.2 +│ ├─┬ cross-env@5.2.1 +│ │ └─┬ cross-spawn@6.0.5 +│ │ ├── nice-try@1.0.5 +│ │ ├── path-key@2.0.1 +│ │ ├── semver@5.7.2 +│ │ ├─┬ shebang-command@1.2.0 +│ │ │ └── shebang-regex@1.0.0 +│ │ └─┬ which@1.3.1 +│ │ └── isexe@2.0.0 deduped +│ ├── cross-spawn@7.0.3 deduped +│ ├── csv-parse@5.5.5 +│ ├─┬ deep-equal-in-any-order@2.0.6 +│ │ ├── lodash.mapvalues@4.6.0 +│ │ └─┬ sort-any@2.0.0 +│ │ └── lodash@4.17.21 deduped +│ ├─┬ exegesis-express@4.0.0 +│ │ └── exegesis@4.1.1 deduped +│ ├─┬ exegesis@4.1.1 +│ │ ├─┬ @apidevtools/json-schema-ref-parser@9.1.2 +│ │ │ ├── @jsdevtools/ono@7.1.3 +│ │ │ ├── @types/json-schema@7.0.15 deduped +│ │ │ ├── call-me-maybe@1.0.2 +│ │ │ └─┬ js-yaml@4.1.0 +│ │ │ └── argparse@2.0.1 +│ │ ├── ajv-formats@2.1.1 deduped +│ │ ├── ajv@8.12.0 deduped +│ │ ├── body-parser@1.20.2 deduped +│ │ ├── content-type@1.0.5 deduped +│ │ ├── deep-freeze@0.0.1 +│ │ ├── events-listener@1.1.0 +│ │ ├── glob@7.2.3 deduped +│ │ ├── json-ptr@3.1.1 +│ │ ├── json-schema-traverse@1.0.0 +│ │ ├── lodash@4.17.21 deduped +│ │ ├─┬ openapi3-ts@3.2.0 +│ │ │ └── yaml@2.4.0 +│ │ ├── promise-breaker@6.0.0 +│ │ ├─┬ pump@3.0.0 +│ │ │ ├── end-of-stream@1.4.4 deduped +│ │ │ └── once@1.4.0 deduped +│ │ ├── qs@6.10.4 deduped +│ │ ├─┬ raw-body@2.5.2 +│ │ │ ├── bytes@3.1.2 +│ │ │ ├── http-errors@2.0.0 deduped +│ │ │ ├── iconv-lite@0.4.24 deduped +│ │ │ └── unpipe@1.0.0 deduped +│ │ └── semver@7.6.0 deduped +│ ├─┬ express@4.18.2 +│ │ ├─┬ accepts@1.3.8 +│ │ │ ├── mime-types@2.1.35 deduped +│ │ │ └── negotiator@0.6.3 +│ │ ├── array-flatten@1.1.1 +│ │ ├─┬ body-parser@1.20.1 +│ │ │ ├── bytes@3.1.2 +│ │ │ ├── content-type@1.0.5 deduped +│ │ │ ├── debug@2.6.9 deduped +│ │ │ ├── depd@2.0.0 deduped +│ │ │ ├── destroy@1.2.0 deduped +│ │ │ ├── http-errors@2.0.0 deduped +│ │ │ ├── iconv-lite@0.4.24 deduped +│ │ │ ├── on-finished@2.4.1 deduped +│ │ │ ├── qs@6.11.0 deduped +│ │ │ ├─┬ raw-body@2.5.1 +│ │ │ │ ├── bytes@3.1.2 deduped +│ │ │ │ ├── http-errors@2.0.0 deduped +│ │ │ │ ├── iconv-lite@0.4.24 deduped +│ │ │ │ └── unpipe@1.0.0 deduped +│ │ │ ├── type-is@1.6.18 deduped +│ │ │ └── unpipe@1.0.0 deduped +│ │ ├─┬ content-disposition@0.5.4 +│ │ │ └── safe-buffer@5.2.1 deduped +│ │ ├── content-type@1.0.5 deduped +│ │ ├── cookie-signature@1.0.6 +│ │ ├── cookie@0.5.0 +│ │ ├─┬ debug@2.6.9 +│ │ │ └── ms@2.0.0 +│ │ ├── depd@2.0.0 deduped +│ │ ├── encodeurl@1.0.2 +│ │ ├── escape-html@1.0.3 +│ │ ├── etag@1.8.1 +│ │ ├─┬ finalhandler@1.2.0 +│ │ │ ├─┬ debug@2.6.9 +│ │ │ │ └── ms@2.0.0 +│ │ │ ├── encodeurl@1.0.2 deduped +│ │ │ ├── escape-html@1.0.3 deduped +│ │ │ ├── on-finished@2.4.1 deduped +│ │ │ ├── parseurl@1.3.3 deduped +│ │ │ ├── statuses@2.0.1 +│ │ │ └── unpipe@1.0.0 deduped +│ │ ├── fresh@0.5.2 +│ │ ├── http-errors@2.0.0 deduped +│ │ ├── merge-descriptors@1.0.1 +│ │ ├── methods@1.1.2 +│ │ ├── on-finished@2.4.1 deduped +│ │ ├── parseurl@1.3.3 +│ │ ├── path-to-regexp@0.1.7 +│ │ ├─┬ proxy-addr@2.0.7 +│ │ │ ├── forwarded@0.2.0 +│ │ │ └── ipaddr.js@1.9.1 +│ │ ├─┬ qs@6.11.0 +│ │ │ └── side-channel@1.0.5 deduped +│ │ ├── range-parser@1.2.1 deduped +│ │ ├── safe-buffer@5.2.1 deduped +│ │ ├─┬ send@0.18.0 +│ │ │ ├─┬ debug@2.6.9 +│ │ │ │ └── ms@2.0.0 +│ │ │ ├── depd@2.0.0 deduped +│ │ │ ├── destroy@1.2.0 deduped +│ │ │ ├── encodeurl@1.0.2 deduped +│ │ │ ├── escape-html@1.0.3 deduped +│ │ │ ├── etag@1.8.1 deduped +│ │ │ ├── fresh@0.5.2 deduped +│ │ │ ├── http-errors@2.0.0 deduped +│ │ │ ├── mime@1.6.0 +│ │ │ ├── ms@2.1.3 +│ │ │ ├── on-finished@2.4.1 deduped +│ │ │ ├── range-parser@1.2.1 deduped +│ │ │ └── statuses@2.0.1 +│ │ ├─┬ serve-static@1.15.0 +│ │ │ ├── encodeurl@1.0.2 deduped +│ │ │ ├── escape-html@1.0.3 deduped +│ │ │ ├── parseurl@1.3.3 deduped +│ │ │ └── send@0.18.0 deduped +│ │ ├── setprototypeof@1.2.0 +│ │ ├── statuses@2.0.1 +│ │ ├── type-is@1.6.18 deduped +│ │ ├── utils-merge@1.0.1 +│ │ └── vary@1.1.2 deduped +│ ├── filesize@6.4.0 +│ ├─┬ form-data@4.0.0 +│ │ ├── asynckit@0.4.0 +│ │ ├── combined-stream@1.0.8 deduped +│ │ └── mime-types@2.1.35 deduped +│ ├─┬ fs-extra@10.1.0 +│ │ ├── graceful-fs@4.2.11 +│ │ ├─┬ jsonfile@6.1.0 +│ │ │ ├── graceful-fs@4.2.11 deduped +│ │ │ └── universalify@2.0.1 deduped +│ │ └── universalify@2.0.1 +│ ├── fuzzy@0.1.3 deduped +│ ├─┬ glob@7.2.3 +│ │ ├── fs.realpath@1.0.0 +│ │ ├─┬ inflight@1.0.6 +│ │ │ ├── once@1.4.0 deduped +│ │ │ └── wrappy@1.0.2 +│ │ ├── inherits@2.0.4 +│ │ ├─┬ minimatch@3.1.2 +│ │ │ └─┬ brace-expansion@1.1.11 +│ │ │ ├── balanced-match@1.0.2 deduped +│ │ │ └── concat-map@0.0.1 deduped +│ │ ├─┬ once@1.4.0 +│ │ │ └── wrappy@1.0.2 deduped +│ │ └── path-is-absolute@1.0.1 +│ ├─┬ google-auth-library@7.14.1 +│ │ ├── arrify@2.0.1 deduped +│ │ ├── base64-js@1.5.1 deduped +│ │ ├─┬ ecdsa-sig-formatter@1.0.11 +│ │ │ └── safe-buffer@5.2.1 deduped +│ │ ├── fast-text-encoding@1.0.6 +│ │ ├─┬ gaxios@4.3.3 +│ │ │ ├── abort-controller@3.0.0 deduped +│ │ │ ├── extend@3.0.2 deduped +│ │ │ ├─┬ https-proxy-agent@5.0.1 +│ │ │ │ ├─┬ agent-base@6.0.2 +│ │ │ │ │ └── debug@4.3.4 deduped +│ │ │ │ └── debug@4.3.4 deduped +│ │ │ ├── is-stream@2.0.1 deduped +│ │ │ └── node-fetch@2.7.0 deduped +│ │ ├─┬ gcp-metadata@4.3.1 +│ │ │ ├── gaxios@4.3.3 deduped +│ │ │ └─┬ json-bigint@1.0.0 +│ │ │ └── bignumber.js@9.1.2 +│ │ ├─┬ gtoken@5.3.2 +│ │ │ ├── gaxios@4.3.3 deduped +│ │ │ ├─┬ google-p12-pem@3.1.4 +│ │ │ │ └── node-forge@1.3.1 deduped +│ │ │ └── jws@4.0.0 deduped +│ │ ├─┬ jws@4.0.0 +│ │ │ ├─┬ jwa@2.0.0 +│ │ │ │ ├── buffer-equal-constant-time@1.0.1 +│ │ │ │ ├── ecdsa-sig-formatter@1.0.11 deduped +│ │ │ │ └── safe-buffer@5.2.1 deduped +│ │ │ └── safe-buffer@5.2.1 deduped +│ │ └─┬ lru-cache@6.0.0 +│ │ └── yallist@4.0.0 +│ ├─┬ inquirer-autocomplete-prompt@2.0.1 +│ │ ├── ansi-escapes@4.3.2 deduped +│ │ ├── figures@3.2.0 deduped +│ │ ├── inquirer@8.2.6 deduped +│ │ ├── picocolors@1.0.0 deduped +│ │ ├── run-async@2.4.1 +│ │ └── rxjs@7.8.1 deduped +│ ├─┬ inquirer@8.2.6 +│ │ ├── ansi-escapes@4.3.2 deduped +│ │ ├─┬ chalk@4.1.2 +│ │ │ ├─┬ ansi-styles@4.3.0 +│ │ │ │ └─┬ color-convert@2.0.1 +│ │ │ │ └── color-name@1.1.4 +│ │ │ └─┬ supports-color@7.2.0 +│ │ │ └── has-flag@4.0.0 +│ │ ├── cli-cursor@3.1.0 deduped +│ │ ├── cli-width@3.0.0 +│ │ ├── external-editor@3.1.0 deduped +│ │ ├── figures@3.2.0 deduped +│ │ ├── lodash@4.17.21 deduped +│ │ ├── mute-stream@0.0.8 +│ │ ├── ora@5.4.1 deduped +│ │ ├── run-async@2.4.1 deduped +│ │ ├── rxjs@7.8.1 deduped +│ │ ├── string-width@4.2.3 deduped +│ │ ├── strip-ansi@6.0.1 deduped +│ │ ├── through@2.3.8 deduped +│ │ └─┬ wrap-ansi@6.2.0 +│ │ ├── ansi-styles@4.3.0 deduped +│ │ ├── string-width@4.2.3 deduped +│ │ └── strip-ansi@6.0.1 deduped +│ ├─┬ js-yaml@3.14.1 +│ │ ├─┬ argparse@1.0.10 +│ │ │ └── sprintf-js@1.0.3 +│ │ └── esprima@4.0.1 +│ ├─┬ jsonwebtoken@9.0.2 +│ │ ├─┬ jws@3.2.2 +│ │ │ ├─┬ jwa@1.4.1 +│ │ │ │ ├── buffer-equal-constant-time@1.0.1 deduped +│ │ │ │ ├── ecdsa-sig-formatter@1.0.11 deduped +│ │ │ │ └── safe-buffer@5.2.1 deduped +│ │ │ └── safe-buffer@5.2.1 deduped +│ │ ├── lodash.includes@4.3.0 +│ │ ├── lodash.isboolean@3.0.3 +│ │ ├── lodash.isinteger@4.0.4 +│ │ ├── lodash.isnumber@3.0.3 +│ │ ├── lodash.isplainobject@4.0.6 +│ │ ├── lodash.isstring@4.0.1 +│ │ ├── lodash.once@4.1.1 deduped +│ │ ├── ms@2.1.2 deduped +│ │ └── semver@7.6.0 deduped +│ ├── leven@3.1.0 +│ ├─┬ libsodium-wrappers@0.7.13 +│ │ └── libsodium@0.7.13 +│ ├── lodash@4.17.21 deduped +│ ├─┬ marked-terminal@5.2.0 +│ │ ├─┬ ansi-escapes@6.2.0 +│ │ │ └── type-fest@3.13.1 +│ │ ├─┬ cardinal@2.1.1 +│ │ │ ├── ansicolors@0.3.2 +│ │ │ └─┬ redeyed@2.1.1 +│ │ │ └── esprima@4.0.1 deduped +│ │ ├── chalk@5.3.0 +│ │ ├── cli-table3@0.6.3 deduped +│ │ ├── marked@4.3.0 deduped +│ │ ├─┬ node-emoji@1.11.0 +│ │ │ └── lodash@4.17.21 deduped +│ │ └─┬ supports-hyperlinks@2.3.0 +│ │ ├── has-flag@4.0.0 +│ │ └─┬ supports-color@7.2.0 +│ │ └── has-flag@4.0.0 deduped +│ ├── marked@4.3.0 +│ ├── mime@2.6.0 +│ ├─┬ minimatch@3.1.2 +│ │ └─┬ brace-expansion@1.1.11 +│ │ ├── balanced-match@1.0.2 deduped +│ │ └── concat-map@0.0.1 deduped +│ ├─┬ morgan@1.10.0 +│ │ ├─┬ basic-auth@2.0.1 +│ │ │ └── safe-buffer@5.1.2 +│ │ ├─┬ debug@2.6.9 +│ │ │ └── ms@2.0.0 +│ │ ├── depd@2.0.0 deduped +│ │ ├─┬ on-finished@2.3.0 +│ │ │ └── ee-first@1.1.1 deduped +│ │ └── on-headers@1.0.2 +│ ├── node-fetch@2.7.0 deduped +│ ├─┬ open@6.4.0 +│ │ └── is-wsl@1.1.0 +│ ├── ora@5.4.1 deduped +│ ├─┬ p-limit@3.1.0 +│ │ └── yocto-queue@0.1.0 +│ ├─┬ portfinder@1.0.32 +│ │ ├─┬ async@2.6.4 +│ │ │ └── lodash@4.17.21 deduped +│ │ ├─┬ debug@3.2.7 +│ │ │ └── ms@2.1.2 deduped +│ │ └─┬ mkdirp@0.5.6 +│ │ └── minimist@1.2.8 deduped +│ ├── progress@2.0.3 +│ ├─┬ proxy-agent@6.4.0 +│ │ ├── agent-base@7.1.0 deduped +│ │ ├── debug@4.3.4 deduped +│ │ ├─┬ http-proxy-agent@7.0.2 +│ │ │ ├── agent-base@7.1.0 deduped +│ │ │ └── debug@4.3.4 deduped +│ │ ├─┬ https-proxy-agent@7.0.4 +│ │ │ ├── agent-base@7.1.0 deduped +│ │ │ └── debug@4.3.4 deduped +│ │ ├── lru-cache@7.18.3 +│ │ ├─┬ pac-proxy-agent@7.0.1 +│ │ │ ├── @tootallnate/quickjs-emscripten@0.23.0 +│ │ │ ├── agent-base@7.1.0 deduped +│ │ │ ├── debug@4.3.4 deduped +│ │ │ ├─┬ get-uri@6.0.3 +│ │ │ │ ├── basic-ftp@5.0.5 +│ │ │ │ ├── data-uri-to-buffer@6.0.2 +│ │ │ │ ├── debug@4.3.4 deduped +│ │ │ │ └─┬ fs-extra@11.2.0 +│ │ │ │ ├── graceful-fs@4.2.11 deduped +│ │ │ │ ├── jsonfile@6.1.0 deduped +│ │ │ │ └── universalify@2.0.1 deduped +│ │ │ ├── http-proxy-agent@7.0.2 deduped +│ │ │ ├── https-proxy-agent@7.0.4 deduped +│ │ │ ├─┬ pac-resolver@7.0.1 +│ │ │ │ ├─┬ degenerator@5.0.1 +│ │ │ │ │ ├─┬ ast-types@0.13.4 +│ │ │ │ │ │ └── tslib@2.6.2 deduped +│ │ │ │ │ ├─┬ escodegen@2.1.0 +│ │ │ │ │ │ ├── esprima@4.0.1 deduped +│ │ │ │ │ │ ├── estraverse@5.3.0 deduped +│ │ │ │ │ │ ├── esutils@2.0.3 deduped +│ │ │ │ │ │ └── source-map@0.6.1 +│ │ │ │ │ └── esprima@4.0.1 deduped +│ │ │ │ └── netmask@2.0.2 +│ │ │ └── socks-proxy-agent@8.0.2 deduped +│ │ ├── proxy-from-env@1.1.0 +│ │ └─┬ socks-proxy-agent@8.0.2 +│ │ ├── agent-base@7.1.0 deduped +│ │ ├── debug@4.3.4 deduped +│ │ └─┬ socks@2.8.1 +│ │ ├─┬ ip-address@9.0.5 +│ │ │ ├── jsbn@1.1.0 +│ │ │ └── sprintf-js@1.1.3 +│ │ └── smart-buffer@4.2.0 +│ ├── retry@0.13.1 +│ ├─┬ rimraf@3.0.2 +│ │ └── glob@7.2.3 deduped +│ ├── semver@7.6.0 deduped +│ ├── stream-chain@2.2.5 +│ ├─┬ stream-json@1.8.0 +│ │ └── stream-chain@2.2.5 deduped +│ ├── strip-ansi@6.0.1 deduped +│ ├─┬ superstatic@9.0.3 +│ │ ├── basic-auth-connect@1.0.0 +│ │ ├── commander@10.0.1 +│ │ ├── compression@1.7.4 deduped +│ │ ├── connect@3.7.0 deduped +│ │ ├── destroy@1.2.0 deduped +│ │ ├─┬ fast-url-parser@1.1.3 +│ │ │ └── punycode@1.4.1 +│ │ ├─┬ glob-slasher@1.0.1 +│ │ │ ├── glob-slash@1.0.0 +│ │ │ ├─┬ lodash.isobject@2.4.1 +│ │ │ │ └── lodash._objecttypes@2.4.1 +│ │ │ └─┬ toxic@1.0.1 +│ │ │ └── lodash@4.17.21 deduped +│ │ ├── is-url@1.2.4 +│ │ ├─┬ join-path@1.1.1 +│ │ │ ├── as-array@2.0.0 +│ │ │ ├── url-join@0.0.1 +│ │ │ └── valid-url@1.0.9 +│ │ ├── lodash@4.17.21 deduped +│ │ ├── mime-types@2.1.35 deduped +│ │ ├─┬ minimatch@6.2.0 +│ │ │ └── brace-expansion@2.0.1 deduped +│ │ ├── morgan@1.10.0 deduped +│ │ ├── on-finished@2.4.1 deduped +│ │ ├── on-headers@1.0.2 deduped +│ │ ├─┬ path-to-regexp@1.8.0 +│ │ │ └── isarray@0.0.1 +│ │ ├─┬ re2@1.20.9 +│ │ │ ├── install-artifact-from-github@1.3.5 +│ │ │ ├── nan@2.18.0 +│ │ │ └── node-gyp@10.0.1 deduped +│ │ ├─┬ router@1.3.8 +│ │ │ ├── array-flatten@3.0.0 +│ │ │ ├─┬ debug@2.6.9 +│ │ │ │ └── ms@2.0.0 +│ │ │ ├── methods@1.1.2 deduped +│ │ │ ├── parseurl@1.3.3 deduped +│ │ │ ├── path-to-regexp@0.1.7 deduped +│ │ │ ├── setprototypeof@1.2.0 deduped +│ │ │ └── utils-merge@1.0.1 deduped +│ │ └── update-notifier-cjs@5.1.6 deduped +│ ├── tar@6.2.0 deduped +│ ├─┬ tcp-port-used@1.0.2 +│ │ ├─┬ debug@4.3.1 +│ │ │ └── ms@2.1.2 deduped +│ │ └─┬ is2@2.0.9 +│ │ ├── deep-is@0.1.4 deduped +│ │ ├── ip-regex@4.3.0 +│ │ └── is-url@1.2.4 deduped +│ ├── tmp@0.2.1 deduped +│ ├── triple-beam@1.4.1 deduped +│ ├─┬ universal-analytics@0.5.3 +│ │ ├── debug@4.3.4 deduped +│ │ └── uuid@8.3.2 deduped +│ ├─┬ update-notifier-cjs@5.1.6 +│ │ ├─┬ boxen@5.1.2 +│ │ │ ├─┬ ansi-align@3.0.1 +│ │ │ │ └── string-width@4.2.3 deduped +│ │ │ ├── camelcase@6.3.0 +│ │ │ ├─┬ chalk@4.1.2 +│ │ │ │ ├─┬ ansi-styles@4.3.0 +│ │ │ │ │ └─┬ color-convert@2.0.1 +│ │ │ │ │ └── color-name@1.1.4 +│ │ │ │ └─┬ supports-color@7.2.0 +│ │ │ │ └── has-flag@4.0.0 +│ │ │ ├── cli-boxes@2.2.1 +│ │ │ ├── string-width@4.2.3 deduped +│ │ │ ├── type-fest@0.20.2 +│ │ │ ├─┬ widest-line@3.1.0 +│ │ │ │ └── string-width@4.2.3 deduped +│ │ │ └── wrap-ansi@7.0.0 deduped +│ │ ├─┬ chalk@4.1.2 +│ │ │ ├─┬ ansi-styles@4.3.0 +│ │ │ │ └─┬ color-convert@2.0.1 +│ │ │ │ └── color-name@1.1.4 +│ │ │ └─┬ supports-color@7.2.0 +│ │ │ └── has-flag@4.0.0 +│ │ ├── configstore@5.0.1 deduped +│ │ ├── has-yarn@2.1.0 +│ │ ├── import-lazy@2.1.0 +│ │ ├─┬ is-ci@2.0.0 +│ │ │ └── ci-info@2.0.0 +│ │ ├── is-installed-globally@0.4.0 deduped +│ │ ├── is-npm@5.0.0 +│ │ ├── is-yarn-global@0.3.0 +│ │ ├─┬ isomorphic-fetch@3.0.0 +│ │ │ ├── node-fetch@2.7.0 deduped +│ │ │ └── whatwg-fetch@3.6.20 +│ │ ├─┬ pupa@2.1.1 +│ │ │ └── escape-goat@2.1.1 +│ │ ├─┬ registry-auth-token@5.0.2 +│ │ │ └─┬ @pnpm/npm-conf@2.2.2 +│ │ │ ├── @pnpm/config.env-replace@1.1.0 +│ │ │ ├─┬ @pnpm/network.ca-file@1.0.2 +│ │ │ │ └── graceful-fs@4.2.10 +│ │ │ └─┬ config-chain@1.1.13 +│ │ │ ├── ini@1.3.8 +│ │ │ └── proto-list@1.2.4 +│ │ ├─┬ registry-url@5.1.0 +│ │ │ └─┬ rc@1.2.8 +│ │ │ ├── deep-extend@0.6.0 +│ │ │ ├── ini@1.3.8 +│ │ │ ├── minimist@1.2.8 deduped +│ │ │ └── strip-json-comments@2.0.1 +│ │ ├─┬ semver-diff@3.1.1 +│ │ │ └── semver@6.3.1 +│ │ ├── semver@7.6.0 deduped +│ │ └── xdg-basedir@4.0.0 deduped +│ ├── uuid@8.3.2 +│ ├─┬ winston-transport@4.7.0 +│ │ ├── logform@2.6.0 deduped +│ │ ├── readable-stream@3.6.2 deduped +│ │ └── triple-beam@1.4.1 deduped +│ ├── winston@3.11.0 deduped +│ └─┬ ws@7.5.9 +│ ├── UNMET OPTIONAL DEPENDENCY bufferutil@^4.0.1 +│ └── UNMET OPTIONAL DEPENDENCY utf-8-validate@^5.0.2 +├─┬ firebase@10.8.1 +│ ├─┬ @firebase/analytics-compat@0.2.7 +│ │ ├── @firebase/analytics-types@0.8.0 +│ │ ├── @firebase/analytics@0.10.1 deduped +│ │ ├── @firebase/app-compat@0.2.28 deduped +│ │ ├─┬ @firebase/component@0.6.5 +│ │ │ ├── @firebase/util@1.9.4 deduped +│ │ │ └── tslib@2.6.2 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @firebase/analytics@0.10.1 +│ │ ├── @firebase/app@0.9.28 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├── @firebase/installations@0.6.5 deduped +│ │ ├─┬ @firebase/logger@0.4.0 +│ │ │ └── tslib@2.6.2 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @firebase/app-check-compat@0.3.9 +│ │ ├── @firebase/app-check-types@0.5.0 +│ │ ├── @firebase/app-check@0.8.2 deduped +│ │ ├── @firebase/app-compat@0.2.28 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├── @firebase/logger@0.4.0 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @firebase/app-check@0.8.2 +│ │ ├── @firebase/app@0.9.28 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├── @firebase/logger@0.4.0 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @firebase/app-compat@0.2.28 +│ │ ├── @firebase/app@0.9.28 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├── @firebase/logger@0.4.0 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├── @firebase/app-types@0.9.0 +│ ├─┬ @firebase/app@0.9.28 +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├── @firebase/logger@0.4.0 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ ├── idb@7.1.1 +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @firebase/auth-compat@0.5.3 +│ │ ├── @firebase/app-compat@0.2.28 deduped +│ │ ├─┬ @firebase/auth-types@0.12.0 +│ │ │ ├── @firebase/app-types@0.9.0 deduped +│ │ │ └── @firebase/util@1.9.4 deduped +│ │ ├── @firebase/auth@1.6.1 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ ├── tslib@2.6.2 deduped +│ │ └─┬ undici@5.28.3 +│ │ └── @fastify/busboy@2.1.0 deduped +│ ├─┬ @firebase/auth@1.6.1 +│ │ ├── @firebase/app@0.9.28 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├── @firebase/logger@0.4.0 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ ├── UNMET OPTIONAL DEPENDENCY @react-native-async-storage/async-storage@^1.18.1 +│ │ ├── tslib@2.6.2 deduped +│ │ └─┬ undici@5.28.3 +│ │ └── @fastify/busboy@2.1.0 deduped +│ ├─┬ @firebase/database-compat@1.0.3 +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├─┬ @firebase/database-types@1.0.1 +│ │ │ ├── @firebase/app-types@0.9.0 deduped +│ │ │ └── @firebase/util@1.9.4 deduped +│ │ ├── @firebase/database@1.0.3 deduped +│ │ ├── @firebase/logger@0.4.0 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @firebase/database@1.0.3 +│ │ ├── @firebase/app-check-interop-types@0.3.0 +│ │ ├── @firebase/auth-interop-types@0.2.1 +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├── @firebase/logger@0.4.0 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ ├─┬ faye-websocket@0.11.4 +│ │ │ └── websocket-driver@0.7.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @firebase/firestore-compat@0.3.26 +│ │ ├── @firebase/app-compat@0.2.28 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├─┬ @firebase/firestore-types@3.0.0 +│ │ │ ├── @firebase/app-types@0.9.0 deduped +│ │ │ └── @firebase/util@1.9.4 deduped +│ │ ├── @firebase/firestore@4.4.3 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @firebase/firestore@4.4.3 +│ │ ├── @firebase/app@0.9.28 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├── @firebase/logger@0.4.0 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ ├── @firebase/webchannel-wrapper@0.10.5 +│ │ ├─┬ @grpc/grpc-js@1.9.14 +│ │ │ ├── @grpc/proto-loader@0.7.10 deduped +│ │ │ └── @types/node@20.11.21 deduped +│ │ ├─┬ @grpc/proto-loader@0.7.10 +│ │ │ ├── lodash.camelcase@4.3.0 +│ │ │ ├── long@5.2.3 +│ │ │ ├─┬ protobufjs@7.2.6 +│ │ │ │ ├── @protobufjs/aspromise@1.1.2 deduped +│ │ │ │ ├── @protobufjs/base64@1.1.2 deduped +│ │ │ │ ├── @protobufjs/codegen@2.0.4 deduped +│ │ │ │ ├── @protobufjs/eventemitter@1.1.0 deduped +│ │ │ │ ├── @protobufjs/fetch@1.1.0 deduped +│ │ │ │ ├── @protobufjs/float@1.0.2 deduped +│ │ │ │ ├── @protobufjs/inquire@1.1.0 deduped +│ │ │ │ ├── @protobufjs/path@1.1.2 deduped +│ │ │ │ ├── @protobufjs/pool@1.1.0 deduped +│ │ │ │ ├── @protobufjs/utf8@1.1.0 deduped +│ │ │ │ ├── @types/node@20.11.21 deduped +│ │ │ │ └── long@5.2.3 deduped +│ │ │ └── yargs@17.7.2 deduped +│ │ ├── tslib@2.6.2 deduped +│ │ └─┬ undici@5.28.3 +│ │ └── @fastify/busboy@2.1.0 deduped +│ ├─┬ @firebase/functions-compat@0.3.8 +│ │ ├── @firebase/app-compat@0.2.28 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├── @firebase/functions-types@0.6.0 +│ │ ├── @firebase/functions@0.11.2 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @firebase/functions@0.11.2 +│ │ ├── @firebase/app-check-interop-types@0.3.0 deduped +│ │ ├── @firebase/app@0.9.28 deduped +│ │ ├── @firebase/auth-interop-types@0.2.1 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├── @firebase/messaging-interop-types@0.2.0 +│ │ ├── @firebase/util@1.9.4 deduped +│ │ ├── tslib@2.6.2 deduped +│ │ └─┬ undici@5.28.3 +│ │ └── @fastify/busboy@2.1.0 deduped +│ ├─┬ @firebase/installations-compat@0.2.5 +│ │ ├── @firebase/app-compat@0.2.28 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├─┬ @firebase/installations-types@0.5.0 +│ │ │ └── @firebase/app-types@0.9.0 deduped +│ │ ├── @firebase/installations@0.6.5 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @firebase/installations@0.6.5 +│ │ ├── @firebase/app@0.9.28 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ ├── idb@7.1.1 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @firebase/messaging-compat@0.2.6 +│ │ ├── @firebase/app-compat@0.2.28 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├── @firebase/messaging@0.12.6 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @firebase/messaging@0.12.6 +│ │ ├── @firebase/app@0.9.28 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├── @firebase/installations@0.6.5 deduped +│ │ ├── @firebase/messaging-interop-types@0.2.0 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ ├── idb@7.1.1 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @firebase/performance-compat@0.2.5 +│ │ ├── @firebase/app-compat@0.2.28 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├── @firebase/logger@0.4.0 deduped +│ │ ├── @firebase/performance-types@0.2.0 +│ │ ├── @firebase/performance@0.6.5 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @firebase/performance@0.6.5 +│ │ ├── @firebase/app@0.9.28 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├── @firebase/installations@0.6.5 deduped +│ │ ├── @firebase/logger@0.4.0 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @firebase/remote-config-compat@0.2.5 +│ │ ├── @firebase/app-compat@0.2.28 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├── @firebase/logger@0.4.0 deduped +│ │ ├── @firebase/remote-config-types@0.3.0 +│ │ ├── @firebase/remote-config@0.4.5 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @firebase/remote-config@0.4.5 +│ │ ├── @firebase/app@0.9.28 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├── @firebase/installations@0.6.5 deduped +│ │ ├── @firebase/logger@0.4.0 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @firebase/storage-compat@0.3.5 +│ │ ├── @firebase/app-compat@0.2.28 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├─┬ @firebase/storage-types@0.8.0 +│ │ │ ├── @firebase/app-types@0.9.0 deduped +│ │ │ └── @firebase/util@1.9.4 deduped +│ │ ├── @firebase/storage@0.12.2 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ └── tslib@2.6.2 deduped +│ ├─┬ @firebase/storage@0.12.2 +│ │ ├── @firebase/app@0.9.28 deduped +│ │ ├── @firebase/component@0.6.5 deduped +│ │ ├── @firebase/util@1.9.4 deduped +│ │ ├── tslib@2.6.2 deduped +│ │ └─┬ undici@5.28.3 +│ │ └── @fastify/busboy@2.1.0 deduped +│ └─┬ @firebase/util@1.9.4 +│ └── tslib@2.6.2 deduped +├── fuzzy@0.1.3 +├─┬ inquirer-autocomplete-prompt@3.0.1 +│ ├─┬ ansi-escapes@6.2.0 +│ │ └── type-fest@3.13.1 +│ ├─┬ figures@5.0.0 +│ │ ├── escape-string-regexp@5.0.0 +│ │ └── is-unicode-supported@1.3.0 +│ ├── inquirer@9.2.15 deduped +│ ├── picocolors@1.0.0 +│ ├── run-async@2.4.1 +│ └── rxjs@7.8.1 deduped +├─┬ inquirer@9.2.15 +│ ├─┬ @ljharb/through@2.3.12 +│ │ └─┬ call-bind@1.0.7 +│ │ ├─┬ es-define-property@1.0.0 +│ │ │ └── get-intrinsic@1.2.4 deduped +│ │ ├── es-errors@1.3.0 +│ │ ├── function-bind@1.1.2 +│ │ ├─┬ get-intrinsic@1.2.4 +│ │ │ ├── es-errors@1.3.0 deduped +│ │ │ ├── function-bind@1.1.2 deduped +│ │ │ ├── has-proto@1.0.3 +│ │ │ ├── has-symbols@1.0.3 +│ │ │ └── hasown@2.0.1 deduped +│ │ └─┬ set-function-length@1.2.1 +│ │ ├─┬ define-data-property@1.1.4 +│ │ │ ├── es-define-property@1.0.0 deduped +│ │ │ ├── es-errors@1.3.0 deduped +│ │ │ └── gopd@1.0.1 deduped +│ │ ├── es-errors@1.3.0 deduped +│ │ ├── function-bind@1.1.2 deduped +│ │ ├── get-intrinsic@1.2.4 deduped +│ │ ├─┬ gopd@1.0.1 +│ │ │ └── get-intrinsic@1.2.4 deduped +│ │ └─┬ has-property-descriptors@1.0.2 +│ │ └── es-define-property@1.0.0 deduped +│ ├─┬ ansi-escapes@4.3.2 +│ │ └── type-fest@0.21.3 +│ ├── chalk@5.3.0 +│ ├── cli-cursor@3.1.0 deduped +│ ├── cli-width@4.1.0 +│ ├─┬ external-editor@3.1.0 +│ │ ├── chardet@0.7.0 +│ │ ├── iconv-lite@0.4.24 deduped +│ │ └─┬ tmp@0.0.33 +│ │ └── os-tmpdir@1.0.2 +│ ├── figures@3.2.0 deduped +│ ├── lodash@4.17.21 deduped +│ ├── mute-stream@1.0.0 +│ ├── ora@5.4.1 deduped +│ ├── run-async@3.0.0 +│ ├── rxjs@7.8.1 deduped +│ ├─┬ string-width@4.2.3 +│ │ ├── emoji-regex@8.0.0 +│ │ ├── is-fullwidth-code-point@3.0.0 +│ │ └── strip-ansi@6.0.1 deduped +│ ├── strip-ansi@6.0.1 deduped +│ └─┬ wrap-ansi@6.2.0 +│ ├─┬ ansi-styles@4.3.0 +│ │ └─┬ color-convert@2.0.1 +│ │ └── color-name@1.1.4 +│ ├── string-width@4.2.3 deduped +│ └── strip-ansi@6.0.1 deduped +├── jasmine-core@5.1.2 +├─┬ jasmine-spec-reporter@7.0.0 +│ └── colors@1.4.0 +├─┬ karma-chrome-launcher@3.2.0 +│ └─┬ which@1.3.1 +│ └── isexe@2.0.0 +├─┬ karma-coverage-istanbul-reporter@3.0.3 +│ ├── istanbul-lib-coverage@3.2.2 +│ ├─┬ istanbul-lib-report@3.0.1 +│ │ ├── istanbul-lib-coverage@3.2.2 deduped +│ │ ├─┬ make-dir@4.0.0 +│ │ │ └── semver@7.6.0 deduped +│ │ └─┬ supports-color@7.2.0 +│ │ └── has-flag@4.0.0 +│ ├─┬ istanbul-lib-source-maps@3.0.6 +│ │ ├── debug@4.3.4 deduped +│ │ ├── istanbul-lib-coverage@2.0.5 +│ │ ├─┬ make-dir@2.1.0 +│ │ │ ├── pify@4.0.1 +│ │ │ └── semver@5.7.2 +│ │ ├─┬ rimraf@2.7.1 +│ │ │ └── glob@7.2.3 deduped +│ │ └── source-map@0.6.1 +│ ├─┬ istanbul-reports@3.1.7 +│ │ ├── html-escaper@2.0.2 +│ │ └── istanbul-lib-report@3.0.1 deduped +│ └─┬ minimatch@3.1.2 +│ └─┬ brace-expansion@1.1.11 +│ ├── balanced-match@1.0.2 deduped +│ └── concat-map@0.0.1 deduped +├─┬ karma-jasmine-html-reporter@2.1.0 +│ ├── jasmine-core@5.1.2 deduped +│ ├── karma-jasmine@5.1.0 deduped +│ └── karma@6.4.3 deduped +├─┬ karma-jasmine@5.1.0 +│ ├── jasmine-core@4.6.0 +│ └── karma@6.4.3 deduped +├─┬ karma@6.4.3 +│ ├── @colors/colors@1.5.0 +│ ├── body-parser@1.20.2 deduped +│ ├─┬ braces@3.0.2 +│ │ └─┬ fill-range@7.0.1 +│ │ └─┬ to-regex-range@5.0.1 +│ │ └── is-number@7.0.0 +│ ├── chokidar@3.6.0 deduped +│ ├─┬ connect@3.7.0 +│ │ ├─┬ debug@2.6.9 +│ │ │ └── ms@2.0.0 +│ │ ├─┬ finalhandler@1.1.2 +│ │ │ ├── debug@2.6.9 deduped +│ │ │ ├── encodeurl@1.0.2 deduped +│ │ │ ├── escape-html@1.0.3 deduped +│ │ │ ├─┬ on-finished@2.3.0 +│ │ │ │ └── ee-first@1.1.1 deduped +│ │ │ ├── parseurl@1.3.3 deduped +│ │ │ ├── statuses@1.5.0 +│ │ │ └── unpipe@1.0.0 deduped +│ │ ├── parseurl@1.3.3 deduped +│ │ └── utils-merge@1.0.1 deduped +│ ├── di@0.0.1 +│ ├─┬ dom-serialize@2.2.1 +│ │ ├── custom-event@1.0.1 +│ │ ├── ent@2.2.0 +│ │ ├── extend@3.0.2 deduped +│ │ └── void-elements@2.0.1 +│ ├── glob@7.2.3 deduped +│ ├── graceful-fs@4.2.11 +│ ├─┬ http-proxy@1.18.1 +│ │ ├── eventemitter3@4.0.7 +│ │ ├── follow-redirects@1.15.5 +│ │ └── requires-port@1.0.0 +│ ├── isbinaryfile@4.0.10 +│ ├── lodash@4.17.21 deduped +│ ├─┬ log4js@6.9.1 +│ │ ├── date-format@4.0.14 +│ │ ├── debug@4.3.4 deduped +│ │ ├── flatted@3.3.1 +│ │ ├── rfdc@1.3.1 deduped +│ │ └─┬ streamroller@3.1.5 +│ │ ├── date-format@4.0.14 deduped +│ │ ├── debug@4.3.4 deduped +│ │ └── fs-extra@8.1.0 deduped +│ ├── mime@2.6.0 deduped +│ ├─┬ minimatch@3.1.2 +│ │ └─┬ brace-expansion@1.1.11 +│ │ ├── balanced-match@1.0.2 deduped +│ │ └── concat-map@0.0.1 deduped +│ ├─┬ mkdirp@0.5.6 +│ │ └── minimist@1.2.8 deduped +│ ├── qjobs@1.2.0 +│ ├── range-parser@1.2.1 +│ ├─┬ rimraf@3.0.2 +│ │ └── glob@7.2.3 deduped +│ ├─┬ socket.io@4.7.4 +│ │ ├── accepts@1.3.8 deduped +│ │ ├── base64id@2.0.0 +│ │ ├── cors@2.8.5 deduped +│ │ ├── debug@4.3.4 deduped +│ │ ├─┬ engine.io@6.5.4 +│ │ │ ├── @types/cookie@0.4.1 +│ │ │ ├─┬ @types/cors@2.8.17 +│ │ │ │ └── @types/node@20.11.21 deduped +│ │ │ ├── @types/node@20.11.21 deduped +│ │ │ ├── accepts@1.3.8 deduped +│ │ │ ├── base64id@2.0.0 deduped +│ │ │ ├── cookie@0.4.2 +│ │ │ ├── cors@2.8.5 deduped +│ │ │ ├── debug@4.3.4 deduped +│ │ │ ├── engine.io-parser@5.2.2 +│ │ │ └─┬ ws@8.11.0 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY bufferutil@^4.0.1 +│ │ │ └── UNMET OPTIONAL DEPENDENCY utf-8-validate@^5.0.2 +│ │ ├─┬ socket.io-adapter@2.5.4 +│ │ │ ├── debug@4.3.4 deduped +│ │ │ └─┬ ws@8.11.0 +│ │ │ ├── UNMET OPTIONAL DEPENDENCY bufferutil@^4.0.1 +│ │ │ └── UNMET OPTIONAL DEPENDENCY utf-8-validate@^5.0.2 +│ │ └─┬ socket.io-parser@4.2.4 +│ │ ├── @socket.io/component-emitter@3.1.0 +│ │ └── debug@4.3.4 deduped +│ ├── source-map@0.6.1 +│ ├── tmp@0.2.1 deduped +│ ├── ua-parser-js@0.7.37 +│ └─┬ yargs@16.2.0 +│ ├─┬ cliui@7.0.4 +│ │ ├── string-width@4.2.3 deduped +│ │ ├── strip-ansi@6.0.1 deduped +│ │ └── wrap-ansi@7.0.0 deduped +│ ├── escalade@3.1.2 deduped +│ ├── get-caller-file@2.0.5 deduped +│ ├── require-directory@2.1.1 deduped +│ ├── string-width@4.2.3 deduped +│ ├── y18n@5.0.8 deduped +│ └── yargs-parser@20.2.9 +├── marked@9.1.6 +├─┬ ngx-markdown@17.1.1 +│ ├── @angular/common@17.2.3 deduped +│ ├── @angular/core@17.2.3 deduped +│ ├── @angular/platform-browser@17.2.3 deduped +│ ├─┬ clipboard@2.0.11 +│ │ ├─┬ good-listener@1.2.2 +│ │ │ └── delegate@3.2.0 +│ │ ├── select@1.1.2 +│ │ └── tiny-emitter@2.1.0 +│ ├── emoji-toolkit@8.0.0 +│ ├─┬ katex@0.16.9 +│ │ └── commander@8.3.0 +│ ├── marked@9.1.6 deduped +│ ├─┬ mermaid@10.8.0 +│ │ ├── @braintree/sanitize-url@6.0.4 +│ │ ├── @types/d3-scale-chromatic@3.0.3 +│ │ ├─┬ @types/d3-scale@4.0.8 +│ │ │ └── @types/d3-time@3.0.3 +│ │ ├─┬ cytoscape-cose-bilkent@4.1.0 +│ │ │ ├─┬ cose-base@1.0.3 +│ │ │ │ └── layout-base@1.0.2 +│ │ │ └── cytoscape@3.28.1 deduped +│ │ ├─┬ cytoscape@3.28.1 +│ │ │ ├── heap@0.2.7 +│ │ │ └── lodash@4.17.21 deduped +│ │ ├─┬ d3-sankey@0.12.3 +│ │ │ ├─┬ d3-array@2.12.1 +│ │ │ │ └── internmap@1.0.1 +│ │ │ └─┬ d3-shape@1.3.7 +│ │ │ └── d3-path@1.0.9 +│ │ ├─┬ d3@7.8.5 +│ │ │ ├─┬ d3-array@3.2.4 +│ │ │ │ └── internmap@2.0.3 +│ │ │ ├── d3-axis@3.0.0 +│ │ │ ├─┬ d3-brush@3.0.0 +│ │ │ │ ├── d3-dispatch@3.0.1 deduped +│ │ │ │ ├── d3-drag@3.0.0 deduped +│ │ │ │ ├── d3-interpolate@3.0.1 deduped +│ │ │ │ ├── d3-selection@3.0.0 deduped +│ │ │ │ └── d3-transition@3.0.1 deduped +│ │ │ ├─┬ d3-chord@3.0.1 +│ │ │ │ └── d3-path@3.1.0 deduped +│ │ │ ├── d3-color@3.1.0 +│ │ │ ├─┬ d3-contour@4.0.2 +│ │ │ │ └── d3-array@3.2.4 deduped +│ │ │ ├─┬ d3-delaunay@6.0.4 +│ │ │ │ └─┬ delaunator@5.0.1 +│ │ │ │ └── robust-predicates@3.0.2 +│ │ │ ├── d3-dispatch@3.0.1 +│ │ │ ├─┬ d3-drag@3.0.0 +│ │ │ │ ├── d3-dispatch@3.0.1 deduped +│ │ │ │ └── d3-selection@3.0.0 deduped +│ │ │ ├─┬ d3-dsv@3.0.1 +│ │ │ │ ├── commander@7.2.0 +│ │ │ │ ├─┬ iconv-lite@0.6.3 +│ │ │ │ │ └── safer-buffer@2.1.2 deduped +│ │ │ │ └── rw@1.3.3 +│ │ │ ├── d3-ease@3.0.1 +│ │ │ ├─┬ d3-fetch@3.0.1 +│ │ │ │ └── d3-dsv@3.0.1 deduped +│ │ │ ├─┬ d3-force@3.0.0 +│ │ │ │ ├── d3-dispatch@3.0.1 deduped +│ │ │ │ ├── d3-quadtree@3.0.1 deduped +│ │ │ │ └── d3-timer@3.0.1 deduped +│ │ │ ├── d3-format@3.1.0 +│ │ │ ├─┬ d3-geo@3.1.0 +│ │ │ │ └── d3-array@3.2.4 deduped +│ │ │ ├── d3-hierarchy@3.1.2 +│ │ │ ├─┬ d3-interpolate@3.0.1 +│ │ │ │ └── d3-color@3.1.0 deduped +│ │ │ ├── d3-path@3.1.0 +│ │ │ ├── d3-polygon@3.0.1 +│ │ │ ├── d3-quadtree@3.0.1 +│ │ │ ├── d3-random@3.0.1 +│ │ │ ├─┬ d3-scale-chromatic@3.0.0 +│ │ │ │ ├── d3-color@3.1.0 deduped +│ │ │ │ └── d3-interpolate@3.0.1 deduped +│ │ │ ├─┬ d3-scale@4.0.2 +│ │ │ │ ├── d3-array@3.2.4 deduped +│ │ │ │ ├── d3-format@3.1.0 deduped +│ │ │ │ ├── d3-interpolate@3.0.1 deduped +│ │ │ │ ├── d3-time-format@4.1.0 deduped +│ │ │ │ └── d3-time@3.1.0 deduped +│ │ │ ├── d3-selection@3.0.0 +│ │ │ ├─┬ d3-shape@3.2.0 +│ │ │ │ └── d3-path@3.1.0 deduped +│ │ │ ├─┬ d3-time-format@4.1.0 +│ │ │ │ └── d3-time@3.1.0 deduped +│ │ │ ├─┬ d3-time@3.1.0 +│ │ │ │ └── d3-array@3.2.4 deduped +│ │ │ ├── d3-timer@3.0.1 +│ │ │ ├─┬ d3-transition@3.0.1 +│ │ │ │ ├── d3-color@3.1.0 deduped +│ │ │ │ ├── d3-dispatch@3.0.1 deduped +│ │ │ │ ├── d3-ease@3.0.1 deduped +│ │ │ │ ├── d3-interpolate@3.0.1 deduped +│ │ │ │ ├── d3-selection@3.0.0 deduped +│ │ │ │ └── d3-timer@3.0.1 deduped +│ │ │ └─┬ d3-zoom@3.0.0 +│ │ │ ├── d3-dispatch@3.0.1 deduped +│ │ │ ├── d3-drag@3.0.0 deduped +│ │ │ ├── d3-interpolate@3.0.1 deduped +│ │ │ ├── d3-selection@3.0.0 deduped +│ │ │ └── d3-transition@3.0.1 deduped +│ │ ├─┬ dagre-d3-es@7.0.10 +│ │ │ ├── d3@7.8.5 deduped +│ │ │ └── lodash-es@4.17.21 deduped +│ │ ├── dayjs@1.11.10 deduped +│ │ ├── dompurify@3.0.9 +│ │ ├── elkjs@0.9.2 +│ │ ├── khroma@2.1.0 +│ │ ├── lodash-es@4.17.21 +│ │ ├─┬ mdast-util-from-markdown@1.3.1 +│ │ │ ├─┬ @types/mdast@3.0.15 +│ │ │ │ └── @types/unist@2.0.10 deduped +│ │ │ ├── @types/unist@2.0.10 +│ │ │ ├─┬ decode-named-character-reference@1.0.2 +│ │ │ │ └── character-entities@2.0.2 +│ │ │ ├─┬ mdast-util-to-string@3.2.0 +│ │ │ │ └── @types/mdast@3.0.15 deduped +│ │ │ ├─┬ micromark-util-decode-numeric-character-reference@1.1.0 +│ │ │ │ └── micromark-util-symbol@1.1.0 deduped +│ │ │ ├─┬ micromark-util-decode-string@1.1.0 +│ │ │ │ ├── decode-named-character-reference@1.0.2 deduped +│ │ │ │ ├─┬ micromark-util-character@1.2.0 +│ │ │ │ │ ├── micromark-util-symbol@1.1.0 deduped +│ │ │ │ │ └── micromark-util-types@1.1.0 deduped +│ │ │ │ ├── micromark-util-decode-numeric-character-reference@1.1.0 deduped +│ │ │ │ └── micromark-util-symbol@1.1.0 deduped +│ │ │ ├─┬ micromark-util-normalize-identifier@1.1.0 +│ │ │ │ └── micromark-util-symbol@1.1.0 deduped +│ │ │ ├── micromark-util-symbol@1.1.0 +│ │ │ ├── micromark-util-types@1.1.0 +│ │ │ ├─┬ micromark@3.2.0 +│ │ │ │ ├─┬ @types/debug@4.1.12 +│ │ │ │ │ └── @types/ms@0.7.34 +│ │ │ │ ├── debug@4.3.4 deduped +│ │ │ │ ├── decode-named-character-reference@1.0.2 deduped +│ │ │ │ ├─┬ micromark-core-commonmark@1.1.0 +│ │ │ │ │ ├── decode-named-character-reference@1.0.2 deduped +│ │ │ │ │ ├─┬ micromark-factory-destination@1.1.0 +│ │ │ │ │ │ ├── micromark-util-character@1.2.0 deduped +│ │ │ │ │ │ ├── micromark-util-symbol@1.1.0 deduped +│ │ │ │ │ │ └── micromark-util-types@1.1.0 deduped +│ │ │ │ │ ├─┬ micromark-factory-label@1.1.0 +│ │ │ │ │ │ ├── micromark-util-character@1.2.0 deduped +│ │ │ │ │ │ ├── micromark-util-symbol@1.1.0 deduped +│ │ │ │ │ │ ├── micromark-util-types@1.1.0 deduped +│ │ │ │ │ │ └── uvu@0.5.6 deduped +│ │ │ │ │ ├── micromark-factory-space@1.1.0 deduped +│ │ │ │ │ ├─┬ micromark-factory-title@1.1.0 +│ │ │ │ │ │ ├── micromark-factory-space@1.1.0 deduped +│ │ │ │ │ │ ├── micromark-util-character@1.2.0 deduped +│ │ │ │ │ │ ├── micromark-util-symbol@1.1.0 deduped +│ │ │ │ │ │ └── micromark-util-types@1.1.0 deduped +│ │ │ │ │ ├─┬ micromark-factory-whitespace@1.1.0 +│ │ │ │ │ │ ├── micromark-factory-space@1.1.0 deduped +│ │ │ │ │ │ ├── micromark-util-character@1.2.0 deduped +│ │ │ │ │ │ ├── micromark-util-symbol@1.1.0 deduped +│ │ │ │ │ │ └── micromark-util-types@1.1.0 deduped +│ │ │ │ │ ├── micromark-util-character@1.2.0 deduped +│ │ │ │ │ ├── micromark-util-chunked@1.1.0 deduped +│ │ │ │ │ ├─┬ micromark-util-classify-character@1.1.0 +│ │ │ │ │ │ ├── micromark-util-character@1.2.0 deduped +│ │ │ │ │ │ ├── micromark-util-symbol@1.1.0 deduped +│ │ │ │ │ │ └── micromark-util-types@1.1.0 deduped +│ │ │ │ │ ├── micromark-util-html-tag-name@1.2.0 +│ │ │ │ │ ├── micromark-util-normalize-identifier@1.1.0 deduped +│ │ │ │ │ ├── micromark-util-resolve-all@1.1.0 deduped +│ │ │ │ │ ├── micromark-util-subtokenize@1.1.0 deduped +│ │ │ │ │ ├── micromark-util-symbol@1.1.0 deduped +│ │ │ │ │ ├── micromark-util-types@1.1.0 deduped +│ │ │ │ │ └── uvu@0.5.6 deduped +│ │ │ │ ├─┬ micromark-factory-space@1.1.0 +│ │ │ │ │ ├── micromark-util-character@1.2.0 deduped +│ │ │ │ │ └── micromark-util-types@1.1.0 deduped +│ │ │ │ ├── micromark-util-character@1.2.0 deduped +│ │ │ │ ├─┬ micromark-util-chunked@1.1.0 +│ │ │ │ │ └── micromark-util-symbol@1.1.0 deduped +│ │ │ │ ├─┬ micromark-util-combine-extensions@1.1.0 +│ │ │ │ │ ├── micromark-util-chunked@1.1.0 deduped +│ │ │ │ │ └── micromark-util-types@1.1.0 deduped +│ │ │ │ ├── micromark-util-decode-numeric-character-reference@1.1.0 deduped +│ │ │ │ ├── micromark-util-encode@1.1.0 +│ │ │ │ ├── micromark-util-normalize-identifier@1.1.0 deduped +│ │ │ │ ├─┬ micromark-util-resolve-all@1.1.0 +│ │ │ │ │ └── micromark-util-types@1.1.0 deduped +│ │ │ │ ├─┬ micromark-util-sanitize-uri@1.2.0 +│ │ │ │ │ ├── micromark-util-character@1.2.0 deduped +│ │ │ │ │ ├── micromark-util-encode@1.1.0 deduped +│ │ │ │ │ └── micromark-util-symbol@1.1.0 deduped +│ │ │ │ ├─┬ micromark-util-subtokenize@1.1.0 +│ │ │ │ │ ├── micromark-util-chunked@1.1.0 deduped +│ │ │ │ │ ├── micromark-util-symbol@1.1.0 deduped +│ │ │ │ │ ├── micromark-util-types@1.1.0 deduped +│ │ │ │ │ └── uvu@0.5.6 deduped +│ │ │ │ ├── micromark-util-symbol@1.1.0 deduped +│ │ │ │ ├── micromark-util-types@1.1.0 deduped +│ │ │ │ └── uvu@0.5.6 deduped +│ │ │ ├─┬ unist-util-stringify-position@3.0.3 +│ │ │ │ └── @types/unist@2.0.10 deduped +│ │ │ └─┬ uvu@0.5.6 +│ │ │ ├── dequal@2.0.3 deduped +│ │ │ ├── diff@5.2.0 +│ │ │ ├── kleur@4.1.5 deduped +│ │ │ └─┬ sade@1.8.1 +│ │ │ └── mri@1.2.0 +│ │ ├── non-layered-tidy-tree-layout@2.0.2 +│ │ ├── stylis@4.3.1 +│ │ ├── ts-dedent@2.2.0 +│ │ ├── uuid@9.0.1 +│ │ └── web-worker@1.3.0 +│ ├── prismjs@1.29.0 +│ ├── rxjs@7.8.1 deduped +│ ├── tslib@2.6.2 deduped +│ └── zone.js@0.14.4 deduped +├─┬ open@10.0.4 +│ ├─┬ default-browser@5.2.1 +│ │ ├─┬ bundle-name@4.1.0 +│ │ │ └── run-applescript@7.0.0 +│ │ └── default-browser-id@5.0.0 +│ ├── define-lazy-prop@3.0.0 +│ ├─┬ is-inside-container@1.0.0 +│ │ └── is-docker@3.0.0 +│ └─┬ is-wsl@3.1.0 +│ └── is-inside-container@1.0.0 deduped +├── reselect@5.1.0 +├─┬ rxjs@7.8.1 +│ └── tslib@2.6.2 deduped +├─┬ ts-node@10.9.2 +│ ├─┬ @cspotcode/source-map-support@0.8.1 +│ │ └─┬ @jridgewell/trace-mapping@0.3.9 +│ │ ├── @jridgewell/resolve-uri@3.1.2 deduped +│ │ └── @jridgewell/sourcemap-codec@1.4.15 deduped +│ ├── UNMET OPTIONAL DEPENDENCY @swc/core@>=1.2.50 +│ ├── UNMET OPTIONAL DEPENDENCY @swc/wasm@>=1.2.50 +│ ├── @tsconfig/node10@1.0.9 +│ ├── @tsconfig/node12@1.0.11 +│ ├── @tsconfig/node14@1.0.3 +│ ├── @tsconfig/node16@1.0.4 +│ ├── @types/node@20.11.21 deduped +│ ├── acorn-walk@8.3.2 +│ ├── acorn@8.11.3 +│ ├── arg@4.1.3 +│ ├── create-require@1.1.1 +│ ├── diff@4.0.2 +│ ├── make-error@1.3.6 +│ ├── typescript@5.3.3 deduped +│ ├── v8-compile-cache-lib@3.0.1 +│ └── yn@3.1.1 +├── tslib@2.6.2 +├── typescript@5.3.3 +└─┬ zone.js@0.14.4 + └── tslib@2.6.2 deduped + diff --git a/src/package-lock.json b/src/package-lock.json index 42370b68..71b1ecb1 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -25,11 +25,9 @@ "@codetrix-studio/capacitor-google-auth": "^3.4.0-rc.0", "@ngx-pwa/local-storage": "^17.0.0", "angular2-uuid": "^1.1.1", - "component": "^1.1.0", "firebase": "^10.8.0", "marked": "^9.0.0", "ngx-markdown": "^17.1.1", - "redux": "^5.0.1", "reselect": "^5.1.0", "rxjs": "^7.8.1", "tslib": "^2.6.2", @@ -51,9 +49,13 @@ "@types/jasminewd2": "~2.0.13", "@types/node": "^20.11.21", "@typescript-eslint/eslint-plugin": "7.1.0", - "@typescript-eslint/parser": "7.1.0", + "@typescript-eslint/parser": "^7.1.0", "cypress": "latest", "eslint": "^8.57.0", + "eslint-plugin-deprecation": "^2.0.0", + "eslint-plugin-optimize-regex": "^1.2.1", + "eslint-plugin-simple-import-sort": "^12.0.0", + "eslint-plugin-unused-imports": "^3.1.0", "firebase-tools": "^13.4.0", "fuzzy": "^0.1.3", "inquirer": "^9.2.15", @@ -3082,7 +3084,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.1.90" } @@ -3765,9 +3767,9 @@ "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==" }, "node_modules/@firebase/app": { - "version": "0.9.27", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.27.tgz", - "integrity": "sha512-p2Dvl1ge4kRsyK5+wWcmdAIE9MSwZ0pDKAYB51LZgZuz6wciUZk4E1yAEdkfQlRxuHehn+Ol9WP5Qk2XQZiHGg==", + "version": "0.9.28", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.28.tgz", + "integrity": "sha512-MS0+EtNixrwJbVDs5Bt/lhUhzeWGUtUoP6X+zYZck5GAZwI5g4F91noVA9oIXlFlpn6Q1xIbiaHA2GwGk7/7Ag==", "dependencies": { "@firebase/component": "0.6.5", "@firebase/logger": "0.4.0", @@ -3817,11 +3819,11 @@ "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==" }, "node_modules/@firebase/app-compat": { - "version": "0.2.27", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.27.tgz", - "integrity": "sha512-SYlqocfUDKPHR6MSFC8hree0BTiWFu5o8wbf6zFlYXyG41w7TcHp4wJi4H/EL5V6cM4kxwruXTJtqXX/fRAZtw==", + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.28.tgz", + "integrity": "sha512-Mr2NbeM1Oaayuw5unUAMzt+7/MN+e2uklT1l87D+ZLJl2UvhZAZmMt74GjEI9N3sDYKMeszSbszBqtJ1fGVafQ==", "dependencies": { - "@firebase/app": "0.9.27", + "@firebase/app": "0.9.28", "@firebase/component": "0.6.5", "@firebase/logger": "0.4.0", "@firebase/util": "1.9.4", @@ -3834,15 +3836,15 @@ "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==" }, "node_modules/@firebase/auth": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.6.0.tgz", - "integrity": "sha512-Qhl35eJTV6BwvuueTPCY6x8kUlYyzALtjp/Ws0X3fw3AnjVVfuVb7oQ3Xh5VPVfMFhaIuUAd1KXwcAuIklkSDw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.6.1.tgz", + "integrity": "sha512-oOuQVOxtxKr+kTTqEkkI2qXIeGbkNLpA8FzO030LF4KXmMcETqsPaIqw7Aw1Y4Zl82l1qpZtpc4vN4Da2qZdfQ==", "dependencies": { "@firebase/component": "0.6.5", "@firebase/logger": "0.4.0", "@firebase/util": "1.9.4", "tslib": "^2.1.0", - "undici": "5.26.5" + "undici": "5.28.3" }, "peerDependencies": { "@firebase/app": "0.x", @@ -3855,25 +3857,25 @@ } }, "node_modules/@firebase/auth-compat": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.2.tgz", - "integrity": "sha512-pRgje5BPCNR1vXyvGOVXwOHtv88A2WooXfklI8sV7/jWi03ExFqNfpJT26GUo/oD39NoKJ3Kt6rD5gVvdV7lMw==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.3.tgz", + "integrity": "sha512-2pVtVEvu8P7SF6jSPfLPKWUClQFj+StqAZ0fD/uQ6mv8DyWn7AuuANFEu7Pv96JPcaL6Gy9jC5dFqjpptjqSRA==", "dependencies": { - "@firebase/auth": "1.6.0", + "@firebase/auth": "1.6.1", "@firebase/auth-types": "0.12.0", "@firebase/component": "0.6.5", "@firebase/util": "1.9.4", "tslib": "^2.1.0", - "undici": "5.26.5" + "undici": "5.28.3" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "node_modules/@firebase/auth-compat/node_modules/undici": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", - "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", + "version": "5.28.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", + "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -3896,9 +3898,9 @@ } }, "node_modules/@firebase/auth/node_modules/undici": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", - "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", + "version": "5.28.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", + "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -3952,9 +3954,9 @@ } }, "node_modules/@firebase/firestore": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.4.2.tgz", - "integrity": "sha512-YaX6ypa/RzU6OkxzUQlpSxwhOIWdTraCNz7sMsbaSEjjl/pj/QvX6TqjkdWGzuBYh2S6rz7ErhDO0g39oZZw/g==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.4.3.tgz", + "integrity": "sha512-Ix61zbeuTsHf0WFbk6+67n89Vzd9M8MMTdnz7c7z+BRE3BS5Vuc3gX5ZcHFjqPkQJ7rpLB1egHsYe4Przp5C2g==", "dependencies": { "@firebase/component": "0.6.5", "@firebase/logger": "0.4.0", @@ -3963,7 +3965,7 @@ "@grpc/grpc-js": "~1.9.0", "@grpc/proto-loader": "^0.7.8", "tslib": "^2.1.0", - "undici": "5.26.5" + "undici": "5.28.3" }, "engines": { "node": ">=10.10.0" @@ -3973,12 +3975,12 @@ } }, "node_modules/@firebase/firestore-compat": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.25.tgz", - "integrity": "sha512-+xI7WmsgZCBhMn/+uhDKcg+lsOUJ9FJyt5PGTzkFPbCsozWfeQZ7eVnfPh0rMkUOf0yIQ924RIe04gwvEIbcoQ==", + "version": "0.3.26", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.26.tgz", + "integrity": "sha512-dNrKiH5Cn6ItANV9nJI2Y0msKBj/skO7skDlRo/BUSQE1DKbNzumxpJEz+PK/PV1nTegnRgVvs47gpQeVWXtYQ==", "dependencies": { "@firebase/component": "0.6.5", - "@firebase/firestore": "4.4.2", + "@firebase/firestore": "4.4.3", "@firebase/firestore-types": "3.0.0", "@firebase/util": "1.9.4", "tslib": "^2.1.0" @@ -3997,9 +3999,9 @@ } }, "node_modules/@firebase/firestore/node_modules/undici": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", - "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", + "version": "5.28.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", + "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -4008,9 +4010,9 @@ } }, "node_modules/@firebase/functions": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.1.tgz", - "integrity": "sha512-3uUa1hB79Gmy6E1gHTfzoHeZolBeHc/I/n3+lOCDe6BOos9AHmzRjKygcFE/7VA2FJjitCE0K+OHI6+OuoY8fQ==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.2.tgz", + "integrity": "sha512-2NULTYOZbu0rXczwfYdqQH0w1FmmYrKjTy1YPQSHLCAkMBdfewoKmVm4Lyo2vRn0H9ZndciLY7NszKDFt9MKCQ==", "dependencies": { "@firebase/app-check-interop-types": "0.3.0", "@firebase/auth-interop-types": "0.2.1", @@ -4018,19 +4020,19 @@ "@firebase/messaging-interop-types": "0.2.0", "@firebase/util": "1.9.4", "tslib": "^2.1.0", - "undici": "5.26.5" + "undici": "5.28.3" }, "peerDependencies": { "@firebase/app": "0.x" } }, "node_modules/@firebase/functions-compat": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.7.tgz", - "integrity": "sha512-uXe6Kmku5lNogp3OpPBcOJbSvnaCOn+YxS3zlXKNU6Q/NLwcvO3RY1zwYyctCos2RemEw3KEQ7YdzcECXjHWLw==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.8.tgz", + "integrity": "sha512-VDHSw6UOu8RxfgAY/q8e+Jn+9Fh60Fc28yck0yfMsi2e0BiWgonIMWkFspFGGLgOJebTHl+hc+9v91rhzU6xlg==", "dependencies": { "@firebase/component": "0.6.5", - "@firebase/functions": "0.11.1", + "@firebase/functions": "0.11.2", "@firebase/functions-types": "0.6.0", "@firebase/util": "1.9.4", "tslib": "^2.1.0" @@ -4045,9 +4047,9 @@ "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==" }, "node_modules/@firebase/functions/node_modules/undici": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", - "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", + "version": "5.28.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", + "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -4208,26 +4210,26 @@ "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==" }, "node_modules/@firebase/storage": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.1.tgz", - "integrity": "sha512-KJ5NV7FUh54TeTlEjdkTTX60ciCKOp9EqlbLnpdcXUYRJg0Z4810TXbilPc1z7fTIG4iPjtdi95bGE9n4dBX8A==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.2.tgz", + "integrity": "sha512-MzanOBcxDx9oOwDaDPMuiYxd6CxcN1xZm+os5uNE3C1itbRKLhM9rzpODDKWzcbnHHFtXk3Q3lsK/d3Xa1WYYw==", "dependencies": { "@firebase/component": "0.6.5", "@firebase/util": "1.9.4", "tslib": "^2.1.0", - "undici": "5.26.5" + "undici": "5.28.3" }, "peerDependencies": { "@firebase/app": "0.x" } }, "node_modules/@firebase/storage-compat": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.4.tgz", - "integrity": "sha512-Y0m5e2gS/wB9Ioth2X/Sgz76vcxvqgQrCmfa9qwhss/N31kxY2Gks6Frv0nrE18AjVfcSmcfDitqUwxcMOTRSg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.5.tgz", + "integrity": "sha512-5dJXfY5NxCF5NAk4dLvJqC+m6cgcf0Fr29nrMHwhwI34pBheQq2PdRZqALsqZCES9dnHTuFNlqGQDpLr+Ph4rw==", "dependencies": { "@firebase/component": "0.6.5", - "@firebase/storage": "0.12.1", + "@firebase/storage": "0.12.2", "@firebase/storage-types": "0.8.0", "@firebase/util": "1.9.4", "tslib": "^2.1.0" @@ -4246,9 +4248,9 @@ } }, "node_modules/@firebase/storage/node_modules/undici": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", - "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", + "version": "5.28.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", + "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -4750,7 +4752,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, + "devOptional": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -4767,7 +4769,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, + "devOptional": true, "engines": { "node": ">=12" }, @@ -4779,7 +4781,7 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, + "devOptional": true, "engines": { "node": ">=12" }, @@ -4791,13 +4793,13 @@ "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "devOptional": true }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, + "devOptional": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -4814,7 +4816,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, + "devOptional": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -4829,7 +4831,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, + "devOptional": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -5796,7 +5798,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.1.tgz", "integrity": "sha512-H4FrOVtNyWC8MUwL3UfjOsAihHvT1Pe8POj3JvjXhSTJipsZMtgUALCT4mGyYZNxymkUfOw3PUj6dE4QPp6osQ==", - "dev": true, + "devOptional": true, "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", @@ -5812,7 +5814,7 @@ "version": "10.2.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true, + "devOptional": true, "engines": { "node": "14 || >=16.14" } @@ -5821,7 +5823,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", - "dev": true, + "devOptional": true, "dependencies": { "semver": "^7.3.5" }, @@ -6378,32 +6380,6 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", - "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", - "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", @@ -6417,136 +6393,6 @@ "darwin" ] }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", - "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", - "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", - "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", - "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", - "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", - "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", - "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", - "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", - "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", - "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@schematics/angular": { "version": "17.2.1", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.2.1.tgz", @@ -7685,11 +7531,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -7745,35 +7586,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "node_modules/acorn-node/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", @@ -7801,14 +7613,6 @@ "node": ">=8.9.0" } }, - "node_modules/adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "engines": { - "node": ">=0.3.0" - } - }, "node_modules/agent-base": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", @@ -7825,7 +7629,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, + "devOptional": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -7877,46 +7681,6 @@ "ajv": "^8.8.2" } }, - "node_modules/align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", - "dependencies": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/align-text/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/alter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz", - "integrity": "sha512-Wuss6JIZ6h4j2+NgU2t+9mSwS7gBSZJbU4Dg8xETguAD2veJUSuCrvTIiC78QgZE7/zX7h6OnXw2PiiCBirEGw==", - "dependencies": { - "stable": "~0.1.3" - } - }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", - "engines": { - "node": ">=0.4.2" - } - }, "node_modules/angular2-uuid": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/angular2-uuid/-/angular2-uuid-1.1.1.tgz", @@ -8112,14 +7876,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/archy": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/archy/-/archy-0.0.2.tgz", - "integrity": "sha512-8mMsetjXv4pCPTrMbPPO2cxy9vzJn2jwbd+ug+mf8fEUZG2E78Vo5erJMjrnGuLTKqOLtS5ulFHJSfg1yaCjxA==", - "engines": { - "node": "*" - } - }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -8192,22 +7948,6 @@ "node": ">=0.8" } }, - "node_modules/ast-traverse": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz", - "integrity": "sha512-CPuE4BWIhJjsNMvFkrzjiBgOl56NJTuBPBkBqyRyfq/nZtx1Z1f5I+qx7G/Zt+FAOS+ABhghkEuWJrfW9Njjog==" - }, - "node_modules/ast-types": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", - "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -8280,35 +8020,6 @@ "postcss": "^8.1.0" } }, - "node_modules/autoprefixer-core": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/autoprefixer-core/-/autoprefixer-core-3.1.2.tgz", - "integrity": "sha512-zXBwCsV9nrVf2evKwUREELXvM0IL7bg9k17EVku57I+nSVKXTyH7IvL4Nqit6wZkrY9b3ca6umNxh9SY5lIsuA==", - "dependencies": { - "caniuse-db": "^1.0.30000006", - "postcss": "~2.2.5" - } - }, - "node_modules/autoprefixer-core/node_modules/postcss": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-2.2.6.tgz", - "integrity": "sha512-8zk4tZ73/ddVQ+Cg2Ca/U4CGT1SAzDYriJDYrRp9ZvNXJPWwYlJaSjHSUJLFKlmuaUjCJvtDnKTwwDpoie55Yw==", - "dependencies": { - "js-base64": "~2.1.5", - "source-map": "~0.1.40" - } - }, - "node_modules/autoprefixer-core/node_modules/source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -8448,15 +8159,8 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base62": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/base62/-/base62-0.1.1.tgz", - "integrity": "sha512-QtExujIOq/F672OkHmDi3CdkphOA1kSQ38gv03Ro3cplYQk831dq9GM3Q1oXAxpR5HNJjGjjjT2pHtBGAJu1jw==", - "engines": { - "node": "*" - } + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "devOptional": true }, "node_modules/base64-js": { "version": "1.5.1", @@ -8586,17 +8290,6 @@ "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", "dev": true }, - "node_modules/block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==", - "dependencies": { - "inherits": "~2.0.0" - }, - "engines": { - "node": "0.4 || >=0.5.8" - } - }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -8846,11 +8539,6 @@ "node": ">=8" } }, - "node_modules/breakable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz", - "integrity": "sha512-+ityJqcjhozQNrezzTd2dtH/lkIXmE52HL+FohK2TOLQDl3QURTNkim+2C0xcso4Zehq/HM4Wkumcdz7Ue+XmA==" - }, "node_modules/browserslist": { "version": "4.23.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", @@ -8927,23 +8615,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/builder-autoprefixer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/builder-autoprefixer/-/builder-autoprefixer-1.0.4.tgz", - "integrity": "sha512-4z2QQnrzUiA3WOTk9scxj/EfKX5y7fPbwQa3up3qRw0ve3XztPnkQ4ZyC36L2NHY4zuEwA9tlu0QgAqxRyCfgg==", - "dependencies": { - "autoprefixer-core": "^3.1.1" - } - }, - "node_modules/builder-es6-module-to-cjs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/builder-es6-module-to-cjs/-/builder-es6-module-to-cjs-1.1.0.tgz", - "integrity": "sha512-HrhpHzBl7xqfADs9OHCsOw9TdE3jiU30rlHaLGZNuELvitfow96BWCO/nO6akval3V6/4ytzH/aMmsE7PtUrrg==", - "dependencies": { - "es6-module-jstransform": "^0.1.2", - "is-module": "^1.0.0" - } - }, "node_modules/builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -8968,16 +8639,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bytes": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-0.3.0.tgz", - "integrity": "sha512-koasz05sePZ8FLtyBSyGGlrvr1DYqr+D/MFXkz9afRugTCGKuqw6fjWMMmaCWEKtmWpgOnaGI4qlw/hPyyYX6g==" - }, "node_modules/cacache": { "version": "18.0.2", "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.2.tgz", "integrity": "sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==", - "dev": true, + "devOptional": true, "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -9000,7 +8666,7 @@ "version": "10.3.10", "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, + "devOptional": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", @@ -9022,7 +8688,7 @@ "version": "10.2.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true, + "devOptional": true, "engines": { "node": "14 || >=16.14" } @@ -9079,11 +8745,6 @@ "node": ">=6" } }, - "node_modules/caniuse-db": { - "version": "1.0.30001591", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001591.tgz", - "integrity": "sha512-XlZaOoKuLcPoHkPTjuo5lZoH6HcSdryFNwAwDEN2AmCs/tK1Ebi0Ahuhm7iCEGlIkIzYgJ9pbKVR+HsKedfapA==" - }, "node_modules/caniuse-lite": { "version": "1.0.30001591", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz", @@ -9135,18 +8796,6 @@ "node": ">= 10" } }, - "node_modules/center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", - "dependencies": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -9161,16 +8810,6 @@ "node": ">=4" } }, - "node_modules/chanel": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/chanel/-/chanel-2.2.0.tgz", - "integrity": "sha512-lI0+F41XPgIMrTBre4o0/OQUuiFMo2w8pk0ww/wpIOsRwV1s+c1fksEdnxfyK7OrBmYxDaqmTgI4YgXfXZ6UHA==", - "dependencies": { - "co": "*", - "generator-supported": "*", - "to-descriptor": "*" - } - }, "node_modules/character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", @@ -9268,7 +8907,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6" } @@ -9452,28 +9091,6 @@ "node": ">=6" } }, - "node_modules/co": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", - "integrity": "sha512-CQsjCRiNObI8AtTsNIBDRMQ4oMR83CzEswHYahClvul7gKk+lDQiOKv+5qh7LQWf5sh6jkZNispz/QlsZxyNgA==" - }, - "node_modules/cogent": { - "version": "0.4.3-fix-redirects", - "resolved": "git+ssh://git@github.com/timaschew/cogent.git#2246bd071392f5053a3a110024fd608a40a593ba", - "license": "MIT", - "dependencies": { - "debug": "*", - "generator-supported": "~0.0.1", - "netrc": "~0.1.3", - "proxy-agent": "^1.1.0", - "raw-body": "^1.1.2", - "statuses": "^1.0.2", - "write-to": "^1.0.0" - }, - "peerDependencies": { - "co": "3" - } - }, "node_modules/color": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", @@ -9565,472 +9182,6 @@ "node": ">=4.0.0" } }, - "node_modules/commoner": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", - "integrity": "sha512-3/qHkNMM6o/KGXHITA14y78PcfmXh4+AOCJpSoF73h4VY1JpdGv3CHMS5+JW6SwLhfJt4RhNmLAa7+RRX/62EQ==", - "dependencies": { - "commander": "^2.5.0", - "detective": "^4.3.1", - "glob": "^5.0.15", - "graceful-fs": "^4.1.2", - "iconv-lite": "^0.4.5", - "mkdirp": "^0.5.0", - "private": "^0.1.6", - "q": "^1.1.2", - "recast": "^0.11.17" - }, - "bin": { - "commonize": "bin/commonize" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commoner/node_modules/ast-types": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", - "integrity": "sha512-qEdtR2UH78yyHX/AUNfXmJTlM48XoFZKBdwi1nzkI1mJL21cmbu0cvjxjpkXJ5NENMq42H+hNs8VLJcqXLerBQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commoner/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/commoner/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/commoner/node_modules/esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/commoner/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/commoner/node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/commoner/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/commoner/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/commoner/node_modules/recast": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "integrity": "sha512-+nixG+3NugceyR8O1bLU45qs84JgI3+8EauyRZafLgC9XbdAOIVgwV1Pe2da0YzGo62KzWoZwUpVEQf6qNAXWA==", - "dependencies": { - "ast-types": "0.9.6", - "esprima": "~3.1.0", - "private": "~0.1.5", - "source-map": "~0.5.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commoner/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/component": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/component/-/component-1.1.0.tgz", - "integrity": "sha512-3729ISBnksZ0luAajVYcJFzm7lSRtaETgfWJsNkOaS1VL4pgC6T2HmEHEJtyVWvpd2H8KJUdNxe7gKXnAed/iw==", - "dependencies": { - "co": "^3.0.0", - "commander": "^2.2.0", - "component-build": "^1.2.2", - "component-consoler": "^2.0.0", - "component-flatten": "^1.0.1", - "component-ls": "^2.1.0", - "component-outdated2": "^1.0.4", - "component-pin": "^1.0.4", - "component-remotes": "^1.2.0", - "component-resolver": "^1.3.0", - "component-search2": "^1.1.1", - "component-updater": "^1.0.4", - "component-watcher": "^1.0.1", - "debug": "*", - "mkdirp": "~0.3.5", - "rimraf": "^2.2.6", - "semver": "^2.2.1", - "superagent": "~0.17.0", - "tiny-lr-fork": "0.0.5", - "win-fork": "~1.1.1" - }, - "bin": { - "component": "bin/component", - "component-build": "bin/component-build", - "component-crawl": "bin/component-crawl", - "component-duplicates": "bin/component-duplicates", - "component-help": "bin/component-help", - "component-install": "bin/component-install", - "component-link": "bin/component-link", - "component-ls": "bin/component-ls", - "component-outdated": "bin/component-outdated", - "component-pin": "bin/component-pin", - "component-search": "bin/component-search", - "component-update": "bin/component-update", - "component-validate": "bin/component-validate" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/component-build": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/component-build/-/component-build-1.2.2.tgz", - "integrity": "sha512-CpLWNhClvE68T9a3UZnAG3L3LdCiHDZlA0ufErCXUYPil9agI1d2ucejxl3h5hk1dfzzcdhAD8gPq54pxsHcuA==", - "dependencies": { - "builder-autoprefixer": "^1.0.3", - "builder-es6-module-to-cjs": "^1.1.0", - "component-builder": "^1.1.12", - "debug": "*" - } - }, - "node_modules/component-builder": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-builder/-/component-builder-1.2.1.tgz", - "integrity": "sha512-iNjEioqOs2PTnIxIn+jRaGdtEAw8ncUPwqSJ4c99A2bAwZnZSHklv1R5QPVqmZYlpYMT3SGSc2zmvmwGK3tgrw==", - "dependencies": { - "requires": "^1.0.0", - "chanel": "^2.0.0", - "co": "^3.1.0", - "component-flatten": "^1.0.1", - "component-manifest": "^1.0.0", - "component-require2": "^1.0.1", - "cp": "^0.1.1", - "debug": "*", - "generator-supported": "~0.0.1", - "graceful-fs": "^2.0.3", - "mkdirp": "^0.3.5", - "syntax-error": "^1.1.1" - } - }, - "node_modules/component-consoler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/component-consoler/-/component-consoler-2.0.0.tgz", - "integrity": "sha512-gHjeG72lAgPdTssGLc7+wcE5gIEE0cDLElmsiaM1E4/feBW2bvCQlP+0H4rdS4SI6iMrDxjh9/6j32LCmUFRYQ==", - "dependencies": { - "debug": "*" - } - }, - "node_modules/component-downloader": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/component-downloader/-/component-downloader-1.2.0.tgz", - "integrity": "sha512-/diPb5TiaOh6ta1ISfwPnndq4HiKRd0pTzZIitohHyLQfxI8LOFkO0s24+UTBx/Ba11QxvH+uIi60NanSRh/rQ==", - "dependencies": { - "chanel": "^2.0.1", - "co": "^3", - "component-consoler": "^2.0.0", - "component-remotes": "^1.1.1", - "debug": "*", - "decompress": "~0.2.0", - "generator-supported": "~0.0.1", - "graceful-fs": "^2.0.2", - "mkdirp": "~0.3.5", - "rimraf": "^2.2.6", - "semver": "^2.2.0", - "unglob": "~0.1.2", - "write-to": "^1.0.0" - } - }, - "node_modules/component-downloader/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/component-downloader/node_modules/semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/component-flatten": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/component-flatten/-/component-flatten-1.0.1.tgz", - "integrity": "sha512-n0YexLJNbA7uhbBK8j0HBVi8DxzMDDXYQZWdo3Mn2cylllHCw7ZUkL3CMtQ8b2N5VEn6X5veC8bvAmdFCwmGxw==", - "deprecated": "no longer maintained, please use a different package", - "dependencies": { - "semver": "^2.2.1" - } - }, - "node_modules/component-flatten/node_modules/semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/component-ls": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/component-ls/-/component-ls-2.1.0.tgz", - "integrity": "sha512-DurdOSfT1uMS3k6iWJ2Dm6aIuPPbmHKWoE0E/65m/84c7HCSFzHRJgWXcb4TTkXUsYCtVjaCgANAZauy4krSug==", - "dependencies": { - "archy": "~0.0.2" - } - }, - "node_modules/component-manifest": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-manifest/-/component-manifest-1.0.0.tgz", - "integrity": "sha512-4eBUmLhuTzmPccH65MaV/teGWLU4gn7duvdjksw4vpuXdLwK7bjBvGIETfv8Q46c54U2ehKCf/ueBXr4xD3alA==", - "dependencies": { - "debug": "*", - "generator-supported": "~0.0.1", - "graceful-fs": "^2.0.1", - "unglob": "~0.1.1" - } - }, - "node_modules/component-outdated2": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/component-outdated2/-/component-outdated2-1.0.5.tgz", - "integrity": "sha512-dMQ1zia/HarCJa0KPW65QGlPiHQI9Dfuz8idw7YGozO3ZKcUgqYNboXnH2RhSK/rJT/tUhqhUCZ6SJTWV/aFOQ==", - "dependencies": { - "component-consoler": "^2.0.0", - "component-flatten": "^1.0.1", - "component-remotes": "^1.1.5", - "generator-supported": "~0.0.1", - "semver": "^2.2.1" - } - }, - "node_modules/component-outdated2/node_modules/semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/component-pin": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/component-pin/-/component-pin-1.0.5.tgz", - "integrity": "sha512-TJY8yz7wPEBUNNeFRYWhtXjmOJebQas2Dmd5YDOy8I0wE0Y15QvjwFSADe4mIgW2GZfkJYrd/FVTm7m4TQUcDQ==", - "dependencies": { - "component-consoler": "^2.0.0", - "component-flatten": "^1.0.1", - "component-remotes": "^1.1.5", - "generator-supported": "~0.0.1", - "semver": "^2.2.1" - } - }, - "node_modules/component-pin/node_modules/semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/component-remotes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/component-remotes/-/component-remotes-1.2.0.tgz", - "integrity": "sha512-9Z1GzJwQPPTQFp/WNGSmYr4KPGzCyork/CD2WyNAi9tLxW7x5nmXxYBruszNGw+h32DNvVyrMYsAfzLARGXYVQ==", - "dependencies": { - "co": "^3", - "cogent": "git://github.com/timaschew/cogent#fix-redirects", - "component-consoler": "^2.0.0", - "component-validator": "^1.0.0", - "debug": "*", - "generator-supported": "~0.0.1", - "graceful-fs": "^2.0.2", - "semver": "^2.2.1" - } - }, - "node_modules/component-remotes/node_modules/semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/component-require2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/component-require2/-/component-require2-1.1.1.tgz", - "integrity": "sha512-FvrYPSLZxE85+jtnpyuRD9x6hfRzWWjXS6QyxMlf4ZA3miwqXbdMT+qqlYRZdwxu+POaN6dLZkMxLPqS9KR8lg==" - }, - "node_modules/component-resolver": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-resolver/-/component-resolver-1.3.0.tgz", - "integrity": "sha512-jtUNWMcVuCRKUBac+v5qMk0Ka8C9XIZ0CEJMLjg/qRr67JTXlBUbABH1pyH2DlFaST+lgLkpmUsHjymyoUAJuw==", - "dependencies": { - "chanel": "^2.0.2", - "co": "^3", - "component-consoler": "^2.0.0", - "component-downloader": "^1.2.0", - "component-flatten": "^1.0.1", - "component-remotes": "^1.2.0", - "component-validator": "^1.1.1", - "debug": "*", - "generator-supported": "~0.0.1", - "graceful-fs": "^2.0.1", - "semver": "^2.2.1", - "unglob": "~0.1.2" - } - }, - "node_modules/component-resolver/node_modules/semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/component-search2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/component-search2/-/component-search2-1.1.1.tgz", - "integrity": "sha512-Wz1cL/Y1Mqk83iHhVnHhLjF29MI/FYEW61UcxnTx6wXO07np54dQIpqYx+uKOlYRq7yn2xkj4d89CrdGoscs3Q==", - "dependencies": { - "bytes": "~0.3.0", - "cogent": "~0.4.0", - "component-consoler": "^2.0.0", - "debug": "*", - "event-stream": "^3.1.1", - "generator-supported": "~0.0.1", - "JSONStream": "~0.8.0", - "stream-to-array": "^1.0.0" - } - }, - "node_modules/component-search2/node_modules/cogent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/cogent/-/cogent-0.4.3.tgz", - "integrity": "sha512-JJZ+vbNzXN+rcZerJRLyFlZW9voOg5cdgbCjeIpaRCk38AH2ukSUaPZyIOLDKsHaWzsnO0vu2Ikpo/bOtZ7Utw==", - "dependencies": { - "debug": "*", - "generator-supported": "~0.0.1", - "netrc": "~0.1.3", - "proxy-agent": "^1.1.0", - "raw-body": "^1.1.2", - "statuses": "^1.0.2", - "write-to": "^1.0.0" - }, - "peerDependencies": { - "co": "3" - } - }, - "node_modules/component-updater": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/component-updater/-/component-updater-1.0.5.tgz", - "integrity": "sha512-/aOiq2OGejudfeGPlULF7aKxImSzsjvdWLCl35vfrp1FnJcHi5zGYD1GNw39k5LZKgnitz1CCPalFPRnRV5B9w==", - "dependencies": { - "component-consoler": "^2.0.0", - "component-flatten": "^1.0.1", - "component-remotes": "^1.1.5", - "generator-supported": "~0.0.1", - "semver": "^2.2.1" - } - }, - "node_modules/component-updater/node_modules/semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/component-validator": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/component-validator/-/component-validator-1.1.1.tgz", - "integrity": "sha512-UBLY5SXjPvwAtrPzd8s+QSEQmICbnPkTUIPhLAYMG0y2+UPDp/W7KOkXYG+pAUHraOM1SbmE+kBSwLWudtOVBw==", - "dependencies": { - "component-consoler": "^2.0.0" - } - }, - "node_modules/component-watcher": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/component-watcher/-/component-watcher-1.0.3.tgz", - "integrity": "sha512-cjBgbrbC9LACKVycJB4A9E9VsxmwN55elgxrdYLndeXGL+g0u7O0OAlvDgTbUGvF1IJD16nVfXtFpUecUzrUUQ==", - "dependencies": { - "debug": "*", - "sane": "0" - } - }, - "node_modules/component/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/component/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/component/node_modules/semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/compress-commons": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", @@ -10109,7 +9260,8 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "devOptional": true }, "node_modules/config-chain": { "version": "1.1.13", @@ -10261,14 +9413,6 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "devOptional": true }, - "node_modules/cookiejar": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-1.3.0.tgz", - "integrity": "sha512-U+NgxxtwHIokuL04FqKEkqsaWBDtnCQo+wvYjUCtBA56Lcg8vpV3SGtBx+RAmw92SV3VT8PwsYcCFK/cC3Dw+A==", - "engines": { - "node": "*" - } - }, "node_modules/copy-anything": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", @@ -10364,7 +9508,8 @@ "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "devOptional": true }, "node_modules/cors": { "version": "2.8.5", @@ -10432,11 +9577,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/cp": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/cp/-/cp-0.1.1.tgz", - "integrity": "sha512-ht9oKVsn1lAqV8FdUuSwBUQB8AG2cSyYbPim/mEwj+Dt3d21IRu2H5diDumMpKb77tsIAGM3eU484KvcTrPvHw==" - }, "node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", @@ -11448,11 +10588,6 @@ "node": ">=0.10" } }, - "node_modules/data-uri-to-buffer": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-0.0.4.tgz", - "integrity": "sha512-nntmCbCupHk2zFSWe64pTt0LJ2U6Bt3K1MWgwXiEAj9IEaowSXbGLYN7m8xCb4hbpQl8QSCRBkKT9tFRUMkU7A==" - }, "node_modules/date-format": { "version": "4.0.14", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", @@ -11472,6 +10607,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "devOptional": true, "dependencies": { "ms": "2.1.2" }, @@ -11484,14 +10620,6 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decode-named-character-reference": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", @@ -11505,50 +10633,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/decompress": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-0.2.5.tgz", - "integrity": "sha512-uGGydmkEBFHdJe2+d3cVzSS71+Fjd5kSuE3ZtCAqnaAgpl3zficiDW3h3iZ8l6SN9dr/SOpYJ6Xe6mR3LycpdA==", - "dependencies": { - "adm-zip": "^0.4.3", - "ext-name": "^1.0.0", - "get-stdin": "^0.1.0", - "mkdirp": "^0.3.5", - "nopt": "^2.2.0", - "rimraf": "^2.2.2", - "stream-combiner": "^0.0.4", - "tar": "^0.1.18", - "tempfile": "^0.1.2" - }, - "bin": { - "decompress": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/decompress/node_modules/tar": { - "version": "0.1.20", - "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.20.tgz", - "integrity": "sha512-RW79YhJI8vSyOcVv0OzOr7DVGkhtFhyz6cufNETPF7dmCJ/kQH+ubpCZkV8Wb7RvQlPuGplQPy0o2ihElzkEZA==", - "deprecated": "This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.", - "dependencies": { - "block-stream": "*", - "fstream": "~0.1.28", - "inherits": "2" - } - }, "node_modules/deep-equal-in-any-order": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/deep-equal-in-any-order/-/deep-equal-in-any-order-2.0.6.tgz", @@ -11577,7 +10661,8 @@ "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "devOptional": true }, "node_modules/default-browser": { "version": "5.2.1", @@ -11703,104 +10788,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/defs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz", - "integrity": "sha512-KgGV1vmSa2UPKeDXaWE5FiXjix8BOtYMgiPGpYhd/42wxiC6YGwtscj/zU9gD5/xk4K2iLDpyGhGA5puZxaeMg==", - "dependencies": { - "alter": "~0.2.0", - "ast-traverse": "~0.1.1", - "breakable": "~1.0.0", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "simple-fmt": "~0.1.0", - "simple-is": "~0.2.0", - "stringmap": "~0.2.2", - "stringset": "~0.2.1", - "tryor": "~0.1.2", - "yargs": "~3.27.0" - }, - "bin": { - "defs": "build/es5/defs" - } - }, - "node_modules/defs/node_modules/camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defs/node_modules/cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", - "dependencies": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "node_modules/defs/node_modules/esprima-fb": { - "version": "15001.1001.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", - "integrity": "sha512-m7OsYzocA8OQ3+9CxmhIv7NPHtyDR2ixaLCO7kLZ+YH+xQ/BpaZmll9EXmc+kBxzWA8BRBXbNEuEQqQ6vfsgDw==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/defs/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" - }, - "node_modules/defs/node_modules/yargs": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", - "integrity": "sha512-6atYjGACjX/OYWico7LwdBx9eiGlkMnIw6OwqfBb+uJQpaT82tQ7oI+BI6Dvq62qZvSbzGzQCVLQdMd59tR2eA==", - "dependencies": { - "camelcase": "^1.2.1", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "os-locale": "^1.4.0", - "window-size": "^0.1.2", - "y18n": "^3.2.0" - } - }, - "node_modules/degenerator": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", - "integrity": "sha512-EMAC+riLSC64jKfOs1jp8J7M4ZXstUUwTdwFBEv6HOzL/Ae+eAzMKEK0nJnpof2fnw9IOjmE6u6qXFejVyk8AA==", - "dependencies": { - "ast-types": "0.x.x", - "escodegen": "1.x.x", - "esprima": "3.x.x" - } - }, - "node_modules/degenerator/node_modules/esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/delaunator": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", @@ -11859,31 +10846,6 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, - "node_modules/detective": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", - "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", - "dependencies": { - "acorn": "^5.2.1", - "defined": "^1.0.0" - } - }, - "node_modules/detective/node_modules/acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dethroy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/dethroy/-/dethroy-1.0.2.tgz", - "integrity": "sha512-oZawVs0uwJqhRBYehJsRpU0l2BhEFNXVOAIhivhjNig8QZ3/eHB2xls37rkCbg3PmSkaX0YbdLmnG83z8ZnPKA==" - }, "node_modules/di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", @@ -12053,7 +11015,8 @@ "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true }, "node_modules/duplexify": { "version": "4.1.2", @@ -12143,11 +11106,6 @@ "integrity": "sha512-2Y/RaA1pdgSHpY0YG4TYuYCD2wh97CRvu22eLG3Kz0pgQ/6KbIFTxsTnDc4MH/6hFlg2L/9qXrDMG0nMjP63iw==", "optional": true }, - "node_modules/emitter-component": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.0.0.tgz", - "integrity": "sha512-GZrLdp4Z7OERecoYQYElVVqf6/gcbGUs8nvaE+nmu2dGy453lLgGyPLNX9DdSyojdMqI86fCT9XQqsWJymciEw==" - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -12385,15 +11343,6 @@ "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", "dev": true }, - "node_modules/es6-module-jstransform": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/es6-module-jstransform/-/es6-module-jstransform-0.1.4.tgz", - "integrity": "sha512-jICJqz4k0qOeGgSJ9fGjvWxnuLsC69qaaLTs3rGtO2ZnARpJ+nAzaXdcj+WPzGUl9KlwtpMD5tWd8l5TRgBfaA==", - "dependencies": { - "esprima-fb": "~3001.1.0-dev-harmony-fb", - "jstransform": "~3.0.0" - } - }, "node_modules/esbuild": { "version": "0.20.0", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.0.tgz", @@ -12480,6 +11429,7 @@ "version": "1.14.3", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "devOptional": true, "dependencies": { "esprima": "^4.0.1", "estraverse": "^4.2.0", @@ -12501,6 +11451,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "devOptional": true, "engines": { "node": ">=4.0" } @@ -12509,6 +11460,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "devOptional": true, "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -12521,6 +11473,7 @@ "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "devOptional": true, "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", @@ -12537,6 +11490,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "devOptional": true, "engines": { "node": ">= 0.8.0" } @@ -12545,6 +11499,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "optional": true, "engines": { "node": ">=0.10.0" @@ -12554,6 +11509,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "devOptional": true, "dependencies": { "prelude-ls": "~1.1.2" }, @@ -12616,6 +11572,72 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-plugin-deprecation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-deprecation/-/eslint-plugin-deprecation-2.0.0.tgz", + "integrity": "sha512-OAm9Ohzbj11/ZFyICyR5N6LbOIvQMp7ZU2zI7Ej0jIc8kiGUERXPNMfw2QqqHD1ZHtjMub3yPZILovYEYucgoQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^6.0.0", + "tslib": "^2.3.1", + "tsutils": "^3.21.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "typescript": "^4.2.4 || ^5.0.0" + } + }, + "node_modules/eslint-plugin-optimize-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-optimize-regex/-/eslint-plugin-optimize-regex-1.2.1.tgz", + "integrity": "sha512-fUaU7Tj1G/KSTDTABJw4Wp427Rl7RPl9ViYTu1Jrv36fJw4DFhd4elPdXiuYtdPsNsvzn9GcVlKEssGIVjw0UQ==", + "dev": true, + "dependencies": { + "regexp-tree": "^0.1.21" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-simple-import-sort": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.0.0.tgz", + "integrity": "sha512-8o0dVEdAkYap0Cn5kNeklaKcT1nUsa3LITWEuFk3nJifOoD+5JQGoyDUW2W/iPWwBsNBJpyJS9y4je/BgxLcyQ==", + "dev": true, + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-unused-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.1.0.tgz", + "integrity": "sha512-9l1YFCzXKkw1qtAru1RWUtG2EVDZY0a0eChKXcL+EZ5jitG7qxdctu4RnvhOJHv4xfmUf7h+JJPINlVpGhZMrw==", + "dev": true, + "dependencies": { + "eslint-rule-composer": "^0.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "6 - 7", + "eslint": "8" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/eslint-scope": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.0.tgz", @@ -12910,6 +11932,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "devOptional": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -12918,18 +11941,6 @@ "node": ">=4" } }, - "node_modules/esprima-fb": { - "version": "3001.1.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz", - "integrity": "sha512-a3RFiCVBiy8KdO6q/C+8BQiP/sRk8XshBU3QHHDP8tNzjYwR3FKBOImu+PXfVhPoZL0JKtJLBAOWlDMCCFY8SQ==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/esquery": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", @@ -12967,6 +11978,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -12980,29 +11992,6 @@ "node": ">= 0.6" } }, - "node_modules/event-stream": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.5.tgz", - "integrity": "sha512-vyibDcu5JL20Me1fP734QBH/kenBGLZap2n0+XXM7mvuUPzJ20Ydqj1aKcIeMdri1p+PU+4yAKugjN8KCVst+g==", - "dependencies": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" - } - }, - "node_modules/event-stream/node_modules/stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", - "dependencies": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, "node_modules/event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -13275,36 +12264,11 @@ "node": ">= 0.8" } }, - "node_modules/ext-list": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-0.2.0.tgz", - "integrity": "sha512-5HDeVof2cxke3u+FQ3FhTVf9UZUK/07Y/5SNqOL8AjCEEcqZciaR4gP1ESIVbYxctlkClVLHddm8oPsk+Ndcrw==", - "dependencies": { - "got": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ext-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-1.0.1.tgz", - "integrity": "sha512-1FkRYVZnrkShQu6UagNtNQuTtHn1n5kGmanUsmEN0iF0+szGUREoDRpXLejAdHMA+fM+sf8S11JUq+RWJALRYw==", - "dependencies": { - "ext-list": "^0.2.0", - "underscore.string": "~2.3.3" - }, - "bin": { - "extname": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "devOptional": true }, "node_modules/external-editor": { "version": "3.1.0", @@ -13389,7 +12353,8 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "devOptional": true }, "node_modules/fast-text-encoding": { "version": "1.0.6", @@ -13466,11 +12431,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-0.0.2.tgz", - "integrity": "sha512-jNmalsdk1enTf+tjxrMb3nutLleumh96WWtXJQHU700Jmjyl/CHj33Di5iFECNNfgb9GwlMNKU18tukUPlFXMg==" - }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -13585,25 +12545,25 @@ } }, "node_modules/firebase": { - "version": "10.8.0", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.8.0.tgz", - "integrity": "sha512-UJpC24vw8JFuHEOQyArBGKTUd7+kohLISCzHyn0M/prP0KOTx2io1eyLliEid330QqnWI7FOlPxoU97qecCSfQ==", + "version": "10.8.1", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.8.1.tgz", + "integrity": "sha512-4B2jzhU/aumfKL446MG41/T5+t+9d9urf5XGrjC0HRQUm4Ya/amV48HBchnje69ExaJP5f2WxO9OX3wh9ee4wA==", "dependencies": { "@firebase/analytics": "0.10.1", "@firebase/analytics-compat": "0.2.7", - "@firebase/app": "0.9.27", + "@firebase/app": "0.9.28", "@firebase/app-check": "0.8.2", "@firebase/app-check-compat": "0.3.9", - "@firebase/app-compat": "0.2.27", + "@firebase/app-compat": "0.2.28", "@firebase/app-types": "0.9.0", - "@firebase/auth": "1.6.0", - "@firebase/auth-compat": "0.5.2", + "@firebase/auth": "1.6.1", + "@firebase/auth-compat": "0.5.3", "@firebase/database": "1.0.3", "@firebase/database-compat": "1.0.3", - "@firebase/firestore": "4.4.2", - "@firebase/firestore-compat": "0.3.25", - "@firebase/functions": "0.11.1", - "@firebase/functions-compat": "0.3.7", + "@firebase/firestore": "4.4.3", + "@firebase/firestore-compat": "0.3.26", + "@firebase/functions": "0.11.2", + "@firebase/functions-compat": "0.3.8", "@firebase/installations": "0.6.5", "@firebase/installations-compat": "0.2.5", "@firebase/messaging": "0.12.6", @@ -13612,8 +12572,8 @@ "@firebase/performance-compat": "0.2.5", "@firebase/remote-config": "0.4.5", "@firebase/remote-config-compat": "0.2.5", - "@firebase/storage": "0.12.1", - "@firebase/storage-compat": "0.3.4", + "@firebase/storage": "0.12.2", + "@firebase/storage-compat": "0.3.5", "@firebase/util": "1.9.4" } }, @@ -14364,15 +13324,6 @@ "node": ">= 0.12" } }, - "node_modules/formidable": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.14.tgz", - "integrity": "sha512-aOskFHEfYwkSKSzGui5jhQ+uyLo2NTwpzhndggz2YZHlv0HkAi+zG5ZEBCL3GTvqLyr/FzX9Mvx9DueCmu2HzQ==", - "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -14404,11 +13355,6 @@ "node": ">= 0.6" } }, - "node_modules/from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==" - }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -14454,7 +13400,8 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "devOptional": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -14470,86 +13417,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/fstream": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", - "integrity": "sha512-N1pLGEHoDyCoI8uMmPXJXhn238L4nk41iipXCrqs4Ss0ooYSr5sNj2ucMo5AqJVC4OaOa7IztpBhOaaYTGZVuA==", - "dependencies": { - "graceful-fs": "~3.0.2", - "inherits": "~2.0.0", - "mkdirp": "0.5", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/fstream/node_modules/graceful-fs": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", - "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", - "dependencies": { - "natives": "^1.1.3" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/fstream/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/fstream/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", - "dependencies": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ftp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/ftp/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ftp/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -14621,11 +13488,6 @@ "node": ">=10" } }, - "node_modules/generator-supported": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/generator-supported/-/generator-supported-0.0.1.tgz", - "integrity": "sha512-VfNqamgY6cuNhi6GF4NIYs5jtJsPZZtpMJl1lCBko5FNALeZ0WfXeG5WMke3lVwfYI6jH1BLZcXyukP9wtPhfw==" - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -14671,14 +13533,6 @@ "node": ">=8.0.0" } }, - "node_modules/get-stdin": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-0.1.0.tgz", - "integrity": "sha512-/WBu3IaQZxE3bs3BhBmR10ipDY4pjN+U4EZgXULa1eqKA0B/Lka/MVoAqhTVYBkkRlCrEGDOU9itrzIgm9Ksng==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -14694,59 +13548,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-uri": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-0.1.4.tgz", - "integrity": "sha512-xV5cksh/mERjnnDgZe0wKO2VokqUeTe/QaKrhUHhm77eiLXhGrWi5qiz20tF6NKRTcY47YP1OzSRgTHadNY3mQ==", - "dependencies": { - "data-uri-to-buffer": "0", - "debug": "2", - "extend": "3", - "file-uri-to-path": "0", - "ftp": "~0.3.5", - "readable-stream": "2" - } - }, - "node_modules/get-uri/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/get-uri/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/get-uri/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/get-uri/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/get-uri/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/getos": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", @@ -14769,6 +13570,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "devOptional": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -14823,6 +13625,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "devOptional": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -14832,6 +13635,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "devOptional": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -15153,34 +13957,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/got": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/got/-/got-0.2.0.tgz", - "integrity": "sha512-YTZ1W2+KYNuBSR2icdJIU4EXddb6NsjXcZN/e1ggfkdniQk1mrVaxyyRJL0Mi+HggW3+Ld2vH3dDl/tI2LKmag==", - "dependencies": { - "object-assign": "^0.3.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/got/node_modules/object-assign": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-0.3.1.tgz", - "integrity": "sha512-4gWmwoU6o9UImLLzq+8R+kzWT0ABYdKXuvSp08JpYzhibFvdUirMfE9nE5yYHcG1k9ClcVueR4TolZpRvwg5og==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/graceful-fs": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", - "integrity": "sha512-hcj/NTUWv+C3MbqrVb9F+aH6lvTwEHJdx2foBxlrVq5h6zE8Bfu4pv4CAAqbDcZrw/9Ak5lsRXlY9Ao8/F0Tuw==", - "deprecated": "please upgrade to graceful-fs 4 for compatibility with current and future versions of Node.js", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -15664,6 +14440,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "devOptional": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -15883,19 +14660,6 @@ "node": ">=12" } }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ip": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", - "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==" - }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -15951,11 +14715,6 @@ "node": ">=8" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, "node_modules/is-ci": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", @@ -16072,11 +14831,6 @@ "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" - }, "node_modules/is-npm": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", @@ -16224,7 +14978,8 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "devOptional": true }, "node_modules/isbinaryfile": { "version": "4.0.10", @@ -16753,11 +15508,6 @@ "valid-url": "^1" } }, - "node_modules/js-base64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "integrity": "sha512-f+5mYh8iF7FlF7zgmj/yqvvYQUHI0kAxGiLjIfNxZzqJ7RQNc4sjgp8crVJw0Kzv2O6aFGZWgMTnO71I9utHSg==" - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -16959,29 +15709,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "optional": true }, - "node_modules/jsonparse": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", - "integrity": "sha512-fw7Q/8gFR8iSekUi9I+HqWIap6mywuoe7hQIg3buTVjuZgALKj4HAmm0X6f+TaL4c9NJbvyFQdaI2ppr5p6dnQ==", - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/JSONStream": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", - "integrity": "sha512-l0NN3IcqrZfZBJp7JWDJIHsnPV7yzJWqsYxQzL8Fwdx1BmEMjLuvtYkv+P9pbvpyfP75/f4MeDZhWNU4is32uA==", - "dependencies": { - "jsonparse": "0.0.5", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "index.js" - }, - "engines": { - "node": "*" - } - }, "node_modules/jsonwebtoken": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", @@ -17040,30 +15767,6 @@ "verror": "1.10.0" } }, - "node_modules/jstransform": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jstransform/-/jstransform-3.0.0.tgz", - "integrity": "sha512-sMwqW0EdQk2A5NjddlcSSLp6t7pIknOrJtxPU3kMN82RJXPGbdC3fcM5VhIsApNKL1hpeH38iSQsJRbgprPQZg==", - "dependencies": { - "base62": "0.1.1", - "esprima-fb": "~3001.1.0-dev-harmony-fb", - "source-map": "0.1.31" - }, - "engines": { - "node": ">=0.8.8" - } - }, - "node_modules/jstransform/node_modules/source-map": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.31.tgz", - "integrity": "sha512-qFALUiKHo35Duky0Ubmb5YKj9b3c6CcgGNGeI60sd6Nn3KaY7h9fclEOcCVk0hwszwYYP6+X2/jpS5hHqqVuig==", - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/jwa": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", @@ -17437,14 +16140,6 @@ "node": "> 0.8" } }, - "node_modules/lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", @@ -17487,17 +16182,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", - "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/less": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", @@ -18047,14 +16731,6 @@ "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, - "node_modules/longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -18127,19 +16803,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/map-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==" - }, "node_modules/markdown-it": { "version": "12.3.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", @@ -18879,6 +17542,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "devOptional": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -19079,12 +17743,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "devOptional": true }, - "node_modules/mkdirp": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" - }, "node_modules/morgan": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", @@ -19223,12 +17881,6 @@ "node": ">=16.0.0" } }, - "node_modules/natives": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", - "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", - "deprecated": "This module relies on Node.js's internals and will break at some point. Do not use it, and update to graceful-fs@4.x." - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -19287,19 +17939,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node_modules/netmask": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", - "integrity": "sha512-3DWDqAtIiPSkBXZyYEjwebfK56nrlQfRGt642fu8RPaL+ePu750+HCMHxjJCG3iEHq/0aeMvX6KIzlv7nuhfrA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/netrc": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/netrc/-/netrc-0.1.4.tgz", - "integrity": "sha512-ye8AIYWQcP9MvoM1i0Z2jV0qed31Z8EWXYnyGNkiUAd+Fo8J+7uy90xTV8g/oAbhtjkY7iZbNTizQaXdKUuwpQ==" - }, "node_modules/ngx-markdown": { "version": "17.1.1", "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-17.1.1.tgz", @@ -19518,36 +18157,6 @@ "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==", "optional": true }, - "node_modules/nopt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz", - "integrity": "sha512-gIOTA/uJuhPwFqp+spY7VQ1satbnGlD+iQVZxI18K6hs8Evq4sX81Ml7BB5byP/LsbR2yBVtmvdEmhi7evJ6Aw==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/noptify": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/noptify/-/noptify-0.0.3.tgz", - "integrity": "sha512-EZT35r9AuK+hig+iYv4144kwfDEDhlj3zncVHw9b9d86TUYk/67BtBApkfPD1kslAT/8TTD262xdsVbV+iCSTw==", - "dependencies": { - "nopt": "~2.0.0" - } - }, - "node_modules/noptify/node_modules/nopt": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.0.0.tgz", - "integrity": "sha512-uVTsuT8Hm3aN3VttY+BPKw4KU9lVpI0F22UAr/I1r6+kugMr3oyhMALkycikLcdfvGRsgzCYN48DYLBFcJEUVg==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, "node_modules/normalize-package-data": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", @@ -20087,6 +18696,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "devOptional": true, "dependencies": { "wrappy": "1" } @@ -20243,17 +18853,6 @@ "node": ">=8" } }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", - "dependencies": { - "lcid": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -20356,60 +18955,6 @@ "node": ">=6" } }, - "node_modules/pac-proxy-agent": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-0.2.0.tgz", - "integrity": "sha512-n7a4CFNSiKfr0Kr2XbJxUEQOab5JMJk3si0SNEjKdKAorg15dW4PZWpKZ+J5rr0S91TbuyLnl37vRS0zU7K4cg==", - "dependencies": { - "agent-base": "~1.0.1", - "debug": "2", - "extend": "~1.2.1", - "get-uri": "~0.1.0", - "pac-resolver": "~1.2.1", - "proxy-agent": "1", - "stream-to-array": "~1.0.0" - } - }, - "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-1.0.2.tgz", - "integrity": "sha512-IrdRInle5l28T2DjBsOojXniN91mXYkt9piDyPbPEoA/X+f7kjd0qiIb18vZThIZCJdLk2Zq/ukXxZp8NkcFsw==" - }, - "node_modules/pac-proxy-agent/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/pac-proxy-agent/node_modules/extend": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-1.2.1.tgz", - "integrity": "sha512-2/JwIYRpMBDSjbQjUUppNSrmc719crhFaWIdT+TRSVA8gE+6HEobQWqJ6VkPt/H8twS7h/0WWs7veh8wmp98Ng==" - }, - "node_modules/pac-proxy-agent/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/pac-resolver": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-1.2.6.tgz", - "integrity": "sha512-hgYjw6snhgn68Rdb2Sgrd/rUKMkZ9EpXiA7G9Gqr9BsC6Bb+l1tAZ11WoYfNYzqamdkXU4m3VOb29H4VHOinyA==", - "dependencies": { - "co": "~3.0.6", - "degenerator": "~1.0.0", - "netmask": "~1.0.4", - "regenerator": "~0.8.13", - "thunkify": "~2.1.1" - } - }, - "node_modules/pac-resolver/node_modules/co": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/co/-/co-3.0.6.tgz", - "integrity": "sha512-Vj29f/AYywpPtHPhN9YqC7yK+p3rfjv7l/mTu5iOtn89a7DdccD4MYQmfU6R9wGdLXwufDIV07+PjXM0taVKvw==" - }, "node_modules/pacote": { "version": "17.0.6", "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.6.tgz", @@ -20553,6 +19098,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -20612,14 +19158,6 @@ "node": ">=8" } }, - "node_modules/pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", - "dependencies": { - "through": "~2.3" - } - }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -21015,14 +19553,6 @@ "node": ">=6" } }, - "node_modules/private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/proc-log": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", @@ -21044,7 +19574,8 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "devOptional": true }, "node_modules/progress": { "version": "2.0.3", @@ -21294,99 +19825,6 @@ "node": ">= 0.10" } }, - "node_modules/proxy-agent": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-1.1.1.tgz", - "integrity": "sha512-25H5ZU12cl82fjFJmlq8iYy9gHjw4jdNmJQBbdztwcpPl4URsepnlTZUqAXKwrxwtPXg4z6NbrIiB7e3arxVUw==", - "dependencies": { - "http-proxy-agent": "0", - "https-proxy-agent": "0", - "lru-cache": "~2.5.0", - "pac-proxy-agent": "0", - "socks-proxy-agent": "1" - } - }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-1.0.2.tgz", - "integrity": "sha512-IrdRInle5l28T2DjBsOojXniN91mXYkt9piDyPbPEoA/X+f7kjd0qiIb18vZThIZCJdLk2Zq/ukXxZp8NkcFsw==" - }, - "node_modules/proxy-agent/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/proxy-agent/node_modules/http-proxy-agent": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-0.2.7.tgz", - "integrity": "sha512-9W3grrlsrW2kRGNRbGkBNVFx4voQS1H1TxWR60MVHKQ+rw+kRtA9JXVGQiiDgYsp315Ex5HPk+3it4lBNyk4WA==", - "dependencies": { - "agent-base": "~1.0.1", - "debug": "2", - "extend": "3" - } - }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-0.3.6.tgz", - "integrity": "sha512-ZuLafAeUu97abfbpAO9Cwjl3slsx6yZ7apTYBNVtMdoDhlVzUhxXO0qh+Xxqc5FAm7oq747k2jjbICYJdEYShg==", - "dependencies": { - "agent-base": "~1.0.1", - "debug": "2", - "extend": "3" - } - }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.2.tgz", - "integrity": "sha512-wyqfj+623mgqv+bpjTdivSoC/LtY9oOrmKz2Cke0NZcgYW9Kce/qWjd9e5PDYf8wuiKfVeo8VnyOSSyeRiUsLw==" - }, - "node_modules/proxy-agent/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/proxy-agent/node_modules/smart-buffer": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", - "integrity": "sha512-1+8bxygjTsNfvQe0/0pNBesTOlSHtOeG6b6LYbvsZCCHDKYZ40zcQo6YTnZBWrBSLWOCbrHljLdEmGMYebu7aQ==", - "engines": { - "node": ">= 0.10.15", - "npm": ">= 1.3.5" - } - }, - "node_modules/proxy-agent/node_modules/socks": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", - "integrity": "sha512-ArX4vGPULWjKDKgUnW8YzfI2uXW7kzgkJuB0GnFBA/PfT3exrrOk+7Wk2oeb894Qf20u1PWv9LEgrO0Z82qAzA==", - "deprecated": "If using 2.x branch, please upgrade to at least 2.1.6 to avoid a serious bug with socket data flow and an import issue introduced in 2.1.0", - "dependencies": { - "ip": "^1.1.4", - "smart-buffer": "^1.0.13" - }, - "engines": { - "node": ">= 0.10.0", - "npm": ">= 1.3.5" - } - }, - "node_modules/proxy-agent/node_modules/socks-proxy-agent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-1.0.2.tgz", - "integrity": "sha512-F8xR1C4uplta4XIwHvvpIxhLO8oCWLuC48hSgFpMqps45WqtOZQ4JadJ5YGo0eGMvIp94qV3bX3Tqi2iHGlNvw==", - "dependencies": { - "agent-base": "~1.0.1", - "extend": "~1.2.1", - "socks": "~1.1.5" - } - }, - "node_modules/proxy-agent/node_modules/socks-proxy-agent/node_modules/extend": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-1.2.1.tgz", - "integrity": "sha512-2/JwIYRpMBDSjbQjUUppNSrmc719crhFaWIdT+TRSVA8gE+6HEobQWqJ6VkPt/H8twS7h/0WWs7veh8wmp98Ng==" - }, "node_modules/proxy-from-env": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", @@ -21434,15 +19872,6 @@ "node": ">=8" } }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, "node_modules/qjobs": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", @@ -21511,31 +19940,6 @@ "node": ">= 0.6" } }, - "node_modules/raw-body": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.3.4.tgz", - "integrity": "sha512-ZC2kBq6BsR0uK441H5SvGH9H+hRpTKVRjvlI6BhLOJrih3oGbGRYdFyyKKESw4/hjzJEr4cZkQgbuU52s63MOQ==", - "dependencies": { - "bytes": "1.0.0", - "iconv-lite": "0.4.8" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", - "integrity": "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==" - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.8.tgz", - "integrity": "sha512-D90rbOiZuEJGtmIBK9wcRpW//ZKLD8bTPOAx5oEsu+O+HhSOstX/HCZFBvNkuyDuiNHunb81cfsqaYzZxcUMYA==", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -21693,48 +20097,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/recast": { - "version": "0.10.33", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz", - "integrity": "sha512-RxAVgvgWGzfFYsdc3PB6TM4/cq8HMgBH8PC9r+SkO7j1MeHZvIMxLSVlUhin3sv9wbAy8CMAPXSGSGkWPovyKQ==", - "dependencies": { - "ast-types": "0.8.12", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "private": "~0.1.5", - "source-map": "~0.5.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/recast/node_modules/ast-types": { - "version": "0.8.12", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz", - "integrity": "sha512-rWhsoD0aHKpx+aKIP0Sf92bai1HC5iZcB1n/HCnkIMR8Bhx0gYRQySo062Y65ND4oRgcuxpLcPrcco09I1shpg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/recast/node_modules/esprima-fb": { - "version": "15001.1001.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", - "integrity": "sha512-m7OsYzocA8OQ3+9CxmhIv7NPHtyDR2ixaLCO7kLZ+YH+xQ/BpaZmll9EXmc+kBxzWA8BRBXbNEuEQqQ6vfsgDw==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/recast/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/redeyed": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", @@ -21744,16 +20106,6 @@ "esprima": "~4.0.0" } }, - "node_modules/reduce-component": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/reduce-component/-/reduce-component-1.0.1.tgz", - "integrity": "sha512-y0wyCcdQul3hI3xHfIs0vg/jSbboQc/YTOAqaxjFG7At+XSexduuOqBVL9SmOLSwa/ldkbzVzdwuk9s2EKTAZg==" - }, - "node_modules/redux": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", - "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" - }, "node_modules/reflect-metadata": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", @@ -21778,26 +20130,6 @@ "node": ">=4" } }, - "node_modules/regenerator": { - "version": "0.8.46", - "resolved": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.46.tgz", - "integrity": "sha512-jFhAPsOnJ/UIZCG1+iISKiczjnLWaQ4RatPkg5BZIcgz0m3C+txY28U0H7ij+fLSADmY+kHj9HZff6CLq9hrVA==", - "dependencies": { - "commoner": "~0.10.3", - "defs": "~1.1.0", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "private": "~0.1.5", - "recast": "0.10.33", - "regenerator-runtime": "~0.9.5", - "through": "~2.3.8" - }, - "bin": { - "regenerator": "bin/regenerator" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", @@ -21813,29 +20145,21 @@ "@babel/runtime": "^7.8.4" } }, - "node_modules/regenerator/node_modules/esprima-fb": { - "version": "15001.1001.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", - "integrity": "sha512-m7OsYzocA8OQ3+9CxmhIv7NPHtyDR2ixaLCO7kLZ+YH+xQ/BpaZmll9EXmc+kBxzWA8BRBXbNEuEQqQ6vfsgDw==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/regenerator/node_modules/regenerator-runtime": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz", - "integrity": "sha512-D0Y/JJ4VhusyMOd/o25a3jdUqN/bC85EFsaoL9Oqmy/O4efCh+xhp7yj2EEOsj974qvMkcW8AwUzJ1jB/MbxCw==" - }, "node_modules/regex-parser": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", "dev": true }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, "node_modules/regexpu-core": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", @@ -21898,14 +20222,6 @@ "jsesc": "bin/jsesc" } }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "engines": { - "node": ">=0.10" - } - }, "node_modules/request-progress": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", @@ -21931,11 +20247,6 @@ "node": ">=0.10.0" } }, - "node_modules/requires": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/requires/-/requires-1.0.2.tgz", - "integrity": "sha512-X0owrXW/+IVhkwoYHL9ZKQQBfq+5NiPVmw6ev7LhWFecMmx9uhbBzjbR/xxv9bRSsHorSrUpQm6WNQdUxnlGtg==" - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -22071,17 +20382,6 @@ "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", "dev": true }, - "node_modules/right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", - "dependencies": { - "align-text": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/rimraf": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", @@ -22335,38 +20635,6 @@ "resolved": "https://registry.npmjs.org/safevalues/-/safevalues-0.3.4.tgz", "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw==" }, - "node_modules/sane": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/sane/-/sane-0.8.1.tgz", - "integrity": "sha512-hWKZiIn39itnpdiiLT+Zh1gIQfS22Nwp9h4GrriMe9iCBcrcuUF264ELNADbBjiLIJqCzEIAtNR8uD+WCYVtTQ==", - "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", - "dependencies": { - "minimatch": "~0.2.14", - "walker": "~1.0.5", - "watch": "~0.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/sane/node_modules/lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ==" - }, - "node_modules/sane/node_modules/minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha512-zZ+Jy8lVWlvqqeM8iZB7w7KmQkoJn8djM585z88rywrEbzoqawVa9FR5p2hwD+y74nfuKOjmNvi9gtWJNLqHvA==", - "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", - "dependencies": { - "lru-cache": "2", - "sigmund": "~1.0.0" - }, - "engines": { - "node": "*" - } - }, "node_modules/sass": { "version": "1.70.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.70.0.tgz", @@ -22767,11 +21035,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==" - }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -22794,16 +21057,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/simple-fmt": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz", - "integrity": "sha512-9a3zTDDh9LXbTR37qBhACWIQ/mP/ry5xtmbE98BJM8GR02sanCkfMzp7AdCTqYhkBZggK/w7hJtc8Pb9nmo16A==" - }, - "node_modules/simple-is": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz", - "integrity": "sha512-GJXhv3r5vdj5tGWO+rcrWgjU2azLB+fb7Ehh3SmZpXE0o4KrrFLti0w4mdDCbR29X/z0Ls20ApjZitlpAXhAeg==" - }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -23132,17 +21385,6 @@ "wbuf": "^1.7.3" } }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, "node_modules/split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", @@ -23201,12 +21443,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" - }, "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -23219,6 +21455,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "devOptional": true, "engines": { "node": ">= 0.6" } @@ -23229,14 +21466,6 @@ "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", "devOptional": true }, - "node_modules/stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", - "dependencies": { - "duplexer": "~0.1.1" - } - }, "node_modules/stream-json": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.8.0.tgz", @@ -23252,14 +21481,6 @@ "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", "devOptional": true }, - "node_modules/stream-to-array": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-1.0.0.tgz", - "integrity": "sha512-Z+ny0tylkXcRS4Jq49BNcKVmt0MrF3E/I500a18zckGt0ZMrOh1ILlbUz+FSjJePYeVbNUBCdvjfDDol27Ld1g==", - "engines": { - "node": ">= 0.10.0" - } - }, "node_modules/streamroller": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", @@ -23310,16 +21531,6 @@ "node": ">=8" } }, - "node_modules/stringmap": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz", - "integrity": "sha512-mR1LEHDw6TsHa+LwJeeBc9ZqZqEOm7bHidgxMmDg8HB/rbA1HhDeT08gS67CCCG/xrgIfQx5tW42pd8vFpLUow==" - }, - "node_modules/stringset": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz", - "integrity": "sha512-km3jeiRpmySChl1oLiBE2ESdG5k/4+6tjENVL6BB3mdmKBiUikI5ks4paad2WAKsxzpNiBqBBbXCC12QqlpLWA==" - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -23397,60 +21608,6 @@ "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==", "optional": true }, - "node_modules/superagent": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-0.17.0.tgz", - "integrity": "sha512-ASGnKAf/X5HxEKjW+mpy8sk53a0Mi9XwBhQpPfqkFh+cl7K41NvUhsIJ/RAMCkQDZEfqu/FYQJoAK5JVp86p9g==", - "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", - "dependencies": { - "cookiejar": "1.3.0", - "debug": "~0.7.2", - "emitter-component": "1.0.0", - "extend": "~1.2.1", - "formidable": "1.0.14", - "methods": "0.0.1", - "mime": "1.2.5", - "qs": "0.6.5", - "reduce-component": "1.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/superagent/node_modules/debug": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "integrity": "sha512-EohAb3+DSHSGx8carOSKJe8G0ayV5/i609OD0J2orCkuyae7SyZSz2aoLmQF2s0Pj5gITDebwPH7GFBlqOUQ1Q==", - "engines": { - "node": "*" - } - }, - "node_modules/superagent/node_modules/extend": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-1.2.1.tgz", - "integrity": "sha512-2/JwIYRpMBDSjbQjUUppNSrmc719crhFaWIdT+TRSVA8gE+6HEobQWqJ6VkPt/H8twS7h/0WWs7veh8wmp98Ng==" - }, - "node_modules/superagent/node_modules/methods": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/methods/-/methods-0.0.1.tgz", - "integrity": "sha512-pB8oFfci/xcfUgM6DTxc7lbTKifPPgs3mZUOsEgaH+1TTWpmcmv3sHl+5sUHIj2X2W8aPYa2+nJealRHK+Lo6A==" - }, - "node_modules/superagent/node_modules/mime": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.5.tgz", - "integrity": "sha512-QfwTOA+zRHSZXxl9Y7ue5ifKDhU1prnh0dO67Vgcl7Lcx0+79vL9A1ln0qtVur8CFSdYq5Zhnw9DDZQgwDh8Ng==", - "engines": { - "node": "*" - } - }, - "node_modules/superagent/node_modules/qs": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.5.tgz", - "integrity": "sha512-n7wA/f30O3SsOw2BVkGUDzjWMw7kXvQJWKtDdgfq5HJvDoad+Jbc6osN1AQ0Iain5plo9e7Cs5fE+xR+DVkPTw==", - "engines": { - "node": "*" - } - }, "node_modules/superstatic": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/superstatic/-/superstatic-9.0.3.tgz", @@ -23592,14 +21749,6 @@ "node": ">=0.10" } }, - "node_modules/syntax-error": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", - "dependencies": { - "acorn-node": "^1.2.0" - } - }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -23720,23 +21869,6 @@ } } }, - "node_modules/tempfile": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-0.1.3.tgz", - "integrity": "sha512-eW5GbbQLBEpa21WNlpvJcvv/DNXLyMNOQBnhellCzQdXAf5Ctmrr8GDLc/YAymOF3t+17wmeE+kZCKBoaanEtA==", - "dependencies": { - "uuid": "~1.4.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tempfile/node_modules/uuid": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-1.4.2.tgz", - "integrity": "sha512-woV5Ei+GBJyrqMXt0mJ9p8/I+47LYKp/4urH76FNTMjl22EhLPz1tNrQufTsrFf/PYV/7ctSZYAK7fKPWQKg+Q==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." - }, "node_modules/terser": { "version": "5.27.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", @@ -23914,11 +22046,6 @@ "readable-stream": "3" } }, - "node_modules/thunkify": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", - "integrity": "sha512-w9foI80XcGImrhMQ19pxunaEC5Rp2uzxZZg4XBAFRfiLOplk3F0l7wo+bO16vC2/nlQfR/mXZxcduo0MF2GWLg==" - }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -23931,44 +22058,6 @@ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", "optional": true }, - "node_modules/tiny-lr-fork": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/tiny-lr-fork/-/tiny-lr-fork-0.0.5.tgz", - "integrity": "sha512-vhcvny/8f46rrViKV0BOUjVl4c/rDTztnT1+kT7iyD/Igqb/uyiRsKLxMc2Z8CNvTE1Px1tuNrPM+BOUL+3vlQ==", - "dependencies": { - "debug": "~0.7.0", - "faye-websocket": "~0.4.3", - "noptify": "~0.0.3", - "qs": "~0.5.2" - }, - "bin": { - "tiny-lr-fork": "bin/tiny-lr" - } - }, - "node_modules/tiny-lr-fork/node_modules/debug": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "integrity": "sha512-EohAb3+DSHSGx8carOSKJe8G0ayV5/i609OD0J2orCkuyae7SyZSz2aoLmQF2s0Pj5gITDebwPH7GFBlqOUQ1Q==", - "engines": { - "node": "*" - } - }, - "node_modules/tiny-lr-fork/node_modules/faye-websocket": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.4.4.tgz", - "integrity": "sha512-78pqrJbvGZSe8i+PLsPd+aJqTyGqgyWLnMw5NOwtXCTVMzEFh1zQPwIuIL/ycTj4rkDy5zZ9B6frYPqVPJBzyQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/tiny-lr-fork/node_modules/qs": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz", - "integrity": "sha512-KbOrQrP5Ye+0gmq+hwxoJwAFRwExACWqwxj1IDFFgqOw9Poxy3wwSbafd9ZqP6T6ykMfnxM573kt/a4i9ybatQ==", - "engines": { - "node": "*" - } - }, "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -23996,16 +22085,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" - }, - "node_modules/to-descriptor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-descriptor/-/to-descriptor-1.0.1.tgz", - "integrity": "sha512-wxfaAjsoz5ptZjuqkEe7KLQ0VvdBH8a+FFzdmeVD9c7TWU9KCzLAC3li4bZ8xiPJsZMqVnZWM/7glZQngMTeEQ==" - }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -24100,11 +22179,6 @@ "node": ">= 14.0.0" } }, - "node_modules/tryor": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", - "integrity": "sha512-2+ilNA00DGvbUYYbRrm3ux+snbo7I6uPXMw8I4p/QMl7HUOWBBZFbk+Mpr8/IAPDQE+LQ8vOdlI6xEzjc+e/BQ==" - }, "node_modules/ts-api-utils": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", @@ -24197,6 +22271,27 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/tuf-js": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.0.tgz", @@ -24340,14 +22435,6 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "devOptional": true }, - "node_modules/underscore.string": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", - "integrity": "sha512-hbD5MibthuDAu4yA5wxes5bzFgqd3PpBJuClbRxaNddxfdsz+qf+1kHwrGQFrmchmDHb9iNU+6EHDn8uj0xDJg==", - "engines": { - "node": "*" - } - }, "node_modules/undici": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/undici/-/undici-6.6.2.tgz", @@ -24365,59 +22452,6 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, - "node_modules/unglob": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unglob/-/unglob-0.1.2.tgz", - "integrity": "sha512-L+VIVtnV3YV9INYG6rWVXaq7yBVzecxstKEuns5niJiKh1XLC3xrOsbVEnyyHhjlTL4eEeaFCmXQhZgXAEw9pA==", - "dependencies": { - "generator-supported": "~0.0.1", - "glob": "~3.2.8", - "minimatch": "~0.2.14" - } - }, - "node_modules/unglob/node_modules/glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha512-hVb0zwEZwC1FXSKRPFTeOtN7AArJcJlI6ULGLtrstaswKNlrTJqAA+1lYlSUop4vjA423xlBzqfVS3iWGlqJ+g==", - "dependencies": { - "inherits": "2", - "minimatch": "0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/unglob/node_modules/glob/node_modules/minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha512-WFX1jI1AaxNTZVOHLBVazwTWKaQjoykSzCBNXB72vDTCzopQGtyP91tKdFK5cv1+qMwPyiTu1HqUriqplI8pcA==", - "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", - "dependencies": { - "lru-cache": "2", - "sigmund": "~1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/unglob/node_modules/lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ==" - }, - "node_modules/unglob/node_modules/minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha512-zZ+Jy8lVWlvqqeM8iZB7w7KmQkoJn8djM585z88rywrEbzoqawVa9FR5p2hwD+y74nfuKOjmNvi9gtWJNLqHvA==", - "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", - "dependencies": { - "lru-cache": "2", - "sigmund": "~1.0.0" - }, - "engines": { - "node": "*" - } - }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -25300,22 +23334,6 @@ "node": ">=0.10.0" } }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/watch": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", - "integrity": "sha512-FAk18nzhYggg939xgRRLJjvqmAKZciO24wr8neoxNPl87w8J3m784wxL4zFBwME+0gNQ2Sv/vfsCrUxPxU2Dmg==", - "engines": [ - "node >=0.1.95" - ] - }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -25820,27 +23838,6 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, - "node_modules/win-fork": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/win-fork/-/win-fork-1.1.1.tgz", - "integrity": "sha512-kMnrXXHyb/Zx1ynkiMtcEgq+rxXFIfs/IhhxVBmIk+1KwPyIggZU0RAiADExhSyf0NESvCWQyfO4eGdlU9fBSw==", - "bin": { - "win-fork": "bin/win-spawn", - "win-line-endings": "bin/win-line-endings", - "win-spawn": "bin/win-spawn" - } - }, - "node_modules/window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==", - "bin": { - "window-size": "cli.js" - }, - "engines": { - "node": ">= 0.10.0" - } - }, "node_modules/winston": { "version": "3.11.0", "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz", @@ -25887,18 +23884,11 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "devOptional": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -25999,7 +23989,8 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "devOptional": true }, "node_modules/write-file-atomic": { "version": "3.0.3", @@ -26013,18 +24004,6 @@ "typedarray-to-buffer": "^3.1.5" } }, - "node_modules/write-to": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/write-to/-/write-to-1.1.1.tgz", - "integrity": "sha512-pcG7jO2XQm49G+oCJhFtQC2Dh7U//K0jzXnCetNERZn57/HbyuQQ+FFDOCUq61Sw3KGHqxO9uEWVaj/tJeAhxw==", - "dependencies": { - "dethroy": "1", - "mkdirp": "0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/ws": { "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", @@ -26092,22 +24071,6 @@ "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", "devOptional": true }, - "node_modules/xregexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", - "engines": { - "node": "*" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/src/package.json b/src/package.json index 3842c889..844a8ca2 100644 --- a/src/package.json +++ b/src/package.json @@ -33,11 +33,9 @@ "@codetrix-studio/capacitor-google-auth": "^3.4.0-rc.0", "@ngx-pwa/local-storage": "^17.0.0", "angular2-uuid": "^1.1.1", - "component": "^1.1.0", "firebase": "^10.8.0", "marked": "^9.0.0", "ngx-markdown": "^17.1.1", - "redux": "^5.0.1", "reselect": "^5.1.0", "rxjs": "^7.8.1", "tslib": "^2.6.2", @@ -59,8 +57,13 @@ "@types/jasminewd2": "~2.0.13", "@types/node": "^20.11.21", "@typescript-eslint/eslint-plugin": "7.1.0", - "@typescript-eslint/parser": "7.1.0", + "@typescript-eslint/parser": "^7.1.0", + "cypress": "latest", "eslint": "^8.57.0", + "eslint-plugin-deprecation": "^2.0.0", + "eslint-plugin-optimize-regex": "^1.2.1", + "eslint-plugin-simple-import-sort": "^12.0.0", + "eslint-plugin-unused-imports": "^3.1.0", "firebase-tools": "^13.4.0", "fuzzy": "^0.1.3", "inquirer": "^9.2.15", @@ -74,8 +77,7 @@ "karma-jasmine-html-reporter": "^2.1.0", "open": "^10.0.4", "ts-node": "~10.9.2", - "typescript": "~5.3.3", - "cypress": "latest" + "typescript": "~5.3.3" }, "browserslist": [ "last 1 Chrome version", diff --git a/src/src/app/app-routing.module.ts b/src/src/app/app-routing.module.ts index 43244d31..0e60bdb0 100644 --- a/src/src/app/app-routing.module.ts +++ b/src/src/app/app-routing.module.ts @@ -1,8 +1,9 @@ import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; -import { SearchPageComponent } from './pages/search/search.page'; -import { SavedPagesAdminPageComponent } from './pages/saved-pages-admin/saved-pages-admin.page'; +import { RouterModule,Routes } from '@angular/router'; + import { NotesAdminPageComponent } from './pages/notes-admin/notes-admin.page'; +import { SavedPagesAdminPageComponent } from './pages/saved-pages-admin/saved-pages-admin.page'; +import { SearchPageComponent } from './pages/search/search.page'; const routes: Routes = [ { diff --git a/src/src/app/app.component.html b/src/src/app/app.component.html index 0ed37e19..d74a47e4 100644 --- a/src/src/app/app.component.html +++ b/src/src/app/app.component.html @@ -16,7 +16,7 @@ > helpHelphelp Help diff --git a/src/src/app/app.component.ts b/src/src/app/app.component.ts index 9538044f..c6695a86 100644 --- a/src/src/app/app.component.ts +++ b/src/src/app/app.component.ts @@ -1,15 +1,16 @@ -import { Component, ViewChild, AfterViewInit, OnDestroy, ChangeDetectorRef } from '@angular/core'; +import { BreakpointObserver,Breakpoints } from '@angular/cdk/layout'; +import { AfterViewInit, ChangeDetectorRef,Component, ViewChild } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { MatSidenav } from '@angular/material/sidenav'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { Observable } from 'rxjs'; +import { map, shareReplay } from 'rxjs/operators'; + +import { SubscriberBase } from './common/subscriber-base'; +import { HelpModalComponent } from './components/help-modal/help-modal.component'; import { AppService } from './services/app.service'; import { NavService } from './services/nav.service'; import { StorageService } from './services/storage.service'; -import { Observable } from 'rxjs'; -import { Breakpoints, BreakpointObserver } from '@angular/cdk/layout'; -import { map, shareReplay } from 'rxjs/operators'; -import { MatSidenav } from '@angular/material/sidenav'; -import { SubscriberBase } from './common/subscriber-base'; -import { MatSnackBar } from '@angular/material/snack-bar'; -import { HelpModalComponent } from './components/help-modal/help-modal.component'; -import { MatDialog } from '@angular/material/dialog'; @Component({ selector: 'app-root', @@ -49,6 +50,9 @@ export class AppComponent extends SubscriberBase implements AfterViewInit { this.error$.subscribe((err) => { if (err) { this.snackBar.open(`Oh no! ${err.msg}`, 'Dismiss Error'); + setTimeout(() => { + this.snackBar.dismiss(); // dismiss if its still there after 25 seconds. + }, 25 * 1000); } }) ); diff --git a/src/src/app/app.module.ts b/src/src/app/app.module.ts index 8c4a30f0..b449bd10 100644 --- a/src/src/app/app.module.ts +++ b/src/src/app/app.module.ts @@ -1,73 +1,63 @@ -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { HttpClientModule } from '@angular/common/http'; -import { BrowserModule } from '@angular/platform-browser'; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; - -import { MARKED_OPTIONS, MarkdownModule } from 'ngx-markdown'; - -import { AngularFireModule } from '@angular/fire/compat'; -import { FirebaseConfig } from './constants'; +import { ClipboardModule } from '@angular/cdk/clipboard'; import { DragDropModule } from '@angular/cdk/drag-drop'; +import { HttpClientModule } from '@angular/common/http'; +import { APP_ID, NgModule } from '@angular/core'; +import { AngularFireModule } from '@angular/fire/compat'; import { AngularFireAuthModule } from '@angular/fire/compat/auth'; import { AngularFireDatabaseModule } from '@angular/fire/compat/database'; - -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatButtonModule } from '@angular/material/button'; -import { MatInputModule } from '@angular/material/input'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatRadioModule } from '@angular/material/radio'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSliderModule } from '@angular/material/slider'; -import { MatSlideToggleModule } from '@angular/material/slide-toggle'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatSidenavModule } from '@angular/material/sidenav'; -import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatListModule } from '@angular/material/list'; -import { MatCardModule } from '@angular/material/card'; -import { MatStepperModule } from '@angular/material/stepper'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatButtonToggleModule } from '@angular/material/button-toggle'; -import { MatIconModule } from '@angular/material/icon'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; import { MatBadgeModule } from '@angular/material/badge'; import { MatBottomSheetModule } from '@angular/material/bottom-sheet'; -import { MatDividerModule } from '@angular/material/divider'; +import { MatButtonModule } from '@angular/material/button'; +import { MatButtonToggleModule } from '@angular/material/button-toggle'; +import { MatCardModule } from '@angular/material/card'; +import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatChipsModule } from '@angular/material/chips'; import { MatNativeDateModule, MatRippleModule } from '@angular/material/core'; -import { ClipboardModule } from '@angular/cdk/clipboard'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { MatSliderModule } from '@angular/material/slider'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatStepperModule } from '@angular/material/stepper'; +import { MatTabsModule } from '@angular/material/tabs'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { MarkdownModule,MARKED_OPTIONS } from 'ngx-markdown'; +import { MarkedOptions, MarkedRenderer } from 'ngx-markdown'; -import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; - -import { NotesAdminPageComponent } from './pages/notes-admin/notes-admin.page'; - -import { SavedPagesAdminPageComponent } from './pages/saved-pages-admin/saved-pages-admin.page'; -import { SavedPageCardComponent } from './components/saved-page-card/saved-page-card.component'; - +import { AppRoutingModule } from './app-routing.module'; +import { AddToPageModalComponent } from './components/add-to-page-modal/add-to-page-modal.component'; import { HelpModalComponent } from './components/help-modal/help-modal.component'; - -import { SearchPageComponent } from './pages/search/search.page'; - +import { NoteEditModalComponent } from './components/note/edit-modal/note-edit-modal.component'; +import { NoteCardComponent } from './components/note/note-card.component'; import { OkCancelModalComponent } from './components/ok-cancel-modal/ok-cancel-modal.component'; -import { SettingsComponent } from './components/settings/settings.component'; - +import { PageEditModalComponent } from './components/page-edit-modal/page-edit-modal.component'; import { PassageCardComponent } from './components/passage/passage-card.component'; -import { StrongsComponent } from './components/strongs/strongs.component'; +import { SavedPageCardComponent } from './components/saved-page-card/saved-page-card.component'; +import { SettingsComponent } from './components/settings/settings.component'; import { StrongsCardComponent } from './components/strongs/card/strongs-card.component'; import { StrongsModalComponent } from './components/strongs/modal/strongs-modal.component'; -import { WordsCardComponent } from './components/words/words-card.component'; -import { NoteCardComponent } from './components/note/note-card.component'; -import { PageEditModalComponent } from './components/page-edit-modal/page-edit-modal.component'; -import { NoteEditModalComponent } from './components/note/edit-modal/note-edit-modal.component'; +import { StrongsComponent } from './components/strongs/strongs.component'; import { VersePickerModalComponent } from './components/verse-picker-modal/verse-picker-modal.component'; -import { AddToPageModalComponent } from './components/add-to-page-modal/add-to-page-modal.component'; - - -import { MarkedOptions, MarkedRenderer } from 'ngx-markdown'; +import { WordsCardComponent } from './components/words/words-card.component'; +import { FirebaseConfig } from './constants'; +import { NotesAdminPageComponent } from './pages/notes-admin/notes-admin.page'; +import { SavedPagesAdminPageComponent } from './pages/saved-pages-admin/saved-pages-admin.page'; +import { SearchPageComponent } from './pages/search/search.page'; // function that returns `MarkedOptions` with renderer override export function markedOptionsFactory(): MarkedOptions { @@ -107,7 +97,7 @@ export function markedOptionsFactory(): MarkedOptions { OkCancelModalComponent, ], imports: [ - BrowserModule.withServerTransition({ appId: 'ng-cli-universal' }), + BrowserModule, HttpClientModule, ReactiveFormsModule, @@ -154,9 +144,10 @@ export function markedOptionsFactory(): MarkedOptions { MatSnackBarModule, MatTooltipModule, MatFormFieldModule, + MatTabsModule, ClipboardModule, ], - providers: [], + providers: [{ provide: APP_ID, useValue: 'ng-cli-universal' }], bootstrap: [AppComponent], }) export class AppModule {} diff --git a/src/src/app/common/array-operations.spec.ts b/src/src/app/common/array-operations.spec.ts index 1bf52679..b2c8bf19 100644 --- a/src/src/app/common/array-operations.spec.ts +++ b/src/src/app/common/array-operations.spec.ts @@ -1,4 +1,4 @@ -import { moveItemUpOrDown, moveItem } from './array-operations'; +import { moveItem,moveItemUpOrDown } from './array-operations'; import { MoveDirection } from './move-direction'; describe('Array Movement', () => { diff --git a/src/src/app/common/array-operations.ts b/src/src/app/common/array-operations.ts index 0d56a007..babf1df8 100644 --- a/src/src/app/common/array-operations.ts +++ b/src/src/app/common/array-operations.ts @@ -1,6 +1,7 @@ -import { MoveDirection } from './move-direction'; import { moveItemInArray } from '@angular/cdk/drag-drop'; +import { MoveDirection } from './move-direction'; + /** * Moves an item up (1 index towards 0) or down (1 index away from 0) immutably, returning a new array as the value. * @param items Array in which to move the item. diff --git a/src/src/app/common/bible-reference.ts b/src/src/app/common/bible-reference.ts index 2277039d..fd856070 100644 --- a/src/src/app/common/bible-reference.ts +++ b/src/src/app/common/bible-reference.ts @@ -924,7 +924,7 @@ export class BibleReference { if (this.ref.length === 0) { return; } - this.parseBook(false); + this.parseBook(); this.parseChapter(false); const foundFirstVerse = this.ref.search(/:.*-/) !== -1; @@ -932,7 +932,7 @@ export class BibleReference { this.maybeParseRangeSep(); const foundSecondBook = this.ref.search(/\w\s+\d/i) !== -1; - this.maybeParseBook(true); + this.maybeParseBook(); this.maybeParseChapterOrVerse(foundSecondBook, foundFirstVerse, true); this.maybeParseVerse(true); } @@ -958,7 +958,7 @@ export class BibleReference { } } - private parseBook(isEnd?: boolean) { + private parseBook() { this.ref = this.ref.toLowerCase().trim(); let fbook = this.ref.substring(0, this.ref.search(/\w\s+\d/i) + 1); @@ -1039,10 +1039,10 @@ export class BibleReference { } } - private maybeParseBook(isEnd: boolean) { + private maybeParseBook() { return this.maybeDo(() => { if (this.ref.search(/\w\s+\d/i) !== -1) { - this.parseBook(isEnd); + this.parseBook(); } }); } diff --git a/src/src/app/common/card-cache-operations.spec.ts b/src/src/app/common/card-cache-operations.spec.ts index 80d6c53e..967bed18 100644 --- a/src/src/app/common/card-cache-operations.spec.ts +++ b/src/src/app/common/card-cache-operations.spec.ts @@ -1,7 +1,7 @@ -import { CardType, CardItem } from '../models/card-state'; +import { CardItem,CardType } from '../models/card-state'; import { NoteItem } from '../models/note-state'; +import { getCardCacheKey, removeFromCardCache,updateInCardCache } from './card-cache-operations'; import { HashTable } from './hashtable'; -import { updateInCardCache, getCardCacheKey, removeFromCardCache } from './card-cache-operations'; describe('Card Cache', () => { it('updateCache', () => { @@ -48,16 +48,6 @@ describe('Card Cache', () => { type: CardType.Passage, data: null, }; - const card2: CardItem = { - qry: 'jason', - type: CardType.Passage, - data: { - id: 'adsf', - xref: '', - title: 'adsf', - content: '', - } as NoteItem, - }; const card3: CardItem = { qry: 'jason3', type: CardType.Passage, diff --git a/src/src/app/common/card-operations.spec.ts b/src/src/app/common/card-operations.spec.ts index 19a20ebd..1c91edc1 100644 --- a/src/src/app/common/card-operations.spec.ts +++ b/src/src/app/common/card-operations.spec.ts @@ -1,6 +1,6 @@ -import { mergeCardList } from './card-operations'; +import { CardItem,CardType } from '../models/card-state'; import { BibleReference, Overlap } from './bible-reference'; -import { CardType, CardItem } from '../models/card-state'; +import { mergeCardList } from './card-operations'; describe('Card Merging', () => { it('Should merge two equal reference cards', () => { diff --git a/src/src/app/common/card-operations.ts b/src/src/app/common/card-operations.ts index 64e8c17c..c820dfe7 100644 --- a/src/src/app/common/card-operations.ts +++ b/src/src/app/common/card-operations.ts @@ -1,5 +1,5 @@ -import { BibleReference, Overlap } from './bible-reference'; import { CardType, DataReference } from '../models/card-state'; +import { BibleReference, Overlap } from './bible-reference'; export function maybeMergeCards( leftCard: DataReference, diff --git a/src/src/app/common/state-service.ts b/src/src/app/common/state-service.ts index 9d46f5ed..5dc4de74 100644 --- a/src/src/app/common/state-service.ts +++ b/src/src/app/common/state-service.ts @@ -1,103 +1,6 @@ -import { Store, createStore } from 'redux'; - import { BehaviorSubject, Observable } from 'rxjs'; import { distinctUntilChanged, map } from 'rxjs/operators'; -/** - * A base class from which to extend a service to provide predictable state to components. You should not extend this - * class directly; instead, use the {@link createStateService} function to create a base class specific to your service. - * @see {@link createStateService} - */ -class StateService { - /** An observable that provides the entire state managed by the service. */ - public readonly state$: Observable; - - private readonly store: Store; - private readonly internalState$: BehaviorSubject; - - protected constructor(reducer: (state: TState, action: TAction) => TState, initialState: TState) { - this.store = createStore( - reducer, - initialState as any, // this cast is required by Redux's typings, it should have no impact - undefined // in the future, we may want to add some middleware to the Redux stores. that goes here! - ); - - this.internalState$ = new BehaviorSubject(initialState as TState); - - // BehaviorSubject.asObservable returns a new object, so hold onto it to avoid unnecessary allocations - this.state$ = this.internalState$.asObservable(); - - this.store.subscribe(() => this.internalState$.next(this.store.getState())); - } - - /** - * Creates an observable that provides data derived from the state managed by the service. - * @param selector A selector that maps the state to the derived data. - */ - public select(selector: (state: TState) => TDerived): Observable { - return this.state$.pipe(map(selector), distinctUntilChanged()); - } - - /** - * Gets the current state managed by the service. **You should only use the current state to validate operations or - * help to construct actions to be dispatched.** Try not to expose any state retrieved using this method outside the - * derived service class. - */ - protected getState(): TState { - return this.internalState$.value; - } - - /** - * Dispatches an action to the underlying Redux store. - * @param action The action to dispatch. - */ - protected dispatch(action: TAction) { - this.store.dispatch(action); - } -} - -/** - * Creates a deeply-immutable type from the provided type. Objects' properties will be marked as `readonly`, array types - * will be replaced with {@link ReadonlyArray}, {@link Map} types will be replaced with {@link ReadonlyMap}, and - * {@link Set} types will be replaced with {@link ReadonlySet}. - */ -export type Immutable = T extends undefined | null | boolean | string | number - ? T - : T extends Array - ? ImmutableArray - : T extends Map - ? ImmutableMap - : T extends Set - ? ImmutableSet - : { readonly [N in keyof T]: Immutable }; - -interface ImmutableArray extends ReadonlyArray> {} -interface ImmutableMap extends ReadonlyMap, Immutable> {} -interface ImmutableSet extends ReadonlySet> {} - -// The below type definition is simpler, but it only works with TypeScript 3.7 and above. Swap this in when we upgrade! - -// export type Immutable = T extends undefined | null | boolean | string | number -// ? T -// : T extends Array -// ? ReadonlyArray> -// : T extends Map -// ? ReadonlyMap, Immutable> -// : T extends Set -// ? ReadonlySet> -// : { readonly [N in keyof T]: Immutable }; - -type IfEquals = (() => T extends X ? 1 : 2) extends () => T extends Y ? 1 : 2 ? A : B; -type IfImmutable = IfEquals< - TState, - { readonly [K in keyof TState]: Immutable }, - TImmutable, - TMutable ->; - -// eslint-disable-next-line -type YourStateTypeNeedsToBeImmutable = {}; - /** * Creates a base class from which to extend a service to provide predictable state to components. * @@ -116,15 +19,75 @@ type YourStateTypeNeedsToBeImmutable = {}; * @param reducer A function that takes the previous state and the dispatched action and returns the new state. * @param initialState The initial state of the service. */ -export function createStateService( - reducer: (state: TState, action: TAction) => TState, - initialState: TState -) { - const stateServiceClass = class extends StateService { +export function createReducingService(initialState: TState) { + const stateServiceClass = class extends ReducingService { constructor() { - super(reducer, initialState); + super(initialState); } }; return stateServiceClass as IfImmutable>; } + +export interface IReducingAction { + handle: (state: TState) => TState; +} + +/** + * Creates a deeply-immutable type from the provided type. Objects' properties will be marked as `readonly`, array types + * will be replaced with {@link ReadonlyArray}, {@link Map} types will be replaced with {@link ReadonlyMap}, and + * {@link Set} types will be replaced with {@link ReadonlySet}. + */ +export type Immutable = T extends undefined | null | boolean | string | number + ? T + : T extends Array + ? ReadonlyArray> + : T extends Map + ? ReadonlyMap, Immutable> + : T extends Set + ? ReadonlySet> + : { readonly [N in keyof T]: Immutable }; + +type IfEquals = (() => T extends X ? 1 : 2) extends () => T extends Y ? 1 : 2 ? A : B; +type IfImmutable = IfEquals< + TState, + { readonly [K in keyof TState]: Immutable }, + TImmutable, + TMutable +>; + +// eslint-disable-next-line +type YourStateTypeNeedsToBeImmutable = {}; + +class ReducingService { + private internalState$: BehaviorSubject; + + constructor(private initialState: TState) { + this.internalState$ = new BehaviorSubject(initialState); + } + + // expose as observable. + public get state$() { + return this.internalState$.asObservable(); + } + + protected dispatch(action: IReducingAction) { + this.internalState$.next(action.handle(this.internalState$.value)); + } + + /** + * Gets the current state managed by the service. **You should only use the current state to validate operations or + * help to construct actions to be dispatched.** Try not to expose any state retrieved using this method outside the + * derived service class. + */ + protected getState(): TState { + return this.internalState$.value; + } + /** + * Creates an observable that provides data derived from the state managed by the service. + * @param selector A selector that maps the state to the derived data. + */ + public select(selector: (state: TState) => TDerived): Observable { + return this.internalState$.pipe(map(selector), distinctUntilChanged()); + } +} diff --git a/src/src/app/common/storable.ts b/src/src/app/common/storable.ts index 27d3528c..a6c66a8b 100644 --- a/src/src/app/common/storable.ts +++ b/src/src/app/common/storable.ts @@ -22,5 +22,5 @@ export interface UserVersion { export enum StorableType { initial, - modified + modified, } diff --git a/src/src/app/common/subscriber-base.ts b/src/src/app/common/subscriber-base.ts index cd5e14b7..d3f98b4b 100644 --- a/src/src/app/common/subscriber-base.ts +++ b/src/src/app/common/subscriber-base.ts @@ -1,4 +1,4 @@ -import { OnDestroy, Injectable } from '@angular/core'; +import { Injectable,OnDestroy } from '@angular/core'; import { Subscription } from 'rxjs'; @Injectable({ diff --git a/src/src/app/components/add-to-page-modal/add-to-page-modal.component.html b/src/src/app/components/add-to-page-modal/add-to-page-modal.component.html index 2708272e..5e405591 100644 --- a/src/src/app/components/add-to-page-modal/add-to-page-modal.component.html +++ b/src/src/app/components/add-to-page-modal/add-to-page-modal.component.html @@ -1,16 +1,14 @@ -
- - save -
Add Card to Saved Page
-
-
+ + save +
Add Card to Saved Page
+
{{ page.title }} @@ -26,7 +24,6 @@ >
state.settings.value.cardIcons.strongs); this.addSubscription( this.appService.state$.subscribe((state) => { @@ -27,9 +42,8 @@ export class StrongsCardComponent extends CardComponent { } copy() { - const html = this.strongsElement.nativeElement.innerHTML; const text = this.strongsElement.nativeElement.innerText; - this.copyToClip(text, html); + this.copyToClip(text); } async openStrongs(q: string) { @@ -42,7 +56,7 @@ export class StrongsCardComponent extends CardComponent { autoFocus: 'content', }); } else { - this.appService.getStrongs(sn, dict, this.cardItem); + this.appService.getStrongs([sn], dict, this.cardItem); } } diff --git a/src/src/app/components/strongs/modal/strongs-modal.component.html b/src/src/app/components/strongs/modal/strongs-modal.component.html index 76577ebd..db163e10 100644 --- a/src/src/app/components/strongs/modal/strongs-modal.component.html +++ b/src/src/app/components/strongs/modal/strongs-modal.component.html @@ -1,22 +1,32 @@ - - {{ - icon$ | async - }} -
{{ cardItem.qry }}
- - - -
- -
- + + {{ + icon$ | async + }} +
{{ this.title }}
+ + + +
+ + + + {{ card.prefix }}{{ card.sn }} + + + + + + diff --git a/src/src/app/components/strongs/modal/strongs-modal.component.ts b/src/src/app/components/strongs/modal/strongs-modal.component.ts index 858abdc2..cd8009cf 100644 --- a/src/src/app/components/strongs/modal/strongs-modal.component.ts +++ b/src/src/app/components/strongs/modal/strongs-modal.component.ts @@ -1,9 +1,10 @@ -import { Component, Inject, ChangeDetectionStrategy } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { ChangeDetectionStrategy,Component, Inject } from '@angular/core'; +import { MAT_DIALOG_DATA,MatDialogRef } from '@angular/material/dialog'; import { Observable } from 'rxjs'; -import { AppService } from 'src/app/services/app.service'; import { BibleReference } from 'src/app/common/bible-reference'; import { CardItem } from 'src/app/models/card-state'; +import { StrongsResult } from 'src/app/models/strongs-state'; +import { AppService } from 'src/app/services/app.service'; @Component({ selector: 'app-strongs-modal', @@ -14,14 +15,16 @@ import { CardItem } from 'src/app/models/card-state'; }) export class StrongsModalComponent { icon$: Observable; + strongsResults: StrongsResult[]; + title: string; constructor( - @Inject(MAT_DIALOG_DATA) public cardItem: CardItem, + @Inject(MAT_DIALOG_DATA) public cardItems: CardItem[], public dialogRef: MatDialogRef, private appService: AppService ) { - console.log(cardItem); - + this.title = cardItems.map(o => o.qry).reduce((p, c) => `${p}, ${c}`); + this.strongsResults = cardItems.map(o => o.data as StrongsResult); this.icon$ = appService.select((state) => state.settings.value.cardIcons.strongs); } @@ -31,6 +34,6 @@ export class StrongsModalComponent { openPassage(p: string) { const ref = BibleReference.makePassageFromReferenceKey(p); - this.appService.getPassage(ref, this.cardItem); + this.appService.getPassage(ref, this.cardItems[0]); } } diff --git a/src/src/app/components/strongs/strongs.component.ts b/src/src/app/components/strongs/strongs.component.ts index ab4c2f84..e4290e62 100644 --- a/src/src/app/components/strongs/strongs.component.ts +++ b/src/src/app/components/strongs/strongs.component.ts @@ -1,5 +1,6 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; +import { Component, EventEmitter,Input, Output } from '@angular/core'; import { BibleReference } from 'src/app/common/bible-reference'; + import { StrongsResult } from '../../models/strongs-state'; @Component({ diff --git a/src/src/app/components/verse-picker-modal/verse-picker-modal.component.html b/src/src/app/components/verse-picker-modal/verse-picker-modal.component.html index eeb6fcc2..4a3985e2 100644 --- a/src/src/app/components/verse-picker-modal/verse-picker-modal.component.html +++ b/src/src/app/components/verse-picker-modal/verse-picker-modal.component.html @@ -1,18 +1,12 @@ -
- - bookmarks -
Verse Picker
- - - -
-
+ + bookmarks +
Verse Picker
+ + + +
diff --git a/src/src/app/components/verse-picker-modal/verse-picker-modal.component.ts b/src/src/app/components/verse-picker-modal/verse-picker-modal.component.ts index 38a21729..59346a64 100644 --- a/src/src/app/components/verse-picker-modal/verse-picker-modal.component.ts +++ b/src/src/app/components/verse-picker-modal/verse-picker-modal.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; -import { AppService } from 'src/app/services/app.service'; import { MatDialogRef } from '@angular/material/dialog'; -import { Book, BibleReference } from 'src/app/common/bible-reference'; +import { BibleReference,Book } from 'src/app/common/bible-reference'; +import { AppService } from 'src/app/services/app.service'; @Component({ selector: 'app-verse-picker', diff --git a/src/src/app/components/words/words-card.component.ts b/src/src/app/components/words/words-card.component.ts index a1d7a5c9..2bc9c1f0 100644 --- a/src/src/app/components/words/words-card.component.ts +++ b/src/src/app/components/words/words-card.component.ts @@ -1,9 +1,10 @@ -import { Component, ElementRef, ViewChild, ChangeDetectionStrategy } from '@angular/core'; +import { Clipboard } from '@angular/cdk/clipboard'; +import { ChangeDetectionStrategy,Component, ElementRef, ViewChild } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { BibleReference } from 'src/app/common/bible-reference'; import { CardComponent } from 'src/app/components/card.component'; -import { AppService } from 'src/app/services/app.service'; import { WordLookupResult } from 'src/app/models/words-state'; +import { AppService } from 'src/app/services/app.service'; @Component({ selector: 'app-words-card', @@ -19,8 +20,13 @@ export class WordsCardComponent extends CardComponent { return this.cardItem.data as WordLookupResult; } - constructor(protected elementRef: ElementRef, protected appService: AppService, public dialog: MatDialog) { - super(elementRef, dialog, appService); + constructor( + protected elementRef: ElementRef, + protected appService: AppService, + protected clipboard: Clipboard, + public dialog: MatDialog + ) { + super(elementRef, dialog, appService, clipboard); this.icon$ = appService.select((state) => state.settings.value.cardIcons.words); } @@ -29,9 +35,8 @@ export class WordsCardComponent extends CardComponent { BibleReference.makePassageFromReferenceKey(ref) ); - const html = refs.map((ref) => `${ref}`).join(', '); const text = refs.join(', '); - this.copyToClip(text, html); + this.copyToClip(text); } makePassage(p: string) { diff --git a/src/src/app/models/app-state.ts b/src/src/app/models/app-state.ts index 4054710c..ee6ef3eb 100644 --- a/src/src/app/models/app-state.ts +++ b/src/src/app/models/app-state.ts @@ -1,9 +1,9 @@ -import { IStorable } from '../common/storable'; -import { NoteItem } from './note-state'; import { Overlap } from '../common/bible-reference'; -import { CardItem, CardIcons, DataReference } from './card-state'; -import { SavedPage } from './page-state'; import { HashTable } from '../common/hashtable'; +import { IStorable } from '../common/storable'; +import { CardIcons, CardItem, DataReference } from './card-state'; +import { NoteItem } from './note-state'; +import { SavedPage } from './page-state'; export interface AppState { readonly currentSavedPage: SavedPage; diff --git a/src/src/app/models/card-state.ts b/src/src/app/models/card-state.ts index 9fe420de..2804be7e 100644 --- a/src/src/app/models/card-state.ts +++ b/src/src/app/models/card-state.ts @@ -1,7 +1,7 @@ +import { NoteItem } from './note-state'; import { BiblePassageResult } from './passage-state'; import { StrongsResult } from './strongs-state'; import { WordLookupResult } from './words-state'; -import { NoteItem } from './note-state'; export type CardData = BiblePassageResult | StrongsResult | WordLookupResult | NoteItem; diff --git a/src/src/app/models/strongs-state.ts b/src/src/app/models/strongs-state.ts index a4892631..df8170c0 100644 --- a/src/src/app/models/strongs-state.ts +++ b/src/src/app/models/strongs-state.ts @@ -1,7 +1,6 @@ export type StrongsDictionary = 'heb' | 'grk'; export interface StrongsResult { - readonly dict: StrongsDictionary; readonly prefix: string; readonly sn: number; readonly def: StrongsDefinition; diff --git a/src/src/app/pages/notes-admin/notes-admin.page.ts b/src/src/app/pages/notes-admin/notes-admin.page.ts index 4390d34a..1dfaa483 100644 --- a/src/src/app/pages/notes-admin/notes-admin.page.ts +++ b/src/src/app/pages/notes-admin/notes-admin.page.ts @@ -1,10 +1,10 @@ import { Component, OnInit } from '@angular/core'; -import { AppService } from '../../services/app.service'; -import { NavService } from '../../services/nav.service'; -import { SubscriberBase } from '../../common/subscriber-base'; -import { CardItem, CardType } from 'src/app/models/card-state'; -import { NoteEditModalComponent } from 'src/app/components/note/edit-modal/note-edit-modal.component'; import { MatDialog } from '@angular/material/dialog'; +import { SubscriberBase } from 'src/app/common/subscriber-base'; +import { NoteEditModalComponent } from 'src/app/components/note/edit-modal/note-edit-modal.component'; +import { CardItem, CardType } from 'src/app/models/card-state'; +import { AppService } from 'src/app/services/app.service'; +import { NavService } from 'src/app/services/nav.service'; @Component({ selector: 'app-notes-admin', diff --git a/src/src/app/pages/saved-pages-admin/saved-pages-admin.page.ts b/src/src/app/pages/saved-pages-admin/saved-pages-admin.page.ts index 9278e61d..0cad090b 100644 --- a/src/src/app/pages/saved-pages-admin/saved-pages-admin.page.ts +++ b/src/src/app/pages/saved-pages-admin/saved-pages-admin.page.ts @@ -1,7 +1,7 @@ import { Component, OnInit } from '@angular/core'; -import { AppService } from '../../services/app.service'; -import { NavService } from '../../services/nav.service'; -import { SubscriberBase } from '../../common/subscriber-base'; +import { SubscriberBase } from 'src/app/common/subscriber-base'; +import { AppService } from 'src/app/services/app.service'; +import { NavService } from 'src/app/services/nav.service'; @Component({ selector: 'app-saved-pages-admin', diff --git a/src/src/app/pages/search/search.page.html b/src/src/app/pages/search/search.page.html index 65b00ddc..68038019 100644 --- a/src/src/app/pages/search/search.page.html +++ b/src/src/app/pages/search/search.page.html @@ -16,7 +16,7 @@ #autoCompleteInput [formControl]="searchControl" [matAutocomplete]="auto" - (keyup.enter)="search($event.target.value)" + (keyup.enter)="searchWithTarget($event.target)" /> diff --git a/src/src/app/pages/search/search.page.ts b/src/src/app/pages/search/search.page.ts index 26625a6e..9583a4d7 100644 --- a/src/src/app/pages/search/search.page.ts +++ b/src/src/app/pages/search/search.page.ts @@ -1,14 +1,15 @@ -import { Component, OnInit, ViewChild, ChangeDetectionStrategy, ElementRef } from '@angular/core'; -import { ActivatedRoute, Router, NavigationEnd } from '@angular/router'; +import { ChangeDetectionStrategy, Component, ElementRef,OnInit, ViewChild } from '@angular/core'; import { UntypedFormControl } from '@angular/forms'; +import { MatAutocomplete,MatAutocompleteTrigger } from '@angular/material/autocomplete'; import { MatDialog } from '@angular/material/dialog'; -import { MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; -import { AppService } from '../../services/app.service'; -import { NavService } from '../../services/nav.service'; +import { ActivatedRoute, NavigationEnd,Router } from '@angular/router'; +import { getFromCardCache } from 'src/app/common/card-cache-operations'; +import { CardItem, CardType } from 'src/app/models/card-state'; +import { AppService } from 'src/app/services/app.service'; + import { SubscriberBase } from '../../common/subscriber-base'; import { VersePickerModalComponent } from '../../components/verse-picker-modal/verse-picker-modal.component'; -import { CardItem, CardType } from 'src/app/models/card-state'; -import { getFromCardCache } from 'src/app/common/card-cache-operations'; +import { NavService } from '../../services/nav.service'; @Component({ selector: 'app-search-page', @@ -109,6 +110,10 @@ export class SearchPageComponent extends SubscriberBase implements OnInit { this.appService.removeCard(card); } + async searchWithTarget(target: EventTarget) { + const term = (target as HTMLInputElement).value; + await this.search(term); + } async search(search: string) { // clear search box. if (this.clearSearchAfterQuery) { diff --git a/src/src/app/services/app-state-actions.ts b/src/src/app/services/app-state-actions.ts deleted file mode 100644 index c6741191..00000000 --- a/src/src/app/services/app-state-actions.ts +++ /dev/null @@ -1,288 +0,0 @@ -import { Error, User, Settings } from '../models/app-state'; -import { IStorable } from '../common/storable'; -import { NoteItem } from '../models/note-state'; -import { MoveDirection } from '../common/move-direction'; -import { SavedPage } from '../models/page-state'; -import { CardItem } from '../models/card-state'; -import { Overlap } from '../common/bible-reference'; - -export class AppActionFactory { - static newSavePage(title: string): AppAction { - return { - type: 'SAVE_PAGE', - title, - } as AppAction; - } - - static newUpdateCurrentPage(): AppAction { - return { - type: 'UPDATE_CURRENT_PAGE', - } as AppAction; - } - - static newUpdateSavedPages(savedPages: IStorable): AppAction { - return { - type: 'UPDATE_SAVED_PAGES', - savedPages, - } as AppAction; - } - - static newUpdateSavedPage(savedPage: SavedPage): AppAction { - return { - type: 'UPDATE_SAVED_PAGE', - savedPage, - } as AppAction; - } - - static newMoveSavedPageCard(savedPage: SavedPage, fromIndex: number, toIndex: number): AppAction { - return { - type: 'MOVE_SAVED_PAGE_CARD', - savedPage, - fromIndex, - toIndex, - } as AppAction; - } - - static newRemoveSavedPage(savedPage: SavedPage): AppAction { - return { - type: 'REMOVE_SAVED_PAGE', - savedPage, - } as AppAction; - } - - static newAddCardToSavedPage(card: CardItem, pageId: string): AppAction { - return { - type: 'ADD_CARD_TO_SAVED_PAGE', - card, - pageId, - } as AppAction; - } - - static newAddCard(card: CardItem, nextToItem: CardItem): AppAction { - return { - type: 'ADD_CARD', - card, - nextToItem, - } as AppAction; - } - - static newUpdateCard(newCard: CardItem, oldCard: CardItem): AppAction { - return { - type: 'UPDATE_CARD', - newCard, - oldCard, - } as AppAction; - } - - static newRemoveCard(card: CardItem): AppAction { - return { - type: 'REMOVE_CARD', - card, - } as AppAction; - } - - static newMoveCard(card: CardItem, direction: MoveDirection): AppAction { - return { - type: 'MOVE_CARD', - card, - direction, - } as AppAction; - } - - static newUpdateCards(cards: IStorable): AppAction { - return { - type: 'UPDATE_CARDS', - cards, - } as AppAction; - } - - static newUpdateError(error: Error): AppAction { - return { - type: 'UPDATE_ERROR', - error, - } as AppAction; - } - - static newUpdateCardMergeStrategy(strategy: Overlap): AppAction { - return { - type: 'UPDATE_CARD_MERGE_STRATEGY', - cardMergeStrategy: strategy, - }; - } - - static newUpdateCardFontSize(cardFontSize: number): AppAction { - return { - type: 'UPDATE_CARD_FONT_SIZE', - cardFontSize, - } as AppAction; - } - - static newUpdateCardFontFamily(cardFontFamily: string): AppAction { - return { - type: 'UPDATE_CARD_FONT_FAMILY', - cardFontFamily, - } as AppAction; - } - - static newUpdateAutocomplete(words: string[]): AppAction { - return { - type: 'UPDATE_AUTOCOMPLETE', - words, - } as AppAction; - } - - static newUpdateSettings(settings: IStorable): AppAction { - return { - type: 'UPDATE_SETTINGS', - settings, - } as AppAction; - } - static newUser(user: User): AppAction { - return { - type: 'SET_USER', - user, - } as AppAction; - } - - static newFindNotes(qry: string, nextToItem: CardItem): AppAction { - return { - type: 'FIND_NOTES', - qry, - nextToItem, - } as AppAction; - } - - static newGetNote(noteId: string, nextToItem: CardItem): AppAction { - return { - type: 'GET_NOTE', - noteId, - nextToItem, - } as AppAction; - } - - static newUpdateNotes(notes: IStorable): AppAction { - return { - type: 'UPDATE_NOTES', - notes, - } as AppAction; - } - - static newSaveNote(note: NoteItem): AppAction { - return { - type: 'SAVE_NOTE', - note, - } as AppAction; - } - - static newDeleteNote(note: NoteItem): AppAction { - return { - type: 'DELETE_NOTE', - note, - } as AppAction; - } -} - -export type AppAction = - | { - type: 'SAVE_PAGE'; - title: string; - } - | { - type: 'UPDATE_CURRENT_PAGE'; - } - | { - type: 'UPDATE_SAVED_PAGES'; - savedPages: IStorable; - } - | { - type: 'UPDATE_SAVED_PAGE'; - savedPage: SavedPage; - } - | { - type: 'REMOVE_SAVED_PAGE'; - savedPage: SavedPage; - } - | { - type: 'MOVE_SAVED_PAGE_CARD'; - fromIndex: number; - toIndex: number; - savedPage: SavedPage; - } - | { - type: 'ADD_CARD_TO_SAVED_PAGE'; - card: CardItem; - pageId: string; - } - | { - type: 'ADD_CARD'; - card: CardItem; - nextToItem: CardItem; - } - | { - type: 'UPDATE_CARD'; - newCard: CardItem; - oldCard: CardItem; - } - | { - type: 'REMOVE_CARD'; - card: CardItem; - } - | { - type: 'MOVE_CARD'; - card: CardItem; - direction: MoveDirection; - } - | { - type: 'UPDATE_CARDS'; - cards: IStorable; - } - | { - type: 'UPDATE_ERROR'; - error: Error; - } - | { - type: 'UPDATE_CARD_MERGE_STRATEGY'; - cardMergeStrategy: Overlap; - } - | { - type: 'UPDATE_CARD_FONT_SIZE'; - cardFontSize: number; - } - | { - type: 'UPDATE_CARD_FONT_FAMILY'; - cardFontFamily: string; - } - | { - type: 'UPDATE_AUTOCOMPLETE'; - words: string[]; - } - | { - type: 'UPDATE_SETTINGS'; - settings: IStorable; - } - | { - type: 'SET_USER'; - user: User; - } - | { - type: 'FIND_NOTES'; - qry: string; - nextToItem: CardItem; - } - | { - type: 'GET_NOTE'; - noteId: string; - nextToItem: CardItem; - } - | { - type: 'UPDATE_NOTES'; - notes: IStorable; - } - | { - type: 'SAVE_NOTE'; - note: NoteItem; - } - | { - type: 'DELETE_NOTE'; - note: NoteItem; - }; diff --git a/src/src/app/services/app-state-initial-state.ts b/src/src/app/services/app-state-initial-state.ts deleted file mode 100644 index 6a660317..00000000 --- a/src/src/app/services/app-state-initial-state.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { AppState } from '../models/app-state'; -import { Overlap } from '../common/bible-reference'; -import { StorableType } from '../common/storable'; - -export const initialState: AppState = { - user: null, - currentCards: { - type: StorableType.initial, - createdOn: new Date(0).toISOString(), - value: [], - }, - cardCache: {}, - autocomplete: [], - currentSavedPage: null, - savedPages: null, - notes: { - type: StorableType.initial, - createdOn: new Date(0).toISOString(), - value: [], - }, - savedPagesLoaded: false, - error: null, - settings: { - type: StorableType.initial, - createdOn: new Date(0).toISOString(), - value: { - displaySettings: { - showStrongsAsModal: false, - appendCardToBottom: true, - insertCardNextToItem: true, - clearSearchAfterQuery: true, - cardFontSize: 12, - cardFontFamily: 'PT Serif', - showVersesOnNewLine: false, - showVerseNumbers: false, - showParagraphs: true, - showParagraphHeadings: true, - syncCardsAcrossDevices: false, - }, - pageSettings: { - mergeStrategy: Overlap.Equal, - }, - cardIcons: { - words: 'font_download', - passage: 'menu_book', - strongs: 'speaker_notes', - note: 'note', - savedPage: 'inbox', - }, - }, - }, -}; diff --git a/src/src/app/services/app-state-reducer.spec.ts b/src/src/app/services/app-state-reducer.spec.ts index 23a5c385..0aebc312 100644 --- a/src/src/app/services/app-state-reducer.spec.ts +++ b/src/src/app/services/app-state-reducer.spec.ts @@ -1,14 +1,38 @@ import { TestBed } from '@angular/core/testing'; -import { reducer, getNewestStorable } from './app-state-reducer'; -import { AppActionFactory } from './app-state-actions'; + import { Overlap } from '../common/bible-reference'; -import { Storable, StorableType } from '../common/storable'; -import { CardType, CardItem } from '../models/card-state'; -import { SavedPage } from '../models/page-state'; -import { AppState, User } from '../models/app-state'; import { getCardCacheKey } from '../common/card-cache-operations'; import { MoveDirection } from '../common/move-direction'; +import { Storable, StorableType } from '../common/storable'; +import { AppState, User } from '../models/app-state'; +import { CardItem,CardType } from '../models/card-state'; import { NoteItem } from '../models/note-state'; +import { SavedPage } from '../models/page-state'; +import { + addCardsAction, + addCardToSavedPageAction, + deleteNoteAction, + findNotesAction, + getNewestStorable, + getNotesAction, + moveCardAction, + moveSavedPageCardAction, + removeCardAction, + removeSavedPageAction, + saveNoteAction, + savePageAction, + setUserAction, + updateAutoCompleteAction, + updateCardAction, + updateCardFontFamilyAction, + updateCardFontSizeAction, + updateCardMergeStrategyAction, + updateCurrentPageAction, + updateNotesAction, + updateSavedPageAction, + updateSavedPagesAction, + updateSettingsAction, +} from './app.service'; describe('getNewestStorable', () => { it('maybeMutateStorable', () => { @@ -126,8 +150,7 @@ describe('AppService Reducer', () => { it('UPDATE_CARD_MERGE_STRATEGY', () => { for (const strategy of [Overlap.None, Overlap.Equal, Overlap.Subset, Overlap.Intersect]) { - const action = AppActionFactory.newUpdateCardMergeStrategy(strategy); - const testState = reducer(preState, action); + const testState = updateCardMergeStrategyAction(strategy).handle(preState); expect(testState.settings.value.pageSettings.mergeStrategy).toEqual(strategy); } }); @@ -163,20 +186,17 @@ describe('AppService Reducer', () => { }, }; - const action = AppActionFactory.newUpdateSettings(settings); - const testState = reducer(preState, action); + const testState = updateSettingsAction(settings).handle(preState); expect(testState.settings).toBe(settings, 'Failed to update the display settings'); }); it('UPDATE_CARD_FONT_SIZE', () => { - const action = AppActionFactory.newUpdateCardFontSize(32); - const testState = reducer(preState, action); + const testState = updateCardFontSizeAction(32).handle(preState); expect(testState.settings.value.displaySettings.cardFontSize).toBe(32, 'Failed to change card font size to 32'); }); it('UPDATE_CARD_FONT_FAMILY', () => { - const action = AppActionFactory.newUpdateCardFontFamily('Jason'); - const testState = reducer(preState, action); + const testState = updateCardFontFamilyAction('Jason').handle(preState); expect(testState.settings.value.displaySettings.cardFontFamily).toBe( 'Jason', 'Failed to change card font family to "Jason"' @@ -188,8 +208,7 @@ describe('AppService Reducer', () => { it('UPDATE_AUTOCOMPLETE', () => { const words = ['word1', 'word2', 'word3']; - const action = AppActionFactory.newUpdateAutocomplete(words); - const testState = reducer(preState, action); + const testState = updateAutoCompleteAction(words).handle(preState); expect(testState.autocomplete).toEqual(words, 'Failed to update the autocomplete array'); }); @@ -210,8 +229,7 @@ describe('AppService Reducer', () => { }, ]); - const action = AppActionFactory.newUpdateSavedPages(savedPages); - const testState = reducer(preState, action); + const testState = updateSavedPagesAction(savedPages).handle(preState); expect(testState.savedPages).toBe(savedPages, 'Failed to update the savedPages array'); expect(testState.savedPages.value.length).toBe(1, 'Updated savedPages is the wrong length'); expect(testState.savedPages.value[0].queries.length).toBe( @@ -227,8 +245,7 @@ describe('AppService Reducer', () => { id: 'myid2', }; - const action = AppActionFactory.newUpdateSavedPage(sp); - const testState = reducer(preState, action); + const testState = updateSavedPageAction(sp).handle(preState); expect(testState.savedPages.value[0].queries.length).toBe( 1, @@ -244,8 +261,7 @@ describe('AppService Reducer', () => { it('REMOVE_SAVED_PAGE', () => { const sp = preState.savedPages.value[0]; - const action = AppActionFactory.newRemoveSavedPage(sp); - const testState = reducer(preState, action); + const testState = removeSavedPageAction(sp).handle(preState); expect(testState.savedPages.value.length).toBe(1, 'Updated savedPages should be 1'); expect(testState.savedPages.value[0].title).toBe('page2'); @@ -258,12 +274,10 @@ describe('AppService Reducer', () => { type: CardType.Strongs, }; - const action1 = AppActionFactory.newAddCard(card1, null); - const testState = reducer(preState, action1); + const testState = addCardsAction([card1], null).handle(preState); expect(testState.currentCards.value[0]).toBe(card1, 'Failed to add first card to empty list'); - const action = AppActionFactory.newUpdateCurrentPage(); - const testState2 = reducer(testState, action); + const testState2 = updateCurrentPageAction().handle(testState); expect(testState2.currentSavedPage.queries.length).toBe(1); expect(preState.currentSavedPage.queries.length).toBe(0); @@ -276,11 +290,9 @@ describe('AppService Reducer', () => { type: CardType.Passage, }; - const action1 = AppActionFactory.newAddCard(card1, null); - const preState2 = reducer(preState, action1); + const preState2 = addCardsAction([card1], null).handle(preState); - const action = AppActionFactory.newSavePage('my saved page'); - const testState = reducer(preState2, action); + const testState = savePageAction('my saved page').handle(preState2); expect(testState.savedPages.value[2].queries.length).toBe( 1, @@ -292,8 +304,7 @@ describe('AppService Reducer', () => { it('MOVE_SAVED_PAGE_CARD', () => { const page = preState.savedPages.value[1]; - const action1 = AppActionFactory.newMoveSavedPageCard(page, 1, 0); - const testState = reducer(preState, action1); + const testState = moveSavedPageCardAction(page, 1, 0).handle(preState); expect(testState.savedPages.value[1].queries[0].qry).toBe('G1', 'Failed to move card in saved page'); }); @@ -303,8 +314,7 @@ describe('AppService Reducer', () => { data: null, type: CardType.Passage, }; - const action1 = AppActionFactory.newAddCardToSavedPage(card1, 'myid1'); - const testState = reducer(preState, action1); + const testState = addCardToSavedPageAction(card1, 'myid1').handle(preState); expect(testState.savedPages.value[0].queries[1].qry).toBe('jn 3:16', 'Failed to add card to saved page'); }); @@ -319,8 +329,7 @@ describe('AppService Reducer', () => { type: CardType.Strongs, }; - const action1 = AppActionFactory.newAddCard(card1, null); - const testState = reducer(preState, action1); + const testState = addCardsAction([card1], null).handle(preState); expect(testState.currentCards.value[0]).toBe(card1, 'Failed to add first card to empty list'); const card2: CardItem = { @@ -329,8 +338,7 @@ describe('AppService Reducer', () => { type: CardType.Strongs, }; - const action2 = AppActionFactory.newAddCard(card2, null); - const testState2 = reducer(testState, action2); + const testState2 = addCardsAction([card2], null).handle(testState); expect(testState2.currentCards.value.length).toBe(2, 'Failed to add second card to list with 1 item'); expect(testState2.currentCards.value[1]).toBe(card2); @@ -342,125 +350,109 @@ describe('AppService Reducer', () => { // append to top, insert next to card - let setState = reducer( - testState2, - AppActionFactory.newUpdateSettings({ - createdOn: new Date(2020, 1, 1, 0, 0, 0, 0).toISOString(), - type: StorableType.initial, - value: { - ...testState2.settings.value, - displaySettings: { - showStrongsAsModal: true, - appendCardToBottom: false, - insertCardNextToItem: true, - clearSearchAfterQuery: false, - cardFontSize: 100, - cardFontFamily: 'Jason', - showVersesOnNewLine: true, - showVerseNumbers: true, - showParagraphs: false, - showParagraphHeadings: false, - syncCardsAcrossDevices: true, - }, + let setState = updateSettingsAction({ + createdOn: new Date(2020, 1, 1, 0, 0, 0, 0).toISOString(), + type: StorableType.initial, + value: { + ...testState2.settings.value, + displaySettings: { + showStrongsAsModal: true, + appendCardToBottom: false, + insertCardNextToItem: true, + clearSearchAfterQuery: false, + cardFontSize: 100, + cardFontFamily: 'Jason', + showVersesOnNewLine: true, + showVerseNumbers: true, + showParagraphs: false, + showParagraphHeadings: false, + syncCardsAcrossDevices: true, }, - }) - ); + }, + }).handle(testState2); - const action3 = AppActionFactory.newAddCard(card3, card2); - const testState3 = reducer(setState, action3); + const testState3 = addCardsAction([card3], card2).handle(setState); expect(testState3.currentCards.value.length).toBe(3, 'Failed to add third card'); expect(testState3.currentCards.value[1]).toBe(card3, 'Failed to insert card above the second card'); // append to bottom, insert next to card - setState = reducer( - testState2, - AppActionFactory.newUpdateSettings({ - createdOn: new Date(2020, 1, 1, 0, 0, 0, 0).toISOString(), - type: StorableType.initial, - value: { - ...testState2.settings.value, - displaySettings: { - showStrongsAsModal: true, - appendCardToBottom: true, - insertCardNextToItem: true, - clearSearchAfterQuery: false, - cardFontSize: 100, - cardFontFamily: 'Jason', - showVersesOnNewLine: true, - showVerseNumbers: true, - showParagraphs: false, - showParagraphHeadings: false, - syncCardsAcrossDevices: true, - }, + setState = updateSettingsAction({ + createdOn: new Date(2020, 1, 1, 0, 0, 0, 0).toISOString(), + type: StorableType.initial, + value: { + ...testState2.settings.value, + displaySettings: { + showStrongsAsModal: true, + appendCardToBottom: true, + insertCardNextToItem: true, + clearSearchAfterQuery: false, + cardFontSize: 100, + cardFontFamily: 'Jason', + showVersesOnNewLine: true, + showVerseNumbers: true, + showParagraphs: false, + showParagraphHeadings: false, + syncCardsAcrossDevices: true, }, - }) - ); + }, + }).handle(testState2); - const action4 = AppActionFactory.newAddCard(card3, card1); - const testState4 = reducer(setState, action4); + const testState4 = addCardsAction([card3], card1).handle(setState); expect(testState4.currentCards.value.length).toBe(3, 'Failed to add third card'); expect(testState4.currentCards.value[1]).toBe(card3, 'Failed to insert card below the first card'); // append to bottom, do not insert next to card - setState = reducer( - testState2, - AppActionFactory.newUpdateSettings({ - createdOn: new Date(2020, 1, 1, 0, 0, 0, 0).toISOString(), - type: StorableType.initial, - value: { - ...testState2.settings.value, - displaySettings: { - showStrongsAsModal: true, - appendCardToBottom: true, - insertCardNextToItem: false, - clearSearchAfterQuery: false, - cardFontSize: 100, - cardFontFamily: 'Jason', - showVersesOnNewLine: true, - showVerseNumbers: true, - showParagraphs: false, - showParagraphHeadings: false, - syncCardsAcrossDevices: true, - }, + setState = updateSettingsAction({ + createdOn: new Date(2020, 1, 1, 0, 0, 0, 0).toISOString(), + type: StorableType.initial, + value: { + ...testState2.settings.value, + displaySettings: { + showStrongsAsModal: true, + appendCardToBottom: true, + insertCardNextToItem: false, + clearSearchAfterQuery: false, + cardFontSize: 100, + cardFontFamily: 'Jason', + showVersesOnNewLine: true, + showVerseNumbers: true, + showParagraphs: false, + showParagraphHeadings: false, + syncCardsAcrossDevices: true, }, - }) - ); + }, + }).handle(testState2); - const action5 = AppActionFactory.newAddCard(card3, card1); - const testState5 = reducer(setState, action5); + const testState5 = addCardsAction([card3], card1).handle(setState); expect(testState5.currentCards.value.length).toBe(3, 'Failed to add third card'); expect(testState5.currentCards.value[2]).toBe(card3, 'Failed to insert card at end of the list'); // append to top, do not insert next to card - setState = reducer( - testState2, - AppActionFactory.newUpdateSettings({ - createdOn: new Date(2020, 1, 1, 0, 0, 0, 0).toISOString(), - type: StorableType.initial, - value: { - ...testState2.settings.value, - displaySettings: { - showStrongsAsModal: true, - appendCardToBottom: false, - insertCardNextToItem: false, - clearSearchAfterQuery: false, - cardFontSize: 100, - cardFontFamily: 'Jason', - showVersesOnNewLine: true, - showVerseNumbers: true, - showParagraphs: false, - showParagraphHeadings: false, - syncCardsAcrossDevices: true, - }, + setState = updateSettingsAction({ + createdOn: new Date(2020, 1, 1, 0, 0, 0, 0).toISOString(), + type: StorableType.initial, + value: { + ...testState2.settings.value, + displaySettings: { + showStrongsAsModal: true, + appendCardToBottom: false, + insertCardNextToItem: false, + clearSearchAfterQuery: false, + cardFontSize: 100, + cardFontFamily: 'Jason', + showVersesOnNewLine: true, + showVerseNumbers: true, + showParagraphs: false, + showParagraphHeadings: false, + syncCardsAcrossDevices: true, }, - }) - ); + }, + }).handle(testState2); - const action6 = AppActionFactory.newAddCard(card3, card1); - const testState6 = reducer(setState, action6); + const testState6 = addCardsAction([card3], card1).handle(setState); expect(testState6.currentCards.value.length).toBe(3, 'Failed to add third card'); expect(testState6.currentCards.value[0]).toBe(card3, 'Failed to insert card at start of the list'); }); @@ -472,8 +464,7 @@ describe('AppService Reducer', () => { type: CardType.Strongs, }; - const action1 = AppActionFactory.newAddCard(oldCard, null); - const preState1 = reducer(preState, action1); + const preState1 = addCardsAction([oldCard], null).handle(preState); const newCard: CardItem = { qry: 'H88', @@ -481,8 +472,7 @@ describe('AppService Reducer', () => { type: CardType.Strongs, }; - const action2 = AppActionFactory.newUpdateCard(newCard, oldCard); - const testState = reducer(preState1, action2); + const testState = updateCardAction(newCard, oldCard).handle(preState1); expect(testState.currentCards.value[0].qry).toBe('H88', 'Should update the card'); expect(testState.cardCache[getCardCacheKey(newCard)].qry).toBe('H88', 'Should exist in card cache'); @@ -498,13 +488,14 @@ describe('AppService Reducer', () => { type: CardType.Strongs, }; - const action1 = AppActionFactory.newAddCard(card, null); - const preState1 = reducer(preState, action1); + const preState1 = addCardsAction([card], null).handle(preState); - const action2 = AppActionFactory.newRemoveCard(card); - const testState = reducer(preState1, action2); + const testState = removeCardAction(card).handle(preState1); - expect(preState1.currentCards.value.length).toBe(1, 'Should have added the card in preparation for removing the card'); + expect(preState1.currentCards.value.length).toBe( + 1, + 'Should have added the card in preparation for removing the card' + ); expect(testState.currentCards.value.length).toBe(0, 'Should have removed the card'); expect(testState.cardCache[getCardCacheKey(card)]).toBeUndefined( 'Should be undefined, having been removed from card cache' @@ -518,33 +509,30 @@ describe('AppService Reducer', () => { type: CardType.Strongs, }; - const action1 = AppActionFactory.newAddCard(card1, null); - const preState1 = reducer(preState, action1); + const preState1 = addCardsAction([card1], null).handle(preState); const card2: CardItem = { qry: 'H88', data: null, type: CardType.Strongs, }; - const action2 = AppActionFactory.newAddCard(card2, null); - const preState2 = reducer(preState1, action2); + + const preState2 = addCardsAction([card2], null).handle(preState1); expect(preState2.currentCards.value.length).toBe(2, 'Should have two cards'); expect(preState2.currentCards.value[0].qry).toBe('G123'); expect(preState2.currentCards.value[1].qry).toBe('H88'); - const action3 = AppActionFactory.newMoveCard(card2, MoveDirection.Up); - const testState1 = reducer(preState2, action3); + const testState1 = moveCardAction(card2, MoveDirection.Up).handle(preState2); expect(testState1.currentCards.value[0].qry).toBe('H88'); expect(testState1.currentCards.value[1].qry).toBe('G123'); - const testState4 = reducer(preState2, action3); + const testState4 = moveCardAction(card2, MoveDirection.Up).handle(preState2); expect(testState4.currentCards.value[0].qry).toBe('H88'); expect(testState4.currentCards.value[1].qry).toBe('G123'); - const action4 = AppActionFactory.newMoveCard(card1, MoveDirection.Down); - const testState2 = reducer(preState2, action4); + const testState2 = moveCardAction(card1, MoveDirection.Down).handle(preState2); expect(testState2.currentCards.value[0].qry).toBe('H88'); expect(testState2.currentCards.value[1].qry).toBe('G123'); - const testState3 = reducer(preState2, action4); + const testState3 = moveCardAction(card1, MoveDirection.Down).handle(preState2); expect(testState3.currentCards.value[0].qry).toBe('H88'); expect(testState3.currentCards.value[1].qry).toBe('G123'); }); @@ -559,8 +547,7 @@ describe('AppService Reducer', () => { providerId: 'asdfasf', }; - const action1 = AppActionFactory.newUser(user); - const testState = reducer(preState, action1); + const testState = setUserAction(user).handle(preState); expect(testState.user).toBe(user, 'Should set the user'); }); @@ -581,18 +568,14 @@ describe('AppService Reducer', () => { xref: 'jn 3:16', }; - const action1 = AppActionFactory.newSaveNote(note1); - const preState1 = reducer(preState, action1); - const action2 = AppActionFactory.newSaveNote(note2); - const preState2 = reducer(preState1, action2); + const preState1 = saveNoteAction(note1).handle(preState); + const preState2 = saveNoteAction(note2).handle(preState1); expect(preState2.notes.value.length).toBe(2, 'Should have two notes'); - const action3 = AppActionFactory.newGetNote('123456789', null); - const preState3 = reducer(preState2, action3); + const preState3 = getNotesAction('123456789', null).handle(preState2); expect(preState3.currentCards.value.length).toBe(1, 'Should have added the note card'); - const action4 = AppActionFactory.newGetNote('1234567890', null); - const preState4 = reducer(preState3, action4); + const preState4 = getNotesAction('1234567890', null).handle(preState3); expect(preState4.currentCards.value.length).toBe(2, 'Should have added the note card'); }); @@ -610,19 +593,17 @@ describe('AppService Reducer', () => { xref: 'jn 3:16', }; - const action1 = AppActionFactory.newUpdateNotes(new Storable([note1, note2])); - const preState1 = reducer(preState, action1); + const preState1 = updateNotesAction(new Storable([note1, note2])).handle(preState); expect(preState1.notes.value.length).toBe(2, 'Should have added the notes'); - const action2 = AppActionFactory.newFindNotes('note', null); - const preState2 = reducer(preState1, action2); + const preState2 = findNotesAction('note', null).handle(preState1); expect(preState2.currentCards.value.length).toBe(2, 'Should have found two notes card'); - const action3 = AppActionFactory.newDeleteNote(note1); - const preState3 = reducer(preState2, action3); + const preState3 = deleteNoteAction(note1).handle(preState2); expect(preState3.currentCards.value.length).toBe(1, 'Should have deleted the note card'); expect(preState3.notes.value.length).toBe(1, 'Should have added the notes'); }); //#endregion }); + diff --git a/src/src/app/services/app-state-reducer.ts b/src/src/app/services/app-state-reducer.ts deleted file mode 100644 index 034a2cf0..00000000 --- a/src/src/app/services/app-state-reducer.ts +++ /dev/null @@ -1,480 +0,0 @@ -import { UUID } from 'angular2-uuid'; - -import { AppState, Settings } from '../models/app-state'; -import { IStorable, Storable } from '../common/storable'; -import { NoteItem } from '../models/note-state'; - -import { mergeCardList } from '../common/card-operations'; -import { updateInCardCache, removeFromCardCache, getFromCardCache } from '../common/card-cache-operations'; - -import { AppAction, AppActionFactory } from './app-state-actions'; -import { initialState } from './app-state-initial-state'; -import { SavedPage } from '../models/page-state'; -import { CardType, CardItem, DataReference } from '../models/card-state'; -import { moveItem, moveItemUpOrDown } from '../common/array-operations'; - -export function getNewestStorable(candidate: IStorable, incumbant: IStorable): IStorable { - // if the candidate is null, then return the state. - if (!candidate) { - return incumbant; - } - - // only update if the settings are newer. - if (!incumbant || new Date(candidate.createdOn) > new Date(incumbant.createdOn)) { - return candidate; - } - - // candidate didn't win. return state untouched. - return incumbant; -} - -export function reducer(state: AppState, action: AppAction): AppState { - // somtimes the state is null. lets not complain if that happens. - if (state === undefined) { - state = initialState; - } - - switch (action.type) { - case 'UPDATE_ERROR': { - return { - ...state, - error: action.error, - }; - } - - //#region Settings - - case 'UPDATE_CARD_MERGE_STRATEGY': { - const settings = new Storable({ - ...state.settings.value, - pageSettings: { - ...state.settings.value.pageSettings, - mergeStrategy: action.cardMergeStrategy, - }, - }); - return reducer(state, { - type: 'UPDATE_SETTINGS', - settings, - }); - } - - case 'UPDATE_SETTINGS': { - const item = getNewestStorable(action.settings, state.settings); - - return { - ...state, - settings: item, - }; - } - - case 'UPDATE_CARD_FONT_SIZE': { - const settings = new Storable({ - ...state.settings.value, - displaySettings: { - ...state.settings.value.displaySettings, - cardFontSize: action.cardFontSize, - }, - }); - - return reducer(state, { - type: 'UPDATE_SETTINGS', - settings, - }); - } - - case 'UPDATE_CARD_FONT_FAMILY': { - const settings = new Storable({ - ...state.settings.value, - displaySettings: { - ...state.settings.value.displaySettings, - cardFontFamily: action.cardFontFamily, - }, - }); - - return reducer(state, { - type: 'UPDATE_SETTINGS', - settings, - }); - } - - //#endregion - - case 'UPDATE_AUTOCOMPLETE': { - return { - ...state, - autocomplete: [...action.words], - }; - } - - //#region Saved Pages - - case 'UPDATE_SAVED_PAGES': { - const savedPages = getNewestStorable(action.savedPages, state.savedPages); - - // only true if a currentSavedPage was set, indicating that the user - // is currently looking at a saved page. - const hasCurrentSavedPage = - state.currentSavedPage !== null && - state.currentSavedPage !== undefined && - action.savedPages.value.some((o) => o.id === state.currentSavedPage.id); - - const currentSavedPage = hasCurrentSavedPage - ? action.savedPages.value.find((o) => o.id === state.currentSavedPage.id) - : null; - - return { - ...state, - // if the currentSavedPage was loaded, replace it with the info from the - // new savedPages array, as it might have changed. - currentCards: hasCurrentSavedPage ? new Storable(currentSavedPage.queries) : state.currentCards, - currentSavedPage: hasCurrentSavedPage ? currentSavedPage : state.currentSavedPage, - savedPagesLoaded: true, - savedPages, // update the savedPages - }; - } - - case 'UPDATE_SAVED_PAGE': { - const newSavedPages = new Storable( - state.savedPages.value.map((o) => { - if (o.id === action.savedPage.id) { - return action.savedPage; - } - return o; - }) - ); - - const savedPages = getNewestStorable(newSavedPages, state.savedPages); - return reducer(state, AppActionFactory.newUpdateSavedPages(savedPages)); - } - - case 'REMOVE_SAVED_PAGE': { - const savedPages = new Storable(state.savedPages.value.filter((o) => o.id !== action.savedPage.id)); - const item = getNewestStorable(savedPages, state.savedPages); - - return { - ...state, - savedPagesLoaded: true, - savedPages: item, - }; - } - - case 'UPDATE_CURRENT_PAGE': { - const current = { - id: state.currentSavedPage.id, - title: state.currentSavedPage.title, - queries: [...mergeCardList(state.currentCards.value, state.settings.value.pageSettings.mergeStrategy)], - }; - - const savedPages = new Storable([ - ...state.savedPages.value.filter((o) => o.id !== state.currentSavedPage.id), - current, - ]); - - const item = getNewestStorable(savedPages, state.savedPages); - return { - ...state, - currentSavedPage: current, - savedPagesLoaded: true, - savedPages: item, - }; - } - - case 'SAVE_PAGE': { - const savedPages = new Storable([ - ...(state.savedPages ? state.savedPages.value : []), - { - // create a new saved page object - title: action.title, - id: UUID.UUID().toString(), - queries: [...mergeCardList(state.currentCards.value, state.settings.value.pageSettings.mergeStrategy)], - }, - ]); - - return reducer(state, { - type: 'UPDATE_SAVED_PAGES', - savedPages, - }); - } - - case 'MOVE_SAVED_PAGE_CARD': { - const queries = moveItem(action.savedPage.queries, action.fromIndex, action.toIndex); - const savedPage = { - ...action.savedPage, - queries, // update the queries. - }; - - return reducer(state, AppActionFactory.newUpdateSavedPage(savedPage)); - } - - case 'ADD_CARD_TO_SAVED_PAGE': { - const savedPages = new Storable([ - ...(state.savedPages ? state.savedPages.value : []).map((o) => { - if (o.id.toString() === action.pageId) { - let references = [] as DataReference[]; - if (state.settings.value.displaySettings.appendCardToBottom) { - references = [...o.queries, action.card]; - } else { - references = [action.card, ...o.queries]; - } - return { - ...o, - queries: mergeCardList(references, state.settings.value.pageSettings.mergeStrategy), - }; - } - return o; - }), - ]); - - return reducer(state, { - type: 'UPDATE_SAVED_PAGES', - savedPages, - }); - } - - //#endregion - - //#region Cards - - case 'ADD_CARD': { - let cards = []; - - if (action.nextToItem && state.settings.value.displaySettings.insertCardNextToItem) { - const idx = state.currentCards.value.indexOf(action.nextToItem); - - if (state.settings.value.displaySettings.appendCardToBottom) { - const before = state.currentCards.value.slice(0, idx + 1); - const after = state.currentCards.value.slice(idx + 1); - cards = [...before, action.card, ...after]; - } else { - const before = state.currentCards.value.slice(0, idx); - const after = state.currentCards.value.slice(idx); - cards = [...before, action.card, ...after]; - } - } else { - if (state.settings.value.displaySettings.appendCardToBottom) { - cards = [...state.currentCards.value, action.card]; - } else { - cards = [action.card, ...state.currentCards.value]; - } - } - - return { - ...state, - currentCards: new Storable(cards), - cardCache: updateInCardCache(action.card, state.cardCache), - }; - } - - case 'UPDATE_CARD': { - return { - ...state, - currentCards: new Storable( - state.currentCards.value.map((c) => { - if (c === action.oldCard) { - return action.newCard; - } - return c; - }) - ), - cardCache: updateInCardCache(action.newCard, removeFromCardCache(action.oldCard, state.cardCache)), - }; - } - - case 'REMOVE_CARD': { - // potentially remove card from a saved page. - const currentSavedPage = - state.currentSavedPage !== null - ? { - ...state.currentSavedPage, - queries: state.currentSavedPage.queries.filter((q) => q !== action.card), - } - : null; - - const savedPages = - state.currentSavedPage !== null - ? new Storable( - (state.savedPages ? state.savedPages.value : []).map((o) => { - if (o === state.currentSavedPage) { - return currentSavedPage; - } - return o; - }) - ) - : state.savedPages; - - return { - ...state, - currentSavedPage, - savedPages, - currentCards: new Storable([...state.currentCards.value.filter((c) => c !== action.card)]), - cardCache: removeFromCardCache(action.card, state.cardCache), - }; - } - - case 'MOVE_CARD': { - const cards = moveItemUpOrDown(state.currentCards.value, action.card, action.direction); - - return { - ...state, - currentCards: new Storable(cards), - }; - } - - case 'UPDATE_CARDS': { - let cardCache = { ...state.cardCache }; - for (const card of action.cards.value) { - cardCache = updateInCardCache(card, cardCache); - } - return { - ...state, - currentCards: action.cards, - cardCache, - }; - } - - //#endregion - - case 'SET_USER': { - return { - ...state, - user: action.user, - }; - } - - //#region Notes - - case 'FIND_NOTES': { - const notes = state.notes.value - .filter((o) => o.title.search(action.qry) > -1) - .map((o) => { - return { - qry: o.id, - type: CardType.Note, - data: o, - } as CardItem; - }); - - let cards = [] as DataReference[]; - - if (action.nextToItem && state.settings.value.displaySettings.insertCardNextToItem) { - const idx = state.currentCards.value.indexOf(action.nextToItem); - - if (state.settings.value.displaySettings.appendCardToBottom) { - const before = state.currentCards.value.slice(0, idx + 1); - const after = state.currentCards.value.slice(idx + 1); - cards = [...before, ...notes, ...after]; - } else { - const before = state.currentCards.value.slice(0, idx); - const after = state.currentCards.value.slice(idx); - cards = [...before, ...notes, ...after]; - } - } else { - if (state.settings.value.displaySettings.appendCardToBottom) { - cards = [...state.currentCards.value, ...notes]; - } else { - cards = [...notes, ...state.currentCards.value]; - } - } - - let cache = { ...state.cardCache }; - for (const n of notes) { - cache = updateInCardCache(n, cache); - } - - return { - ...state, - currentCards: new Storable(cards), - cardCache: cache, - }; - } - - case 'GET_NOTE': { - const note = state.notes.value.find((o) => o.id === action.noteId); - const card: CardItem = { - qry: note.id, - type: CardType.Note, - data: note, - }; - - return reducer(state, { - type: 'ADD_CARD', - card, - nextToItem: action.nextToItem, - }); - } - - case 'UPDATE_NOTES': { - return { - ...state, - notes: action.notes ? action.notes : new Storable([]), - }; - } - - case 'SAVE_NOTE': { - // you may be creating a new note or updating an existing. - // if its an update, you need to update the note in the following: - // * card list could have it. - // * notes list could have it. - // * it could be in any of the saved pages lists... - // so iterate through all of them and if you find the note - // in any of them, swap it out - - const notes = new Storable([ - ...state.notes.value.filter((o) => o.id !== action.note.id), - action.note, - ]); - - const newState = { - ...state, - currentCards: new Storable([...state.currentCards.value]), // you want to trigger an update to the cards if a card update is different. - notes, - }; - - return newState; - } - - case 'DELETE_NOTE': { - // the note may be in any of the following: - // * card list could have it. - // * notes list could have it. - // * it could be in any of the saved pages lists... - // so iterate through all of them and if you find the note - // in any of them, remove it - - const card = state.currentCards.value.find((o) => o.qry === action.note.id); - - const cards = card - ? [ - ...state.currentCards.value.filter((o) => { - return o.type !== CardType.Note || o.qry !== action.note.id; - }), - ] - : state.currentCards.value; // if card is undefined, then it wasn't in the current card list. - - const notes = new Storable([...state.notes.value.filter((o) => o.id !== action.note.id)]); - - const savedPages = new Storable([ - ...(state.savedPages ? state.savedPages.value : []).map((sp) => { - return { - ...sp, - queries: sp.queries.filter((o) => { - return o.type !== CardType.Note || o.qry !== action.note.id; - }), - }; - }), - ]); - - return { - ...state, - currentCards: new Storable(cards), - notes, - savedPages, - cardCache: card - ? removeFromCardCache(getFromCardCache(card, state.cardCache), state.cardCache) - : state.cardCache, - }; - } - - //#endregion - } -} diff --git a/src/src/app/services/app.service.ts b/src/src/app/services/app.service.ts index fbe56ab5..43e8a3de 100644 --- a/src/src/app/services/app.service.ts +++ b/src/src/app/services/app.service.ts @@ -1,41 +1,641 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { User, Settings, DisplaySettings, PageSettings } from '../models/app-state'; -import { Section, BibleReference, Overlap } from '../common/bible-reference'; -import { createStateService } from '../common/state-service'; -import { StorageMap } from '@ngx-pwa/local-storage'; -import { AngularFireDatabase } from '@angular/fire/compat/database'; -import { IStorable, Storable } from '../common/storable'; +import { UUID } from 'angular2-uuid'; +import { lastValueFrom } from 'rxjs'; + +import { moveItem, moveItemUpOrDown } from '../common/array-operations'; +import { BibleReference, Overlap,Section } from '../common/bible-reference'; +import { getFromCardCache,removeFromCardCache, updateInCardCache } from '../common/card-cache-operations'; +import { mergeCardList } from '../common/card-operations'; +import { HashTable } from '../common/hashtable'; +import { MoveDirection } from '../common/move-direction'; +import { createReducingService,IReducingAction } from '../common/state-service'; +import { IStorable, Storable, StorableType } from '../common/storable'; +import { AppState, DisplaySettings, Error,PageSettings, Settings, User } from '../models/app-state'; +import { CardItem, CardType, DataReference } from '../models/card-state'; import { NoteItem } from '../models/note-state'; +import { SavedPage } from '../models/page-state'; import { - Paragraph, - BiblePassage, - BibleVerse, - BibleParagraphPassage, BibleParagraph, + BibleParagraphPassage, + BiblePassage, BiblePassageResult, + BibleVerse, + Paragraph, } from '../models/passage-state'; import { - StrongsDefinition, - StrongsCrossReference, RMACCrossReference, RMACDefinition, + StrongsCrossReference, + StrongsDefinition, StrongsDictionary, StrongsResult, } from '../models/strongs-state'; -import { WordToStem, IndexResult, WordLookupResult } from '../models/words-state'; -import { HashTable } from '../common/hashtable'; -import { MoveDirection } from '../common/move-direction'; -import { reducer } from './app-state-reducer'; -import { initialState } from './app-state-initial-state'; -import { CardItem, CardType, DataReference } from '../models/card-state'; -import { SavedPage } from '../models/page-state'; -import { AppActionFactory } from './app-state-actions'; +import { IndexResult, WordLookupResult,WordToStem } from '../models/words-state'; + +const initialState: AppState = { + user: null, + currentCards: { + type: StorableType.initial, + createdOn: new Date(0).toISOString(), + value: [], + }, + cardCache: {}, + autocomplete: [], + currentSavedPage: null, + savedPages: null, + notes: { + type: StorableType.initial, + createdOn: new Date(0).toISOString(), + value: [], + }, + savedPagesLoaded: false, + error: null, + settings: { + type: StorableType.initial, + createdOn: new Date(0).toISOString(), + value: { + displaySettings: { + showStrongsAsModal: false, + appendCardToBottom: true, + insertCardNextToItem: true, + clearSearchAfterQuery: true, + cardFontSize: 12, + cardFontFamily: 'PT Serif', + showVersesOnNewLine: false, + showVerseNumbers: false, + showParagraphs: true, + showParagraphHeadings: true, + syncCardsAcrossDevices: false, + }, + pageSettings: { + mergeStrategy: Overlap.Equal, + }, + cardIcons: { + words: 'font_download', + passage: 'menu_book', + strongs: 'speaker_notes', + note: 'note', + savedPage: 'inbox', + }, + }, + }, +}; + +interface AppAction extends IReducingAction {} + +export function getNewestStorable(candidate: IStorable, incumbant: IStorable): IStorable { + // if the candidate is null, then return the state. + if (!candidate) { + return incumbant; + } + + // only update if the settings are newer. + if (!incumbant || new Date(candidate.createdOn) > new Date(incumbant.createdOn)) { + return candidate; + } + + // candidate didn't win. return state untouched. + return incumbant; +} + +//#region Saved Pages + +export const savePageAction = (title: string): AppAction => { + return { + handle(state: AppState) { + const savedPages = new Storable([ + ...(state.savedPages ? state.savedPages.value : []), + { + // create a new saved page object + title: title, + id: UUID.UUID().toString(), + queries: [...mergeCardList(state.currentCards.value, state.settings.value.pageSettings.mergeStrategy)], + }, + ]); + + return updateSavedPagesAction(savedPages).handle(state); + }, + }; +}; + +export const updateCurrentPageAction = (): AppAction => { + return { + handle(state: AppState) { + const current = { + id: state.currentSavedPage.id, + title: state.currentSavedPage.title, + queries: [...mergeCardList(state.currentCards.value, state.settings.value.pageSettings.mergeStrategy)], + }; + + const savedPages = new Storable([ + ...state.savedPages.value.filter((o) => o.id !== state.currentSavedPage.id), + current, + ]); + + const item = getNewestStorable(savedPages, state.savedPages); + return { + ...state, + currentSavedPage: current, + savedPagesLoaded: true, + savedPages: item, + }; + }, + }; +}; + +export const updateSavedPagesAction = (oldSavedPages: IStorable): AppAction => { + return { + handle(state: AppState) { + const newSavedPages = getNewestStorable(oldSavedPages, state.savedPages); + + // only true if a currentSavedPage was set, indicating that the user + // is currently looking at a saved page. + const hasCurrentSavedPage = + state.currentSavedPage !== null && + state.currentSavedPage !== undefined && + oldSavedPages.value.some((o) => o.id === state.currentSavedPage.id); + + const currentSavedPage = hasCurrentSavedPage + ? oldSavedPages.value.find((o) => o.id === state.currentSavedPage.id) + : null; + + return { + ...state, + // if the currentSavedPage was loaded, replace it with the info from the + // new savedPages array, as it might have changed. + currentCards: hasCurrentSavedPage ? new Storable(currentSavedPage.queries) : state.currentCards, + currentSavedPage: hasCurrentSavedPage ? currentSavedPage : state.currentSavedPage, + savedPagesLoaded: true, + savedPages: newSavedPages, // update the savedPages + }; + }, + }; +}; + +export const updateSavedPageAction = (savedPage: SavedPage): AppAction => { + return { + handle(state: AppState) { + const newSavedPages = new Storable( + state.savedPages.value.map((o) => { + if (o.id === savedPage.id) { + return savedPage; + } + return o; + }) + ); + + const savedPages = getNewestStorable(newSavedPages, state.savedPages); + return updateSavedPagesAction(savedPages).handle(state); + }, + }; +}; + +export const removeSavedPageAction = (savedPage: SavedPage): AppAction => { + return { + handle(state: AppState) { + const savedPages = new Storable(state.savedPages.value.filter((o) => o.id !== savedPage.id)); + const item = getNewestStorable(savedPages, state.savedPages); + + return { + ...state, + savedPagesLoaded: true, + savedPages: item, + }; + }, + }; +}; + +export const moveSavedPageCardAction = (oldSavedPage: SavedPage, fromIndex: number, toIndex: number): AppAction => { + return { + handle(state: AppState) { + const queries = moveItem(oldSavedPage.queries, fromIndex, toIndex); + const savedPage = { + ...oldSavedPage, + queries, // update the queries. + }; + + return updateSavedPageAction(savedPage).handle(state); + }, + }; +}; + +export const addCardToSavedPageAction = (card: CardItem, pageId: string): AppAction => { + return { + handle(state: AppState) { + const savedPages = new Storable([ + ...(state.savedPages ? state.savedPages.value : []).map((o) => { + if (o.id.toString() === pageId) { + let references = [] as DataReference[]; + if (state.settings.value.displaySettings.appendCardToBottom) { + references = [...o.queries, card]; + } else { + references = [card, ...o.queries]; + } + return { + ...o, + queries: mergeCardList(references, state.settings.value.pageSettings.mergeStrategy), + }; + } + return o; + }), + ]); + + return updateSavedPagesAction(savedPages).handle(state); + }, + }; +}; + +//#endregion + +//#region Cards + +export const addCardsAction = (cardsToAdd: CardItem[], nextToItem: CardItem): AppAction => { + return { + handle(state: AppState) { + let cards = [...state.currentCards.value]; + let cache = state.cardCache; + + for (let card of cardsToAdd) { + if (nextToItem && state.settings.value.displaySettings.insertCardNextToItem) { + const idx = cards.indexOf(nextToItem); + + if (state.settings.value.displaySettings.appendCardToBottom) { + const before = cards.slice(0, idx + 1); + const after = cards.slice(idx + 1); + cards = [...before, card, ...after]; + } else { + const before = cards.slice(0, idx); + const after = cards.slice(idx); + cards = [...before, card, ...after]; + } + } else { + if (state.settings.value.displaySettings.appendCardToBottom) { + cards = [...cards, card]; + } else { + cards = [card, ...cards]; + } + } + cache = updateInCardCache(card, state.cardCache); + } + return { + ...state, + currentCards: new Storable(cards), + cardCache: cache, + }; + }, + }; +}; + +export const updateCardAction = (newCard: CardItem, oldCard: CardItem): AppAction => { + return { + handle(state: AppState) { + return { + ...state, + currentCards: new Storable( + state.currentCards.value.map((c) => { + if (c === oldCard) { + return newCard; + } + return c; + }) + ), + cardCache: updateInCardCache(newCard, removeFromCardCache(oldCard, state.cardCache)), + }; + }, + }; +}; + +export const removeCardAction = (card: CardItem): AppAction => { + return { + handle(state: AppState) { + // potentially remove card from a saved page. + const currentSavedPage = + state.currentSavedPage !== null + ? { + ...state.currentSavedPage, + queries: state.currentSavedPage.queries.filter((q) => q !== card), + } + : null; + + const savedPages = + state.currentSavedPage !== null + ? new Storable( + (state.savedPages ? state.savedPages.value : []).map((o) => { + if (o === state.currentSavedPage) { + return currentSavedPage; + } + return o; + }) + ) + : state.savedPages; + + return { + ...state, + currentSavedPage, + savedPages, + currentCards: new Storable([...state.currentCards.value.filter((c) => c !== card)]), + cardCache: removeFromCardCache(card, state.cardCache), + }; + }, + }; +}; + +export const moveCardAction = (card: CardItem, direction: MoveDirection): AppAction => { + return { + handle(state: AppState) { + const cards = moveItemUpOrDown(state.currentCards.value, card, direction); + + return { + ...state, + currentCards: new Storable(cards), + }; + }, + }; +}; + +export const updateCardsAction = (cards: IStorable): AppAction => { + return { + handle(state: AppState) { + let cardCache = { ...state.cardCache }; + for (const card of cards.value) { + cardCache = updateInCardCache(card, cardCache); + } + return { + ...state, + currentCards: cards, + cardCache, + }; + }, + }; +}; + +export const clearCardsAction = (): AppAction => { + return { + handle(state: AppState) { + return { + ...state, + currentCards: new Storable([]), + }; + }, + }; +}; + +//#endregion + +//#region General + +export const updateErrorAction = (error: Error): AppAction => { + return { + handle(state: AppState) { + return { + ...state, + error: error, + }; + }, + }; +}; + +export const setUserAction = (user: User): AppAction => { + return { + handle(state: AppState) { + return { + ...state, + user: user, + }; + }, + }; +}; + +export const updateAutoCompleteAction = (words: string[]): AppAction => { + return { + handle(state: AppState) { + return { + ...state, + autocomplete: [...words], + }; + }, + }; +}; + +//#endregion + +//#region Settings + +export const updateSettingsAction = (settings: IStorable): AppAction => { + return { + handle(state: AppState) { + const item = getNewestStorable(settings, state.settings); + + return { + ...state, + settings: item, + }; + }, + }; +}; + +export const updateCardMergeStrategyAction = (mergeStrategy: Overlap): AppAction => { + return { + handle(state: AppState) { + const settings = new Storable({ + ...state.settings.value, + pageSettings: { + ...state.settings.value.pageSettings, + mergeStrategy: mergeStrategy, + }, + }); + return updateSettingsAction(settings).handle(state); + }, + }; +}; + +export const updateCardFontSizeAction = (cardFontSize: number): AppAction => { + return { + handle(state: AppState) { + const settings = new Storable({ + ...state.settings.value, + displaySettings: { + ...state.settings.value.displaySettings, + cardFontSize: cardFontSize, + }, + }); + + return updateSettingsAction(settings).handle(state); + }, + }; +}; + +export const updateCardFontFamilyAction = (cardFontFamily: string): AppAction => { + return { + handle(state: AppState) { + const settings = new Storable({ + ...state.settings.value, + displaySettings: { + ...state.settings.value.displaySettings, + cardFontFamily: cardFontFamily, + }, + }); + + return updateSettingsAction(settings).handle(state); + }, + }; +}; + +//#endregion + +//#region Notes + +export const findNotesAction = (qry: string, nextToItem: CardItem): AppAction => { + return { + handle(state: AppState) { + const notes = state.notes.value + .filter((o) => o.title.search(qry) > -1) + .map((o) => { + return { + qry: o.id, + type: CardType.Note, + data: o, + } as CardItem; + }); + + let cards = [] as DataReference[]; + + if (nextToItem && state.settings.value.displaySettings.insertCardNextToItem) { + const idx = state.currentCards.value.indexOf(nextToItem); + + if (state.settings.value.displaySettings.appendCardToBottom) { + const before = state.currentCards.value.slice(0, idx + 1); + const after = state.currentCards.value.slice(idx + 1); + cards = [...before, ...notes, ...after]; + } else { + const before = state.currentCards.value.slice(0, idx); + const after = state.currentCards.value.slice(idx); + cards = [...before, ...notes, ...after]; + } + } else { + if (state.settings.value.displaySettings.appendCardToBottom) { + cards = [...state.currentCards.value, ...notes]; + } else { + cards = [...notes, ...state.currentCards.value]; + } + } + + let cache = { ...state.cardCache }; + for (const n of notes) { + cache = updateInCardCache(n, cache); + } + + return { + ...state, + currentCards: new Storable(cards), + cardCache: cache, + }; + }, + }; +}; + +export const getNotesAction = (noteId: string, nextToItem: CardItem): AppAction => { + return { + handle(state: AppState) { + const note = state.notes.value.find((o) => o.id === noteId); + const card: CardItem = { + qry: note.id, + type: CardType.Note, + data: note, + }; + + return addCardsAction([card], nextToItem).handle(state); + }, + }; +}; + +export const updateNotesAction = (notes: IStorable): AppAction => { + return { + handle(state: AppState) { + return { + ...state, + notes: notes ? notes : new Storable([]), + }; + }, + }; +}; + +export const saveNoteAction = (note: NoteItem): AppAction => { + return { + handle(state: AppState) { + // you may be creating a new note or updating an existing. + // if its an update, you need to update the note in the following: + // * card list could have it. + // * notes list could have it. + // * it could be in any of the saved pages lists... + // so iterate through all of them and if you find the note + // in any of them, swap it out + + const notes = new Storable([...state.notes.value.filter((o) => o.id !== note.id), note]); + + return { + ...state, + // you want to trigger an update to the cards if a card update is different. + currentCards: new Storable([...state.currentCards.value]), + notes, + }; + }, + }; +}; + +export const deleteNoteAction = (note: NoteItem): AppAction => { + return { + handle(state: AppState) { + // the note may be in any of the following: + // * card list could have it. + // * notes list could have it. + // * it could be in any of the saved pages lists... + // so iterate through all of them and if you find the note + // in any of them, remove it + + const card = state.currentCards.value.find((o) => o.qry === note.id); + + const cards = card + ? [ + ...state.currentCards.value.filter((o) => { + return o.type !== CardType.Note || o.qry !== note.id; + }), + ] + : state.currentCards.value; // if card is undefined, then it wasn't in the current card list. + + const notes = new Storable([...state.notes.value.filter((o) => o.id !== note.id)]); + + const savedPages = new Storable([ + ...(state.savedPages ? state.savedPages.value : []).map((sp) => { + return { + ...sp, + queries: sp.queries.filter((o) => { + return o.type !== CardType.Note || o.qry !== note.id; + }), + }; + }), + ]); + + return { + ...state, + currentCards: new Storable(cards), + notes, + savedPages, + cardCache: card + ? removeFromCardCache(getFromCardCache(card, state.cardCache), state.cardCache) + : state.cardCache, + }; + }, + }; +}; + +//#endregion @Injectable({ providedIn: 'root', }) -export class AppService extends createStateService(reducer, initialState) { +export class AppService extends createReducingService(initialState) { private wordToStem: Map; private paragraphs: HashTable; private searchIndexArray: string[]; @@ -109,7 +709,7 @@ export class AppService extends createStateService(reducer, initialState) { ]); private readonly dataPath = 'assets/data'; - constructor(private http: HttpClient, private localStorageService: StorageMap, private db: AngularFireDatabase) { + constructor(private http: HttpClient) { super(); this.searchIndexArray = this.buildIndexArray().sort(); @@ -118,20 +718,74 @@ export class AppService extends createStateService(reducer, initialState) { //#region General dispatchError(msg: string) { - this.dispatch({ - type: 'UPDATE_ERROR', - error: { - msg, - }, - }); + this.dispatch(updateErrorAction({ msg })); console.log(msg); } setUser(user: User) { - this.dispatch({ - type: 'SET_USER', - user, - }); + this.dispatch(setUserAction(user)); + } + + async getAutoComplete(keyword: string) { + if (!this.autocomplete) { + // if you have't populated the word list yet, do so... + const data = await lastValueFrom(this.http.get(`${this.dataPath}/index/word_to_stem_idx.json`)); + this.autocomplete = data.map((o) => o.w); + } + + let qry = keyword; + let prefix = ''; + const idx = qry.lastIndexOf(';'); + const words: string[] = []; + + if (idx > -1) { + qry = keyword.substring(idx + 1).trim(); + prefix = keyword.substring(0, idx).trim() + '; '; + } + + qry = qry.split('"').join(''); // remove any quotes, just in case + + if (qry.search(/\d/i) === -1) { + // its a word + for (const item of BibleReference.Books) { + if ( + item.name !== 'Unknown' && + (item.name.toLowerCase().indexOf(qry.toLowerCase()) > -1 || + item.abbreviation.toLowerCase().indexOf(qry.toLowerCase()) > -1) + ) { + words.push(prefix + item.name); + if (words.length > 2) { + break; + } + } + } + + for (const item of this.autocomplete) { + if (item.toLowerCase().indexOf(qry.toLowerCase()) > -1) { + words.push(prefix + item); + if (words.length > 6) { + break; + } + } + } + + this.dispatch(updateAutoCompleteAction(words)); + } else if (qry.search(/(h|g)\d/i) !== -1) { + // its a strongs lookup + if (qry.substring(0, 1).toUpperCase() === 'H') { + const num = parseInt(qry.substring(1), 10); + for (let x = num; x < num + 10 && x < 8675; x++) { + words.push('H' + x); + } + } else if (qry.substring(0, 1).toUpperCase() === 'G') { + const num = parseInt(qry.substring(1), 10); + for (let x = num; x < num + 10 && x < 5625; x++) { + words.push('G' + x); + } + } + + this.dispatch(updateAutoCompleteAction(words)); + } } //#endregion @@ -139,11 +793,11 @@ export class AppService extends createStateService(reducer, initialState) { //#region Cards removeCard(card: CardItem) { - this.dispatch(AppActionFactory.newRemoveCard(card)); + this.dispatch(removeCardAction(card)); } moveCard(card: CardItem, direction: MoveDirection) { - this.dispatch(AppActionFactory.newMoveCard(card, direction)); + this.dispatch(moveCardAction(card, direction)); } async addCard(qry: string, nextToItem: CardItem = null) { @@ -151,18 +805,18 @@ export class AppService extends createStateService(reducer, initialState) { if (!card) { return; } - this.dispatch(AppActionFactory.newAddCard(card, nextToItem)); + this.dispatch(addCardsAction([card], nextToItem)); } async updateCards(queries: IStorable) { - const cards: CardItem[] = []; const values = queries.value ?? []; + const cards: CardItem[] = []; for (const q of values) { const card = await this.getCardByQuery(q.qry.trim(), q.type); cards.push(card); } this.dispatch( - AppActionFactory.newUpdateCards({ + updateCardsAction({ type: queries.type, createdOn: queries.createdOn, value: cards, @@ -170,6 +824,10 @@ export class AppService extends createStateService(reducer, initialState) { ); } + async clearCards() { + this.dispatch(clearCardsAction()); + } + private async getCardByQuery(qry: string, type?: CardType): Promise { if (qry.startsWith('note:')) { const q = qry.toLocaleLowerCase().trim().replace('note:', ''); @@ -192,7 +850,7 @@ export class AppService extends createStateService(reducer, initialState) { type: CardType.Note, data, } as CardItem; - } else if (qry.search(/[0-9]/i) === -1) { + } else if (qry.search(/\d/i) === -1) { // // its a search term. const data = await this.getWordsFromApi(qry); if (!data) { @@ -203,7 +861,7 @@ export class AppService extends createStateService(reducer, initialState) { type: CardType.Word, data, } as CardItem; - } else if (qry.search(/(H|G)[0-9]/i) !== -1) { + } else if (qry.search(/(h|g)\d/i) !== -1) { // its a strongs lookup const dict = qry.substring(0, 1).search(/h/i) !== -1 ? 'heb' : 'grk'; const strongsNumber = qry.substring(1, qry.length); @@ -237,62 +895,62 @@ export class AppService extends createStateService(reducer, initialState) { cards.push(await this.getCardByQuery(ref.qry, ref.type)); } - this.dispatch(AppActionFactory.newUpdateCards(new Storable(cards))); + this.dispatch(updateCardsAction(new Storable(cards))); } savePage(title: string) { - this.dispatch(AppActionFactory.newSavePage(title)); + this.dispatch(savePageAction(title)); } updateCurrentSavedPage() { - this.dispatch(AppActionFactory.newUpdateCurrentPage()); + this.dispatch(updateCurrentPageAction()); } updateSavedPages(savedPages: IStorable) { - this.dispatch(AppActionFactory.newUpdateSavedPages(savedPages)); + this.dispatch(updateSavedPagesAction(savedPages)); } updateSavedPage(savedPage: SavedPage) { - this.dispatch(AppActionFactory.newUpdateSavedPage(savedPage)); + this.dispatch(updateSavedPageAction(savedPage)); } removeSavedPage(savedPage: SavedPage) { - this.dispatch(AppActionFactory.newRemoveSavedPage(savedPage)); + this.dispatch(removeSavedPageAction(savedPage)); } moveSavedPageCard(savedPage: SavedPage, fromIndex: number, toIndex: number) { - this.dispatch(AppActionFactory.newMoveSavedPageCard(savedPage, fromIndex, toIndex)); + this.dispatch(moveSavedPageCardAction(savedPage, fromIndex, toIndex)); } addCardToSavedPage(pageId: string, card: CardItem) { - this.dispatch(AppActionFactory.newAddCardToSavedPage(card, pageId)); + this.dispatch(addCardToSavedPageAction(card, pageId)); } //#endregion //#region Settings - updateCardMergeStrategy(strategy: Overlap) { - this.dispatch(AppActionFactory.newUpdateCardMergeStrategy(strategy)); + updateSettings(settings: IStorable) { + this.dispatch(updateSettingsAction(settings)); } - changeCardFontFamily(cardFont: string) { - this.dispatch(AppActionFactory.newUpdateCardFontFamily(cardFont)); + updateCardMergeStrategy(strategy: Overlap) { + this.dispatch(updateCardMergeStrategyAction(strategy)); } changeCardFontSize(size: number) { - this.dispatch(AppActionFactory.newUpdateCardFontSize(size)); + this.dispatch(updateCardFontSizeAction(size)); } - updateSettings(settings: IStorable) { - this.dispatch(AppActionFactory.newUpdateSettings(settings)); + changeCardFontFamily(cardFont: string) { + this.dispatch(updateCardFontFamilyAction(cardFont)); } updateDisplaySettings(displaySettings: DisplaySettings) { const state = this.getState(); this.dispatch( - AppActionFactory.newUpdateSettings( + updateSettingsAction( new Storable({ ...state.settings.value, displaySettings, @@ -305,7 +963,7 @@ export class AppService extends createStateService(reducer, initialState) { const state = this.getState(); this.dispatch( - AppActionFactory.newUpdateSettings( + updateSettingsAction( new Storable({ ...state.settings.value, pageSettings, @@ -319,36 +977,40 @@ export class AppService extends createStateService(reducer, initialState) { //#region Notes findNotes(qry: string, nextToItem: CardItem = null) { - this.dispatch(AppActionFactory.newFindNotes(qry, nextToItem)); + this.dispatch(findNotesAction(qry, nextToItem)); } async getNote(noteId: string, nextToItem: CardItem = null) { - this.dispatch(AppActionFactory.newGetNote(noteId, nextToItem)); + this.dispatch(getNotesAction(noteId, nextToItem)); } updateNotes(notes: IStorable) { - this.dispatch(AppActionFactory.newUpdateNotes(notes)); + this.dispatch(updateNotesAction(notes)); } saveNote(note: NoteItem) { - this.dispatch(AppActionFactory.newSaveNote(note)); + this.dispatch(saveNoteAction(note)); } deleteNote(note: NoteItem) { - this.dispatch(AppActionFactory.newDeleteNote(note)); + this.dispatch(deleteNoteAction(note)); } //#endregion //#region Strongs - async getStrongs(strongsNumber: string, dict: StrongsDictionary, nextToItem: CardItem = null) { - const card = await this.getStrongsCard(strongsNumber, dict); - if (!card) { - return; // nothing was returned. so an error occurred. + async getStrongs(strongsNumber: string[], dict: StrongsDictionary, nextToItem: CardItem = null) { + const cards = []; + for (const sn of strongsNumber) { + const card = await this.getStrongsCard(sn, dict); + cards.push(card); + } + if (cards.length < 1) { + return; } - this.dispatch(AppActionFactory.newAddCard(card, nextToItem)); + this.dispatch(addCardsAction(cards, nextToItem)); } async getStrongsCard(strongsNumber: string, dict: StrongsDictionary) { @@ -398,7 +1060,7 @@ export class AppService extends createStateService(reducer, initialState) { let url = `${dict}${Math.ceil(sn / 100)}.json`; try { - const d = await this.http.get(`${this.dataPath}/strongs/${url}`).toPromise(); + const d = await lastValueFrom(this.http.get(`${this.dataPath}/strongs/${url}`)); result.def = d.find((el) => el.i === result.prefix + result.sn); } catch (err) { this.dispatchError(`Unable to retrieve Strong's Data for ${result.prefix}${result.sn}`); @@ -406,7 +1068,7 @@ export class AppService extends createStateService(reducer, initialState) { } try { - const d = await this.http.get(`${this.dataPath}/strongscr/cr${url}`).toPromise(); + const d = await lastValueFrom(this.http.get(`${this.dataPath}/strongscr/cr${url}`)); result.crossrefs = d.find((o) => o.id.toUpperCase() === result.prefix + result.sn); } catch (err) { @@ -421,10 +1083,10 @@ export class AppService extends createStateService(reducer, initialState) { // rmac is a two get process. // first, get the rmac code. try { - const rmacCrossReferences = await this.http.get(url).toPromise(); + const rmacCrossReferences = await lastValueFrom(this.http.get(url)); // deal with RMAC - const referencesForThisStrongsNumber = rmacCrossReferences.filter((el, i) => { + const referencesForThisStrongsNumber = rmacCrossReferences.filter((el) => { return el.i === sn.toString(); }); @@ -442,7 +1104,7 @@ export class AppService extends createStateService(reducer, initialState) { url = `${this.dataPath}/rmac/r-${result.rmaccode.substring(0, 1)}.json`; try { - const rmacDefinitions = await this.http.get(url).toPromise(); + const rmacDefinitions = await lastValueFrom(this.http.get(url)); result.rmac = rmacDefinitions.find((o) => o.id.toLowerCase() === result.rmaccode); } catch (err) { this.dispatchError('Unable to retrieve RMAC'); @@ -452,6 +1114,7 @@ export class AppService extends createStateService(reducer, initialState) { } return result as StrongsResult; } + //#endregion //#region Bible Passages @@ -462,13 +1125,13 @@ export class AppService extends createStateService(reducer, initialState) { return; // nothing was returned. so an error occurred. } - this.dispatch(AppActionFactory.newAddCard(card, nextToItem)); + this.dispatch(addCardsAction([card], nextToItem)); } async updatePassage(oldCard: CardItem, ref: BibleReference) { const newCard = await this.composeBiblePassageCardItem(ref); - this.dispatch(AppActionFactory.newUpdateCard(newCard, oldCard)); + this.dispatch(updateCardAction(newCard, oldCard)); } private async composeBiblePassageCardItem(ref: BibleReference) { @@ -500,9 +1163,9 @@ export class AppService extends createStateService(reducer, initialState) { for (let i = Number(section.start.chapter); i <= Number(section.end.chapter); i++) { try { - const d = await this.http - .get(`${this.dataPath}/bibles/kjv_strongs/${section.book.bookNumber}-${i}.json`) - .toPromise(); + const d = await lastValueFrom( + this.http.get(`${this.dataPath}/bibles/kjv_strongs/${section.book.bookNumber}-${i}.json`) + ); chapters.push(d); } catch (err) { this.dispatchError(`Unable to retrieve bible passage ${BibleReference.toString(section)}.`); @@ -577,7 +1240,7 @@ export class AppService extends createStateService(reducer, initialState) { private async convertToParagraphPassages(chapters: BiblePassage[], section: Section) { // get the paragraphs the first time if you haven't already. if (!this.paragraphs) { - this.paragraphs = await this.http.get>(`${this.dataPath}/bibles/paras.json`).toPromise(); + this.paragraphs = await lastValueFrom(this.http.get>(`${this.dataPath}/bibles/paras.json`)); } const passages: BibleParagraphPassage[] = []; @@ -603,7 +1266,6 @@ export class AppService extends createStateService(reducer, initialState) { // create an initial paragraph to hold verses that might come before a paragraph. let para = { p: { h: '', p: 0 }, vss: [] }; const paras = []; - const vss: BibleVerse[] = []; // for each verse in the chapter, break them into paragraphs. for (const v of ch.vss) { @@ -651,7 +1313,7 @@ export class AppService extends createStateService(reducer, initialState) { data: result, } as CardItem; - this.dispatch(AppActionFactory.newAddCard(card, nextToItem)); + this.dispatch(addCardsAction([card], nextToItem)); } private async getWordsFromApi(qry: string): Promise { @@ -674,12 +1336,11 @@ export class AppService extends createStateService(reducer, initialState) { } if (!this.wordToStem.has(q)) { - this.dispatch({ - type: 'UPDATE_ERROR', - error: { + this.dispatch( + updateErrorAction({ msg: `Unable to find the word "${q}" in any passages.`, - }, - }); + }) + ); return; } @@ -711,23 +1372,21 @@ export class AppService extends createStateService(reducer, initialState) { // that is shared by all of them. IF not, we can just return those refs. if (results.length === 0) { if (excluded.length > 0) { - this.dispatch({ - type: 'UPDATE_ERROR', - error: { - msg: `The ${excluded.length > 1 ? 'words' : 'word'} "${excluded.reduce((prev, curr, idx, arr) => { + this.dispatch( + updateErrorAction({ + msg: `The ${excluded.length > 1 ? 'words' : 'word'} "${excluded.reduce((prev, curr) => { return `${prev}, ${curr}`; })}" ${excluded.length > 1 ? 'have' : 'has'} been excluded from search because it is too common.`, - }, - }); + }) + ); return; } - this.dispatch({ - type: 'UPDATE_ERROR', - error: { + this.dispatch( + updateErrorAction({ msg: `No passages found for query: ${qry}.`, - }, - }); + }) + ); return; } @@ -767,19 +1426,18 @@ export class AppService extends createStateService(reducer, initialState) { private async getStemWordIndex() { this.wordToStem = new Map(); try { - const r = await this.http.get(`${this.dataPath}/index/word_to_stem_idx.json`).toPromise(); + const r = await lastValueFrom(this.http.get(`${this.dataPath}/index/word_to_stem_idx.json`)); // find the right word for (const i of r) { this.wordToStem.set(i.w, i.s); } } catch (err) { - this.dispatch({ - type: 'UPDATE_ERROR', - error: { + this.dispatch( + updateErrorAction({ msg: err, - }, - }); + }) + ); return; } } @@ -795,14 +1453,13 @@ export class AppService extends createStateService(reducer, initialState) { let r: IndexResult[]; try { - r = await this.http.get(url).toPromise(); + r = await lastValueFrom(this.http.get(url)); } catch (err) { - this.dispatch({ - type: 'UPDATE_ERROR', - error: { + this.dispatch( + updateErrorAction({ msg: err, - }, - }); + }) + ); return; } // find the right word @@ -1106,70 +1763,4 @@ export class AppService extends createStateService(reducer, initialState) { } //#endregion - - //#region Auto Complete - - async getAutoComplete(keyword: string) { - if (!this.autocomplete) { - // if you have't populated the word list yet, do so... - const data = await this.http.get(`${this.dataPath}/index/word_to_stem_idx.json`).toPromise(); - this.autocomplete = data.map((o) => o.w); - } - - let qry = keyword; - let prefix = ''; - const idx = qry.lastIndexOf(';'); - const words: string[] = []; - - if (idx > -1) { - qry = keyword.substr(idx + 1).trim(); - prefix = keyword.substr(0, idx).trim() + '; '; - } - - qry = qry.split('"').join(''); // remove any quotes, just in case - - if (qry.search(/[0-9]/i) === -1) { - // its a word - for (const item of BibleReference.Books) { - if ( - item.name !== 'Unknown' && - (item.name.toLowerCase().indexOf(qry.toLowerCase()) > -1 || - item.abbreviation.toLowerCase().indexOf(qry.toLowerCase()) > -1) - ) { - words.push(prefix + item.name); - if (words.length > 2) { - break; - } - } - } - - for (const item of this.autocomplete) { - if (item.toLowerCase().indexOf(qry.toLowerCase()) > -1) { - words.push(prefix + item); - if (words.length > 6) { - break; - } - } - } - - this.dispatch(AppActionFactory.newUpdateAutocomplete(words)); - } else if (qry.search(/(H|G)[0-9]/i) !== -1) { - // its a strongs lookup - if (qry.substr(0, 1).toUpperCase() === 'H') { - const num = parseInt(qry.substr(1), 10); - for (let x = num; x < num + 10 && x < 8675; x++) { - words.push('H' + x); - } - } else if (qry.substr(0, 1).toUpperCase() === 'G') { - const num = parseInt(qry.substr(1), 10); - for (let x = num; x < num + 10 && x < 5625; x++) { - words.push('G' + x); - } - } - - this.dispatch(AppActionFactory.newUpdateAutocomplete(words)); - } - } - - //#endregion } diff --git a/src/src/app/services/migration0to1.service.ts b/src/src/app/services/migration0to1.service.ts index de328fc9..cf081137 100644 --- a/src/src/app/services/migration0to1.service.ts +++ b/src/src/app/services/migration0to1.service.ts @@ -2,13 +2,14 @@ import { Injectable } from '@angular/core'; import { AngularFireDatabase, AngularFireObject } from '@angular/fire/compat/database'; import { DataSnapshot } from '@angular/fire/compat/database/interfaces'; import { UUID } from 'angular2-uuid'; -import { AppService } from './app.service'; + import { Overlap } from '../common/bible-reference'; -import { Settings, User } from '../models/app-state'; -import { SavedPage } from '../models/page-state'; -import { CardType, DataReference } from '../models/card-state'; -import { StorageService } from './storage.service'; import { Storable, StorableType } from '../common/storable'; +import { Settings, User } from '../models/app-state'; +import { CardType, DataReference } from '../models/card-state'; +import { SavedPage } from '../models/page-state'; +import { AppService } from './app.service'; +import { StorageService } from './storage.service'; @Injectable({ providedIn: 'root', diff --git a/src/src/app/services/storage.service.ts b/src/src/app/services/storage.service.ts index ee82a1a1..cb5fb5de 100644 --- a/src/src/app/services/storage.service.ts +++ b/src/src/app/services/storage.service.ts @@ -1,19 +1,19 @@ import { Injectable } from '@angular/core'; -import { StorageMap } from '@ngx-pwa/local-storage'; import { AngularFireDatabase, AngularFireObject } from '@angular/fire/compat/database'; import { DataSnapshot } from '@angular/fire/compat/database/interfaces'; +import { StorageMap } from '@ngx-pwa/local-storage'; +import { createSelector } from 'reselect'; +import { lastValueFrom } from 'rxjs'; -import { SubscriberBase } from '../common/subscriber-base'; +import { isNullOrUndefined } from '../common/helpers'; import { IStorable, StorableType, UserVersion } from '../common/storable'; -import { AppService } from './app.service'; -import { MigrationVersion0to1 } from './migration0to1.service'; - -import { User, Settings, AppState } from '../models/app-state'; +import { SubscriberBase } from '../common/subscriber-base'; +import { AppState,Settings, User } from '../models/app-state'; +import { DataReference } from '../models/card-state'; import { NoteItem } from '../models/note-state'; import { SavedPage } from '../models/page-state'; -import { isNullOrUndefined } from '../common/helpers'; -import { DataReference } from '../models/card-state'; -import { createSelector } from 'reselect'; +import { AppService } from './app.service'; +import { MigrationVersion0to1 } from './migration0to1.service'; /** * This class handles all the storage needs of the application. It handles both @@ -186,9 +186,9 @@ export class StorageService extends SubscriberBase { } private async getFromLocal(path: string, action: (storable: IStorable) => void) { - const hasStorable = await this.local.has(path).toPromise(); + const hasStorable = await lastValueFrom(this.local.has(path)); if (hasStorable) { - const localData = (await this.local.get(path).toPromise()) as IStorable; + const localData = (await lastValueFrom(this.local.get(path))) as IStorable; // console.log('Data recieved from local store', localData); action(localData); } @@ -206,14 +206,14 @@ export class StorageService extends SubscriberBase { // console.log('Data saved to local store', data); // update local - this.local.set(this.settingsPath, data).subscribe( - () => { - // nop - }, - // error - () => { - this.appService.dispatchError(`Something went wrong and the Settings weren't saved. :(`); - } + this.addSubscription( + this.local.set(this.settingsPath, data).subscribe({ + next: () => {}, + complete: () => {}, + error: () => { + this.appService.dispatchError(`Something went wrong and the Settings weren't saved. :(`); + }, + }) ); // update remote @@ -232,14 +232,14 @@ export class StorageService extends SubscriberBase { // console.log('Data saved to local store', data); // update local - this.local.set(this.savedPagesPath, data).subscribe( - () => { - // nop - }, - // error - () => { - this.appService.dispatchError(`Something went wrong and the Page wasn't saved. :(`); - } + this.addSubscription( + this.local.set(this.savedPagesPath, data).subscribe({ + next: () => {}, + complete: () => {}, + error: () => { + this.appService.dispatchError(`Something went wrong and the Page wasn't saved. :(`); + }, + }) ); // update remote @@ -258,14 +258,14 @@ export class StorageService extends SubscriberBase { // console.log('Data saved to local store', data); // update local - this.local.set(this.noteItemsPath, data).subscribe( - () => { - // nop - }, - // error - () => { - this.appService.dispatchError(`Something went wrong and the Note wasn't saved. :(`); - } + this.addSubscription( + this.local.set(this.noteItemsPath, data).subscribe({ + next: () => {}, + complete: () => {}, + error: () => { + this.appService.dispatchError(`Something went wrong and the Note wasn't saved. :(`); + }, + }) ); // update remote @@ -289,15 +289,15 @@ export class StorageService extends SubscriberBase { } // update local - this.local.set(this.cardsPath, v.currentCards).subscribe({ - next: () => { - // nop - }, - // error - error: () => { - this.appService.dispatchError(`Something went wrong and the current cards weren't saved. :(`); - }, - }); + this.addSubscription( + this.local.set(this.cardsPath, v.currentCards).subscribe({ + next: () => {}, + complete: () => {}, + error: () => { + this.appService.dispatchError(`Something went wrong and the current cards weren't saved. :(`); + }, + }) + ); // since you updated the local variable above, this remote update will // get picked up by the remote subscription below. diff --git a/src/src/test.ts b/src/src/test.ts index caf71351..bb0c8856 100644 --- a/src/src/test.ts +++ b/src/src/test.ts @@ -1,4 +1,5 @@ import 'zone.js/testing'; + import { getTestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, diff --git a/src/tsconfig.app.json b/src/tsconfig.app.json index 82d91dc4..19e4aa33 100644 --- a/src/tsconfig.app.json +++ b/src/tsconfig.app.json @@ -5,11 +5,6 @@ "outDir": "./out-tsc/app", "types": [] }, - "files": [ - "src/main.ts", - "src/polyfills.ts" - ], - "include": [ - "src/**/*.d.ts" - ] + "files": ["src/main.ts", "src/polyfills.ts"], + "include": ["src/**/*.d.ts"], } diff --git a/src/tsconfig.json b/src/tsconfig.json index f81bf877..1b20e0c3 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -1,4 +1,3 @@ -/* To learn more about this file see: https://angular.io/config/tsconfig. */ { "compileOnSave": false, "compilerOptions": { @@ -15,5 +14,9 @@ "target": "es2022", "module": "ESNext", "lib": ["es2018", "dom"] - } + }, + "angularCompilerOptions": { + "strictTemplates": true + }, + "include": ["src/**/*.ts"] } diff --git a/src/tsconfig.spec.json b/src/tsconfig.spec.json index 092345b0..669344f8 100644 --- a/src/tsconfig.spec.json +++ b/src/tsconfig.spec.json @@ -3,16 +3,8 @@ "extends": "./tsconfig.json", "compilerOptions": { "outDir": "./out-tsc/spec", - "types": [ - "jasmine" - ] + "types": ["jasmine"] }, - "files": [ - "src/test.ts", - "src/polyfills.ts" - ], - "include": [ - "src/**/*.spec.ts", - "src/**/*.d.ts" - ] + "files": ["src/test.ts", "src/polyfills.ts"], + "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] }