From ea985f727b26d82ad5bc8c29fe4aa21dbf1d161e Mon Sep 17 00:00:00 2001 From: "Mathias Schaefer (molily)" Date: Sun, 31 Oct 2021 13:44:47 +0100 Subject: [PATCH 1/4] Use template-driven forms --- client/.eslintrc.json | 33 +- client/README.md | 12 +- client/angular.json | 30 +- client/package-lock.json | 1270 +++++++++++------ client/package.json | 28 +- client/src/app/app.module.ts | 6 +- .../control-errors.component.html | 6 +- .../control-errors.component.spec.ts | 81 +- .../control-errors.component.ts | 49 +- .../signup-form/signup-form.component.html | 119 +- .../signup-form/signup-form.component.scss | 12 +- .../signup-form/signup-form.component.spec.ts | 28 +- .../signup-form/signup-form.component.ts | 108 +- .../directives/async-validator.directive.ts | 34 + .../error-message.directive.spec.ts | 3 +- .../app/directives/error-message.directive.ts | 37 +- client/src/app/sass/variables.scss | 6 +- client/src/app/services/signup.service.ts | 2 +- client/src/styles.scss | 2 +- 19 files changed, 1160 insertions(+), 706 deletions(-) create mode 100644 client/src/app/directives/async-validator.directive.ts diff --git a/client/.eslintrc.json b/client/.eslintrc.json index 1e4624e..d28d50a 100644 --- a/client/.eslintrc.json +++ b/client/.eslintrc.json @@ -1,18 +1,11 @@ { "root": true, - "ignorePatterns": [ - "projects/**/*" - ], + "ignorePatterns": ["projects/**/*"], "overrides": [ { - "files": [ - "*.ts" - ], + "files": ["*.ts"], "parserOptions": { - "project": [ - "tsconfig.json", - "e2e/tsconfig.json" - ], + "project": ["tsconfig.json"], "createDefaultProgram": true }, "extends": [ @@ -20,31 +13,27 @@ "plugin:@angular-eslint/template/process-inline-templates" ], "rules": { - "@angular-eslint/component-selector": [ + "@angular-eslint/directive-selector": [ "error", { + "type": "attribute", "prefix": "app", - "style": "kebab-case", - "type": "element" + "style": "camelCase" } ], - "@angular-eslint/directive-selector": [ + "@angular-eslint/component-selector": [ "error", { + "type": "element", "prefix": "app", - "style": "camelCase", - "type": "attribute" + "style": "kebab-case" } ] } }, { - "files": [ - "*.html" - ], - "extends": [ - "plugin:@angular-eslint/template/recommended" - ], + "files": ["*.html"], + "extends": ["plugin:@angular-eslint/template/recommended"], "rules": {} } ] diff --git a/client/README.md b/client/README.md index 58f3e01..53c2145 100644 --- a/client/README.md +++ b/client/README.md @@ -4,17 +4,19 @@ Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. -## Code scaffolding - -Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. - ## Build Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. ## Running unit tests -Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). +Run `ng test` to execute the unit tests. + +## Running accessibility tests + +Run `npm run a11y` to start a dev server and execute the accessibility tests. + +Run `npm run pa11y-ci` to run the accessibility tests against an already running dev server. ## Further help diff --git a/client/angular.json b/client/angular.json index d458e7f..d8224f1 100644 --- a/client/angular.json +++ b/client/angular.json @@ -25,13 +25,8 @@ "main": "src/main.ts", "polyfills": "src/polyfills.ts", "tsConfig": "tsconfig.app.json", - "assets": [ - "src/favicon.ico", - "src/assets" - ], - "styles": [ - "src/styles.scss" - ], + "assets": ["src/favicon.ico", "src/assets"], + "styles": ["src/styles.scss"], "scripts": [] }, "configurations": { @@ -70,14 +65,17 @@ "serve": { "builder": "@angular-devkit/build-angular:dev-server", "options": { - "browserTarget": "form-testing:build", "proxyConfig": "src/proxy.conf.json" }, "configurations": { "production": { "browserTarget": "form-testing:build:production" + }, + "development": { + "browserTarget": "form-testing:build:development" } - } + }, + "defaultConfiguration": "development" }, "extract-i18n": { "builder": "@angular-devkit/build-angular:extract-i18n", @@ -92,23 +90,15 @@ "polyfills": "src/polyfills.ts", "tsConfig": "tsconfig.spec.json", "karmaConfig": "karma.conf.js", - "assets": [ - "src/favicon.ico", - "src/assets" - ], - "styles": [ - "src/styles.scss" - ], + "assets": ["src/favicon.ico", "src/assets"], + "styles": ["src/styles.scss"], "scripts": [] } }, "lint": { "builder": "@angular-eslint/builder:lint", "options": { - "lintFilePatterns": [ - "src/**/*.ts", - "src/**/*.html" - ] + "lintFilePatterns": ["src/**/*.ts", "src/**/*.html"] } }, "deploy": { diff --git a/client/package-lock.json b/client/package-lock.json index b1aa528..d3342d2 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -9,27 +9,27 @@ "version": "0.0.0", "license": "Unlicense", "dependencies": { - "@angular/animations": "~12.2.0", - "@angular/common": "~12.2.0", - "@angular/compiler": "~12.2.0", - "@angular/core": "~12.2.0", - "@angular/forms": "~12.2.0", - "@angular/platform-browser": "~12.2.0", - "@angular/platform-browser-dynamic": "~12.2.0", - "@angular/router": "~12.2.0", + "@angular/animations": "~12.2.12", + "@angular/common": "~12.2.12", + "@angular/compiler": "~12.2.12", + "@angular/core": "~12.2.12", + "@angular/forms": "~12.2.12", + "@angular/platform-browser": "~12.2.12", + "@angular/platform-browser-dynamic": "~12.2.12", + "@angular/router": "~12.2.12", "rxjs": "~6.6.0", "tslib": "^2.3.0", "zone.js": "~0.11.4" }, "devDependencies": { - "@angular-devkit/build-angular": "~12.2.0", + "@angular-devkit/build-angular": "~12.2.12", "@angular-eslint/builder": "12.3.1", "@angular-eslint/eslint-plugin": "12.3.1", "@angular-eslint/eslint-plugin-template": "12.3.1", - "@angular-eslint/schematics": "12.3.1", + "@angular-eslint/schematics": "12.6.1", "@angular-eslint/template-parser": "12.3.1", - "@angular/cli": "~12.2.0", - "@angular/compiler-cli": "~12.2.0", + "@angular/cli": "~12.2.12", + "@angular/compiler-cli": "~12.2.12", "@types/jasmine": "~3.8.2", "@types/node": "^16.4.13", "@typescript-eslint/eslint-plugin": "4.28.2", @@ -62,31 +62,31 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1202.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.0.tgz", - "integrity": "sha512-99O8iLO9LEVTPYN6kj6XINHxjw13ofTS48hm3D0i44QMEyq3SRH1ctH6HcUAtbgPF3VjOUFr5vRYpQN1OdOCXw==", + "version": "0.1202.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.12.tgz", + "integrity": "sha512-md7F1chg8zwrmX2C2E2GoOaHhXp03+DmGph5CBTB6t8q3yB734I9A2bE5i0TyxCBLZzh8GOTH9nOGSGX6JlYrw==", "dev": true, "dependencies": { - "@angular-devkit/core": "12.2.0", + "@angular-devkit/core": "12.2.12", "rxjs": "6.6.7" }, "engines": { "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular-devkit/build-angular": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.2.0.tgz", - "integrity": "sha512-hcnlTZo1iWVVDiq2MSwbEJtc2E4rf7tSvsBvSVQLH1GILtVvN64L3YW0wVThNctWL8nicHWjtGQ+z3kjCOhxYw==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.2.12.tgz", + "integrity": "sha512-e2Q77KQk7KjIA9Rvih89acug7Hc98BoD8/RGKPuj4NcdlzoBfjF05ThwRTKFQPs/grWvyuIujVEsQL/PuG3oBg==", "dev": true, "dependencies": { "@ampproject/remapping": "1.0.1", - "@angular-devkit/architect": "0.1202.0", - "@angular-devkit/build-optimizer": "0.1202.0", - "@angular-devkit/build-webpack": "0.1202.0", - "@angular-devkit/core": "12.2.0", + "@angular-devkit/architect": "0.1202.12", + "@angular-devkit/build-optimizer": "0.1202.12", + "@angular-devkit/build-webpack": "0.1202.12", + "@angular-devkit/core": "12.2.12", "@babel/core": "7.14.8", "@babel/generator": "7.14.8", "@babel/helper-annotate-as-pure": "7.14.5", @@ -98,7 +98,7 @@ "@babel/template": "7.14.5", "@discoveryjs/json-ext": "0.5.3", "@jsdevtools/coverage-istanbul-loader": "3.0.5", - "@ngtools/webpack": "12.2.0", + "@ngtools/webpack": "12.2.12", "ansi-colors": "4.1.1", "babel-loader": "8.2.2", "browserslist": "^4.9.1", @@ -107,10 +107,10 @@ "circular-dependency-plugin": "5.2.2", "copy-webpack-plugin": "9.0.1", "core-js": "3.16.0", - "critters": "0.0.10", + "critters": "0.0.12", "css-loader": "6.2.0", "css-minimizer-webpack-plugin": "3.0.2", - "esbuild": "0.12.17", + "esbuild-wasm": "0.13.8", "find-cache-dir": "3.3.1", "glob": "7.1.7", "https-proxy-agent": "5.0.0", @@ -120,7 +120,7 @@ "less-loader": "10.0.1", "license-webpack-plugin": "2.3.20", "loader-utils": "2.0.0", - "mini-css-extract-plugin": "2.1.0", + "mini-css-extract-plugin": "2.4.2", "minimatch": "3.0.4", "open": "8.2.1", "ora": "5.4.1", @@ -146,7 +146,7 @@ "text-table": "0.2.0", "tree-kill": "1.2.2", "tslib": "2.3.0", - "webpack": "5.47.1", + "webpack": "5.50.0", "webpack-dev-middleware": "5.0.0", "webpack-dev-server": "3.11.2", "webpack-merge": "5.8.0", @@ -154,15 +154,18 @@ }, "engines": { "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, + "optionalDependencies": { + "esbuild": "0.13.8" + }, "peerDependencies": { - "@angular/compiler-cli": "^12.0.0 || ^12.2.0-next", - "@angular/localize": "^12.0.0 || ^12.2.0-next", - "@angular/service-worker": "^12.0.0 || ^12.2.0-next", + "@angular/compiler-cli": "^12.0.0", + "@angular/localize": "^12.0.0", + "@angular/service-worker": "^12.0.0", "karma": "^6.3.0", - "ng-packagr": "^12.0.0 || ^12.1.0-next", + "ng-packagr": "^12.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0", "tslint": "^6.1.0", @@ -192,26 +195,10 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@ngtools/webpack": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.0.tgz", - "integrity": "sha512-EocGfCbpPAnanDlagtlbVHpgSWE0a5NyWOY6RCw0pAxj1zL9SYMMId4X+ZJ21C23m6JqNXnWNZ4ib+LaXBIOBg==", - "dev": true, - "engines": { - "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^12.0.0 || ^12.2.0-next", - "typescript": "~4.2.3 || ~4.3.2", - "webpack": "^5.30.0" - } - }, "node_modules/@angular-devkit/build-optimizer": { - "version": "0.1202.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1202.0.tgz", - "integrity": "sha512-ORZGPrBTlzfSUzAZTrbpMgTbx1TaMcJ+nEFDj0hVBK+DUgf7GnaRjltlIqfKKphh7c6h3OKZAu3k2Lo57WqcIA==", + "version": "0.1202.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1202.12.tgz", + "integrity": "sha512-EUTY8PmST6Br3QiVqsU4W2b35nd/7iM9EygaFsreffd51P+eSIAFmxe1L/bWZuKpcptiExtYY4N118M254w88g==", "dev": true, "dependencies": { "source-map": "0.7.3", @@ -223,7 +210,7 @@ }, "engines": { "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { @@ -236,17 +223,17 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1202.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1202.0.tgz", - "integrity": "sha512-G2Iljb8Vpu5+N6jWUii2m8p5NRJe84pgiQbIOxQvegEYkdmbISQYmW3ubFjWDQgjArCpZyWJQ/AIwhmkRef5xQ==", + "version": "0.1202.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1202.12.tgz", + "integrity": "sha512-WZu03G7/la49q5SnzjmlfenQJD7Ssk8WSvSdMbooS44Rc0PZGWJIgYJ+4L2kYcC1aimrm9NZvWTyVb/OK0dIpA==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1202.0", + "@angular-devkit/architect": "0.1202.12", "rxjs": "6.6.7" }, "engines": { "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { @@ -255,9 +242,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.0.tgz", - "integrity": "sha512-9H2NfE4eazpMPwbAx4ZbtTNijo6419DZsmQzlzwQWzTInO3+CAjQuyW53W5Nt/IoauNVOgOEsC8/YbYjNmN0Aw==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.12.tgz", + "integrity": "sha512-ZFThmQecQmlniQl65rWn4oOMuWKy313O6Hk8sen7WdsjDircqtbHmtJCA1w/EU4xIilIJHo0Kez4Ihi00cGyYw==", "dev": true, "dependencies": { "ajv": "8.6.2", @@ -269,7 +256,7 @@ }, "engines": { "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, @@ -296,18 +283,18 @@ "dev": true }, "node_modules/@angular-devkit/schematics": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.0.tgz", - "integrity": "sha512-C+eutMKtOLROk/2zs1NkXeLZJpFtvZm7ctWmcns0Yh83Di2sCgGiSqdqNZFyDplxkt5W5lF2cdBSGyP8ZH+/ug==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.12.tgz", + "integrity": "sha512-Z5Z8HvIRoNEXMrfJgVZieSTZyD0TytRJscuW6xS83Aeqp5py9hvs5ytWhlpnTRz0ji8qc67csFKHvphDOqDduQ==", "dev": true, "dependencies": { - "@angular-devkit/core": "12.2.0", + "@angular-devkit/core": "12.2.12", "ora": "5.4.1", "rxjs": "6.6.7" }, "engines": { "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, @@ -325,6 +312,12 @@ "typescript": "*" } }, + "node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-12.6.1.tgz", + "integrity": "sha512-m5upUwjiegTe/iPEn02ZYg/I0pKWRJkpgvQm4Odp2Bm173orpEihzCTursUxwEi1WPNlcyduh1bgjNKAPCOtkQ==", + "dev": true + }, "node_modules/@angular-eslint/eslint-plugin": { "version": "12.3.1", "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-12.3.1.tgz", @@ -355,39 +348,64 @@ "typescript": "*" } }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "node_modules/@angular-eslint/schematics": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-12.6.1.tgz", + "integrity": "sha512-PERmjyTNsp08w8ShKEfzcXRB8Ye4YWceFfR5WllgrMi+teOz9XmTSO62UixgqJSRCdn9ufSNMWmN3jwtGGf03w==", "dev": true, "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" + "@angular-eslint/eslint-plugin": "12.6.1", + "@angular-eslint/eslint-plugin-template": "12.6.1", + "ignore": "5.1.8", + "strip-json-comments": "3.1.1", + "tmp": "0.2.1" }, - "engines": { - "node": ">=6.0" + "peerDependencies": { + "@angular/cli": ">= 12.0.0 < 13.0.0" } }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true + "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/eslint-plugin": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-12.6.1.tgz", + "integrity": "sha512-zchuiGeaeWYEc4q3XhHcX6Q5y4MOjtt3cZY2UxOaCTaYYp9yTh6k2MuE9hj0BO6qAcQyCrLlBiHhuYCpjAPO4Q==", + "dev": true, + "dependencies": { + "@angular-eslint/utils": "12.6.1", + "@typescript-eslint/experimental-utils": "4.28.2" + }, + "peerDependencies": { + "eslint": "*", + "typescript": "*" + } }, - "node_modules/@angular-eslint/schematics": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-12.3.1.tgz", - "integrity": "sha512-r1yZaqyO0oJhKDIWio3gH9TWpWEN8bUpiftgkkR6Yyc4hKBbiR5N4RQo5aZ5bnGytdW8QP8zq2k1yYBWjhEX7A==", + "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/eslint-plugin-template": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-12.6.1.tgz", + "integrity": "sha512-sJ6r1VKhUavQ1lTH53YdGF0bX17UywU8L2I+Oy5tl4diQ50RkIr8kwmilGC483/RuTCSwcE6mYS09a65HsPwyw==", "dev": true, "dependencies": { - "@angular-eslint/eslint-plugin": "12.3.1", - "@angular-eslint/eslint-plugin-template": "12.3.1", - "ignore": "5.1.8", - "strip-json-comments": "3.1.1", - "tmp": "0.2.1" + "@angular-eslint/bundled-angular-compiler": "12.6.1", + "@typescript-eslint/experimental-utils": "4.28.2", + "aria-query": "^4.2.2", + "axobject-query": "^2.2.0" }, "peerDependencies": { - "@angular/cli": ">= 12.0.0 < 13.0.0" + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/utils": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-12.6.1.tgz", + "integrity": "sha512-v+Vl9y0hUCDRA8hFgYov3IORfD/e1AoEEL0rhznwH7hfXwbQhwDrjSZHeQ+BMh27rEz5e8LXxJGiicF3Sq8uJw==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "12.6.1", + "@typescript-eslint/experimental-utils": "4.28.2" + }, + "peerDependencies": { + "eslint": "*", + "typescript": "*" } }, "node_modules/@angular-eslint/schematics/node_modules/tmp": { @@ -417,9 +435,9 @@ } }, "node_modules/@angular/animations": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-12.2.0.tgz", - "integrity": "sha512-BCta/HT0VaM0hzsyRyb24UIaV7vlpo2jJjSwnBhO5RosH+bAaA3Faa3ps3AjCDCEXo9z99dvxJFm8WqdunPYyw==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-12.2.12.tgz", + "integrity": "sha512-RoBFfEfQ/obvILFwKUrZipEAkBYTIS4aHQ76+W3v2YWKaWVHKjBM3xGOik2ION2IIUIuqui3FCYOu7HVLTjCQA==", "dependencies": { "tslib": "^2.2.0" }, @@ -427,20 +445,20 @@ "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/core": "12.2.0" + "@angular/core": "12.2.12" } }, "node_modules/@angular/cli": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-12.2.0.tgz", - "integrity": "sha512-gxw4e3Wb1YgNE+f9sX90xea5vXatqvlYq3mOWFUWVKYcayAgnt9z97a1ULEkSytS1aVjyL44zzkU/QFufPpadQ==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-12.2.12.tgz", + "integrity": "sha512-69M5lrXuHKBkPne8h1v1Mgl9aJZhc+jamU7iZjQhlIt8xL1pTGr/y9/4S+sX1gKEGhd6p/82KwJ1CFcm/Kjhfg==", "dev": true, "hasInstallScript": true, "dependencies": { - "@angular-devkit/architect": "0.1202.0", - "@angular-devkit/core": "12.2.0", - "@angular-devkit/schematics": "12.2.0", - "@schematics/angular": "12.2.0", + "@angular-devkit/architect": "0.1202.12", + "@angular-devkit/core": "12.2.12", + "@angular-devkit/schematics": "12.2.12", + "@schematics/angular": "12.2.12", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", "debug": "4.3.2", @@ -462,7 +480,7 @@ }, "engines": { "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, @@ -484,9 +502,9 @@ } }, "node_modules/@angular/common": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-12.2.0.tgz", - "integrity": "sha512-9OaqH5WhfJ/YpN9b4TmiGHdOar/3NiGjktwG1/5jV4mTO+tOP25yNO4zCd4RuaRURipWUEa8mSaesgUgTb3jmQ==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-12.2.12.tgz", + "integrity": "sha512-i1VUoGYYx3tMEpmGQvaLt6x4C/MWDxUPATKJwnawLbHDLfAHkyXiCASmcMtaNt1EvOd/uN/J2ONVpF6J49CnMQ==", "dependencies": { "tslib": "^2.2.0" }, @@ -494,14 +512,14 @@ "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/core": "12.2.0", + "@angular/core": "12.2.12", "rxjs": "^6.5.3 || ^7.0.0" } }, "node_modules/@angular/compiler": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.2.0.tgz", - "integrity": "sha512-24G1joE699gbAHRAIESVQBI797Q506MZ/LWyFHRjfdlfXgltDN63j5dpNJzb/rUK1/uHGGAJaEH+OE60ZK2q9Q==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.2.12.tgz", + "integrity": "sha512-MoeLdKxahBhx/neHvu4AAg6QHvifjjy63vGPsivQUhl3054d/fw0xnLSaRHOS4kP+/loYOrnEEqog1ehTYnyew==", "dependencies": { "tslib": "^2.2.0" }, @@ -510,9 +528,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.2.0.tgz", - "integrity": "sha512-VjGb4gty8JSkmcBvdc4QzQx6mPT7cXs42Hu8IDK7dQma3nTRmwbX0BF1m7i+kbrjWHK8I85FbsYbSzfzZid2NA==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.2.12.tgz", + "integrity": "sha512-zIL6GnoIzNWNiip9sjvwzhL6lGg8lj0W1bKodmL6BINqPUPNdRR++VliUKr/o9DRBDEP7A0F+m2kmYJoN4p2FA==", "dev": true, "dependencies": { "@babel/core": "^7.8.6", @@ -540,7 +558,7 @@ "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/compiler": "12.2.0", + "@angular/compiler": "12.2.12", "typescript": ">=4.2.3 <4.4" } }, @@ -554,9 +572,9 @@ } }, "node_modules/@angular/compiler-cli/node_modules/yargs": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.0.tgz", - "integrity": "sha512-SQr7qqmQ2sNijjJGHL4u7t8vyDZdZ3Ahkmo4sc1w5xI9TBX0QDdG/g4SFnxtWOsGLjwHQue57eFALfwFCnixgg==", + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", "dev": true, "dependencies": { "cliui": "^7.0.2", @@ -572,9 +590,9 @@ } }, "node_modules/@angular/core": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-12.2.0.tgz", - "integrity": "sha512-zy/gqSlSEmi85HVbpoQ0nhC74xoL+aoofvbkKPgdgyEcnqzBt4IFzH++0EZ+GMeZ2pVoNfiXklUhAy2OBAiR/g==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-12.2.12.tgz", + "integrity": "sha512-DdZbhyVvwlYO5aLZi5IxJRflZ55Sae72cJAIK4+I5yTrVEf8iDwMZwnRhsv5rOwdEk12Zs8Ppb9JkpaFWium9Q==", "dependencies": { "tslib": "^2.2.0" }, @@ -587,9 +605,9 @@ } }, "node_modules/@angular/forms": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-12.2.0.tgz", - "integrity": "sha512-lhKin5IHElH5qk2Su/o0YMF9JYb84grz0WMIHYmt3EASw/EGvzZwUBd76anJWWwFig6GLw/ZdNC9zLW2Leh06Q==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-12.2.12.tgz", + "integrity": "sha512-qZKN1igKaeoFqs7ETiVOBJz4KZo9SmDuUrTbkylrYe9I6wHOsmjZSW49M4Lq5dsczl12kTxc3m83RIsRPZAw6Q==", "dependencies": { "tslib": "^2.2.0" }, @@ -597,16 +615,16 @@ "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/common": "12.2.0", - "@angular/core": "12.2.0", - "@angular/platform-browser": "12.2.0", + "@angular/common": "12.2.12", + "@angular/core": "12.2.12", + "@angular/platform-browser": "12.2.12", "rxjs": "^6.5.3 || ^7.0.0" } }, "node_modules/@angular/platform-browser": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-12.2.0.tgz", - "integrity": "sha512-MIoWBhhMmPBFfuOPBgEG21uqCZVudTj4YMGxQH4iVlI9GD9ZAht8XgopN9Vw4cytPNfKWsspLoruhIWRNSJlNA==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-12.2.12.tgz", + "integrity": "sha512-HzHQUxKSh4n6tNIW4BcR0yJRs7NiAeuSXTEHs5+1Zmf2NVTYh4E4U+IkRUwzlrdzDoUEP/Fd3yP/M71LGm7aTg==", "dependencies": { "tslib": "^2.2.0" }, @@ -614,9 +632,9 @@ "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/animations": "12.2.0", - "@angular/common": "12.2.0", - "@angular/core": "12.2.0" + "@angular/animations": "12.2.12", + "@angular/common": "12.2.12", + "@angular/core": "12.2.12" }, "peerDependenciesMeta": { "@angular/animations": { @@ -625,9 +643,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.2.0.tgz", - "integrity": "sha512-mvUo1WEI8PrJxIer0RLXSW9raYDrKarUQ9T2Q0/R3ZgS6Y1WvoJe+qSZ7K/hCbErH4zd+64TuJHlj+g2WHPLug==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.2.12.tgz", + "integrity": "sha512-uVbRxZP2fI86U8LqQ80RIzY5qHvGW2Koywylj7kNpfPhwMBSGpG91IjOZtrKUXF4jYJWZ3h2GGv7RFtRilvuNg==", "dependencies": { "tslib": "^2.2.0" }, @@ -635,16 +653,16 @@ "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/common": "12.2.0", - "@angular/compiler": "12.2.0", - "@angular/core": "12.2.0", - "@angular/platform-browser": "12.2.0" + "@angular/common": "12.2.12", + "@angular/compiler": "12.2.12", + "@angular/core": "12.2.12", + "@angular/platform-browser": "12.2.12" } }, "node_modules/@angular/router": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-12.2.0.tgz", - "integrity": "sha512-C5S0bU8KtU/2wBQ76AZVFivWbGYJCDwkVg2Lk4ddjqs/pKWb0vg2Baa3DfJrIz3esqfYUJl00HMYQVM9+QtZQA==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-12.2.12.tgz", + "integrity": "sha512-unuUJyj3CHj29jmyCaluou1sajZDnZgDJ/3vNCif4md1sC5MuY/XkqecTgvSwze17kkpxCGjjn2dlWFRp+yExw==", "dependencies": { "tslib": "^2.2.0" }, @@ -652,9 +670,9 @@ "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/common": "12.2.0", - "@angular/core": "12.2.0", - "@angular/platform-browser": "12.2.0", + "@angular/common": "12.2.12", + "@angular/core": "12.2.12", + "@angular/platform-browser": "12.2.12", "rxjs": "^6.5.3 || ^7.0.0" } }, @@ -2446,6 +2464,22 @@ "schema-utils": "^2.7.0" } }, + "node_modules/@ngtools/webpack": { + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.12.tgz", + "integrity": "sha512-j3043wP+EWk2zMmAYrOzecpUX2n37R6XqypEBbj1qLAQBiSDulRN0dIsZzgTlrBgeOQ1YtFoRMuqaPsGIbuNiw==", + "dev": true, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^12.0.0", + "typescript": "~4.2.3 || ~4.3.2", + "webpack": "^5.30.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2726,18 +2760,18 @@ } }, "node_modules/@schematics/angular": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.0.tgz", - "integrity": "sha512-2NolT/PNKgjINIHvz6o4sYFj4D4ai7Usf+HspQCi9W30qtLV4Z6hRXoEhmDxrGSlF67vJdwUwDM3sP+6Tg8XEw==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.12.tgz", + "integrity": "sha512-XkHs4aMlOT64QxfDbIBFLxM/qCsuhkZ6G696C0t3eEX2kA1OmED34Qs1ezwb7fqdlcSrt3D3SGdBBcMzaMT7hg==", "dev": true, "dependencies": { - "@angular-devkit/core": "12.2.0", - "@angular-devkit/schematics": "12.2.0", + "@angular-devkit/core": "12.2.12", + "@angular-devkit/schematics": "12.2.12", "jsonc-parser": "3.0.0" }, "engines": { "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, @@ -2825,9 +2859,9 @@ "dev": true }, "node_modules/@types/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, "dependencies": { "@types/minimatch": "*", @@ -3305,6 +3339,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -3601,6 +3644,19 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "node_modules/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, + "engines": { + "node": ">=6.0" + } + }, "node_modules/arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -3850,6 +3906,12 @@ "follow-redirects": "^1.10.0" } }, + "node_modules/axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, "node_modules/babel-loader": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", @@ -5181,15 +5243,16 @@ } }, "node_modules/critters": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.10.tgz", - "integrity": "sha512-p5VKhP1803+f+0Jq5P03w1SbiHtpAKm+1EpJHkiPxQPq0Vu9QLZHviJ02GRrWi0dlcJqrmzMWInbwp4d22RsGw==", + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.12.tgz", + "integrity": "sha512-ujxKtKc/mWpjrOKeaACTaQ1aP0O31M0ZPWhfl85jZF1smPU4Ivb9va5Ox2poif4zVJQQo0LCFlzGtEZAsCAPcw==", "dev": true, "dependencies": { "chalk": "^4.1.0", - "css": "^3.0.0", + "css-select": "^4.1.3", "parse5": "^6.0.1", "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", "pretty-bytes": "^5.3.0" } }, @@ -5251,6 +5314,24 @@ "node": ">=8" } }, + "node_modules/critters/node_modules/postcss": { + "version": "8.3.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.9.tgz", + "integrity": "sha512-f/ZFyAKh9Dnqytx5X62jgjhhzttjZS7hMsohcI7HEI5tjELX/HxCy3EFhsRxyzGvrzFF+82XPvCS8T9TFleVJw==", + "dev": true, + "dependencies": { + "nanoid": "^3.1.28", + "picocolors": "^0.2.1", + "source-map-js": "^0.6.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, "node_modules/critters/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -5292,17 +5373,6 @@ "node": ">= 8" } }, - "node_modules/css": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", - "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "source-map": "^0.6.1", - "source-map-resolve": "^0.6.0" - } - }, "node_modules/css-blank-pseudo": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", @@ -5578,19 +5648,6 @@ "node": ">=0.10.0" } }, - "node_modules/css-parse/node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "node_modules/css-prefers-color-scheme": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", @@ -5695,15 +5752,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cssdb": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", @@ -6544,15 +6592,268 @@ } }, "node_modules/esbuild": { - "version": "0.12.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.17.tgz", - "integrity": "sha512-GshKJyVYUnlSXIZj/NheC2O0Kblh42CS7P1wJyTbbIHevTG4jYMS9NNw8EOd8dDWD0dzydYHS01MpZoUcQXB4g==", + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.8.tgz", + "integrity": "sha512-A4af7G7YZLfG5OnARJRMtlpEsCkq/zHZQXewgPA864l9D6VjjbH1SuFYK/OSV6BtHwDGkdwyRrX0qQFLnMfUcw==", "dev": true, "hasInstallScript": true, + "optional": true, "bin": { "esbuild": "bin/esbuild" + }, + "optionalDependencies": { + "esbuild-android-arm64": "0.13.8", + "esbuild-darwin-64": "0.13.8", + "esbuild-darwin-arm64": "0.13.8", + "esbuild-freebsd-64": "0.13.8", + "esbuild-freebsd-arm64": "0.13.8", + "esbuild-linux-32": "0.13.8", + "esbuild-linux-64": "0.13.8", + "esbuild-linux-arm": "0.13.8", + "esbuild-linux-arm64": "0.13.8", + "esbuild-linux-mips64le": "0.13.8", + "esbuild-linux-ppc64le": "0.13.8", + "esbuild-netbsd-64": "0.13.8", + "esbuild-openbsd-64": "0.13.8", + "esbuild-sunos-64": "0.13.8", + "esbuild-windows-32": "0.13.8", + "esbuild-windows-64": "0.13.8", + "esbuild-windows-arm64": "0.13.8" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.8.tgz", + "integrity": "sha512-AilbChndywpk7CdKkNSZ9klxl+9MboLctXd9LwLo3b0dawmOF/i/t2U5d8LM6SbT1Xw36F8yngSUPrd8yPs2RA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/esbuild-darwin-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.8.tgz", + "integrity": "sha512-b6sdiT84zV5LVaoF+UoMVGJzR/iE2vNUfUDfFQGrm4LBwM/PWXweKpuu6RD9mcyCq18cLxkP6w/LD/w9DtX3ng==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.8.tgz", + "integrity": "sha512-R8YuPiiJayuJJRUBG4H0VwkEKo6AvhJs2m7Tl0JaIer3u1FHHXwGhMxjJDmK+kXwTFPriSysPvcobXC/UrrZCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.8.tgz", + "integrity": "sha512-zBn6urrn8FnKC+YSgDxdof9jhPCeU8kR/qaamlV4gI8R3KUaUK162WYM7UyFVAlj9N0MyD3AtB+hltzu4cysTw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.8.tgz", + "integrity": "sha512-pWW2slN7lGlkx0MOEBoUGwRX5UgSCLq3dy2c8RIOpiHtA87xAUpDBvZK10MykbT+aMfXc0NI2lu1X+6kI34xng==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/esbuild-linux-32": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.8.tgz", + "integrity": "sha512-T0I0ueeKVO/Is0CAeSEOG9s2jeNNb8jrrMwG9QBIm3UU18MRB60ERgkS2uV3fZ1vP2F8i3Z2e3Zju4lg9dhVmw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.8.tgz", + "integrity": "sha512-Bm8SYmFtvfDCIu9sjKppFXzRXn2BVpuCinU1ChTuMtdKI/7aPpXIrkqBNOgPTOQO9AylJJc1Zw6EvtKORhn64w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-arm": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.8.tgz", + "integrity": "sha512-4/HfcC40LJ4GPyboHA+db0jpFarTB628D1ifU+/5bunIgY+t6mHkJWyxWxAAE8wl/ZIuRYB9RJFdYpu1AXGPdg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.8.tgz", + "integrity": "sha512-X4pWZ+SL+FJ09chWFgRNO3F+YtvAQRcWh0uxKqZSWKiWodAB20flsW/OWFYLXBKiVCTeoGMvENZS/GeVac7+tQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.8.tgz", + "integrity": "sha512-o7e0D+sqHKT31v+mwFircJFjwSKVd2nbkHEn4l9xQ1hLR+Bv8rnt3HqlblY3+sBdlrOTGSwz0ReROlKUMJyldA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.8.tgz", + "integrity": "sha512-eZSQ0ERsWkukJp2px/UWJHVNuy0lMoz/HZcRWAbB6reoaBw7S9vMzYNUnflfL3XA6WDs+dZn3ekHE4Y2uWLGig==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.8.tgz", + "integrity": "sha512-gZX4kP7gVvOrvX0ZwgHmbuHczQUwqYppxqtoyC7VNd80t5nBHOFXVhWo2Ad/Lms0E8b+wwgI/WjZFTCpUHOg9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ] + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.8.tgz", + "integrity": "sha512-afzza308X4WmcebexbTzAgfEWt9MUkdTvwIa8xOu4CM2qGbl2LanqEl8/LUs8jh6Gqw6WsicEK52GPrS9wvkcw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/esbuild-sunos-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.8.tgz", + "integrity": "sha512-mWPZibmBbuMKD+LDN23LGcOZ2EawMYBONMXXHmbuxeT0XxCNwadbCVwUQ/2p5Dp5Kvf6mhrlIffcnWOiCBpiVw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ] + }, + "node_modules/esbuild-wasm": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.13.8.tgz", + "integrity": "sha512-UbD+3nloiSpJWXTCInZQrqPe8Y+RLfDkY/5kEHiXsw/lmaEvibe69qTzQu16m5R9je/0bF7VYQ5jaEOq0z9lLA==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=8" } }, + "node_modules/esbuild-windows-32": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.8.tgz", + "integrity": "sha512-QsZ1HnWIcnIEApETZWw8HlOhDSWqdZX2SylU7IzGxOYyVcX7QI06ety/aDcn437mwyO7Ph4RrbhB+2ntM8kX8A==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/esbuild-windows-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.8.tgz", + "integrity": "sha512-76Fb57B9eE/JmJi1QmUW0tRLQZfGo0it+JeYoCDTSlbTn7LV44ecOHIMJSSgZADUtRMWT9z0Kz186bnaB3amSg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.8.tgz", + "integrity": "sha512-HW6Mtq5eTudllxY2YgT62MrVcn7oq2o8TAoAvDUhyiEmRmDY8tPwAhb1vxw5/cdkbukM3KdMYtksnUhF/ekWeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -10614,12 +10915,12 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.1.0.tgz", - "integrity": "sha512-SV1GgjMcfqy6hW07rAniUbQE4qS3inh3v4rZEUySkPRWy3vMbS3jUCjMOvNI4lUnDlQYJEmuUqKktTCNY5koFQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.2.tgz", + "integrity": "sha512-ZmqShkn79D36uerdED+9qdo1ZYG8C1YsWvXu0UMJxurZnSdgz7gQKO2EGv8T55MhDqG3DYmGtizZNpM/UbTlcA==", "dev": true, "dependencies": { - "schema-utils": "^3.0.0" + "schema-utils": "^3.1.0" }, "engines": { "node": ">= 12.13.0" @@ -10838,9 +11139,9 @@ "optional": true }, "node_modules/nanoid": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -12130,6 +12431,12 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "node_modules/picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -16300,19 +16607,6 @@ "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "node_modules/socket.io": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.2.tgz", @@ -16365,9 +16659,9 @@ } }, "node_modules/sockjs-client": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", - "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", + "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", "dev": true, "dependencies": { "debug": "^3.2.6", @@ -16375,7 +16669,7 @@ "faye-websocket": "^0.11.3", "inherits": "^2.0.4", "json3": "^3.3.3", - "url-parse": "^1.5.1" + "url-parse": "^1.5.3" } }, "node_modules/sockjs-client/node_modules/debug": { @@ -16483,13 +16777,16 @@ } }, "node_modules/source-map-resolve": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "dev": true, "dependencies": { "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "node_modules/source-map-support": { @@ -18133,9 +18430,9 @@ } }, "node_modules/webpack": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.47.1.tgz", - "integrity": "sha512-cW+Mzy9SCDapFV4OrkHuP6EFV2mAsiQd+gOa3PKtHNoKg6qPqQXZzBlHH+CnQG1osplBCqwsJZ8CfGO6XWah0g==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.50.0.tgz", + "integrity": "sha512-hqxI7t/KVygs0WRv/kTgUW8Kl3YC81uyWQSo/7WUs5LsuRw0htH/fCwbVBGCuiX/t4s7qzjXFcf41O8Reiypag==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.0", @@ -18144,6 +18441,7 @@ "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.8.0", @@ -18160,7 +18458,7 @@ "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", "watchpack": "^2.2.0", - "webpack-sources": "^3.1.1" + "webpack-sources": "^3.2.0" }, "bin": { "webpack": "bin/webpack.js" @@ -19382,26 +19680,26 @@ } }, "@angular-devkit/architect": { - "version": "0.1202.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.0.tgz", - "integrity": "sha512-99O8iLO9LEVTPYN6kj6XINHxjw13ofTS48hm3D0i44QMEyq3SRH1ctH6HcUAtbgPF3VjOUFr5vRYpQN1OdOCXw==", + "version": "0.1202.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.12.tgz", + "integrity": "sha512-md7F1chg8zwrmX2C2E2GoOaHhXp03+DmGph5CBTB6t8q3yB734I9A2bE5i0TyxCBLZzh8GOTH9nOGSGX6JlYrw==", "dev": true, "requires": { - "@angular-devkit/core": "12.2.0", + "@angular-devkit/core": "12.2.12", "rxjs": "6.6.7" } }, "@angular-devkit/build-angular": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.2.0.tgz", - "integrity": "sha512-hcnlTZo1iWVVDiq2MSwbEJtc2E4rf7tSvsBvSVQLH1GILtVvN64L3YW0wVThNctWL8nicHWjtGQ+z3kjCOhxYw==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.2.12.tgz", + "integrity": "sha512-e2Q77KQk7KjIA9Rvih89acug7Hc98BoD8/RGKPuj4NcdlzoBfjF05ThwRTKFQPs/grWvyuIujVEsQL/PuG3oBg==", "dev": true, "requires": { "@ampproject/remapping": "1.0.1", - "@angular-devkit/architect": "0.1202.0", - "@angular-devkit/build-optimizer": "0.1202.0", - "@angular-devkit/build-webpack": "0.1202.0", - "@angular-devkit/core": "12.2.0", + "@angular-devkit/architect": "0.1202.12", + "@angular-devkit/build-optimizer": "0.1202.12", + "@angular-devkit/build-webpack": "0.1202.12", + "@angular-devkit/core": "12.2.12", "@babel/core": "7.14.8", "@babel/generator": "7.14.8", "@babel/helper-annotate-as-pure": "7.14.5", @@ -19413,7 +19711,7 @@ "@babel/template": "7.14.5", "@discoveryjs/json-ext": "0.5.3", "@jsdevtools/coverage-istanbul-loader": "3.0.5", - "@ngtools/webpack": "12.2.0", + "@ngtools/webpack": "12.2.12", "ansi-colors": "4.1.1", "babel-loader": "8.2.2", "browserslist": "^4.9.1", @@ -19422,10 +19720,11 @@ "circular-dependency-plugin": "5.2.2", "copy-webpack-plugin": "9.0.1", "core-js": "3.16.0", - "critters": "0.0.10", + "critters": "0.0.12", "css-loader": "6.2.0", "css-minimizer-webpack-plugin": "3.0.2", - "esbuild": "0.12.17", + "esbuild": "0.13.8", + "esbuild-wasm": "0.13.8", "find-cache-dir": "3.3.1", "glob": "7.1.7", "https-proxy-agent": "5.0.0", @@ -19435,7 +19734,7 @@ "less-loader": "10.0.1", "license-webpack-plugin": "2.3.20", "loader-utils": "2.0.0", - "mini-css-extract-plugin": "2.1.0", + "mini-css-extract-plugin": "2.4.2", "minimatch": "3.0.4", "open": "8.2.1", "ora": "5.4.1", @@ -19461,26 +19760,17 @@ "text-table": "0.2.0", "tree-kill": "1.2.2", "tslib": "2.3.0", - "webpack": "5.47.1", + "webpack": "5.50.0", "webpack-dev-middleware": "5.0.0", "webpack-dev-server": "3.11.2", "webpack-merge": "5.8.0", "webpack-subresource-integrity": "1.5.2" - }, - "dependencies": { - "@ngtools/webpack": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.0.tgz", - "integrity": "sha512-EocGfCbpPAnanDlagtlbVHpgSWE0a5NyWOY6RCw0pAxj1zL9SYMMId4X+ZJ21C23m6JqNXnWNZ4ib+LaXBIOBg==", - "dev": true, - "requires": {} - } } }, "@angular-devkit/build-optimizer": { - "version": "0.1202.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1202.0.tgz", - "integrity": "sha512-ORZGPrBTlzfSUzAZTrbpMgTbx1TaMcJ+nEFDj0hVBK+DUgf7GnaRjltlIqfKKphh7c6h3OKZAu3k2Lo57WqcIA==", + "version": "0.1202.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1202.12.tgz", + "integrity": "sha512-EUTY8PmST6Br3QiVqsU4W2b35nd/7iM9EygaFsreffd51P+eSIAFmxe1L/bWZuKpcptiExtYY4N118M254w88g==", "dev": true, "requires": { "source-map": "0.7.3", @@ -19489,19 +19779,19 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.1202.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1202.0.tgz", - "integrity": "sha512-G2Iljb8Vpu5+N6jWUii2m8p5NRJe84pgiQbIOxQvegEYkdmbISQYmW3ubFjWDQgjArCpZyWJQ/AIwhmkRef5xQ==", + "version": "0.1202.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1202.12.tgz", + "integrity": "sha512-WZu03G7/la49q5SnzjmlfenQJD7Ssk8WSvSdMbooS44Rc0PZGWJIgYJ+4L2kYcC1aimrm9NZvWTyVb/OK0dIpA==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1202.0", + "@angular-devkit/architect": "0.1202.12", "rxjs": "6.6.7" } }, "@angular-devkit/core": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.0.tgz", - "integrity": "sha512-9H2NfE4eazpMPwbAx4ZbtTNijo6419DZsmQzlzwQWzTInO3+CAjQuyW53W5Nt/IoauNVOgOEsC8/YbYjNmN0Aw==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.12.tgz", + "integrity": "sha512-ZFThmQecQmlniQl65rWn4oOMuWKy313O6Hk8sen7WdsjDircqtbHmtJCA1w/EU4xIilIJHo0Kez4Ihi00cGyYw==", "dev": true, "requires": { "ajv": "8.6.2", @@ -19533,12 +19823,12 @@ } }, "@angular-devkit/schematics": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.0.tgz", - "integrity": "sha512-C+eutMKtOLROk/2zs1NkXeLZJpFtvZm7ctWmcns0Yh83Di2sCgGiSqdqNZFyDplxkt5W5lF2cdBSGyP8ZH+/ug==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.12.tgz", + "integrity": "sha512-Z5Z8HvIRoNEXMrfJgVZieSTZyD0TytRJscuW6xS83Aeqp5py9hvs5ytWhlpnTRz0ji8qc67csFKHvphDOqDduQ==", "dev": true, "requires": { - "@angular-devkit/core": "12.2.0", + "@angular-devkit/core": "12.2.12", "ora": "5.4.1", "rxjs": "6.6.7" } @@ -19552,6 +19842,12 @@ "@nrwl/devkit": ">= 12.0.0 < 13.0.0" } }, + "@angular-eslint/bundled-angular-compiler": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-12.6.1.tgz", + "integrity": "sha512-m5upUwjiegTe/iPEn02ZYg/I0pKWRJkpgvQm4Odp2Bm173orpEihzCTursUxwEi1WPNlcyduh1bgjNKAPCOtkQ==", + "dev": true + }, "@angular-eslint/eslint-plugin": { "version": "12.3.1", "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-12.3.1.tgz", @@ -19570,39 +19866,53 @@ "@typescript-eslint/experimental-utils": "4.28.2", "aria-query": "^4.2.2", "axobject-query": "^2.2.0" - }, - "dependencies": { - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - } - }, - "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true - } } }, "@angular-eslint/schematics": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-12.3.1.tgz", - "integrity": "sha512-r1yZaqyO0oJhKDIWio3gH9TWpWEN8bUpiftgkkR6Yyc4hKBbiR5N4RQo5aZ5bnGytdW8QP8zq2k1yYBWjhEX7A==", + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-12.6.1.tgz", + "integrity": "sha512-PERmjyTNsp08w8ShKEfzcXRB8Ye4YWceFfR5WllgrMi+teOz9XmTSO62UixgqJSRCdn9ufSNMWmN3jwtGGf03w==", "dev": true, "requires": { - "@angular-eslint/eslint-plugin": "12.3.1", - "@angular-eslint/eslint-plugin-template": "12.3.1", + "@angular-eslint/eslint-plugin": "12.6.1", + "@angular-eslint/eslint-plugin-template": "12.6.1", "ignore": "5.1.8", "strip-json-comments": "3.1.1", "tmp": "0.2.1" }, "dependencies": { + "@angular-eslint/eslint-plugin": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-12.6.1.tgz", + "integrity": "sha512-zchuiGeaeWYEc4q3XhHcX6Q5y4MOjtt3cZY2UxOaCTaYYp9yTh6k2MuE9hj0BO6qAcQyCrLlBiHhuYCpjAPO4Q==", + "dev": true, + "requires": { + "@angular-eslint/utils": "12.6.1", + "@typescript-eslint/experimental-utils": "4.28.2" + } + }, + "@angular-eslint/eslint-plugin-template": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-12.6.1.tgz", + "integrity": "sha512-sJ6r1VKhUavQ1lTH53YdGF0bX17UywU8L2I+Oy5tl4diQ50RkIr8kwmilGC483/RuTCSwcE6mYS09a65HsPwyw==", + "dev": true, + "requires": { + "@angular-eslint/bundled-angular-compiler": "12.6.1", + "@typescript-eslint/experimental-utils": "4.28.2", + "aria-query": "^4.2.2", + "axobject-query": "^2.2.0" + } + }, + "@angular-eslint/utils": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-12.6.1.tgz", + "integrity": "sha512-v+Vl9y0hUCDRA8hFgYov3IORfD/e1AoEEL0rhznwH7hfXwbQhwDrjSZHeQ+BMh27rEz5e8LXxJGiicF3Sq8uJw==", + "dev": true, + "requires": { + "@angular-eslint/bundled-angular-compiler": "12.6.1", + "@typescript-eslint/experimental-utils": "4.28.2" + } + }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -19624,23 +19934,23 @@ } }, "@angular/animations": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-12.2.0.tgz", - "integrity": "sha512-BCta/HT0VaM0hzsyRyb24UIaV7vlpo2jJjSwnBhO5RosH+bAaA3Faa3ps3AjCDCEXo9z99dvxJFm8WqdunPYyw==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-12.2.12.tgz", + "integrity": "sha512-RoBFfEfQ/obvILFwKUrZipEAkBYTIS4aHQ76+W3v2YWKaWVHKjBM3xGOik2ION2IIUIuqui3FCYOu7HVLTjCQA==", "requires": { "tslib": "^2.2.0" } }, "@angular/cli": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-12.2.0.tgz", - "integrity": "sha512-gxw4e3Wb1YgNE+f9sX90xea5vXatqvlYq3mOWFUWVKYcayAgnt9z97a1ULEkSytS1aVjyL44zzkU/QFufPpadQ==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-12.2.12.tgz", + "integrity": "sha512-69M5lrXuHKBkPne8h1v1Mgl9aJZhc+jamU7iZjQhlIt8xL1pTGr/y9/4S+sX1gKEGhd6p/82KwJ1CFcm/Kjhfg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1202.0", - "@angular-devkit/core": "12.2.0", - "@angular-devkit/schematics": "12.2.0", - "@schematics/angular": "12.2.0", + "@angular-devkit/architect": "0.1202.12", + "@angular-devkit/core": "12.2.12", + "@angular-devkit/schematics": "12.2.12", + "@schematics/angular": "12.2.12", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", "debug": "4.3.2", @@ -19670,25 +19980,25 @@ } }, "@angular/common": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-12.2.0.tgz", - "integrity": "sha512-9OaqH5WhfJ/YpN9b4TmiGHdOar/3NiGjktwG1/5jV4mTO+tOP25yNO4zCd4RuaRURipWUEa8mSaesgUgTb3jmQ==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-12.2.12.tgz", + "integrity": "sha512-i1VUoGYYx3tMEpmGQvaLt6x4C/MWDxUPATKJwnawLbHDLfAHkyXiCASmcMtaNt1EvOd/uN/J2ONVpF6J49CnMQ==", "requires": { "tslib": "^2.2.0" } }, "@angular/compiler": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.2.0.tgz", - "integrity": "sha512-24G1joE699gbAHRAIESVQBI797Q506MZ/LWyFHRjfdlfXgltDN63j5dpNJzb/rUK1/uHGGAJaEH+OE60ZK2q9Q==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.2.12.tgz", + "integrity": "sha512-MoeLdKxahBhx/neHvu4AAg6QHvifjjy63vGPsivQUhl3054d/fw0xnLSaRHOS4kP+/loYOrnEEqog1ehTYnyew==", "requires": { "tslib": "^2.2.0" } }, "@angular/compiler-cli": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.2.0.tgz", - "integrity": "sha512-VjGb4gty8JSkmcBvdc4QzQx6mPT7cXs42Hu8IDK7dQma3nTRmwbX0BF1m7i+kbrjWHK8I85FbsYbSzfzZid2NA==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.2.12.tgz", + "integrity": "sha512-zIL6GnoIzNWNiip9sjvwzhL6lGg8lj0W1bKodmL6BINqPUPNdRR++VliUKr/o9DRBDEP7A0F+m2kmYJoN4p2FA==", "dev": true, "requires": { "@babel/core": "^7.8.6", @@ -19714,9 +20024,9 @@ "dev": true }, "yargs": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.0.tgz", - "integrity": "sha512-SQr7qqmQ2sNijjJGHL4u7t8vyDZdZ3Ahkmo4sc1w5xI9TBX0QDdG/g4SFnxtWOsGLjwHQue57eFALfwFCnixgg==", + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -19731,41 +20041,41 @@ } }, "@angular/core": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-12.2.0.tgz", - "integrity": "sha512-zy/gqSlSEmi85HVbpoQ0nhC74xoL+aoofvbkKPgdgyEcnqzBt4IFzH++0EZ+GMeZ2pVoNfiXklUhAy2OBAiR/g==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-12.2.12.tgz", + "integrity": "sha512-DdZbhyVvwlYO5aLZi5IxJRflZ55Sae72cJAIK4+I5yTrVEf8iDwMZwnRhsv5rOwdEk12Zs8Ppb9JkpaFWium9Q==", "requires": { "tslib": "^2.2.0" } }, "@angular/forms": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-12.2.0.tgz", - "integrity": "sha512-lhKin5IHElH5qk2Su/o0YMF9JYb84grz0WMIHYmt3EASw/EGvzZwUBd76anJWWwFig6GLw/ZdNC9zLW2Leh06Q==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-12.2.12.tgz", + "integrity": "sha512-qZKN1igKaeoFqs7ETiVOBJz4KZo9SmDuUrTbkylrYe9I6wHOsmjZSW49M4Lq5dsczl12kTxc3m83RIsRPZAw6Q==", "requires": { "tslib": "^2.2.0" } }, "@angular/platform-browser": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-12.2.0.tgz", - "integrity": "sha512-MIoWBhhMmPBFfuOPBgEG21uqCZVudTj4YMGxQH4iVlI9GD9ZAht8XgopN9Vw4cytPNfKWsspLoruhIWRNSJlNA==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-12.2.12.tgz", + "integrity": "sha512-HzHQUxKSh4n6tNIW4BcR0yJRs7NiAeuSXTEHs5+1Zmf2NVTYh4E4U+IkRUwzlrdzDoUEP/Fd3yP/M71LGm7aTg==", "requires": { "tslib": "^2.2.0" } }, "@angular/platform-browser-dynamic": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.2.0.tgz", - "integrity": "sha512-mvUo1WEI8PrJxIer0RLXSW9raYDrKarUQ9T2Q0/R3ZgS6Y1WvoJe+qSZ7K/hCbErH4zd+64TuJHlj+g2WHPLug==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.2.12.tgz", + "integrity": "sha512-uVbRxZP2fI86U8LqQ80RIzY5qHvGW2Koywylj7kNpfPhwMBSGpG91IjOZtrKUXF4jYJWZ3h2GGv7RFtRilvuNg==", "requires": { "tslib": "^2.2.0" } }, "@angular/router": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-12.2.0.tgz", - "integrity": "sha512-C5S0bU8KtU/2wBQ76AZVFivWbGYJCDwkVg2Lk4ddjqs/pKWb0vg2Baa3DfJrIz3esqfYUJl00HMYQVM9+QtZQA==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-12.2.12.tgz", + "integrity": "sha512-unuUJyj3CHj29jmyCaluou1sajZDnZgDJ/3vNCif4md1sC5MuY/XkqecTgvSwze17kkpxCGjjn2dlWFRp+yExw==", "requires": { "tslib": "^2.2.0" } @@ -21039,6 +21349,13 @@ "schema-utils": "^2.7.0" } }, + "@ngtools/webpack": { + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.12.tgz", + "integrity": "sha512-j3043wP+EWk2zMmAYrOzecpUX2n37R6XqypEBbj1qLAQBiSDulRN0dIsZzgTlrBgeOQ1YtFoRMuqaPsGIbuNiw==", + "dev": true, + "requires": {} + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -21259,13 +21576,13 @@ } }, "@schematics/angular": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.0.tgz", - "integrity": "sha512-2NolT/PNKgjINIHvz6o4sYFj4D4ai7Usf+HspQCi9W30qtLV4Z6hRXoEhmDxrGSlF67vJdwUwDM3sP+6Tg8XEw==", + "version": "12.2.12", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.12.tgz", + "integrity": "sha512-XkHs4aMlOT64QxfDbIBFLxM/qCsuhkZ6G696C0t3eEX2kA1OmED34Qs1ezwb7fqdlcSrt3D3SGdBBcMzaMT7hg==", "dev": true, "requires": { - "@angular-devkit/core": "12.2.0", - "@angular-devkit/schematics": "12.2.0", + "@angular-devkit/core": "12.2.12", + "@angular-devkit/schematics": "12.2.12", "jsonc-parser": "3.0.0" } }, @@ -21347,9 +21664,9 @@ "dev": true }, "@types/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, "requires": { "@types/minimatch": "*", @@ -21735,6 +22052,13 @@ "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", "dev": true }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "requires": {} + }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -21967,6 +22291,16 @@ } } }, + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -22153,6 +22487,12 @@ "follow-redirects": "^1.10.0" } }, + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, "babel-loader": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", @@ -23219,15 +23559,16 @@ } }, "critters": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.10.tgz", - "integrity": "sha512-p5VKhP1803+f+0Jq5P03w1SbiHtpAKm+1EpJHkiPxQPq0Vu9QLZHviJ02GRrWi0dlcJqrmzMWInbwp4d22RsGw==", + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.12.tgz", + "integrity": "sha512-ujxKtKc/mWpjrOKeaACTaQ1aP0O31M0ZPWhfl85jZF1smPU4Ivb9va5Ox2poif4zVJQQo0LCFlzGtEZAsCAPcw==", "dev": true, "requires": { "chalk": "^4.1.0", - "css": "^3.0.0", + "css-select": "^4.1.3", "parse5": "^6.0.1", "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", "pretty-bytes": "^5.3.0" }, "dependencies": { @@ -23271,6 +23612,17 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "postcss": { + "version": "8.3.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.9.tgz", + "integrity": "sha512-f/ZFyAKh9Dnqytx5X62jgjhhzttjZS7hMsohcI7HEI5tjELX/HxCy3EFhsRxyzGvrzFF+82XPvCS8T9TFleVJw==", + "dev": true, + "requires": { + "nanoid": "^3.1.28", + "picocolors": "^0.2.1", + "source-map-js": "^0.6.2" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -23304,25 +23656,6 @@ } } }, - "css": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", - "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "source-map": "^0.6.1", - "source-map-resolve": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "css-blank-pseudo": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", @@ -23506,19 +23839,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } } } }, @@ -24257,11 +24577,156 @@ } }, "esbuild": { - "version": "0.12.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.17.tgz", - "integrity": "sha512-GshKJyVYUnlSXIZj/NheC2O0Kblh42CS7P1wJyTbbIHevTG4jYMS9NNw8EOd8dDWD0dzydYHS01MpZoUcQXB4g==", + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.8.tgz", + "integrity": "sha512-A4af7G7YZLfG5OnARJRMtlpEsCkq/zHZQXewgPA864l9D6VjjbH1SuFYK/OSV6BtHwDGkdwyRrX0qQFLnMfUcw==", + "dev": true, + "optional": true, + "requires": { + "esbuild-android-arm64": "0.13.8", + "esbuild-darwin-64": "0.13.8", + "esbuild-darwin-arm64": "0.13.8", + "esbuild-freebsd-64": "0.13.8", + "esbuild-freebsd-arm64": "0.13.8", + "esbuild-linux-32": "0.13.8", + "esbuild-linux-64": "0.13.8", + "esbuild-linux-arm": "0.13.8", + "esbuild-linux-arm64": "0.13.8", + "esbuild-linux-mips64le": "0.13.8", + "esbuild-linux-ppc64le": "0.13.8", + "esbuild-netbsd-64": "0.13.8", + "esbuild-openbsd-64": "0.13.8", + "esbuild-sunos-64": "0.13.8", + "esbuild-windows-32": "0.13.8", + "esbuild-windows-64": "0.13.8", + "esbuild-windows-arm64": "0.13.8" + } + }, + "esbuild-android-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.8.tgz", + "integrity": "sha512-AilbChndywpk7CdKkNSZ9klxl+9MboLctXd9LwLo3b0dawmOF/i/t2U5d8LM6SbT1Xw36F8yngSUPrd8yPs2RA==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.8.tgz", + "integrity": "sha512-b6sdiT84zV5LVaoF+UoMVGJzR/iE2vNUfUDfFQGrm4LBwM/PWXweKpuu6RD9mcyCq18cLxkP6w/LD/w9DtX3ng==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.8.tgz", + "integrity": "sha512-R8YuPiiJayuJJRUBG4H0VwkEKo6AvhJs2m7Tl0JaIer3u1FHHXwGhMxjJDmK+kXwTFPriSysPvcobXC/UrrZCQ==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.8.tgz", + "integrity": "sha512-zBn6urrn8FnKC+YSgDxdof9jhPCeU8kR/qaamlV4gI8R3KUaUK162WYM7UyFVAlj9N0MyD3AtB+hltzu4cysTw==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.8.tgz", + "integrity": "sha512-pWW2slN7lGlkx0MOEBoUGwRX5UgSCLq3dy2c8RIOpiHtA87xAUpDBvZK10MykbT+aMfXc0NI2lu1X+6kI34xng==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.8.tgz", + "integrity": "sha512-T0I0ueeKVO/Is0CAeSEOG9s2jeNNb8jrrMwG9QBIm3UU18MRB60ERgkS2uV3fZ1vP2F8i3Z2e3Zju4lg9dhVmw==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.8.tgz", + "integrity": "sha512-Bm8SYmFtvfDCIu9sjKppFXzRXn2BVpuCinU1ChTuMtdKI/7aPpXIrkqBNOgPTOQO9AylJJc1Zw6EvtKORhn64w==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.8.tgz", + "integrity": "sha512-4/HfcC40LJ4GPyboHA+db0jpFarTB628D1ifU+/5bunIgY+t6mHkJWyxWxAAE8wl/ZIuRYB9RJFdYpu1AXGPdg==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.8.tgz", + "integrity": "sha512-X4pWZ+SL+FJ09chWFgRNO3F+YtvAQRcWh0uxKqZSWKiWodAB20flsW/OWFYLXBKiVCTeoGMvENZS/GeVac7+tQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.8.tgz", + "integrity": "sha512-o7e0D+sqHKT31v+mwFircJFjwSKVd2nbkHEn4l9xQ1hLR+Bv8rnt3HqlblY3+sBdlrOTGSwz0ReROlKUMJyldA==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.8.tgz", + "integrity": "sha512-eZSQ0ERsWkukJp2px/UWJHVNuy0lMoz/HZcRWAbB6reoaBw7S9vMzYNUnflfL3XA6WDs+dZn3ekHE4Y2uWLGig==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.8.tgz", + "integrity": "sha512-gZX4kP7gVvOrvX0ZwgHmbuHczQUwqYppxqtoyC7VNd80t5nBHOFXVhWo2Ad/Lms0E8b+wwgI/WjZFTCpUHOg9Q==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.8.tgz", + "integrity": "sha512-afzza308X4WmcebexbTzAgfEWt9MUkdTvwIa8xOu4CM2qGbl2LanqEl8/LUs8jh6Gqw6WsicEK52GPrS9wvkcw==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.8.tgz", + "integrity": "sha512-mWPZibmBbuMKD+LDN23LGcOZ2EawMYBONMXXHmbuxeT0XxCNwadbCVwUQ/2p5Dp5Kvf6mhrlIffcnWOiCBpiVw==", + "dev": true, + "optional": true + }, + "esbuild-wasm": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.13.8.tgz", + "integrity": "sha512-UbD+3nloiSpJWXTCInZQrqPe8Y+RLfDkY/5kEHiXsw/lmaEvibe69qTzQu16m5R9je/0bF7VYQ5jaEOq0z9lLA==", "dev": true }, + "esbuild-windows-32": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.8.tgz", + "integrity": "sha512-QsZ1HnWIcnIEApETZWw8HlOhDSWqdZX2SylU7IzGxOYyVcX7QI06ety/aDcn437mwyO7Ph4RrbhB+2ntM8kX8A==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.8.tgz", + "integrity": "sha512-76Fb57B9eE/JmJi1QmUW0tRLQZfGo0it+JeYoCDTSlbTn7LV44ecOHIMJSSgZADUtRMWT9z0Kz186bnaB3amSg==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.8.tgz", + "integrity": "sha512-HW6Mtq5eTudllxY2YgT62MrVcn7oq2o8TAoAvDUhyiEmRmDY8tPwAhb1vxw5/cdkbukM3KdMYtksnUhF/ekWeg==", + "dev": true, + "optional": true + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -27456,12 +27921,12 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.1.0.tgz", - "integrity": "sha512-SV1GgjMcfqy6hW07rAniUbQE4qS3inh3v4rZEUySkPRWy3vMbS3jUCjMOvNI4lUnDlQYJEmuUqKktTCNY5koFQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.2.tgz", + "integrity": "sha512-ZmqShkn79D36uerdED+9qdo1ZYG8C1YsWvXu0UMJxurZnSdgz7gQKO2EGv8T55MhDqG3DYmGtizZNpM/UbTlcA==", "dev": true, "requires": { - "schema-utils": "^3.0.0" + "schema-utils": "^3.1.0" }, "dependencies": { "schema-utils": { @@ -27627,9 +28092,9 @@ "optional": true }, "nanoid": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", "dev": true }, "nanomatch": { @@ -28619,6 +29084,12 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -31685,19 +32156,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } } } }, @@ -31797,9 +32255,9 @@ } }, "sockjs-client": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", - "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", + "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", "dev": true, "requires": { "debug": "^3.2.6", @@ -31807,7 +32265,7 @@ "faye-websocket": "^0.11.3", "inherits": "^2.0.4", "json3": "^3.3.3", - "url-parse": "^1.5.1" + "url-parse": "^1.5.3" }, "dependencies": { "debug": { @@ -31883,13 +32341,16 @@ } }, "source-map-resolve": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "dev": true, "requires": { "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-support": { @@ -33166,9 +33627,9 @@ } }, "webpack": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.47.1.tgz", - "integrity": "sha512-cW+Mzy9SCDapFV4OrkHuP6EFV2mAsiQd+gOa3PKtHNoKg6qPqQXZzBlHH+CnQG1osplBCqwsJZ8CfGO6XWah0g==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.50.0.tgz", + "integrity": "sha512-hqxI7t/KVygs0WRv/kTgUW8Kl3YC81uyWQSo/7WUs5LsuRw0htH/fCwbVBGCuiX/t4s7qzjXFcf41O8Reiypag==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", @@ -33177,6 +33638,7 @@ "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.8.0", @@ -33193,7 +33655,7 @@ "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", "watchpack": "^2.2.0", - "webpack-sources": "^3.1.1" + "webpack-sources": "^3.2.0" }, "dependencies": { "enhanced-resolve": { diff --git a/client/package.json b/client/package.json index 0407bce..bbccdb7 100644 --- a/client/package.json +++ b/client/package.json @@ -7,7 +7,7 @@ "build": "ng build", "test": "ng test", "lint": "ng lint", - "a11y": "start-server-and-test start https-get://localhost:4200/ pa11y-ci", + "a11y": "start-server-and-test start http-get://localhost:4200/ pa11y-ci", "pa11y-ci": "pa11y-ci", "deploy": "ng deploy --base-href=/angular-form-testing/" }, @@ -15,27 +15,27 @@ "license": "Unlicense", "author": "Mathias Schäfer (https://molily.de)", "dependencies": { - "@angular/animations": "~12.2.0", - "@angular/common": "~12.2.0", - "@angular/compiler": "~12.2.0", - "@angular/core": "~12.2.0", - "@angular/forms": "~12.2.0", - "@angular/platform-browser": "~12.2.0", - "@angular/platform-browser-dynamic": "~12.2.0", - "@angular/router": "~12.2.0", + "@angular/animations": "~12.2.12", + "@angular/common": "~12.2.12", + "@angular/compiler": "~12.2.12", + "@angular/core": "~12.2.12", + "@angular/forms": "~12.2.12", + "@angular/platform-browser": "~12.2.12", + "@angular/platform-browser-dynamic": "~12.2.12", + "@angular/router": "~12.2.12", "rxjs": "~6.6.0", "tslib": "^2.3.0", "zone.js": "~0.11.4" }, "devDependencies": { - "@angular-devkit/build-angular": "~12.2.0", + "@angular-devkit/build-angular": "~12.2.12", "@angular-eslint/builder": "12.3.1", "@angular-eslint/eslint-plugin": "12.3.1", "@angular-eslint/eslint-plugin-template": "12.3.1", - "@angular-eslint/schematics": "12.3.1", + "@angular-eslint/schematics": "12.6.1", "@angular-eslint/template-parser": "12.3.1", - "@angular/cli": "~12.2.0", - "@angular/compiler-cli": "~12.2.0", + "@angular/cli": "~12.2.12", + "@angular/compiler-cli": "~12.2.12", "@types/jasmine": "~3.8.2", "@types/node": "^16.4.13", "@typescript-eslint/eslint-plugin": "4.28.2", @@ -53,4 +53,4 @@ "start-server-and-test": "^1.13.1", "typescript": "~4.3.5" } -} \ No newline at end of file +} diff --git a/client/src/app/app.module.ts b/client/src/app/app.module.ts index df7d7b3..4b6db90 100644 --- a/client/src/app/app.module.ts +++ b/client/src/app/app.module.ts @@ -1,11 +1,12 @@ import { HttpClientModule } from '@angular/common/http'; import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; +import { FormsModule } from '@angular/forms'; import { BrowserModule } from '@angular/platform-browser'; import { AppComponent } from './app.component'; import { ControlErrorsComponent } from './components/control-errors/control-errors.component'; import { SignupFormComponent } from './components/signup-form/signup-form.component'; +import { AsyncValidatorDirective } from './directives/async-validator.directive'; import { ErrorMessageDirective } from './directives/error-message.directive'; @NgModule({ @@ -14,8 +15,9 @@ import { ErrorMessageDirective } from './directives/error-message.directive'; SignupFormComponent, ErrorMessageDirective, ControlErrorsComponent, + AsyncValidatorDirective ], - imports: [BrowserModule, ReactiveFormsModule, HttpClientModule], + imports: [BrowserModule, FormsModule, HttpClientModule], providers: [], bootstrap: [AppComponent], }) diff --git a/client/src/app/components/control-errors/control-errors.component.html b/client/src/app/components/control-errors/control-errors.component.html index d90b10a..3442748 100644 --- a/client/src/app/components/control-errors/control-errors.component.html +++ b/client/src/app/components/control-errors/control-errors.component.html @@ -1,9 +1,5 @@
- - - - required - - -
- `, - }) - class HostComponent { - public control = new FormControl(null, Validators.required); - public form = new FormGroup({ control: this.control }); - } - - beforeEach(async () => { - await setup(HostComponent); - }); - - describe('valid control', () => { - it('renders nothing', () => { - setFieldElementValue(input, 'something'); - fixture.detectChanges(); - expectContent(fixture, ''); - }); - }); - - describe('invalid, pristine, untouched control', () => { - it('renders nothing', () => { - expectContent(fixture, ''); - }); - }); - - describe('invalid control, touched', () => { - it('renders the template', () => { - // Mark control as touched - input.dispatchEvent(new FocusEvent('blur')); - fixture.detectChanges(); - expectContent(fixture, '❗ required'); - expect(findEl(fixture, 'control-error').attributes.role).toBe('alert'); - }); - }); - - describe('invalid control, dirty', () => { - it('renders the template', () => { - // Mark control as dirty - input.dispatchEvent(new Event('input')); - fixture.detectChanges(); - expectContent(fixture, '❗ required'); - expect(findEl(fixture, 'control-error').attributes.role).toBe('alert'); - }); - }); - }); - describe('without control', () => { @Component({ template: ` @@ -152,7 +95,7 @@ describe('ControlErrorComponent', () => { it('throws an error', async () => { await TestBed.configureTestingModule({ - imports: [ReactiveFormsModule], + imports: [FormsModule], declarations: [ControlErrorsComponent, HostComponent], }).compileComponents(); @@ -167,8 +110,8 @@ describe('ControlErrorComponent', () => { describe('without template', () => { @Component({ template: ` - - + + `, }) class HostComponent { diff --git a/client/src/app/components/control-errors/control-errors.component.ts b/client/src/app/components/control-errors/control-errors.component.ts index a08656e..7c0553d 100644 --- a/client/src/app/components/control-errors/control-errors.component.ts +++ b/client/src/app/components/control-errors/control-errors.component.ts @@ -4,18 +4,31 @@ import { Input, OnDestroy, OnInit, - Optional, TemplateRef, } from '@angular/core'; -import { AbstractControl, ControlContainer, ValidationErrors } from '@angular/forms'; +import { AbstractControl, ValidationErrors } from '@angular/forms'; import { Subscription } from 'rxjs'; import { startWith } from 'rxjs/operators'; -import { findFormControl } from 'src/app/util/findFormControl'; interface TemplateContext { $implicit: ValidationErrors; } +/** + * Shows the errors for a given form control. + * + * Expects a template that is rendered when the control is invalid and touched. + * The `errors` object is passed to the template as template input variable. + * + * @example + * + * + * + * Password must be given. + * Password is too weak. + * + * + */ @Component({ selector: 'app-control-errors', templateUrl: './control-errors.component.html', @@ -25,11 +38,6 @@ export class ControlErrorsComponent implements OnInit, OnDestroy { @Input() public control?: AbstractControl; - @Input() - public controlName?: string; - - public internalControl?: AbstractControl; - @ContentChild(TemplateRef) public template: TemplateRef | null = null; @@ -37,32 +45,25 @@ export class ControlErrorsComponent implements OnInit, OnDestroy { $implicit: {}, }; - private subscription?: Subscription; + public internalControl?: AbstractControl; - constructor( - @Optional() - private controlContainer?: ControlContainer, - ) {} + private subscription?: Subscription; public ngOnInit(): void { - const control = findFormControl( - this.control, - this.controlName, - this.controlContainer, - ); - this.internalControl = control; - - this.subscription = control.statusChanges + if (!this.control) { + throw new Error('ControlErrorsComponent: control not given'); + } + this.subscription = this.control.statusChanges .pipe(startWith('PENDING')) - .subscribe((status) => { + .subscribe(() => { this.updateTemplateContext(); }); } private updateTemplateContext(): void { - if (this.internalControl && this.internalControl.errors) { + if (this.control && this.control.errors) { this.templateContext = { - $implicit: this.internalControl.errors, + $implicit: this.control.errors, }; } } diff --git a/client/src/app/components/signup-form/signup-form.component.html b/client/src/app/components/signup-form/signup-form.component.html index 9c0f6a8..13010ed 100644 --- a/client/src/app/components/signup-form/signup-form.component.html +++ b/client/src/app/components/signup-form/signup-form.component.html @@ -1,6 +1,6 @@

Sign-up

-
+
Choose your plan @@ -11,9 +11,10 @@

Sign-up

-
+
Address @@ -254,7 +256,7 @@

Sign-up

#name="ngModel" type="text" name="name" - [(ngModel)]="model.address.name" + ngModel required appErrorMessage="name-errors" autocomplete="name" @@ -276,18 +278,18 @@

Sign-up

Sign-up

#addressLine1="ngModel" type="text" name="addressLine1" - [(ngModel)]="model.address.addressLine1" - [required]="model.plan !== PERSONAL" + ngModel + [required]="plan.value === BUSINESS || plan.value === NON_PROFIT" appErrorMessage="addressLine1-errors" autocomplete="address-line1" data-testid="addressLine1" @@ -310,10 +312,10 @@

Sign-up

- + Company must be given. - + Organization must be given. @@ -334,7 +336,7 @@

Sign-up

#addressLine2="ngModel" type="text" name="addressLine2" - [(ngModel)]="model.address.addressLine2" + ngModel required appErrorMessage="addressLine2-errors" autocomplete="address-line2" @@ -365,7 +367,7 @@

Sign-up

#city="ngModel" type="text" name="city" - [(ngModel)]="model.address.city" + ngModel required appErrorMessage="city-errors" autocomplete="shipping address-level2" @@ -394,7 +396,7 @@

Sign-up

#postcode="ngModel" type="text" name="postcode" - [(ngModel)]="model.address.postcode" + ngModel required appErrorMessage="postcode-errors" autocomplete="shipping postal-code" @@ -422,7 +424,7 @@

Sign-up

Sign-up