From 7be0a6af0f01c8f36649d4061bea90634e76ead5 Mon Sep 17 00:00:00 2001 From: Henry Taeschner Date: Fri, 29 Dec 2023 19:10:42 +0100 Subject: [PATCH] fix: simplify routing and translation loading, extend linting/prettier, added default test cases --- .browserslistrc | 18 + .commitlintrc.json | 9 + .dockerignore | 43 ++ .editorconfig | 15 + .eslintrc.json | 75 ++ .gitignore | 6 +- .gitlab-ci.yml | 16 + .prettierignore | 17 + .prettierrc.json | 23 + angular.json | 20 +- jest.config.ts | 23 + jest.preset.js | 15 + karma.conf.js | 10 +- package-lock.json | 649 +++++------------- package.json | 77 ++- src/app/app.component.spec.ts | 4 +- src/app/app.component.ts | 2 +- src/app/app.module.ts | 63 +- src/app/shared/can-active-guard.service.ts | 11 +- .../image-container.component.ts | 2 +- src/app/shared/shared.module.ts | 161 ++--- .../theme-color-box.component.ts | 2 +- src/app/test/mocks/auth-mock.service.ts | 27 + src/app/theme-mgmt-remote.module.ts | 105 +-- .../theme-designer.component.html | 8 +- .../theme-designer.component.spec.ts | 36 +- .../theme-designer.component.ts | 3 +- .../theme-detail/theme-detail.component.html | 6 +- .../theme-detail.component.spec.ts | 33 +- .../theme-detail/theme-detail.component.ts | 2 +- .../theme-intern/theme-intern.component.ts | 2 +- .../theme-import/theme-import.component.html | 2 +- .../theme-import.component.spec.ts | 41 +- .../theme-import/theme-import.component.ts | 2 +- .../theme-search/theme-search.component.html | 12 +- .../theme-search.component.spec.ts | 31 +- .../theme-search/theme-search.component.ts | 15 +- src/app/theme/theme.module.ts | 45 +- src/assets/env.json | 2 +- src/environments/environment.ts | 5 +- src/test-setup.ts | 1 + tsconfig.app.json | 25 +- tsconfig.json | 20 +- tsconfig.spec.json | 11 +- webpack.config.js | 2 +- 45 files changed, 783 insertions(+), 914 deletions(-) create mode 100644 .browserslistrc create mode 100644 .commitlintrc.json create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .eslintrc.json create mode 100644 .gitlab-ci.yml create mode 100644 .prettierignore create mode 100644 .prettierrc.json create mode 100644 jest.config.ts create mode 100644 jest.preset.js create mode 100644 src/app/test/mocks/auth-mock.service.ts create mode 100644 src/test-setup.ts diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000..0ccadaf --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,18 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# For the full list of supported browsers by the Angular framework, please see: +# https://angular.io/guide/browser-support + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +last 1 Chrome version +last 1 Firefox version +last 2 Edge major versions +last 2 Safari major versions +last 2 iOS major versions +Firefox ESR +not IE 9-10 # Angular support for IE 9-10 has been deprecated and will be removed as of Angular v11. To opt-in, remove the 'not' prefix on this line. +not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. diff --git a/.commitlintrc.json b/.commitlintrc.json new file mode 100644 index 0000000..837ad18 --- /dev/null +++ b/.commitlintrc.json @@ -0,0 +1,9 @@ +{ + "extends": ["@commitlint/config-conventional"], + "rules": { + "type-case": [2, "always", ["lowerCase"]], + "type-enum": [2, "always", ["build", "ci", "docs", "feat", "fix", "perf", "refactor", "revert", "style", "ticket"]], + "subject-min-length": [2, "always", [5]], + "subject-max-length": [2, "always", [200]] + } +} diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..26377f4 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,43 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/tmp +/out-tsc + +# dependencies +/node_modules + +# IDEs and editors +.vscode/ +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +testem.log +/typings +yarn-error.log + +# e2e +/e2e/*.js +/e2e/*.map + +# System Files +.DS_Store +Thumbs.db \ No newline at end of file diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..022da71 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..301bf85 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,75 @@ +{ + "root": true, + "ignorePatterns": [ + ".angular/**", + ".husky/**", + "coverage/**", + "dist/**", + "helm/**", + "node_modules/**", + "src/app/generated/**", + "src/app/api/*", + "src/app/model/*" + ], + "overrides": [ + { + "files": ["*.ts", "*.js"], + "env": { "es6": true }, + "globals": { + "__dirname": true + }, + "parserOptions": { + "ecmaVersion": "latest", + "project": "**/tsconfig.json", + "tsconfigRootDir": "", + "createDefaultProgram": true + }, + "extends": [ + "plugin:@angular-eslint/recommended", + "plugin:@angular-eslint/template/process-inline-templates", + "plugin:prettier/recommended" + ], + "rules": { + "semi": ["error", "never"], + "@angular-eslint/directive-selector": [ + "error", + { + "type": "attribute", + "prefix": "tm", + "style": "camelCase" + } + ], + "@angular-eslint/component-selector": [ + "warn", + { + "type": "element", + "prefix": "tm", + "style": "kebab-case" + } + ], + "prettier/prettier": [ + "error", + { + "singleQuote": true + } + ], + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": ["error", { "vars": "all", "args": "none" }] + } + }, + { + "files": ["*.html"], + "excludedFiles": ["*inline-template-*.component.html"], + "extends": ["plugin:@angular-eslint/template/recommended", "plugin:prettier/recommended"], + "rules": { + "prettier/prettier": [ + "error", + { + "singleQuote": true, + "parser": "angular" + } + ] + } + } + ] +} diff --git a/.gitignore b/.gitignore index 6a37bf7..b75ca20 100644 --- a/.gitignore +++ b/.gitignore @@ -32,16 +32,14 @@ speed-measure-plugin*.json .history/* # misc -node_modules /.angular/cache /.sass-cache /connect.lock /coverage /libpeerconnection.log -npm-debug.log -yarn-error.log -testem.log /typings +*.log +*.sh # System Files .DS_Store diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..35ac51e --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,16 @@ +variables: + # docker image for the npm build and test + NPM_BUILD_IMAGE: harbor.1000kit.org/1000kit/node-build:v16 + +include: + - project: '1000kit/infra/ci/angular' + ref: 'v1' + file: 'ci.yml' + +npm:build: + before_script: + - npm ci --force --cache .npm --prefer-offline + +npm:test: + before_script: + - npm ci --force --cache .npm --prefer-offline diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..4d7a3c1 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,17 @@ +.angular/** +.husky/** +.docusaurus/ +.prettierignore +coverage/** +dist/** +helm/** +nginx/** +node_modules +CHANGELOG.md +README.md +Dockerfile +*.log +*.sh +src/app/generated/** +src/app/api/* +src/app/model/* diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..62bbae8 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,23 @@ +{ + "trailingComma": "none", + "tabWidth": 2, + "useTabs": false, + "semi": false, + "singleQuote": true, + "bracketSpacing": true, + "printWidth": 120, + "overrides": [ + { + "files": "*.component.html", + "options": { + "parser": "angular" + } + }, + { + "files": "*.html", + "options": { + "parser": "html" + } + } + ] +} diff --git a/angular.json b/angular.json index 4b60363..44f0b7c 100644 --- a/angular.json +++ b/angular.json @@ -3,18 +3,18 @@ "version": 1, "newProjectRoot": "projects", "projects": { - "theme-mgmt-ui": { + "onecx-theme-ui": { "projectType": "application", "schematics": {}, "root": "", "sourceRoot": "src", - "prefix": "app", + "prefix": "tm", "architect": { "build": { "builder": "ngx-build-plus:browser", "options": { "preserveSymlinks": true, - "outputPath": "dist/theme-mgmt-ui", + "outputPath": "dist/onecx-theme-ui", "index": "src/index.html", "main": "src/main.ts", "polyfills": "src/polyfills.ts", @@ -76,18 +76,18 @@ "serve": { "builder": "ngx-build-plus:dev-server", "options": { - "browserTarget": "theme-mgmt-ui:build", - "port": 4200, - "publicHost": "http://localhost:4200", + "browserTarget": "onecx-theme-ui:build", + "port": 5020, + "publicHost": "http://localhost:5020", "extraWebpackConfig": "webpack.config.js", "proxyConfig": "proxy.conf.js" }, "configurations": { "development": { - "browserTarget": "theme-mgmt-ui:build:development" + "browserTarget": "onecx-theme-ui:build:development" }, "production": { - "browserTarget": "theme-mgmt-ui:build:production", + "browserTarget": "onecx-theme-ui:build:production", "extraWebpackConfig": "webpack.prod.config.js" } } @@ -95,7 +95,7 @@ "extract-i18n": { "builder": "ngx-build-plus:extract-i18n", "options": { - "browserTarget": "theme-mgmt-ui:build", + "browserTarget": "onecx-theme-ui:build", "extraWebpackConfig": "webpack.config.js" } }, @@ -114,7 +114,7 @@ "lint": { "builder": "@angular-eslint/builder:lint", "options": { - "lintFilePatterns": ["src/**/*.ts", "src/**/*.html"] + "lintFilePatterns": ["**/*.ts", "**/*.js", "**/*.html"] } } } diff --git a/jest.config.ts b/jest.config.ts new file mode 100644 index 0000000..2a259b8 --- /dev/null +++ b/jest.config.ts @@ -0,0 +1,23 @@ +/* eslint-disable */ +export default { + displayName: 'theme-mgmt-ui', + preset: './jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + globals: {}, + coverageDirectory: './coverage/app', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$' + } + ] + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment' + ] +} diff --git a/jest.preset.js b/jest.preset.js new file mode 100644 index 0000000..0d26306 --- /dev/null +++ b/jest.preset.js @@ -0,0 +1,15 @@ +const nxPreset = require('@nrwl/jest/preset').default + +module.exports = { + ...nxPreset, + /* TODO: Update to latest Jest snapshotFormat + * By default Nx has kept the older style of Jest Snapshot formats + * to prevent breaking of any existing tests with snapshots. + * It's recommend you update to the latest format. + * You can do this by removing snapshotFormat property + * and running tests with --update-snapshot flag. + * Example: "nx affected --targets=test --update-snapshot" + * More info: https://jestjs.io/docs/upgrading-to-jest29#snapshot-format + */ + snapshotFormat: { escapeString: true, printBasicPrototype: true } +} diff --git a/karma.conf.js b/karma.conf.js index 85da66f..dd48008 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -25,7 +25,7 @@ module.exports = function (config) { suppressAll: true // removes the duplicated traces }, coverageReporter: { - dir: require('path').join(__dirname, './coverage/library-ui'), + dir: require('path').join(__dirname, './coverage/app'), subdir: '.', reporters: [{ type: 'html' }, { type: 'text-summary' }] }, @@ -34,14 +34,14 @@ module.exports = function (config) { colors: true, logLevel: config.LOG_INFO, autoWatch: true, - browsers: ['Chrome', 'HeadlessChrome'], + browsers: ['HeadlessChrome'], + singleRun: false, + restartOnFileChange: true, customLaunchers: { HeadlessChrome: { base: 'ChromeHeadless', flags: ['--no-sandbox'] } - }, - singleRun: false, - restartOnFileChange: true + } }) } diff --git a/package-lock.json b/package-lock.json index 9de2f73..60b569e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,11 +23,11 @@ "@ngneat/falso": "^6.4.0", "@ngx-translate/core": "^14.0.0", "@ngx-translate/http-loader": "^7.0.0", - "@onecx/accelerator": "^3.6.0", - "@onecx/integration-interface": "^3.6.0", - "@onecx/keycloak-auth": "^3.6.0", - "@onecx/portal-integration-angular": "^3.6.0", - "@onecx/portal-layout-styles": "^3.6.0", + "@onecx/accelerator": "^3.7.1", + "@onecx/integration-interface": "^3.7.1", + "@onecx/keycloak-auth": "^3.7.1", + "@onecx/portal-integration-angular": "^3.7.1", + "@onecx/portal-layout-styles": "^3.7.1", "clsx": "^1.2.1", "core-js": "^3.30.1", "file-saver": "^2.0.5", @@ -48,10 +48,11 @@ "@angular-devkit/build-angular": "15.2.6", "@angular-devkit/core": "15.2.6", "@angular-devkit/schematics": "15.2.6", - "@angular-eslint/builder": "^15.2.1", - "@angular-eslint/eslint-plugin": "15.0.0", - "@angular-eslint/eslint-plugin-template": "15.0.0", - "@angular-eslint/template-parser": "15.0.0", + "@angular-eslint/builder": "15.2.1", + "@angular-eslint/eslint-plugin": "15.2.1", + "@angular-eslint/eslint-plugin-template": "15.2.1", + "@angular-eslint/schematics": "15.2.1", + "@angular-eslint/template-parser": "15.2.1", "@angular/cli": "~15.2.0", "@angular/compiler-cli": "15.2.7", "@angular/language-service": "15.2.7", @@ -59,7 +60,6 @@ "@commitlint/config-conventional": "^17.6.3", "@docusaurus/module-type-aliases": "~2.4.0", "@jscutlery/semver": "^2.30.1", - "@nrwl/nx-cloud": "15.3.5", "@openapitools/openapi-generator-cli": "^2.6.0", "@schematics/angular": "15.2.6", "@storybook/addon-essentials": "7.0.4", @@ -71,14 +71,15 @@ "@swc/core": "^1.3.56", "@swc/helpers": "0.5.1", "@types/jasmine": "~3.10.0", + "@types/jest": "^29.5.11", "@types/node": "18.16.3", - "@typescript-eslint/eslint-plugin": "5.59.2", - "@typescript-eslint/parser": "5.59.2", + "@typescript-eslint/eslint-plugin": "5.48.2", + "@typescript-eslint/parser": "5.48.2", "autoprefixer": "10.4.14", "chromatic": "^6.17.4", "css-loader": "^6.7.3", "cypress": "^12.11.0", - "eslint": "~8.39.0", + "eslint": "^8.33.0", "eslint-config-prettier": "8.8.0", "eslint-plugin-cypress": "^2.13.3", "eslint-plugin-import": "2.27.5", @@ -103,7 +104,6 @@ "ng-packagr": "15.2.2", "ngx-build-plus": "^14.0.0", "ngx-translate-testing": "^6.1.0", - "nx": "16.0.3", "postcss": "8.4.23", "postcss-import": "~15.1.0", "postcss-preset-env": "~8.3.2", @@ -933,19 +933,19 @@ } }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-15.0.0.tgz", - "integrity": "sha512-IFJFVCc3t+ujD8J6//RzYrtp7N9wUQhZnRUkd7pI7IpUT1XrQx5uNbDca9OLXM5F+HCHOQPIoaCyg3O/XJcc8Q==", + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-15.2.1.tgz", + "integrity": "sha512-LO7Am8eVCr7oh6a0VmKSL7K03CnQEQhFO7Wt/YtbfYOxVjrbwmYLwJn+wZPOT7A02t/BttOD/WXuDrOWtSMQ/Q==", "dev": true }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-15.0.0.tgz", - "integrity": "sha512-Yj/GeLQ+bBUgrIQDqa//nHrS9UvxZ1KQhavcK0xruuy29AYf+yolVdEGKvFNlpMoGRXkv2eMmWUkODS495DTYQ==", + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-15.2.1.tgz", + "integrity": "sha512-OM7b1kS4E4CkXjkaWN+lEzawh4VxY6l7FO1Cuk4s7iv3/YpZG3rJxIZBqnFLTixwrBuqw8y4FNBzF3eDgmFAUw==", "dev": true, "dependencies": { - "@angular-eslint/utils": "15.0.0", - "@typescript-eslint/utils": "5.43.0" + "@angular-eslint/utils": "15.2.1", + "@typescript-eslint/utils": "5.48.2" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", @@ -953,15 +953,15 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-15.0.0.tgz", - "integrity": "sha512-9i8BFnqhN1/xR1vZaeRUf48DWxgRnJDOXfJtNONkTUUsImXzShJUgFK++/YC6BeNRsZf0wPN/qpstuScwELJKA==", + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-15.2.1.tgz", + "integrity": "sha512-IeiSLk6YxapFdH2z5o/O3R7VwtBd2T6fWmhLFPwDYMDknrwegnOjwswCdBplOccpUp0wqlCeGUx7LTsuzwaz7w==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "15.0.0", - "@angular-eslint/utils": "15.0.0", - "@typescript-eslint/type-utils": "5.43.0", - "@typescript-eslint/utils": "5.43.0", + "@angular-eslint/bundled-angular-compiler": "15.2.1", + "@angular-eslint/utils": "15.2.1", + "@typescript-eslint/type-utils": "5.48.2", + "@typescript-eslint/utils": "5.48.2", "aria-query": "5.1.3", "axobject-query": "3.1.1" }, @@ -970,13 +970,29 @@ "typescript": "*" } }, + "node_modules/@angular-eslint/schematics": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-15.2.1.tgz", + "integrity": "sha512-0ZfBCejHWIcgy3J5kFs9sS/jqi8i5AptxggOwFySOlCLJ+CzNrktjD4jff1Zy8K/VLzY0Ci0BSZXvgWfP0k9Rg==", + "dev": true, + "dependencies": { + "@angular-eslint/eslint-plugin": "15.2.1", + "@angular-eslint/eslint-plugin-template": "15.2.1", + "ignore": "5.2.4", + "strip-json-comments": "3.1.1", + "tmp": "0.2.1" + }, + "peerDependencies": { + "@angular/cli": ">= 15.0.0 < 16.0.0" + } + }, "node_modules/@angular-eslint/template-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-15.0.0.tgz", - "integrity": "sha512-tidZOhQ9ygXPyUwxXzXbEVJUiHRNF0oFu1Pf+hSlOwgjvRqCqVwXfDxEe6NjFEwRXsp0CtDgyseu7E9+ml+m6A==", + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-15.2.1.tgz", + "integrity": "sha512-ViCi79gC2aKJecmYLkOT+QlT5WMRNXeYz0Dr9Pr8qXzIbY0oAWE7nOT5jkXwQ9oUk+ybtGCWHma5JVJWVJsIog==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "15.0.0", + "@angular-eslint/bundled-angular-compiler": "15.2.1", "eslint-scope": "^7.0.0" }, "peerDependencies": { @@ -985,13 +1001,13 @@ } }, "node_modules/@angular-eslint/utils": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-15.0.0.tgz", - "integrity": "sha512-+eI2vNixlxmwAH+vcF81DNtzZ1CJAe6e1yktT5Xmn/FUVWKe4hHQN95Km0H8G0epF8MovCJwmPdhFYwi/X8u3w==", + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-15.2.1.tgz", + "integrity": "sha512-++FneAJHxJqcSu0igVN6uOkSoHxlzgLoMBswuovYJy3UKwm33/T6WFku8++753Ca/JucIoR1gdUfO7SoSspMDg==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "15.0.0", - "@typescript-eslint/utils": "5.43.0" + "@angular-eslint/bundled-angular-compiler": "15.2.1", + "@typescript-eslint/utils": "5.48.2" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", @@ -6720,170 +6736,12 @@ "nx": ">= 14.1 <= 16" } }, - "node_modules/@nrwl/nx-cloud": { - "version": "15.3.5", - "resolved": "https://registry.npmjs.org/@nrwl/nx-cloud/-/nx-cloud-15.3.5.tgz", - "integrity": "sha512-JMKLY0HhdzQ/6jEvfL/EecPPdsdBIM0SyFrWAjikSJAh5MqhpFJWnr6FfTc5P57PJZ+IUNLkJ21VMuoTrA4+4w==", - "dev": true, - "dependencies": { - "axios": "^0.21.2", - "chalk": "4.1.0", - "dotenv": "~10.0.0", - "fs-extra": "^10.1.0", - "node-machine-id": "^1.1.12", - "strip-json-comments": "^3.1.1", - "tar": "6.1.11", - "yargs-parser": ">=21.0.1" - }, - "bin": { - "nx-cloud": "bin/nx-cloud.js" - } - }, - "node_modules/@nrwl/nx-cloud/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@nrwl/nx-cloud/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/@nrwl/nx-cloud/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@nrwl/nx-cloud/node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@nrwl/nx-cloud/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@nrwl/nx-cloud/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nrwl/nx-cloud/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nrwl/nx-cloud/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nrwl/nx-cloud/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nrwl/nx-cloud/node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/nx-cloud/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@nrwl/nx-cloud/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/@nrwl/tao": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-16.0.3.tgz", "integrity": "sha512-CAECe97eReR1vVf5iuv+Nw0msDJS/HtRBpkkN5e65lSJzEKdsOgpWtteU0QzexN/Spnah8Q/ByM14ii2P1xpCQ==", "dev": true, + "peer": true, "dependencies": { "nx": "16.0.3" }, @@ -6973,6 +6831,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 10" } @@ -6989,6 +6848,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 10" } @@ -7005,6 +6865,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10" } @@ -7021,6 +6882,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10" } @@ -7037,6 +6899,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10" } @@ -7053,6 +6916,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10" } @@ -7069,6 +6933,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10" } @@ -7085,6 +6950,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 10" } @@ -7101,23 +6967,24 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 10" } }, "node_modules/@onecx/accelerator": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@onecx/accelerator/-/accelerator-3.7.0.tgz", - "integrity": "sha512-W8JkVxQ8EgbFWRipnm7jhCigirkfhi2P+TP/mAxgAJGI7MHhXpObpxcm9LELP9bs8pcvNI/c56Nn18QYpml6Ow==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@onecx/accelerator/-/accelerator-3.7.1.tgz", + "integrity": "sha512-s/+4oNgHOWN9NabbF+BeHDv091kxv9o/XiUrBP9ssnfK4sDaS0/7g16Wprmt2SMJMQxm6nLczBgJ+nkJHSrITQ==", "peerDependencies": { "rxjs": "7.8.1", "tslib": "^2.3.0" } }, "node_modules/@onecx/integration-interface": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@onecx/integration-interface/-/integration-interface-3.7.0.tgz", - "integrity": "sha512-kjHbSesP8Rad/jIUhjagbvyzx50w2jf9X4TYMwmtT0sNcLf6bxfZEBRYFfA0X+RjuqTesGHvbGHVsOHy7gAZ/g==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@onecx/integration-interface/-/integration-interface-3.7.1.tgz", + "integrity": "sha512-fsqKJGlXkM05uvVuodVDE3q37Ykz1/LtypAXWjsmK2mc+EGOfjBtEJi7UGmnWVup7U0lFZR+eTTAzYbc6LIXzQ==", "peerDependencies": { "@onecx/accelerator": "^3", "rxjs": "7.8.1", @@ -7125,9 +6992,9 @@ } }, "node_modules/@onecx/keycloak-auth": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@onecx/keycloak-auth/-/keycloak-auth-3.7.0.tgz", - "integrity": "sha512-ClEExps/Q1pm/udTHayZRLw26OFfV9vNcXRsFJXDy9fjv/mRTK/x+i6AWQD7QC++lQIfDYCbVuV8cB+SvBGz0w==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@onecx/keycloak-auth/-/keycloak-auth-3.7.1.tgz", + "integrity": "sha512-QqkhJdAvn0y/9X/QTSHOn1B7RDZ6qVp/JM7pjfwwCZZcQQT2KW+wDlQWMiNBPhnsSQua1RlsaI5dqeQyipgbmA==", "dependencies": { "tslib": "^2.3.0" }, @@ -7141,9 +7008,9 @@ } }, "node_modules/@onecx/portal-integration-angular": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@onecx/portal-integration-angular/-/portal-integration-angular-3.7.0.tgz", - "integrity": "sha512-gsYdjNcbYzO0L8Cwi/uqoKIqUoU0wytqhIStB6v4fbnqOdrkh0y1Kf+uo1p2tDahIGSf4A5j6vqrdg/XRV8lzQ==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@onecx/portal-integration-angular/-/portal-integration-angular-3.7.1.tgz", + "integrity": "sha512-JFzo03qdRlU3Y25VduTVzENIhlL4Y4XmanUSfDdxoPU3sCD3PjpYI30y95WzA/1vDZFaerjs+9wYXHmfMx1k5A==", "dependencies": { "tslib": "^2.3.0" }, @@ -7173,9 +7040,9 @@ } }, "node_modules/@onecx/portal-layout-styles": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@onecx/portal-layout-styles/-/portal-layout-styles-3.7.0.tgz", - "integrity": "sha512-DDTNS8FNBvlfhJ0jQ1xjJU6ipi8ACHRzVKVLvVnk9kfdxDZvAotB2ootQFCOVBPMHrnIauabDXcN4Zd+eKEZUg==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@onecx/portal-layout-styles/-/portal-layout-styles-3.7.1.tgz", + "integrity": "sha512-RBFWbP22bh5sotUXcoo4Ur3/LZ481M8mR6Gb80KephFS8zppTyKMcCI4sDy4mEbtrsvKFOxyIVLw/ZBJX9LdgQ==", "peerDependencies": { "tslib": "^2.5.0" } @@ -7405,6 +7272,7 @@ "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", "dev": true, "hasInstallScript": true, + "peer": true, "dependencies": { "node-addon-api": "^3.2.1", "node-gyp-build": "^4.3.0" @@ -10485,6 +10353,16 @@ "integrity": "sha512-yta4vvl7W3H6nFPIp6fvd7YCVMgWp3ir8Bv+AGfBll1a5hoKVs9eLcj15Fy9DDn9Yp8fHOjb/YEJd1vWYyE78A==", "dev": true }, + "node_modules/@types/jest": { + "version": "29.5.11", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.11.tgz", + "integrity": "sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, "node_modules/@types/js-levenshtein": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@types/js-levenshtein/-/js-levenshtein-1.1.3.tgz", @@ -10850,19 +10728,18 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.2.tgz", - "integrity": "sha512-yVrXupeHjRxLDcPKL10sGQ/QlVrA8J5IYOEWVqk0lJaSZP7X5DfnP7Ns3cc74/blmbipQ1htFNVGsHX6wsYm0A==", + "version": "5.48.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.2.tgz", + "integrity": "sha512-sR0Gja9Ky1teIq4qJOl0nC+Tk64/uYdX+mi+5iB//MH8gwyx8e3SOyhEzeLZEFEEfCaLf8KJq+Bd/6je1t+CAg==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.2", - "@typescript-eslint/type-utils": "5.59.2", - "@typescript-eslint/utils": "5.59.2", + "@typescript-eslint/scope-manager": "5.48.2", + "@typescript-eslint/type-utils": "5.48.2", + "@typescript-eslint/utils": "5.48.2", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -10883,90 +10760,15 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.2.tgz", - "integrity": "sha512-b1LS2phBOsEy/T381bxkkywfQXkV1dWda/z0PhnIy3bC5+rQWQDS7fk9CSpcXBccPY27Z6vBEuaPBCKCgYezyQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.2", - "@typescript-eslint/utils": "5.59.2", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.2.tgz", - "integrity": "sha512-kSuF6/77TZzyGPhGO4uVp+f0SBoYxCDf+lW3GKhtKru/L8k/Hd7NFQxyWUeY7Z/KGB2C6Fe3yf2vVi4V9TsCSQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.2", - "@typescript-eslint/types": "5.59.2", - "@typescript-eslint/typescript-estree": "5.59.2", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.2.tgz", - "integrity": "sha512-uq0sKyw6ao1iFOZZGk9F8Nro/8+gfB5ezl1cA06SrqbgJAt0SRoFhb9pXaHvkrxUpZaoLxt8KlovHNk8Gp6/HQ==", + "version": "5.48.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.2.tgz", + "integrity": "sha512-38zMsKsG2sIuM5Oi/olurGwYJXzmtdsHhn5mI/pQogP+BjYVkK5iRazCQ8RGS0V+YLk282uWElN70zAAUmaYHw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.2", - "@typescript-eslint/types": "5.59.2", - "@typescript-eslint/typescript-estree": "5.59.2", + "@typescript-eslint/scope-manager": "5.48.2", + "@typescript-eslint/types": "5.48.2", + "@typescript-eslint/typescript-estree": "5.48.2", "debug": "^4.3.4" }, "engines": { @@ -10986,13 +10788,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.2.tgz", - "integrity": "sha512-dB1v7ROySwQWKqQ8rEWcdbTsFjh2G0vn8KUyvTXdPoyzSL6lLGkiXEV5CvpJsEe9xIdKV+8Zqb7wif2issoOFA==", + "version": "5.48.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.2.tgz", + "integrity": "sha512-zEUFfonQid5KRDKoI3O+uP1GnrFd4tIHlvs+sTJXiWuypUWMuDaottkJuR612wQfOkjYbsaskSIURV9xo4f+Fw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.2", - "@typescript-eslint/visitor-keys": "5.59.2" + "@typescript-eslint/types": "5.48.2", + "@typescript-eslint/visitor-keys": "5.48.2" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -11003,13 +10805,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.43.0.tgz", - "integrity": "sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==", + "version": "5.48.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.2.tgz", + "integrity": "sha512-QVWx7J5sPMRiOMJp5dYshPxABRoZV1xbRirqSk8yuIIsu0nvMTZesKErEA3Oix1k+uvsk8Cs8TGJ6kQ0ndAcew==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.43.0", - "@typescript-eslint/utils": "5.43.0", + "@typescript-eslint/typescript-estree": "5.48.2", + "@typescript-eslint/utils": "5.48.2", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -11029,67 +10831,10 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.43.0.tgz", - "integrity": "sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz", - "integrity": "sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/visitor-keys": "5.43.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz", - "integrity": "sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.43.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/types": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.2.tgz", - "integrity": "sha512-LbJ/HqoVs2XTGq5shkiKaNTuVv5tTejdHgfdjqRUGdYhjW1crm/M7og2jhVskMt8/4wS3T1+PfFvL1K3wqYj4w==", + "version": "5.48.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.2.tgz", + "integrity": "sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -11100,13 +10845,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.2.tgz", - "integrity": "sha512-+j4SmbwVmZsQ9jEyBMgpuBD0rKwi9RxRpjX71Brr73RsYnEr3Lt5QZ624Bxphp8HUkSKfqGnPJp1kA5nl0Sh7Q==", + "version": "5.48.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.2.tgz", + "integrity": "sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.2", - "@typescript-eslint/visitor-keys": "5.59.2", + "@typescript-eslint/types": "5.48.2", + "@typescript-eslint/visitor-keys": "5.48.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -11127,16 +10872,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.43.0.tgz", - "integrity": "sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==", + "version": "5.48.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.2.tgz", + "integrity": "sha512-2h18c0d7jgkw6tdKTlNaM7wyopbLRBiit8oAxoP89YnuBOzCZ8g8aBCaCqq7h208qUTroL7Whgzam7UY3HVLow==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.43.0", - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/typescript-estree": "5.43.0", + "@typescript-eslint/scope-manager": "5.48.2", + "@typescript-eslint/types": "5.48.2", + "@typescript-eslint/typescript-estree": "5.48.2", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -11152,80 +10897,6 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz", - "integrity": "sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/visitor-keys": "5.43.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.43.0.tgz", - "integrity": "sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz", - "integrity": "sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/visitor-keys": "5.43.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz", - "integrity": "sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.43.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -11249,12 +10920,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.2.tgz", - "integrity": "sha512-EEpsO8m3RASrKAHI9jpavNv9NlEUebV4qmF1OWxSTtKSFBpC1NCmWazDQHFivRf0O1DV11BA645yrLEVQ0/Lig==", + "version": "5.48.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.2.tgz", + "integrity": "sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/types": "5.48.2", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -11457,6 +11128,7 @@ "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", "dev": true, + "peer": true, "dependencies": { "js-yaml": "^3.10.0", "tslib": "^2.4.0" @@ -11470,6 +11142,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -11479,6 +11152,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -11492,6 +11166,7 @@ "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", "dev": true, + "peer": true, "dependencies": { "argparse": "^2.0.1" }, @@ -16120,7 +15795,8 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/duplexify": { "version": "3.7.1", @@ -23334,6 +23010,7 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", "dev": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -25149,12 +24826,6 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, - "node_modules/node-machine-id": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", - "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", - "dev": true - }, "node_modules/node-releases": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", @@ -25452,6 +25123,7 @@ "integrity": "sha512-Q76wS7oWsbxi7lxyhI9d10MOvNhbxjDU0J40gdg8DhIi8QWJ5q5SfkD5+Vn1mYy9AA7zyKUF8CGh2kYJMpWPpA==", "dev": true, "hasInstallScript": true, + "peer": true, "dependencies": { "@nrwl/tao": "16.0.3", "@parcel/watcher": "2.0.4", @@ -25520,6 +25192,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -25535,6 +25208,7 @@ "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", "dev": true, + "peer": true, "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -25546,6 +25220,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -25562,6 +25237,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, + "peer": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -25573,6 +25249,7 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", "dev": true, + "peer": true, "engines": { "node": ">=10" } @@ -25581,13 +25258,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "peer": true }, "node_modules/nx/node_modules/enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, + "peer": true, "dependencies": { "ansi-colors": "^4.1.1" }, @@ -25600,6 +25279,7 @@ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", "dev": true, + "peer": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -25616,6 +25296,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -25633,6 +25314,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -25642,6 +25324,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -25654,6 +25337,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", "dev": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -25665,13 +25349,15 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/nx/node_modules/semver": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", "dev": true, + "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -25687,6 +25373,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -25701,6 +25388,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -25710,6 +25398,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -25722,6 +25411,7 @@ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, + "peer": true, "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", @@ -25736,6 +25426,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -25752,13 +25443,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "peer": true }, "node_modules/nx/node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, + "peer": true, "engines": { "node": ">=12" } @@ -28607,6 +28300,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, "node_modules/regexpu-core": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", @@ -30560,6 +30265,7 @@ "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", "dev": true, + "peer": true, "dependencies": { "duplexer": "^0.1.1", "minimist": "^1.2.0", @@ -32341,7 +32047,8 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", diff --git a/package.json b/package.json index 69c52ff..dfe5387 100644 --- a/package.json +++ b/package.json @@ -9,15 +9,16 @@ } }, "scripts": { - "start": "ng serve --configuration=development --proxy-config=proxy.conf.js", "build": "ng build", "clean": "npm cache clean --force", + "start": "ng serve --configuration=development --proxy-config=proxy.conf.js", "prepare": "husky install", - "format": "nx format:write --uncommitted", - "format2": "ng lint --fix", "lint": "ng lint", + "eslint": "eslint --ext .js,.ts src", + "format": "ng lint --fix", + "browsers": "npx browserslist", "test": "ng test", - "test:ci": "ng test --no-watch --browsers=ChromeHeadless --code-coverage", + "test:ci": "ng test --watch=false --browsers=ChromeHeadless --code-coverage --progress", "apigen-portal-cleanup": "rm -rf $npm_package_config_portal_openapiOutput", "apigen-portal-format": "npx prettier $npm_package_config_portal_openapiYaml --write && npx prettier $npm_package_config_portal_openapiOutput/**/* --write", "apigen-portal-generate": "openapi-generator-cli generate -i $npm_package_config_portal_openapiYaml -g typescript-angular -c apigen.yaml -o $npm_package_config_portal_openapiOutput --type-mappings AnyType=object", @@ -25,6 +26,24 @@ "apigen": "npm run apigen-portal" }, "private": true, + "husky": { + "hooks": { + "pre-commit": "pretty-quick --staged" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.spec.json", + "karmaConfig": "./karma.conf.js", + "codeCoverageExclude": [ + "src/testing/**/*", + "src/app/generated/**/*" + ] + } + }, "dependencies": { "@angular-architects/module-federation": "15.0.0", "@angular/animations": "15.2.7", @@ -40,11 +59,11 @@ "@ngneat/falso": "^6.4.0", "@ngx-translate/core": "^14.0.0", "@ngx-translate/http-loader": "^7.0.0", - "@onecx/accelerator": "^3.6.0", - "@onecx/integration-interface": "^3.6.0", - "@onecx/keycloak-auth": "^3.6.0", - "@onecx/portal-integration-angular": "^3.6.0", - "@onecx/portal-layout-styles": "^3.6.0", + "@onecx/accelerator": "^3.7.1", + "@onecx/integration-interface": "^3.7.1", + "@onecx/keycloak-auth": "^3.7.1", + "@onecx/portal-integration-angular": "^3.7.1", + "@onecx/portal-layout-styles": "^3.7.1", "clsx": "^1.2.1", "core-js": "^3.30.1", "file-saver": "^2.0.5", @@ -65,10 +84,11 @@ "@angular-devkit/build-angular": "15.2.6", "@angular-devkit/core": "15.2.6", "@angular-devkit/schematics": "15.2.6", - "@angular-eslint/builder": "^15.2.1", - "@angular-eslint/eslint-plugin": "15.0.0", - "@angular-eslint/eslint-plugin-template": "15.0.0", - "@angular-eslint/template-parser": "15.0.0", + "@angular-eslint/builder": "15.2.1", + "@angular-eslint/eslint-plugin": "15.2.1", + "@angular-eslint/eslint-plugin-template": "15.2.1", + "@angular-eslint/schematics": "15.2.1", + "@angular-eslint/template-parser": "15.2.1", "@angular/cli": "~15.2.0", "@angular/compiler-cli": "15.2.7", "@angular/language-service": "15.2.7", @@ -86,37 +106,45 @@ "@swc/cli": "~0.1.62", "@swc/core": "^1.3.56", "@swc/helpers": "0.5.1", + "@types/jasmine": "~3.10.0", + "@types/jest": "^29.5.11", "@types/node": "18.16.3", - "@typescript-eslint/eslint-plugin": "5.59.2", - "@typescript-eslint/parser": "5.59.2", + "@typescript-eslint/eslint-plugin": "5.48.2", + "@typescript-eslint/parser": "5.48.2", "autoprefixer": "10.4.14", "chromatic": "^6.17.4", "css-loader": "^6.7.3", "cypress": "^12.11.0", - "eslint": "~8.39.0", + "eslint": "^8.33.0", "eslint-config-prettier": "8.8.0", "eslint-plugin-cypress": "^2.13.3", "eslint-plugin-import": "2.27.5", "eslint-plugin-jsx-a11y": "6.7.1", + "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-storybook": "^0.6.12", "husky": "^8.0.3", + "jasmine-core": "~4.0.0", + "jasmine-spec-reporter": "^7.0.0", "jest": "29.5.0", "jest-environment-jsdom": "29.5.0", "jest-preset-angular": "13.0.1", "jsonc-eslint-parser": "^2.2.0", + "karma": "^6.4.2", + "karma-chrome-launcher": "^3.2.0", + "karma-coverage": "^2.2.0", + "karma-coverage-istanbul-reporter": "^3.0.3", + "karma-jasmine": "^5.1.0", + "karma-jasmine-html-reporter": "^2.0.0", "msw": "^1.2.1", "msw-storybook-addon": "^1.8.0", "ng-packagr": "15.2.2", "ngx-build-plus": "^14.0.0", "ngx-translate-testing": "^6.1.0", - "@nrwl/nx-cloud": "15.3.5", - "nx": "16.0.3", "postcss": "8.4.23", "postcss-import": "~15.1.0", "postcss-preset-env": "~8.3.2", "postcss-url": "~10.1.3", "prettier": "^2.8.8", - "eslint-plugin-prettier": "^4.0.0", "style-loader": "^3.3.2", "stylus": "^0.59.0", "stylus-loader": "^7.1.0", @@ -127,15 +155,6 @@ "url-loader": "^4.1.1", "webpack": "^5.82.0", "webpack-merge": "^5.8.0", - "winston": "^3.8.2", - "@types/jasmine": "~3.10.0", - "jasmine-core": "~4.0.0", - "jasmine-spec-reporter": "^7.0.0", - "karma": "^6.4.2", - "karma-chrome-launcher": "^3.2.0", - "karma-coverage": "^2.2.0", - "karma-coverage-istanbul-reporter": "^3.0.3", - "karma-jasmine": "^5.1.0", - "karma-jasmine-html-reporter": "^2.0.0" + "winston": "^3.8.2" } } diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 3ee868e..c2fe1a5 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -1,12 +1,14 @@ import { TestBed } from '@angular/core/testing' import { AppComponent } from './app.component' import { RouterTestingModule } from '@angular/router/testing' +import { NO_ERRORS_SCHEMA } from '@angular/core' describe('AppComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ imports: [RouterTestingModule], - declarations: [AppComponent] + declarations: [AppComponent], + schemas: [NO_ERRORS_SCHEMA] }).compileComponents() }) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 19fcfe4..7b6e0fa 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,6 +1,6 @@ import { Component } from '@angular/core' @Component({ - selector: 'app-root', + selector: 'tm-root', templateUrl: './app.component.html', styleUrls: ['./app.component.scss'] }) diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 1ea8ea9..35a66a8 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,28 +1,19 @@ -import { APP_INITIALIZER, NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { HttpClient, HttpClientModule } from '@angular/common/http' -import { RouterModule } from '@angular/router' +import { APP_INITIALIZER, CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA, NgModule } from '@angular/core' import { BrowserModule } from '@angular/platform-browser' import { BrowserAnimationsModule } from '@angular/platform-browser/animations' - -import { TranslateModule, TranslateService } from '@ngx-translate/core' +import { TranslateService } from '@ngx-translate/core' import { DialogService } from 'primeng/dynamicdialog' +import { Observable } from 'rxjs' -import { APP_CONFIG, PortalCoreModule, TranslateCombinedLoader } from '@onecx/portal-integration-angular' +import { APP_CONFIG, PortalCoreModule } from '@onecx/portal-integration-angular' import { KeycloakAuthModule } from '@onecx/keycloak-auth' + import { AppComponent } from './app.component' import { environment } from '../environments/environment' -import { TranslateHttpLoader } from '@ngx-translate/http-loader' -import { Observable } from 'rxjs' - -export function HttpLoaderFactory(http: HttpClient) { - return new TranslateCombinedLoader( - new TranslateHttpLoader(http, `./assets/i18n/`, '.json'), - new TranslateHttpLoader(http, `./onecx-portal-lib/assets/i18n/`, '.json') - ) -} +// standalone app: ensure translations are loaded during app init function initializer(translate: TranslateService): () => Observable { + console.log('App module initializer') return () => { translate.addLangs(['en', 'de']) const browserLang = translate.getBrowserLang() @@ -31,44 +22,14 @@ function initializer(translate: TranslateService): () => Observable { } @NgModule({ + bootstrap: [AppComponent], declarations: [AppComponent], - imports: [ - CommonModule, - BrowserModule, - HttpClientModule, - KeycloakAuthModule, - BrowserAnimationsModule, - RouterModule.forRoot( - [ - { path: '', pathMatch: 'full', redirectTo: '/theme' }, - { - path: 'theme', - loadChildren: () => import('./theme/theme.module').then((m) => m.ThemeModule), - data: { - breadcrumb: 'Theme Mgmt' - } - } - ], - { initialNavigation: 'enabledBlocking', enableTracing: true } - ), - PortalCoreModule.forRoot('theme-mgmt'), - TranslateModule.forRoot({ - isolate: true - }) - ], + imports: [BrowserModule, KeycloakAuthModule, BrowserAnimationsModule, PortalCoreModule.forRoot('theme-mgmt-ui')], providers: [ - { - provide: APP_CONFIG, - useValue: environment - }, DialogService, - { - provide: APP_INITIALIZER, - useFactory: initializer, - multi: true, - deps: [TranslateService] - } + { provide: APP_CONFIG, useValue: environment }, + { provide: APP_INITIALIZER, useFactory: initializer, multi: true, deps: [TranslateService] } ], - bootstrap: [AppComponent] + schemas: [NO_ERRORS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA] }) export class AppModule {} diff --git a/src/app/shared/can-active-guard.service.ts b/src/app/shared/can-active-guard.service.ts index 95e99cb..2e78bf9 100644 --- a/src/app/shared/can-active-guard.service.ts +++ b/src/app/shared/can-active-guard.service.ts @@ -1,9 +1,10 @@ import { Injectable } from '@angular/core' import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router' import { TranslateService } from '@ngx-translate/core' -import { ConfigurationService } from '@onecx/portal-integration-angular' import { filter, map, Observable, OperatorFunction, tap } from 'rxjs' +import { ConfigurationService } from '@onecx/portal-integration-angular' + const SUPPORTED_LANGUAGES = ['de', 'en'] const DEFAULT_LANG = 'en' @@ -19,15 +20,15 @@ export class CanActivateGuard implements CanActivate { return this.loadTranslations() } - loadTranslations() { - console.log(`loadTranslations in portal-mgmt`) + private loadTranslations(): Observable | Promise | boolean | UrlTree { + console.log('Start Translation guard - default language ' + DEFAULT_LANG) // this language will be used as a fallback when a translation isn't found in the current language this.txService.setDefaultLang(DEFAULT_LANG) return this.txService.use(this.getBestMatchLanguage(this.config.lang)).pipe( //optional, after we set the language, we can listen for eventual changes to the lang tap(() => { - // console.log(`Translations guard done ${this.config.lang}`) + console.log(`Translations guard done ${this.config.lang}`) this.config.lang$ //the explict cast is to help linter understand that we will never get undefined .pipe( @@ -43,7 +44,7 @@ export class CanActivateGuard implements CanActivate { ) } - getBestMatchLanguage(lang: string) { + private getBestMatchLanguage(lang: string): string { if (SUPPORTED_LANGUAGES.includes(lang)) { return lang } else { diff --git a/src/app/shared/image-container/image-container.component.ts b/src/app/shared/image-container/image-container.component.ts index 3b96331..7636ba9 100644 --- a/src/app/shared/image-container/image-container.component.ts +++ b/src/app/shared/image-container/image-container.component.ts @@ -2,7 +2,7 @@ import { Component, Input, OnChanges, SimpleChanges } from '@angular/core' import { environment } from '../../../environments/environment' @Component({ - selector: 'app-image-container', + selector: 'tm-image-container', styleUrls: ['./image-container.component.scss'], templateUrl: './image-container.component.html' }) diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 436c08a..f2846fb 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -1,103 +1,96 @@ -import { NgModule } from '@angular/core' +import { CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA, NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { HttpClient } from '@angular/common/http' import { FormsModule, ReactiveFormsModule } from '@angular/forms' -import { - MissingTranslationHandler, - MissingTranslationHandlerParams, - TranslateModule, - TranslateService -} from '@ngx-translate/core' +import { TranslateModule, TranslateService } from '@ngx-translate/core' import { TranslateHttpLoader } from '@ngx-translate/http-loader' +import { ColorSketchModule } from 'ngx-color/sketch' +import { ErrorTailorModule } from '@ngneat/error-tailor' +import { AutoCompleteModule } from 'primeng/autocomplete' import { CheckboxModule } from 'primeng/checkbox' -import { InputTextareaModule } from 'primeng/inputtextarea' -import { AccordionModule } from 'primeng/accordion' -import { MessageService } from 'primeng/api' +import { ConfirmDialogModule } from 'primeng/confirmdialog' import { ConfirmPopupModule } from 'primeng/confirmpopup' +import { ConfirmationService, MessageService } from 'primeng/api' import { DataViewModule } from 'primeng/dataview' import { DialogModule } from 'primeng/dialog' +import { DialogService, DynamicDialogModule } from 'primeng/dynamicdialog' import { DropdownModule } from 'primeng/dropdown' +import { FileUploadModule } from 'primeng/fileupload' import { InputTextModule } from 'primeng/inputtext' +import { InputTextareaModule } from 'primeng/inputtextarea' import { KeyFilterModule } from 'primeng/keyfilter' import { ListboxModule } from 'primeng/listbox' import { MultiSelectModule } from 'primeng/multiselect' import { OverlayPanelModule } from 'primeng/overlaypanel' -import { SelectButtonModule } from 'primeng/selectbutton' import { PanelModule } from 'primeng/panel' -import { StepsModule } from 'primeng/steps' -import { TableModule } from 'primeng/table' +import { SelectButtonModule } from 'primeng/selectbutton' import { TabViewModule } from 'primeng/tabview' +import { TableModule } from 'primeng/table' import { ToastModule } from 'primeng/toast' -import { TreeModule } from 'primeng/tree' -import { BadgeModule } from 'primeng/badge' -import { FileUploadModule } from 'primeng/fileupload' -import { AutoCompleteModule } from 'primeng/autocomplete' -import { DialogService, DynamicDialogModule } from 'primeng/dynamicdialog' -import { ErrorTailorModule } from '@ngneat/error-tailor' -import { MfeInfo, MFE_INFO, PortalDialogService, PortalMessageService } from '@onecx/portal-integration-angular' +import { + MfeInfo, + MFE_INFO, + PortalDialogService, + PortalMessageService, + TranslateCombinedLoader +} from '@onecx/portal-integration-angular' + import { BASE_PATH } from '../generated' +import { LabelResolver } from './label.resolver' import { environment } from '../../environments/environment' import { CanActivateGuard } from './can-active-guard.service' -import { LabelResolver } from './label.resolver' import { ImageContainerComponent } from './image-container/image-container.component' import { ThemeColorBoxComponent } from './theme-color-box/theme-color-box.component' -export function createTranslateLoader(http: HttpClient, mfeInfo: MfeInfo) { - console.log(`configuring translate loader ${mfeInfo?.remoteBaseUrl}`) - if (mfeInfo && mfeInfo.remoteBaseUrl) { - return new TranslateHttpLoader(http, `${mfeInfo.remoteBaseUrl}/assets/i18n/`, '.json') - } else { - return new TranslateHttpLoader(http, `./assets/i18n/`, '.json') - } -} - export const basePathProvider = (mfeInfo: MfeInfo) => { - console.log(`Base path provider ${mfeInfo?.remoteBaseUrl}`) - return mfeInfo ? mfeInfo.remoteBaseUrl + '/' + environment.apiPrefix : './' + environment.apiPrefix + console.log( + 'Base path provider: ' + (mfeInfo ? mfeInfo.remoteBaseUrl + '' + environment.apiPrefix : '' + environment.apiPrefix) + ) + return mfeInfo ? mfeInfo.remoteBaseUrl + '' + environment.apiPrefix : '' + environment.apiPrefix } -export class MyMissingTranslationHandler implements MissingTranslationHandler { - handle(params: MissingTranslationHandlerParams) { - console.log(`Missing translation for ${params.key}`) - return params.key - } +export function HttpLoaderFactory(http: HttpClient, mfeInfo: MfeInfo) { + console.log(`Configuring translation loader ${mfeInfo?.remoteBaseUrl}`) + // if running standalone then load the app assets directly from remote base URL + const appAssetPrefix = mfeInfo && mfeInfo.remoteBaseUrl ? mfeInfo.remoteBaseUrl : './' + return new TranslateCombinedLoader( + new TranslateHttpLoader(http, appAssetPrefix + 'assets/i18n/', '.json'), + new TranslateHttpLoader(http, appAssetPrefix + 'onecx-portal-lib/assets/i18n/', '.json') + ) } @NgModule({ declarations: [ImageContainerComponent, ThemeColorBoxComponent], imports: [ - AccordionModule, - CommonModule, + AutoCompleteModule, CheckboxModule, + ColorSketchModule, + CommonModule, + ConfirmDialogModule, + ConfirmPopupModule, DataViewModule, DialogModule, - DynamicDialogModule, DropdownModule, + DynamicDialogModule, + FileUploadModule, FormsModule, + InputTextModule, + InputTextareaModule, KeyFilterModule, - BadgeModule, ListboxModule, MultiSelectModule, + OverlayPanelModule, + PanelModule, ReactiveFormsModule, - FileUploadModule, - AutoCompleteModule, + SelectButtonModule, TabViewModule, - TreeModule, - TranslateModule.forChild({ - isolate: true, - missingTranslationHandler: { - provide: MissingTranslationHandler, - useClass: MyMissingTranslationHandler - } - }), + TableModule, + ToastModule, + TranslateModule.forChild({ isolate: true }), ErrorTailorModule.forRoot({ - controlErrorsOn: { - async: true, - blur: true, - change: true - }, + controlErrorsOn: { async: true, blur: true, change: true }, errors: { useFactory: (i18n: TranslateService) => { return { @@ -117,61 +110,45 @@ export class MyMissingTranslationHandler implements MissingTranslationHandler { (selector) => element.tagName === selector ) } - }), - StepsModule, - InputTextModule, - InputTextareaModule, - ConfirmPopupModule, - ToastModule, - PanelModule, - OverlayPanelModule, - SelectButtonModule, - TableModule + }) ], exports: [ - AccordionModule, + AutoCompleteModule, CheckboxModule, CommonModule, + ConfirmPopupModule, DataViewModule, DialogModule, DropdownModule, + DynamicDialogModule, + ErrorTailorModule, + FileUploadModule, FormsModule, + ImageContainerComponent, + InputTextModule, + InputTextareaModule, KeyFilterModule, ListboxModule, - TabViewModule, - BadgeModule, MultiSelectModule, - AutoCompleteModule, - FileUploadModule, - ReactiveFormsModule, - TranslateModule, - ErrorTailorModule, - TreeModule, - StepsModule, - InputTextModule, - InputTextareaModule, - ConfirmPopupModule, - ToastModule, - PanelModule, OverlayPanelModule, + PanelModule, + ReactiveFormsModule, SelectButtonModule, + TabViewModule, TableModule, - DynamicDialogModule, - ImageContainerComponent, - ThemeColorBoxComponent + ThemeColorBoxComponent, + ToastModule, + TranslateModule ], //this is not elegant, for some reason the injection token from primeng does not work across federated module providers: [ + CanActivateGuard, + ConfirmationService, LabelResolver, { provide: MessageService, useExisting: PortalMessageService }, { provide: DialogService, useClass: PortalDialogService }, - - CanActivateGuard, - { - provide: BASE_PATH, - useFactory: basePathProvider, - deps: [MFE_INFO] - } - ] + { provide: BASE_PATH, useFactory: basePathProvider, deps: [MFE_INFO] } + ], + schemas: [NO_ERRORS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA] }) export class SharedModule {} diff --git a/src/app/shared/theme-color-box/theme-color-box.component.ts b/src/app/shared/theme-color-box/theme-color-box.component.ts index 1e8789a..fb3db85 100644 --- a/src/app/shared/theme-color-box/theme-color-box.component.ts +++ b/src/app/shared/theme-color-box/theme-color-box.component.ts @@ -1,7 +1,7 @@ import { Component, Input } from '@angular/core' @Component({ - selector: 'app-theme-color-box', + selector: 'tm-theme-color-box', styleUrls: ['./theme-color-box.component.scss'], templateUrl: './theme-color-box.component.html' }) diff --git a/src/app/test/mocks/auth-mock.service.ts b/src/app/test/mocks/auth-mock.service.ts new file mode 100644 index 0000000..ed76935 --- /dev/null +++ b/src/app/test/mocks/auth-mock.service.ts @@ -0,0 +1,27 @@ +import { IAuthService, UserProfile } from '@onecx/portal-integration-angular' +import { BehaviorSubject } from 'rxjs' + +export class IAuthMockService implements IAuthService { + currentUser$ = new BehaviorSubject(undefined) + getCurrentUser(): UserProfile | null { + return null + } + logout(): void {} + hasPermission(permissionKey: string): boolean { + return false + } + getAuthProviderName(): string { + return 'mock' + } + hasRole(role: string | string[]): boolean { + return false + } + init(): Promise { + return new Promise((resolve, reject) => { + resolve(false) + }) + } + getUserRoles(): string[] { + return [] + } +} diff --git a/src/app/theme-mgmt-remote.module.ts b/src/app/theme-mgmt-remote.module.ts index a4920ec..ec377f7 100644 --- a/src/app/theme-mgmt-remote.module.ts +++ b/src/app/theme-mgmt-remote.module.ts @@ -1,101 +1,22 @@ -import { CommonModule } from '@angular/common' -import { HttpClient } from '@angular/common/http' -import { NgModule } from '@angular/core' +import { Inject, NgModule } from '@angular/core' import { RouterModule, Routes } from '@angular/router' -import { TranslateModule, MissingTranslationHandler, TranslateLoader } from '@ngx-translate/core' -import { - MyMissingTranslationHandler, - PortalMessageService, - PortalDialogService, - MFE_INFO, - createTranslateLoader, - PortalCoreModule -} from '@onecx/portal-integration-angular' -import { MessageService } from 'primeng/api' -import { DialogService } from 'primeng/dynamicdialog' -import { BASE_PATH } from './generated' -import { CanActivateGuard } from './shared/can-active-guard.service' -import { LabelResolver } from './shared/label.resolver' -import { basePathProvider, SharedModule } from './shared/shared.module' -import { ThemeDesignerComponent } from './theme/theme-designer/theme-designer.component' -import { ThemeDetailComponent } from './theme/theme-detail/theme-detail.component' -import { ThemeSearchComponent } from './theme/theme-search/theme-search.component' + +import { MFE_INFO, MfeInfo, PortalCoreModule } from '@onecx/portal-integration-angular' + const routes: Routes = [ { path: '', - component: ThemeSearchComponent, - canActivate: [CanActivateGuard], - pathMatch: 'full' - }, - { - path: 'new', - canActivate: [CanActivateGuard], - component: ThemeDesignerComponent, - data: { - breadcrumb: 'BREADCRUMBS.CREATE', - breadcrumbFn: (data: any) => `${data.labeli18n}` - }, - resolve: { - labeli18n: LabelResolver - } - }, - { - path: ':id', - canActivate: [CanActivateGuard], - component: ThemeDetailComponent, - data: { - breadcrumb: 'BREADCRUMBS.DETAIL', - breadcrumbFn: (data: any) => `${data.labeli18n}` - }, - resolve: { - labeli18n: LabelResolver - } - }, - { - path: ':id/edit', - canActivate: [CanActivateGuard], - component: ThemeDesignerComponent, - data: { - breadcrumb: 'BREADCRUMBS.EDIT', - breadcrumbFn: (data: any) => `${data.labeli18n}` - }, - resolve: { - labeli18n: LabelResolver - } + loadChildren: () => import('./theme/theme.module').then((m) => m.ThemeModule) } ] @NgModule({ - imports: [ - CommonModule, - SharedModule, - PortalCoreModule.forMicroFrontend(), - RouterModule.forChild(routes), - TranslateModule.forChild({ - isolate: true, - missingTranslationHandler: { - provide: MissingTranslationHandler, - useClass: MyMissingTranslationHandler - }, - loader: { - provide: TranslateLoader, - useFactory: createTranslateLoader, - deps: [HttpClient, MFE_INFO] - } - }) - ], + imports: [PortalCoreModule.forMicroFrontend(), RouterModule.forChild(routes)], exports: [], - //this is not elegant, for some reason the injection token from primeng does not work across federated module - providers: [ - LabelResolver, - { provide: MessageService, useExisting: PortalMessageService }, - { provide: DialogService, useClass: PortalDialogService }, - - CanActivateGuard, - { - provide: BASE_PATH, - useFactory: basePathProvider, - deps: [MFE_INFO] - } - ] + providers: [], + schemas: [] }) -export class ThemeMgmtModule {} +export class ThemeMgmtModule { + constructor(@Inject(MFE_INFO) mfeInfo?: MfeInfo) { + console.info('Theme Mgmt Module constructor', mfeInfo) + } +} diff --git a/src/app/theme/theme-designer/theme-designer.component.html b/src/app/theme/theme-designer/theme-designer.component.html index ff7db45..8d19bd0 100644 --- a/src/app/theme/theme-designer/theme-designer.component.html +++ b/src/app/theme/theme-designer/theme-designer.component.html @@ -90,11 +90,11 @@
- + >
- + >
{ let component: ThemeDesignerComponent let fixture: ComponentFixture - const messageServiceMock: jasmine.SpyObj = jasmine.createSpyObj('MessageService', [ - 'add' - ]) + const msgServiceSpy = jasmine.createSpyObj('PortalMessageService', ['success', 'error', 'info']) const configServiceSpy = { getProperty: jasmine.createSpy('getProperty').and.returnValue('123'), getPortal: jasmine.createSpy('getPortal').and.returnValue({ @@ -30,6 +28,7 @@ describe('ThemeDesignerComponent', () => { TestBed.configureTestingModule({ declarations: [ThemeDesignerComponent], imports: [ + RouterTestingModule, HttpClientTestingModule, TranslateModule.forRoot({ loader: { @@ -39,22 +38,15 @@ describe('ThemeDesignerComponent', () => { } }) ], + schemas: [NO_ERRORS_SCHEMA], providers: [ { provide: ConfigurationService, useValue: configServiceSpy }, - { provide: MessageService, useValue: messageServiceMock }, - { - provide: ActivatedRoute, - useValue: { - snapshot: { - paramMap: { - get: () => '1', - has: () => '1' - } - } - } - } + { provide: PortalMessageService, useValue: msgServiceSpy } ] - }).compileComponents() + }).compileComponents(), + msgServiceSpy.success.calls.reset() + msgServiceSpy.error.calls.reset() + msgServiceSpy.info.calls.reset() })) beforeEach(() => { diff --git a/src/app/theme/theme-designer/theme-designer.component.ts b/src/app/theme/theme-designer/theme-designer.component.ts index ba327b0..bb37a2f 100644 --- a/src/app/theme/theme-designer/theme-designer.component.ts +++ b/src/app/theme/theme-designer/theme-designer.component.ts @@ -11,8 +11,9 @@ import { themeVariables } from '../theme-variables' import { environment } from '../../../environments/environment' import { CreateThemeDTO, ImageV1APIService, ThemeDTO, ThemesAPIService } from '../../generated' import { dropDownSortItemsByLabel, dropDownGetLabelByValue, setFetchUrls } from '../../shared/utils' + @Component({ - selector: 'app-theme-designer', + selector: 'tm-theme-designer', templateUrl: './theme-designer.component.html', styleUrls: ['./theme-designer.component.scss'], providers: [ConfirmationService] diff --git a/src/app/theme/theme-detail/theme-detail.component.html b/src/app/theme/theme-detail/theme-detail.component.html index 2cbdd66..3f1f7ba 100644 --- a/src/app/theme/theme-detail/theme-detail.component.html +++ b/src/app/theme/theme-detail/theme-detail.component.html @@ -48,11 +48,11 @@ -->
- + > - + diff --git a/src/app/theme/theme-detail/theme-detail.component.spec.ts b/src/app/theme/theme-detail/theme-detail.component.spec.ts index 6b4c757..1d9c780 100644 --- a/src/app/theme/theme-detail/theme-detail.component.spec.ts +++ b/src/app/theme/theme-detail/theme-detail.component.spec.ts @@ -1,20 +1,25 @@ -/* tslint:disable:no-unused-variable */ +import { NO_ERRORS_SCHEMA } from '@angular/core' import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' -import { ActivatedRoute } from '@angular/router' -import { ThemeDetailComponent } from './theme-detail.component' +import { HttpClient } from '@angular/common/http' import { HttpClientTestingModule } from '@angular/common/http/testing' +import { RouterTestingModule } from "@angular/router/testing" import { TranslateLoader, TranslateModule } from '@ngx-translate/core' -import { HttpClient } from '@angular/common/http' -import { HttpLoaderFactory } from 'src/app/app.module' + +import { PortalMessageService, ConfigurationService } from '@onecx/portal-integration-angular' +import { HttpLoaderFactory } from 'src/app/shared/shared.module' +import { ThemeDetailComponent } from './theme-detail.component' describe('ThemeDetailComponent', () => { let component: ThemeDetailComponent let fixture: ComponentFixture + const msgServiceSpy = jasmine.createSpyObj('PortalMessageService', ['success', 'error', 'info']) + beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ declarations: [ThemeDetailComponent], imports: [ + RouterTestingModule, HttpClientTestingModule, TranslateModule.forRoot({ loader: { @@ -24,19 +29,11 @@ describe('ThemeDetailComponent', () => { } }) ], - providers: [ - { - provide: ActivatedRoute, - useValue: { - snapshot: { - paramMap: { - get: () => '1' - } - } - } - } - ] - }).compileComponents() + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents(), + msgServiceSpy.success.calls.reset() + msgServiceSpy.error.calls.reset() + msgServiceSpy.info.calls.reset() })) beforeEach(() => { diff --git a/src/app/theme/theme-detail/theme-detail.component.ts b/src/app/theme/theme-detail/theme-detail.component.ts index b939813..9d1d069 100644 --- a/src/app/theme/theme-detail/theme-detail.component.ts +++ b/src/app/theme/theme-detail/theme-detail.component.ts @@ -102,7 +102,7 @@ export class ThemeDetailComponent implements OnInit { label: data['ACTIONS.NAVIGATION.CLOSE'], title: data['ACTIONS.NAVIGATION.CLOSE.TOOLTIP'], actionCallback: () => this.close(), - icon: 'pi pi-arrow-left', + icon: 'pi pi-times', show: 'always', permission: 'THEME#SEARCH' }, diff --git a/src/app/theme/theme-detail/theme-intern/theme-intern.component.ts b/src/app/theme/theme-detail/theme-intern/theme-intern.component.ts index 0150728..069e1fb 100644 --- a/src/app/theme/theme-detail/theme-intern/theme-intern.component.ts +++ b/src/app/theme/theme-detail/theme-intern/theme-intern.component.ts @@ -4,7 +4,7 @@ import { TranslateService } from '@ngx-translate/core' import { ThemeDTO } from '../../../generated/model/themeDTO' @Component({ - selector: 'app-theme-intern', + selector: 'tm-theme-intern', templateUrl: './theme-intern.component.html' }) export class ThemeInternComponent { diff --git a/src/app/theme/theme-import/theme-import.component.html b/src/app/theme/theme-import/theme-import.component.html index 95b6a07..9d866ac 100644 --- a/src/app/theme/theme-import/theme-import.component.html +++ b/src/app/theme/theme-import/theme-import.component.html @@ -39,7 +39,7 @@ /> - +
{{ 'THEME.NO_PROPERTIES' | translate }}
{ let component: ThemeImportComponent let fixture: ComponentFixture - const messageServiceMock: jasmine.SpyObj = jasmine.createSpyObj('MessageService', [ - 'add' - ]) - beforeEach(async () => { - await TestBed.configureTestingModule({ + + const msgServiceSpy = jasmine.createSpyObj('PortalMessageService', ['success', 'error', 'info']) + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ declarations: [ThemeImportComponent], imports: [ + RouterTestingModule, HttpClientTestingModule, TranslateModule.forRoot({ loader: { @@ -27,21 +29,14 @@ describe('ThemeImportComponent', () => { } }) ], - providers: [ - { - provide: ActivatedRoute, - useValue: { - snapshot: { - paramMap: { - get: () => '1' - } - } - } - }, - { provide: MessageService, useValue: messageServiceMock } - ] - }).compileComponents() + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents(), + msgServiceSpy.success.calls.reset() + msgServiceSpy.error.calls.reset() + msgServiceSpy.info.calls.reset() + })) + beforeEach(() => { fixture = TestBed.createComponent(ThemeImportComponent) component = fixture.componentInstance fixture.detectChanges() diff --git a/src/app/theme/theme-import/theme-import.component.ts b/src/app/theme/theme-import/theme-import.component.ts index b964bd1..050f0f1 100644 --- a/src/app/theme/theme-import/theme-import.component.ts +++ b/src/app/theme/theme-import/theme-import.component.ts @@ -8,7 +8,7 @@ import { CreateThemeDTO, ThemeDTO } from '../../generated' import { PortalMessageService } from '@onecx/portal-integration-angular' @Component({ - selector: 'app-theme-import', + selector: 'tm-theme-import', templateUrl: './theme-import.component.html', styleUrls: ['./theme-import.component.scss'] }) diff --git a/src/app/theme/theme-search/theme-search.component.html b/src/app/theme/theme-search/theme-search.component.html index c507ded..ca5e988 100644 --- a/src/app/theme/theme-search/theme-search.component.html +++ b/src/app/theme/theme-search/theme-search.component.html @@ -48,11 +48,11 @@ >
- + >
@@ -63,7 +63,7 @@
- +
@@ -74,10 +74,10 @@
- +
- +
@@ -91,5 +91,5 @@ - + diff --git a/src/app/theme/theme-search/theme-search.component.spec.ts b/src/app/theme/theme-search/theme-search.component.spec.ts index 84ddf2b..6eff13a 100644 --- a/src/app/theme/theme-search/theme-search.component.spec.ts +++ b/src/app/theme/theme-search/theme-search.component.spec.ts @@ -1,20 +1,25 @@ -/* tslint:disable:no-unused-variable */ +import { NO_ERRORS_SCHEMA } from '@angular/core' +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' import { HttpClient } from '@angular/common/http' import { HttpClientTestingModule } from '@angular/common/http/testing' -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' -import { ActivatedRoute } from '@angular/router' +import { RouterTestingModule } from "@angular/router/testing" import { TranslateLoader, TranslateModule } from '@ngx-translate/core' -import { HttpLoaderFactory } from 'src/app/app.module' + +import { PortalMessageService } from '@onecx/portal-integration-angular' +import { HttpLoaderFactory } from 'src/app/shared/shared.module' import { ThemeSearchComponent } from './theme-search.component' describe('ThemeSearchComponent', () => { let component: ThemeSearchComponent let fixture: ComponentFixture + const msgServiceSpy = jasmine.createSpyObj('PortalMessageService', ['success', 'error', 'info']) + beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ declarations: [ThemeSearchComponent], imports: [ + RouterTestingModule, HttpClientTestingModule, TranslateModule.forRoot({ loader: { @@ -24,19 +29,11 @@ describe('ThemeSearchComponent', () => { } }) ], - providers: [ - { - provide: ActivatedRoute, - useValue: { - snapshot: { - paramMap: { - get: () => '1' - } - } - } - } - ] - }).compileComponents() + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents(), + msgServiceSpy.success.calls.reset() + msgServiceSpy.error.calls.reset() + msgServiceSpy.info.calls.reset() })) beforeEach(() => { diff --git a/src/app/theme/theme-search/theme-search.component.ts b/src/app/theme/theme-search/theme-search.component.ts index 678af5d..4980cee 100644 --- a/src/app/theme/theme-search/theme-search.component.ts +++ b/src/app/theme/theme-search/theme-search.component.ts @@ -34,22 +34,22 @@ export class ThemeSearchComponent implements OnInit { ngOnInit(): void { this.loadThemes() this.translate - .get(['ACTIONS.CREATE.THEME', 'ACTIONS.CREATE.THEME.TOOLTIP', 'ACTIONS.IMPORT.LABEL', 'ACTIONS.IMPORT.PORTAL']) + .get(['ACTIONS.CREATE.THEME', 'ACTIONS.CREATE.THEME.TOOLTIP', 'ACTIONS.IMPORT.LABEL', 'ACTIONS.IMPORT.TOOLTIP']) .subscribe((data) => { this.prepareActionButtons(data) }) this.translate .get([ + 'THEME.NAME', + 'THEME.DESCRIPTION', 'SEARCH.SORT_BY', 'SEARCH.FILTER', 'SEARCH.FILTER_OF', - 'THEME.NAME', - 'THEME.DESCRIPTION', + 'SEARCH.SORT_DIRECTION_ASC', + 'SEARCH.SORT_DIRECTION_DESC', 'GENERAL.TOOLTIP.VIEW_MODE_GRID', 'GENERAL.TOOLTIP.VIEW_MODE_LIST', - 'GENERAL.TOOLTIP.VIEW_MODE_TABLE', - 'SEARCH.SORT_DIRECTION_ASC', - 'SEARCH.SORT_DIRECTION_DESC' + 'GENERAL.TOOLTIP.VIEW_MODE_TABLE' ]) .subscribe((data) => { this.prepareTranslations(data) @@ -73,7 +73,7 @@ export class ThemeSearchComponent implements OnInit { }, { label: data['ACTIONS.IMPORT.LABEL'], - title: data['ACTIONS.IMPORT.PORTAL'], + title: data['ACTIONS.IMPORT.TOOLTIP'], actionCallback: () => this.onImportThemeClick(), permission: 'THEME#IMPORT', icon: 'pi pi-upload', @@ -90,7 +90,6 @@ export class ThemeSearchComponent implements OnInit { viewModeToggleTooltips: { grid: data['GENERAL.TOOLTIP.VIEW_MODE_GRID'], list: data['GENERAL.TOOLTIP.VIEW_MODE_LIST'] - // table: data['GENERAL.TOOLTIP.VIEW_MODE_TABLE'], }, sortOrderTooltips: { ascending: data['SEARCH.SORT_DIRECTION_ASC'], diff --git a/src/app/theme/theme.module.ts b/src/app/theme/theme.module.ts index df4b4ab..4572ea3 100644 --- a/src/app/theme/theme.module.ts +++ b/src/app/theme/theme.module.ts @@ -1,16 +1,16 @@ -import { CommonModule } from '@angular/common' -import { Inject, NgModule } from '@angular/core' +import { CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA, NgModule } from '@angular/core' +import { HttpClient } from '@angular/common/http' import { FormsModule } from '@angular/forms' import { RouterModule, Routes } from '@angular/router' -import { MfeInfo, MFE_INFO, PortalCoreModule } from '@onecx/portal-integration-angular' -import { ColorSketchModule } from 'ngx-color/sketch' -import { ConfirmDialogModule } from 'primeng/confirmdialog' -import { ConfirmationService } from 'primeng/api' +import { MissingTranslationHandler, TranslateLoader, TranslateModule } from '@ngx-translate/core' import { FieldsetModule } from 'primeng/fieldset' +import { MFE_INFO, PortalCoreModule, MyMissingTranslationHandler } from '@onecx/portal-integration-angular' + import { CanActivateGuard } from '../shared/can-active-guard.service' import { LabelResolver } from '../shared/label.resolver' -import { SharedModule } from '../shared/shared.module' +import { HttpLoaderFactory, SharedModule } from '../shared/shared.module' + import { ThemeSearchComponent } from './theme-search/theme-search.component' import { ThemeImportComponent } from './theme-import/theme-import.component' import { ThemeDetailComponent } from './theme-detail/theme-detail.component' @@ -70,20 +70,29 @@ const routes: Routes = [ ThemeInternComponent ], imports: [ - CommonModule, - SharedModule, - [RouterModule.forChild(routes)], - PortalCoreModule.forMicroFrontend(), FormsModule, - ColorSketchModule, - ConfirmDialogModule, - FieldsetModule + FieldsetModule, + PortalCoreModule.forMicroFrontend(), + [RouterModule.forChild(routes)], + SharedModule, + TranslateModule.forChild({ + isolate: true, + missingTranslationHandler: { + provide: MissingTranslationHandler, + useClass: MyMissingTranslationHandler + }, + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient, MFE_INFO] + } + }) ], - - providers: [ConfirmationService] + providers: [], + schemas: [NO_ERRORS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA] }) export class ThemeModule { - constructor(@Inject(MFE_INFO) mfeInfo: MfeInfo) { - console.log(`Theme Module constructor ${JSON.stringify(mfeInfo)}`) + constructor() { + console.info('Theme Module constructor') } } diff --git a/src/assets/env.json b/src/assets/env.json index 6e2083f..90885ce 100644 --- a/src/assets/env.json +++ b/src/assets/env.json @@ -15,7 +15,7 @@ "ONECX_PORTAL_HELP_DISABLED": "${ONECX_PORTAL_HELP_DISABLED}", "ONECX_PORTAL_START_IN_EDIT_MODE": "${ONECX_PORTAL_START_IN_EDIT_MODE}", "TOKEN_ROLE_CLAIM_NAME": "${TOKEN_ROLE_CLAIM_NAME}", - "TKIT_PORTAL_ID": "ADMIN", + "TKIT_PORTAL_ID": "${TKIT_PORTAL_ID}", "TKIT_PORTAL_DEFAULT_THEME": "${TKIT_PORTAL_DEFAULT_THEME}", "TKIT_PORTAL_THEME_SERVER_URL": "${TKIT_PORTAL_THEME_SERVER_URL}", "TKIT_SEARCH_BASE_URL": "${TKIT_SEARCH_BASE_URL}" diff --git a/src/environments/environment.ts b/src/environments/environment.ts index ffeb0ec..e26f52d 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -4,11 +4,10 @@ export const environment = { production: false, - KEYCLOAK_CLIENT_ID: 'portal-mf-shell', - // KEYCLOAK_URL: 'http://localhost:9090', KEYCLOAK_URL: 'http://keycloak-app/', - // KEYCLOAK_REALM: 'master', KEYCLOAK_REALM: 'OneCX', + KEYCLOAK_CLIENT_ID: 'portal-mf-shell', + TKIT_PORTAL_ID: 'ADMIN', skipRemoteConfigLoad: true, apiPrefix: 'portal-api' } diff --git a/src/test-setup.ts b/src/test-setup.ts new file mode 100644 index 0000000..90bc506 --- /dev/null +++ b/src/test-setup.ts @@ -0,0 +1 @@ +import 'jest-preset-angular/setup-jest' diff --git a/tsconfig.app.json b/tsconfig.app.json index a43f398..25ea2e0 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -1,21 +1,20 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "declaration": true, - "declarationMap": true, + "composite": false, + "declaration": false, + "declarationMap": false, "inlineSources": true, - "types": [], - "target": "es2022", - "useDefineForClassFields": false + "target": "ES2022" }, - "files": ["src/main.ts", "src/polyfills.ts", "src/app/theme-mgmt-remote.module.ts"], - "include": ["src/**/*.ts", "src/**/*.d.ts"], + "files": ["./src/main.ts", "./src/polyfills.ts", "./src/app/theme-mgmt-remote.module.ts"], + "include": ["./src/**/*.ts", "./src/**/*.d.ts"], "exclude": [ - "src/test-setup.ts", - "**/*.spec.ts", - "**/*.test.ts", - "**/*.stories.ts", - "**/*.stories.js", - "jest.config.ts" + "./src/test-setup.ts", + "./src/**/*.spec.ts", + "./src/**/*.test.ts", + "./src/**/*.stories.ts", + "./src/**/*.stories.js", + "./jest.config.ts" ] } diff --git a/tsconfig.json b/tsconfig.json index 5053fcd..d50948b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,9 +3,12 @@ "compilerOptions": { "strict": true, "baseUrl": "./", - "outDir": "./dist/out-tsc", + "rootDir": "", + "outDir": "./dist/app", "sourceMap": true, + "composite": false, "declaration": false, + "declarationMap": false, "downlevelIteration": true, "experimentalDecorators": true, "moduleResolution": "node", @@ -17,15 +20,22 @@ "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, "esModuleInterop": true, - "target": "es2022", - "module": "es2020", - "lib": ["es2022", "dom"] + "useDefineForClassFields": false, + "target": "ES2022", + "module": "ES2022", + "lib": ["ES2022", "DOM"], + "inlineSources": true, + "types": [] }, "files": [], "include": [], + "exclude": ["node_modules", "tmp"], "references": [ { - "path": "./tsconfig.app.json" + "path": "tsconfig.app.json" + }, + { + "path": "tsconfig.spec.json" } ], "angularCompilerOptions": { diff --git a/tsconfig.spec.json b/tsconfig.spec.json index 803c8a7..2b05de7 100644 --- a/tsconfig.spec.json +++ b/tsconfig.spec.json @@ -1,11 +1,14 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "outDir": "./dist/out-tsc", + "composite": false, + "declaration": false, + "outDir": "./dist/test", "module": "commonjs", "types": ["jasmine", "node"], - "target": "es2016" + "target": "ES2022", + "useDefineForClassFields": false }, - "files": ["src/test.ts", "src/polyfills.ts"], - "include": ["**/*.test.ts", "**/*.spec.ts", "src/**/*.d.ts", "jest.config.ts"] + "files": ["./src/test.ts", "./src/polyfills.ts"], + "include": ["./src/**/*.test.ts", "./src/**/*.spec.ts", "./src/**/*.d.ts", "./jest.config.ts"] } diff --git a/webpack.config.js b/webpack.config.js index 838a12b..e135939 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -2,7 +2,7 @@ const { ModifyEntryPlugin } = require('@angular-architects/module-federation/src const { share, withModuleFederationPlugin } = require('@angular-architects/module-federation/webpack') const config = withModuleFederationPlugin({ - name: 'theme-mgmt', + name: 'theme-mgmt-ui', filename: 'remoteEntry.js', exposes: { './ThemeMgmtModule': 'src/app/theme-mgmt-remote.module.ts'