From 6ffc3b6b8803ddf0e47a1f921ff85b7881f027d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Kilchenmann?= Date: Thu, 4 Mar 2021 16:12:58 +0100 Subject: [PATCH] feat(eslint): migrate tslint to eslint (DSP-1372) (#394) * test(eslint): migrate from tslint to eslint * chore(eslint): two commands to run lint tool * refactor(eslint): automatically fixed errors by esLint rules * refactor(user): refactor code by following ESLint rules * refactor(user): refactor code by following ESLint rules * refactor(main): refactor code by following ESLint rules * refactor(user): refactor code by following ESLint rules * refactor(comments): undo ugly tODO comment but still following esLint rules * refactor(ontology): refactor code by following ESLint rules * refactor(ontology): refactor code by following ESLint rules * refactor(ontology-visualizer): refactor code by following ESLint rules * refactor(ontology): refactor code by following ESLint rules * refactor(permission): refactor code by following ESLint rules * refactor(system): refactor code by following ESLint rules * refactor(user): refactor code by following ESLint rules * refactor(main): refactor code by following ESLint rules * refactor(project): refactor code by following ESLint rules * refactor(system): refactor code by following ESLint rules * refactor(project): refactor code by following ESLint rules * refactor(user): refactor code by following ESLint rules * test(ontology): bug fix in res class form service * chore(gh-ci): use new eslint * docs(contribution): update linter section with new eslint config * refactor(tests): delete tslint * refactor(ontology): refactor code by following ESLint rules * fix(deps): delete tslint * refactor(eslint): delete empty tslint-to-eslint log file * fix(deps): reactivate eslint-plugin tslint * docs(contribution): update linter section with new eslint config * fix(eslint): reactivate old tslint config * fix(eslint): delete old tslint config rules * refactor(eslint): delete old tslint config files * chore(eslint): update eslint config * chore(eslint): update eslint config * refactor(ontology): fix eslint issue * refactor(cache): following our naming convention * test(eslint): update naming convention rules * refactor(eslint): delete unused config file * Update package-lock.json * refactor: refactor code by following our name conventions * chore(eslint): disallow console.log and .error * chore(deps): update package-lock.json * fix(eslint): bug fixing in eslint config * refactor: fixed errors from eslint * chore(eslint): update config * refactor: undo previous changes * fix(deps): update package-lock.json * refactor: refactor code to make eslint happy * refactor(eslint): delete redundant config * chore(deps): update package-lock.json * chore(eslint): fixed eslint issue automatically * chore(eslint): strict rule for spaces in objects Set eslint rule for https://docs.google.com/document/d/1SIVMxoV0N8xYqhVk_0hhuqSuUF47D1YYrDESqdmipfM/edit#heading=h.awf6ef8h98ze --- .eslintignore | 11 + .eslintrc.js | 201 ++ .github/workflows/main.yml | 2 +- docs/how-to-contribute/index.md | 10 +- package-lock.json | 2921 ++++++++++++++--- package.json | 12 +- src/app/app.component.ts | 2 +- src/app/app.module.ts | 8 +- src/app/main/cache/cache.service.ts | 54 +- .../cookie-policy/cookie-policy.component.ts | 18 +- .../dialog-header/dialog-header.component.ts | 18 +- src/app/main/dialog/dialog.component.ts | 2 +- .../main/directive/base-value.directive.ts | 63 +- .../directive/external-links.directive.ts | 6 +- .../invalid-control-scroll.directive.spec.ts | 2 +- .../invalid-control-scroll.directive.ts | 8 +- src/app/main/error/error.component.ts | 4 +- src/app/main/grid/grid.component.spec.ts | 44 +- src/app/main/header/header.component.spec.ts | 4 +- src/app/main/header/header.component.ts | 12 +- src/app/main/login/login.component.ts | 2 +- src/app/main/main.component.spec.ts | 34 +- src/app/main/main.component.ts | 8 +- .../select-language/language.service.spec.ts | 14 +- .../main/select-language/language.service.ts | 16 +- ...ponent-communication-event.service.spec.ts | 16 +- .../component-communication-event.service.ts | 6 +- src/app/project/board/board.component.spec.ts | 8 +- src/app/project/board/board.component.ts | 12 +- .../contacts-tab-view.component.spec.ts | 6 +- .../dataset-tab-view.component.spec.ts | 7 +- .../person-template.component.spec.ts | 10 +- .../project-tab-view.component.spec.ts | 34 +- .../project-tab-view.component.ts | 3 +- .../terms-tab-view.component.spec.ts | 4 +- .../add-user/add-user.component.ts | 18 +- .../collaboration.component.spec.ts | 8 +- .../collaboration/collaboration.component.ts | 10 +- .../select-group/select-group.component.ts | 17 +- .../list-info-form.component.ts | 7 +- .../edit-list-item.component.spec.ts | 52 +- .../edit-list-item.component.ts | 27 +- .../list-item-form.component.spec.ts | 8 +- .../list-item-form.component.ts | 48 +- .../list-item/list-item.component.spec.ts | 106 +- .../list/list-item/list-item.component.ts | 6 +- src/app/project/list/list.component.spec.ts | 40 +- src/app/project/list/list.component.ts | 6 +- .../default-data/default-properties.ts | 38 +- .../ontology-form/ontology-form.component.ts | 7 +- .../ontology-visualizer.component.spec.ts | 26 +- .../ontology-visualizer.component.ts | 18 +- .../visualizer/visualizer.component.html | 4 +- .../visualizer/visualizer.component.spec.ts | 36 +- .../visualizer/visualizer.component.ts | 26 +- .../ontology/ontology.component.spec.ts | 8 +- .../project/ontology/ontology.component.ts | 18 +- .../property-form.component.html | 6 +- .../property-form/property-form.component.ts | 10 +- .../property-info.component.spec.ts | 12 +- .../property-info/property-info.component.ts | 4 +- .../resource-class-form.component.ts | 31 +- .../resource-class-form.service.ts | 13 +- .../resource-class-info.component.spec.ts | 2 +- .../add-group/add-group.component.spec.ts | 32 +- .../add-group/add-group.component.ts | 20 +- .../permission/permission.component.spec.ts | 8 +- .../permission/permission.component.ts | 7 +- .../project-form/project-form.component.ts | 26 +- src/app/project/project.component.ts | 12 +- src/app/system/groups/groups.component.ts | 14 +- .../projects-list.component.spec.ts | 8 +- .../projects-list/projects-list.component.ts | 33 +- src/app/system/projects/projects.component.ts | 12 +- src/app/system/system.component.spec.ts | 8 +- src/app/system/system.component.ts | 4 +- .../users-list/users-list.component.spec.ts | 8 +- .../users/users-list/users-list.component.ts | 23 +- src/app/user/account/account.component.ts | 8 +- .../collection-list.component.ts | 2 +- .../dashboard/dashboard.component.spec.ts | 8 +- src/app/user/dashboard/dashboard.component.ts | 4 +- .../user/membership/membership.component.ts | 12 +- src/app/user/profile/profile.component.ts | 8 +- .../password-form.component.spec.ts | 8 +- .../password-form/password-form.component.ts | 29 +- src/app/user/user-form/user-form.component.ts | 50 +- .../user-menu/user-menu.component.spec.ts | 8 +- src/app/user/user-menu/user-menu.component.ts | 2 +- src/app/user/user.component.spec.ts | 8 +- src/app/user/user.component.ts | 2 +- .../resource-instance-form.component.spec.ts | 30 +- .../resource-instance-form.component.ts | 16 +- .../select-ontology.component.spec.ts | 18 +- .../select-ontology.component.ts | 6 +- .../select-project.component.spec.ts | 18 +- .../select-properties.component.spec.ts | 8 +- .../select-properties.component.ts | 34 +- .../switch-properties.component.spec.ts | 18 +- .../switch-properties.component.ts | 6 +- .../select-resource-class.component.spec.ts | 28 +- src/tslint.json | 22 - tsconfig.eslint.json | 8 + tslint-to-eslint-config.log | 22 + tslint.json | 141 - 105 files changed, 3581 insertions(+), 1352 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.js delete mode 100644 src/tslint.json create mode 100644 tsconfig.eslint.json create mode 100644 tslint-to-eslint-config.log delete mode 100644 tslint.json diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000000..e054541673 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,11 @@ +# Ignore miscellaneous folders +.github/ +.idea/ +.vscode/ +.yalc/ +node_modules/ +dist/ +tmp/ + +# Ignore certain project files +docs/assets/js/ diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000000..686cd1a1c6 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,201 @@ +/* +👋 Hi! This file was autogenerated by tslint-to-eslint-config. +https://github.com/typescript-eslint/tslint-to-eslint-config + +It represents the closest reasonable ESLint configuration to this +project's original TSLint configuration. + +We recommend eventually switching this configuration to extend from +the recommended rulesets in typescript-eslint. +https://github.com/typescript-eslint/tslint-to-eslint-config/blob/master/docs/FAQs.md + +Happy linting! 💖 +*/ +module.exports = { + "env": { + "browser": true, + "es6": true, + "node": true + }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "tsconfig.eslint.json", + "sourceType": "module" + }, + "plugins": [ + "eslint-plugin-import", + "eslint-plugin-jsdoc", + "@angular-eslint/eslint-plugin", + "@typescript-eslint" + ], + "rules": { + "@angular-eslint/component-class-suffix": "error", + "@angular-eslint/directive-class-suffix": "error", + "@angular-eslint/no-host-metadata-property": "error", + "@angular-eslint/no-input-rename": "error", + "@angular-eslint/no-inputs-metadata-property": "error", + "@angular-eslint/no-output-on-prefix": "error", + "@angular-eslint/no-output-rename": "error", + "@angular-eslint/no-outputs-metadata-property": "error", + "@angular-eslint/use-lifecycle-interface": "error", + "@angular-eslint/use-pipe-transform-interface": "error", + "@typescript-eslint/consistent-type-definitions": "error", + "@typescript-eslint/dot-notation": "off", + "@typescript-eslint/explicit-member-accessibility": [ + "off", + { + "accessibility": "explicit" + } + ], + "@typescript-eslint/indent": "error", + "@typescript-eslint/member-delimiter-style": [ + "error", + { + "multiline": { + "delimiter": "semi", + "requireLast": true + }, + "singleline": { + "delimiter": "semi", + "requireLast": false + } + } + ], + "@typescript-eslint/member-ordering": "error", + "@typescript-eslint/naming-convention": [ + "error", + { + "selector": ["default"], + "format": ["camelCase", "PascalCase", "UPPER_CASE"], + "leadingUnderscore": "allow", + "trailingUnderscore": "allow" + }, + { + "selector": ["classProperty", "classMethod"], + "modifiers": ["private"], + "format": ["camelCase"], + "leadingUnderscore": "require" + }, + { + "selector": ["classProperty"], + "modifiers": ["readonly"], + "format": ["UPPER_CASE"], + "trailingUnderscore": "allow" + } + ], + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/no-empty-interface": "error", + "@typescript-eslint/no-inferrable-types": [ + "error", + { + "ignoreParameters": true + } + ], + "@typescript-eslint/no-misused-new": "error", + "@typescript-eslint/no-non-null-assertion": "error", + "@typescript-eslint/no-shadow": [ + "error", + { + "hoist": "all" + } + ], + "@typescript-eslint/no-unused-expressions": "error", + "@typescript-eslint/no-use-before-define": "error", + "@typescript-eslint/prefer-function-type": "error", + "@typescript-eslint/quotes": [ + "error", + "single", + { + "avoidEscape": true + } + ], + "@typescript-eslint/semi": [ + "error", + "always" + ], + "@typescript-eslint/type-annotation-spacing": "error", + "@typescript-eslint/unified-signatures": "error", + "arrow-body-style": "error", + "brace-style": [ + "error", + "1tbs" + ], + "capitalized-comments": [ + "error", + "never" + ], + "constructor-super": "error", + "curly": "error", + "object-curly-spacing": [ + "error", + "always" + ], + "eol-last": "error", + "eqeqeq": [ + "error", + "smart" + ], + "guard-for-in": "error", + "id-blacklist": "off", + "id-match": "off", + "import/no-deprecated": "warn", + "jsdoc/no-types": "off", + "max-len": [ + "error", + { + "code": 200 + } + ], + "no-bitwise": "error", + "no-caller": "error", + "no-console": [ + "warn", + { + "allow": [ + "dir", + "timeLog", + "assert", + "clear", + "count", + "countReset", + "group", + "groupEnd", + "table", + "dirxml", + "groupCollapsed", + "Console", + "profile", + "profileEnd", + "timeStamp", + "context" + ] + } + ], + "no-debugger": "error", + "no-empty": "off", + "no-eval": "error", + "no-fallthrough": "error", + "no-new-wrappers": "error", + "no-restricted-imports": [ + "error", + "rxjs/Rx" + ], + "no-throw-literal": "error", + "no-trailing-spaces": "error", + "no-undef-init": "error", + "no-underscore-dangle": "off", + "no-unused-labels": "error", + "no-var": "error", + "prefer-const": "error", + "radix": "error", + "spaced-comment": [ + "error", + "always", + { + "markers": [ + "/" + ] + } + ] + } +}; diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5192b0cfa3..31804f80ae 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -31,7 +31,7 @@ jobs: npm run webdriver-update npm run test-e2e-protractor - name: Run lint - run: npm run lint + run: npm run lint-ci release-please: name: Prepare next release diff --git a/docs/how-to-contribute/index.md b/docs/how-to-contribute/index.md index 56ce0e2feb..d0e375baae 100644 --- a/docs/how-to-contribute/index.md +++ b/docs/how-to-contribute/index.md @@ -30,11 +30,13 @@ Run `npm run test-e2e-protractor` to execute the end-to-end tests via [Protracto ### Running code linter -Run `npm run lint` to execute the lint service via [tslint](https://palantir.github.io/tslint/). +Run `npm run lint-local` to execute the lint service via [ESLint](https://eslint.org). This command uses the `--fix` flag which fixes simple errors like redundant type if you have default value assigned. In the Github Actions (CI) workflow the linter runs as `npm run lint-ci`. -> :warning: **tslint is deprecated and will be replaced by eslint** -> -> Get more info here: +To integrate ESLint with Visual Studio Code, do the following: + +* Install the [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) extension. +* Create a task via the **Tasks: Configure Task** command and select `npm: lint-local`. +* In the resulting `tasks.json` file, configure the problem matcher to be `$eslint-stylish`. ## Further help diff --git a/package-lock.json b/package-lock.json index fde04ac6ba..bd2bf914cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,7 +5,7 @@ "requires": true, "packages": { "": { - "version": "4.2.1", + "version": "4.3.0", "dependencies": { "@angular/animations": "^9.1.12", "@angular/cdk": "^9.2.4", @@ -47,6 +47,7 @@ }, "devDependencies": { "@angular-devkit/build-angular": "~0.901.12", + "@angular-eslint/eslint-plugin": "^1.2.0", "@angular/cli": "~9.1.12", "@angular/compiler-cli": "~9.1.12", "@angular/language-service": "~9.1.12", @@ -54,9 +55,14 @@ "@types/jasmine": "~3.4.4", "@types/jasminewd2": "~2.0.3", "@types/node": "^12.11.1", + "@typescript-eslint/eslint-plugin": "^4.15.2", + "@typescript-eslint/eslint-plugin-tslint": "^4.15.2", + "@typescript-eslint/parser": "^4.15.2", "codelyzer": "^5.1.2", - "eslint": "^6.5.1", + "eslint": "^6.8.0", "eslint-plugin-angular": "^4.0.1", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jsdoc": "^32.2.0", "jasmine-core": "~3.5.0", "jasmine-spec-reporter": "~4.2.1", "karma": "^5.1.1", @@ -66,7 +72,6 @@ "karma-jasmine-html-reporter": "^1.5.4", "protractor": "^7.0.0", "ts-node": "~8.4.1", - "tslint": "~5.20.0", "typescript": "3.8.3" } }, @@ -345,6 +350,22 @@ "npm": ">=2.0.0" } }, + "node_modules/@angular-eslint/eslint-plugin": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-1.2.0.tgz", + "integrity": "sha512-HxSDdAS2/lbwYBJmRVRKlx5wjiKdeBPl7JJlciwhrP7QR01a66AWun+fW1ZpMnnqivkF+D5sISsoedRLthRcwA==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.3.0" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-jsdoc": "*", + "eslint-plugin-prefer-arrow": "*", + "typescript": "*" + } + }, "node_modules/@angular/animations": { "version": "9.1.13", "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.1.13.tgz", @@ -574,9 +595,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.13.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.6.tgz", - "integrity": "sha512-VhgqKOWYVm7lQXlvbJnWOzwfAQATd2nV52koT0HZ/LdDH0m4DUDwkKYsH+IwpXb+bKPyBJzawA4I6nBKqZcpQw==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.8.tgz", + "integrity": "sha512-EaI33z19T4qN3xLXsGf48M2cDqa6ei9tPZlfLdb2HC+e/cFtREiRd8hdSqDbwdLB0/+gLwqJmCYASH0z2bUdog==", "dev": true }, "node_modules/@babel/core": { @@ -669,29 +690,20 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.0.tgz", - "integrity": "sha512-SOWD0JK9+MMIhTQiUVd4ng8f3NXhPVQvTv7D3UN4wbp/6cAHnB2EmMaU1zZA2Hh1gwme+THBrVSqTFxHczTh0Q==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.8.tgz", + "integrity": "sha512-pBljUGC1y3xKLn1nrx2eAhurLMA8OqBtBP/JwG4U8skN7kf8/aqwwxpV1N6T0e7r6+7uNitIa/fUxPFagSXp3A==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.13.0", + "@babel/compat-data": "^7.13.8", "@babel/helper-validator-option": "^7.12.17", "browserslist": "^4.14.5", - "semver": "7.0.0" + "semver": "^6.3.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.12.17", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", @@ -924,9 +936,9 @@ } }, "node_modules/@babel/highlight": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", - "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.8.tgz", + "integrity": "sha512-4vrIhfJyfNf+lCtXC2ck1rKSzDwciqF7IWFhXXrSOUC2O5DrVp+w4c6ed4AllTxhTkUP5x2tYj41VaxdVMMRDw==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.12.11", @@ -935,9 +947,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.13.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.4.tgz", - "integrity": "sha512-uvoOulWHhI+0+1f9L4BoozY7U5cIkZ9PgJqvb041d6vypgUmtVPG4vmGm4pSggjl8BELzvHyUeJSUyEMY6b+qA==", + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.9.tgz", + "integrity": "sha512-nEUfRiARCcaVo3ny3ZQjURjHQZUo/JkEw7rLlSZy/psWGnvwXFtPcr6jb7Yb41DVW5LTe6KRq9LGleRNsg1Frw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -947,53 +959,53 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.13.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.5.tgz", - "integrity": "sha512-8cErJEDzhZgNKzYyjCKsHuyPqtWxG8gc9h4OFSUDJu0vCAOsObPU2LcECnW0kJwh/b+uUz46lObVzIXw0fzAbA==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz", + "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-remap-async-to-generator": "^7.13.0", - "@babel/plugin-syntax-async-generators": "^7.8.0" + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.17.tgz", - "integrity": "sha512-ZNGoFZqrnuy9H2izB2jLlnNDAfVPlGl5NhFEiFe4D84ix9GQGygF+CWMGHKuE+bpyS/AOuDQCnkiRNqW2IzS1Q==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", + "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.13.tgz", - "integrity": "sha512-v9eEi4GiORDg8x+Dmi5r8ibOe0VXoKDeNPYcTTxdGN4eOWikrJfDJCJrr1l5gKGvsNyGJbrfMftC2dTL6oz7pg==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", + "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-json-strings": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.0.tgz", - "integrity": "sha512-UkAvFA/9+lBBL015gjA68NvKiCReNxqFLm3SdNKaM3XXoDisA7tMAIX4PmIwatFoFqMxxT3WyG9sK3MO0Kting==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", + "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -1013,13 +1025,15 @@ } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.0.tgz", - "integrity": "sha512-B4qphdSTp0nLsWcuei07JPKeZej4+Hd22MdnulJXQa1nCcGSBlk8FiqenGERaPZ+PuYhz4Li2Wjc8yfJvHgUMw==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", + "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", "dev": true, "dependencies": { + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.13.0" }, "peerDependencies": { @@ -1027,27 +1041,27 @@ } }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz", - "integrity": "sha512-9+MIm6msl9sHWg58NvqpNpLtuFbmpFYk37x8kgnGzAHvX35E1FyAwSUt5hIkSoWJFSAH+iwU8bJ4fcD1zKXOzg==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", + "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.0.tgz", - "integrity": "sha512-OVRQOZEBP2luZrvEbNSX5FfWDousthhdEoAOpej+Tpe58HFLvqRClT89RauIvBuCDFEip7GW1eT86/5lMy2RNA==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.8.tgz", + "integrity": "sha512-hpbBwbTgd7Cz1QryvwJZRo1U0k1q8uyBmeXOSQUjdg/A2TASkhR/rz7AyqZ/kS8kbpsNA80rOYbxySBJAqmhhQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -1371,9 +1385,9 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.0.tgz", - "integrity": "sha512-j7397PkIB4lcn25U2dClK6VLC6pr2s3q+wbE8R3vJvY6U1UTBBj0n6F+5v6+Fd/UwfDPAorMOs2TV+T4M+owpQ==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", + "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.13.0", @@ -1386,14 +1400,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz", - "integrity": "sha512-aHfVjhZ8QekaNF/5aNdStCGzwTbU7SI5hUybBKlMzqIMC7w7Ho8hx5a4R/DkTHfRfLwHGGxSpFt9BfxKCoXKoA==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.12.13", - "@babel/helper-module-transforms": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-validator-identifier": "^7.12.11", "babel-plugin-dynamic-import-node": "^2.3.3" }, @@ -1670,9 +1684,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.13.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.7.tgz", - "integrity": "sha512-h+ilqoX998mRVM5FtB5ijRuHUDVt5l3yfoOi2uh18Z/O3hvyaHQ39NpxVkCIG5yFs+mLq/ewFp8Bss6zmWv6ZA==", + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.9.tgz", + "integrity": "sha512-aY2kU+xgJ3dJ1eU6FMB9EH8dIe8dmusF1xEku52joLvw6eAFN0AI+WxCLDnpev2LEejWBAy2sBvBOBAjI3zmvA==", "dependencies": { "regenerator-runtime": "^0.13.4" } @@ -1706,9 +1720,9 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.0.tgz", - "integrity": "sha512-zBZfgvBB/ywjx0Rgc2+BwoH/3H+lDtlgD4hBOpEv5LxRnYsm/753iRuLepqnYlynpjC3AdQxtxsoeHJoEEwOAw==", + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", "dev": true, "dependencies": { "@babel/types": "^7.13.0", @@ -1883,7 +1897,6 @@ "version": "13.0.0", "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-13.0.0.tgz", "integrity": "sha512-+tzEp8wlqEnw0Gc7jtVRAJ6RteUjXw6JJR4O65KlnxOmJrCGPI0xjV/lKRnQeU0w4i96PQs/jtpL921Wrb7PWg==", - "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -2338,10 +2351,16 @@ "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", "dev": true }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, "node_modules/@types/jsonld": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@types/jsonld/-/jsonld-1.5.3.tgz", - "integrity": "sha512-xDjKgwTBOrdevh46a6dota4Lusrn0R6lC1EKEQkBhTrOx4xzGpQKZ/JsXPx7NP2N9qVj7AYo6k5ubWtXAYJkLw==" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/jsonld/-/jsonld-1.5.4.tgz", + "integrity": "sha512-e51UoELQzKJWGsVNqoKI5nnXazupqoOYTBMAGe3Iram0sWxeVTzgk38BKYgmOZmuIXaMFfuAz1ZimK2oyQNnRA==" }, "node_modules/@types/minimatch": { "version": "3.0.3", @@ -2393,6 +2412,559 @@ "node": ">=0.10.0" } }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.16.1.tgz", + "integrity": "sha512-SK777klBdlkUZpZLC1mPvyOWk9yAFCWmug13eAjVQ4/Q1LATE/NbcQL1xDHkptQkZOLnPmLUA1Y54m8dqYwnoQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.16.1", + "@typescript-eslint/scope-manager": "4.16.1", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.15", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin-tslint": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-4.16.1.tgz", + "integrity": "sha512-IjcIWuTm5/Z5GQsHhetFLta63DvX2RCsDELbwnICavRDnQfiu1qW/RTxMaMwyYGa4W9B5XvOUgm4Fh55yu2cuw==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.16.1", + "lodash": "^4.17.15" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0", + "tslint": "^5.0.0 || ^6.0.0", + "typescript": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin-tslint/node_modules/@typescript-eslint/experimental-utils": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.16.1.tgz", + "integrity": "sha512-0Hm3LSlMYFK17jO4iY3un1Ve9x1zLNn4EM50Lia+0EV99NdbK+cn0er7HC7IvBA23mBg3P+8dUkMXy4leL33UQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.16.1", + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/typescript-estree": "4.16.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin-tslint/node_modules/@typescript-eslint/types": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", + "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin-tslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.16.1.tgz", + "integrity": "sha512-m8I/DKHa8YbeHt31T+UGd/l8Kwr0XCTCZL3H4HMvvLCT7HU9V7yYdinTOv1gf/zfqNeDcCgaFH2BMsS8x6NvJg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/visitor-keys": "4.16.1", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin-tslint/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin-tslint/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin-tslint/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/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/experimental-utils": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.16.1.tgz", + "integrity": "sha512-0Hm3LSlMYFK17jO4iY3un1Ve9x1zLNn4EM50Lia+0EV99NdbK+cn0er7HC7IvBA23mBg3P+8dUkMXy4leL33UQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.16.1", + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/typescript-estree": "4.16.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", + "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.16.1.tgz", + "integrity": "sha512-m8I/DKHa8YbeHt31T+UGd/l8Kwr0XCTCZL3H4HMvvLCT7HU9V7yYdinTOv1gf/zfqNeDcCgaFH2BMsS8x6NvJg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/visitor-keys": "4.16.1", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/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/@typescript-eslint/experimental-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.3.0.tgz", + "integrity": "sha512-cmmIK8shn3mxmhpKfzMMywqiEheyfXLV/+yPDnOTvQX/ztngx7Lg/OD26J8gTZfkLKUmaEBxO2jYP3keV7h2OQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.3.0", + "@typescript-eslint/types": "4.3.0", + "@typescript-eslint/typescript-estree": "4.3.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/scope-manager": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.3.0.tgz", + "integrity": "sha512-cTeyP5SCNE8QBRfc+Lgh4Xpzje46kNUhXYfc3pQWmJif92sjrFuHT9hH4rtOkDTo/si9Klw53yIr+djqGZS1ig==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.3.0", + "@typescript-eslint/visitor-keys": "4.3.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.3.0.tgz", + "integrity": "sha512-xZxkuR7XLM6RhvLkgv9yYlTcBHnTULzfnw4i6+z2TGBLy9yljAypQaZl9c3zFvy7PNI7fYWyvKYtohyF8au3cw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.3.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.16.1.tgz", + "integrity": "sha512-/c0LEZcDL5y8RyI1zLcmZMvJrsR6SM1uetskFkoh3dvqDKVXPsXI+wFB/CbVw7WkEyyTKobC1mUNp/5y6gRvXg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "4.16.1", + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/typescript-estree": "4.16.1", + "debug": "^4.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", + "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.16.1.tgz", + "integrity": "sha512-m8I/DKHa8YbeHt31T+UGd/l8Kwr0XCTCZL3H4HMvvLCT7HU9V7yYdinTOv1gf/zfqNeDcCgaFH2BMsS8x6NvJg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/visitor-keys": "4.16.1", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser/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/@typescript-eslint/scope-manager": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.16.1.tgz", + "integrity": "sha512-6IlZv9JaurqV0jkEg923cV49aAn8V6+1H1DRfhRcvZUrptQ+UtSKHb5kwTayzOYTJJ/RsYZdcvhOEKiBLyc0Cw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/visitor-keys": "4.16.1" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", + "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.3.0.tgz", + "integrity": "sha512-Cx9TpRvlRjOppGsU6Y6KcJnUDOelja2NNCX6AZwtVHRzaJkdytJWMuYiqi8mS35MRNA3cJSwDzXePfmhU6TANw==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.3.0.tgz", + "integrity": "sha512-ZAI7xjkl+oFdLV/COEz2tAbQbR3XfgqHEGy0rlUXzfGQic6EBCR4s2+WS3cmTPG69aaZckEucBoTxW9PhzHxxw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.3.0", + "@typescript-eslint/visitor-keys": "4.3.0", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.3.0.tgz", + "integrity": "sha512-xZxkuR7XLM6RhvLkgv9yYlTcBHnTULzfnw4i6+z2TGBLy9yljAypQaZl9c3zFvy7PNI7fYWyvKYtohyF8au3cw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.3.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/visitor-keys": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.16.1.tgz", + "integrity": "sha512-s/aIP1XcMkEqCNcPQtl60ogUYjSM8FU2mq1O7y5cFf3Xcob1z1iXWNB6cC43Op+NGRTFgGolri6s8z/efA9i1w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.16.1", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", + "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", @@ -2599,11 +3171,6 @@ "three-render-objects": "^1.24.6" } }, - "node_modules/3d-force-graph/node_modules/three": { - "version": "0.125.2", - "resolved": "https://registry.npmjs.org/three/-/three-0.125.2.tgz", - "integrity": "sha512-7rIRO23jVKWcAPFdW/HREU2NZMGWPBZ4XwEMt0Ak0jwLUKVJhcKM55eCBWyGZq/KiQbeo1IeuAoo/9l2dzhTXA==" - }, "node_modules/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -2896,6 +3463,25 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, + "node_modules/array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -2923,6 +3509,23 @@ "node": ">=0.10.0" } }, + "node_modules/array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/arraybuffer.slice": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", @@ -3236,15 +3839,6 @@ "node": ">=6" } }, - "node_modules/babel-loader/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/babel-loader/node_modules/pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -3687,6 +4281,7 @@ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -3852,9 +4447,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001192", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001192.tgz", - "integrity": "sha512-63OrUnwJj5T1rUmoyqYTdRWBqFFxZFlyZnRRjDR8NSUQFB6A+j/uBORU/SyJ5WzDLg4SPiZH40hQCBNdZ/jmAw==", + "version": "1.0.30001194", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001194.tgz", + "integrity": "sha512-iDUOH+oFeBYk5XawYsPtsx/8fFpndAPUQJC7gBTfxHM8xw5nOZv7ceAD4frS1MKCLUac7QL5wdAJiFQlDRjXlA==", "dev": true }, "node_modules/canonical-path": { @@ -4281,6 +4876,15 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "node_modules/comment-parser": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.2.tgz", + "integrity": "sha512-AOdq0i8ghZudnYv8RUnHrhTgafUGs61Rdz9jemU5x2lnZwAWyOq7vySo626K59e1fVKH1xSRorJwPVRLSWOoAQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -4431,6 +5035,15 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, + "node_modules/contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -4623,9 +5236,9 @@ "dev": true }, "node_modules/core-js": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.9.0.tgz", - "integrity": "sha512-PyFBJaLq93FlyYdsndE5VaueA9K5cNB7CGzeCj191YYLhkQM0gdZR2SKihM70oF0wdqKSKClv/tEBOpoRmdOVQ==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.9.1.tgz", + "integrity": "sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -4633,9 +5246,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.0.tgz", - "integrity": "sha512-YK6fwFjCOKWwGnjFUR3c544YsnA/7DoLL0ysncuOJ4pwbriAtOpvM2bygdlcXbvQCQZ7bBU9CL4t7tGl7ETRpQ==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.1.tgz", + "integrity": "sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA==", "dev": true, "dependencies": { "browserslist": "^4.16.3", @@ -5883,9 +6496,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.3.674", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.674.tgz", - "integrity": "sha512-DBmEKRVYLZAoQSW+AmLcTF5Bpwhk4RUkobtzXVDlfPPYIlbsH3Jfg3QbBjAfFcRARzMIo4YiMhp3N+RnMuo1Eg==", + "version": "1.3.677", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.677.tgz", + "integrity": "sha512-Tcmk+oKQgpjcM+KYanlkd76ZtpzalkpUULnlJDP6vjHtR7UU564IM9Qv5DxqHZNBQjzXm6mkn7Y8bw2OoE3FmQ==", "dev": true }, "node_modules/elliptic": { @@ -5981,9 +6594,9 @@ } }, "node_modules/engine.io-client": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.0.tgz", - "integrity": "sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.1.tgz", + "integrity": "sha512-oVu9kBkGbcggulyVF0kz6BV3ganqUeqXvD79WOFKa+11oK692w1NyFkuEj4xrkFRpZhn92QOqTk4RQq5LiBXbQ==", "dev": true, "dependencies": { "component-emitter": "~1.3.0", @@ -6084,25 +6697,27 @@ } }, "node_modules/es-abstract": { - "version": "1.18.0-next.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", - "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", + "version": "1.18.0-next.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.3.tgz", + "integrity": "sha512-VMzHx/Bczjg59E6jZOQjHeN3DEoptdhejpARgflAViidlqSpjdq9zA6lKwlhRRs/lOw1gHJv2xkkSFRgvEwbQg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2", + "get-intrinsic": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", "object-inspect": "^1.9.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.3", - "string.prototype.trimstart": "^1.0.3" + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -6221,12 +6836,207 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-module-utils/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "node_modules/eslint-plugin-angular": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-angular/-/eslint-plugin-angular-4.0.1.tgz", "integrity": "sha512-OaW5G461C2lIkOG+/bhnBoXB9UQm/r0Dj2Qf9uiIN0/ncvf2Llp30L0q1tqWkN8/CxyBwQKh1v0hpCLLDjaIKQ==", "dev": true }, + "node_modules/eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "32.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-32.2.0.tgz", + "integrity": "sha512-ikeVeF3JVmzjcmGd04OZK0rXjgiw46TWtNX+OhyF2jQlw3w1CAU1vyAyLv8PZcIjp7WxP4N20Vg1CI9bp/52dw==", + "dev": true, + "dependencies": { + "comment-parser": "1.1.2", + "debug": "^4.3.1", + "jsdoctypeparser": "^9.0.0", + "lodash": "^4.17.20", + "regextras": "^0.7.1", + "semver": "^7.3.4", + "spdx-expression-parse": "^3.0.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/eslint-plugin-jsdoc/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-jsdoc/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/eslint-plugin-prefer-arrow": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", + "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "eslint": ">=2.0.0" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -6241,6 +7051,39 @@ } }, "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/eslint-utils": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", @@ -6252,7 +7095,7 @@ "node": ">=6" } }, - "node_modules/eslint-visitor-keys": { + "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", @@ -6292,6 +7135,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint/node_modules/regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true, + "engines": { + "node": ">=6.5.0" + } + }, "node_modules/eslint/node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -6324,6 +7176,15 @@ "node": ">=6.0.0" } }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -6413,9 +7274,9 @@ "dev": true }, "node_modules/events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "engines": { "node": ">=0.8.x" @@ -6952,7 +7813,7 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/find-up": { + "node_modules/find-cache-dir/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", @@ -6965,6 +7826,78 @@ "node": ">=8" } }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/flat-cache": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", @@ -7008,9 +7941,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz", - "integrity": "sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", + "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==", "dev": true, "funding": [ { @@ -7367,6 +8300,15 @@ "node": ">=0.10.0" } }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-binary2": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", @@ -7398,9 +8340,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true, "engines": { "node": ">= 0.4" @@ -8082,15 +9024,6 @@ "node": ">=6" } }, - "node_modules/import-local/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/import-local/node_modules/pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -8374,6 +9307,15 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "node_modules/is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -8386,6 +9328,21 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -8564,6 +9521,18 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", @@ -8658,6 +9627,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-svg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", @@ -9010,6 +9991,18 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, + "node_modules/jsdoctypeparser": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz", + "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==", + "dev": true, + "bin": { + "jsdoctypeparser": "bin/jsdoctypeparser" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -9331,6 +10324,67 @@ "node": ">=0.1.90" } }, + "node_modules/karma/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/karma/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/karma/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9604,6 +10658,42 @@ "immediate": "~3.0.5" } }, + "node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -9628,15 +10718,16 @@ } }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/lodash": { @@ -11268,30 +12359,36 @@ } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "p-try": "^1.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" + } + }, + "node_modules/p-locate/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" } }, "node_modules/p-map": { @@ -11621,12 +12718,12 @@ "dev": true }, "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/path-is-absolute": { @@ -11738,15 +12835,15 @@ } }, "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "dependencies": { - "find-up": "^4.0.0" + "find-up": "^2.1.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/polished": { @@ -12746,6 +13843,67 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/protractor/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/protractor/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/protractor/node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -13186,6 +14344,54 @@ "util-promisify": "^2.1.0" } }, + "node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -13293,12 +14499,15 @@ } }, "node_modules/regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true, "engines": { - "node": ">=6.5.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, "node_modules/regexpu-core": { @@ -13318,6 +14527,15 @@ "node": ">=4" } }, + "node_modules/regextras": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz", + "integrity": "sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==", + "dev": true, + "engines": { + "node": ">=0.1.14" + } + }, "node_modules/regjsgen": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", @@ -15055,9 +16273,9 @@ } }, "node_modules/string-width": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.1.tgz", - "integrity": "sha512-LL0OLyN6AnfV9xqGQpDBwedT2Rt63737LxvsRxbcwpa2aIeynBApG2Sm//F3TaLHIR1aJBN52DWklc06b94o5Q==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "dependencies": { "emoji-regex": "^8.0.0", @@ -15127,6 +16345,15 @@ "node": ">=6" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -15679,9 +16906,9 @@ "dev": true }, "node_modules/three": { - "version": "0.125.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.125.0.tgz", - "integrity": "sha512-qL36qUGsPQ/Ofo/RZdXwHwM7A8wzUSAIyawtjIebJSPvounUQeneSqxI0aBY2iwKpseGy+RUtj3C5f/z4poyXw==" + "version": "0.125.2", + "resolved": "https://registry.npmjs.org/three/-/three-0.125.2.tgz", + "integrity": "sha512-7rIRO23jVKWcAPFdW/HREU2NZMGWPBZ4XwEMt0Ak0jwLUKVJhcKM55eCBWyGZq/KiQbeo1IeuAoo/9l2dzhTXA==" }, "node_modules/three-forcegraph": { "version": "1.37.0", @@ -15943,16 +17170,42 @@ "typescript": ">=2.0" } }, + "node_modules/tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/tslint": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", - "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", "dev": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", @@ -15962,10 +17215,10 @@ "glob": "^7.1.1", "js-yaml": "^3.13.1", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", + "mkdirp": "^0.5.3", "resolve": "^1.3.2", "semver": "^5.3.0", - "tslib": "^1.8.0", + "tslib": "^1.13.0", "tsutils": "^2.29.0" }, "bin": { @@ -15975,7 +17228,7 @@ "node": ">=4.8.0" }, "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" } }, "node_modules/tslint/node_modules/semver": { @@ -15983,15 +17236,17 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, + "peer": true, "bin": { "semver": "bin/semver" } }, - "node_modules/tsutils": { + "node_modules/tslint/node_modules/tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, + "peer": true, "dependencies": { "tslib": "^1.8.1" }, @@ -15999,6 +17254,21 @@ "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" } }, + "node_modules/tsutils": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz", + "integrity": "sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, "node_modules/tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", @@ -16086,6 +17356,18 @@ "node": "*" } }, + "node_modules/unbox-primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz", + "integrity": "sha512-P/51NX+JXyxK/aigg1/ZgyccdAxm5K1+n8+tvqSntjOivPt19gvm1VC49RWYetsiub8WViUchdxl/KWHHB0kzA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.0", + "has-symbols": "^1.0.0", + "which-boxed-primitive": "^1.0.1" + } + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -17488,15 +18770,6 @@ "node": ">=6" } }, - "node_modules/webpack-dev-server/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/webpack-dev-server/node_modules/readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -18056,15 +19329,6 @@ "node": ">=6" } }, - "node_modules/webpack/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/webpack/node_modules/pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -18211,6 +19475,22 @@ "which": "bin/which" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -18715,6 +19995,15 @@ } } }, + "@angular-eslint/eslint-plugin": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-1.2.0.tgz", + "integrity": "sha512-HxSDdAS2/lbwYBJmRVRKlx5wjiKdeBPl7JJlciwhrP7QR01a66AWun+fW1ZpMnnqivkF+D5sISsoedRLthRcwA==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.3.0" + } + }, "@angular/animations": { "version": "9.1.13", "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.1.13.tgz", @@ -18865,9 +20154,9 @@ } }, "@babel/compat-data": { - "version": "7.13.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.6.tgz", - "integrity": "sha512-VhgqKOWYVm7lQXlvbJnWOzwfAQATd2nV52koT0HZ/LdDH0m4DUDwkKYsH+IwpXb+bKPyBJzawA4I6nBKqZcpQw==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.8.tgz", + "integrity": "sha512-EaI33z19T4qN3xLXsGf48M2cDqa6ei9tPZlfLdb2HC+e/cFtREiRd8hdSqDbwdLB0/+gLwqJmCYASH0z2bUdog==", "dev": true }, "@babel/core": { @@ -18948,23 +20237,15 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.0.tgz", - "integrity": "sha512-SOWD0JK9+MMIhTQiUVd4ng8f3NXhPVQvTv7D3UN4wbp/6cAHnB2EmMaU1zZA2Hh1gwme+THBrVSqTFxHczTh0Q==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.8.tgz", + "integrity": "sha512-pBljUGC1y3xKLn1nrx2eAhurLMA8OqBtBP/JwG4U8skN7kf8/aqwwxpV1N6T0e7r6+7uNitIa/fUxPFagSXp3A==", "dev": true, "requires": { - "@babel/compat-data": "^7.13.0", + "@babel/compat-data": "^7.13.8", "@babel/helper-validator-option": "^7.12.17", "browserslist": "^4.14.5", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } + "semver": "^6.3.0" } }, "@babel/helper-create-regexp-features-plugin": { @@ -19204,9 +20485,9 @@ } }, "@babel/highlight": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", - "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.8.tgz", + "integrity": "sha512-4vrIhfJyfNf+lCtXC2ck1rKSzDwciqF7IWFhXXrSOUC2O5DrVp+w4c6ed4AllTxhTkUP5x2tYj41VaxdVMMRDw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -19215,50 +20496,50 @@ } }, "@babel/parser": { - "version": "7.13.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.4.tgz", - "integrity": "sha512-uvoOulWHhI+0+1f9L4BoozY7U5cIkZ9PgJqvb041d6vypgUmtVPG4vmGm4pSggjl8BELzvHyUeJSUyEMY6b+qA==", + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.9.tgz", + "integrity": "sha512-nEUfRiARCcaVo3ny3ZQjURjHQZUo/JkEw7rLlSZy/psWGnvwXFtPcr6jb7Yb41DVW5LTe6KRq9LGleRNsg1Frw==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.13.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.5.tgz", - "integrity": "sha512-8cErJEDzhZgNKzYyjCKsHuyPqtWxG8gc9h4OFSUDJu0vCAOsObPU2LcECnW0kJwh/b+uUz46lObVzIXw0fzAbA==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz", + "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-remap-async-to-generator": "^7.13.0", - "@babel/plugin-syntax-async-generators": "^7.8.0" + "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.17.tgz", - "integrity": "sha512-ZNGoFZqrnuy9H2izB2jLlnNDAfVPlGl5NhFEiFe4D84ix9GQGygF+CWMGHKuE+bpyS/AOuDQCnkiRNqW2IzS1Q==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", + "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.13.tgz", - "integrity": "sha512-v9eEi4GiORDg8x+Dmi5r8ibOe0VXoKDeNPYcTTxdGN4eOWikrJfDJCJrr1l5gKGvsNyGJbrfMftC2dTL6oz7pg==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", + "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-json-strings": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.0.tgz", - "integrity": "sha512-UkAvFA/9+lBBL015gjA68NvKiCReNxqFLm3SdNKaM3XXoDisA7tMAIX4PmIwatFoFqMxxT3WyG9sK3MO0Kting==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", + "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { @@ -19272,35 +20553,37 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.0.tgz", - "integrity": "sha512-B4qphdSTp0nLsWcuei07JPKeZej4+Hd22MdnulJXQa1nCcGSBlk8FiqenGERaPZ+PuYhz4Li2Wjc8yfJvHgUMw==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", + "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", "dev": true, "requires": { + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.13.0" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz", - "integrity": "sha512-9+MIm6msl9sHWg58NvqpNpLtuFbmpFYk37x8kgnGzAHvX35E1FyAwSUt5hIkSoWJFSAH+iwU8bJ4fcD1zKXOzg==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", + "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.0.tgz", - "integrity": "sha512-OVRQOZEBP2luZrvEbNSX5FfWDousthhdEoAOpej+Tpe58HFLvqRClT89RauIvBuCDFEip7GW1eT86/5lMy2RNA==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.8.tgz", + "integrity": "sha512-hpbBwbTgd7Cz1QryvwJZRo1U0k1q8uyBmeXOSQUjdg/A2TASkhR/rz7AyqZ/kS8kbpsNA80rOYbxySBJAqmhhQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-unicode-property-regex": { @@ -19543,9 +20826,9 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.0.tgz", - "integrity": "sha512-j7397PkIB4lcn25U2dClK6VLC6pr2s3q+wbE8R3vJvY6U1UTBBj0n6F+5v6+Fd/UwfDPAorMOs2TV+T4M+owpQ==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", + "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.13.0", @@ -19555,14 +20838,14 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz", - "integrity": "sha512-aHfVjhZ8QekaNF/5aNdStCGzwTbU7SI5hUybBKlMzqIMC7w7Ho8hx5a4R/DkTHfRfLwHGGxSpFt9BfxKCoXKoA==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.12.13", - "@babel/helper-module-transforms": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-validator-identifier": "^7.12.11", "babel-plugin-dynamic-import-node": "^2.3.3" } @@ -19787,9 +21070,9 @@ } }, "@babel/runtime": { - "version": "7.13.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.7.tgz", - "integrity": "sha512-h+ilqoX998mRVM5FtB5ijRuHUDVt5l3yfoOi2uh18Z/O3hvyaHQ39NpxVkCIG5yFs+mLq/ewFp8Bss6zmWv6ZA==", + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.9.tgz", + "integrity": "sha512-aY2kU+xgJ3dJ1eU6FMB9EH8dIe8dmusF1xEku52joLvw6eAFN0AI+WxCLDnpev2LEejWBAy2sBvBOBAjI3zmvA==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -19823,9 +21106,9 @@ }, "dependencies": { "@babel/generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.0.tgz", - "integrity": "sha512-zBZfgvBB/ywjx0Rgc2+BwoH/3H+lDtlgD4hBOpEv5LxRnYsm/753iRuLepqnYlynpjC3AdQxtxsoeHJoEEwOAw==", + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", "dev": true, "requires": { "@babel/types": "^7.13.0", @@ -20371,10 +21654,16 @@ "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", "dev": true }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, "@types/jsonld": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@types/jsonld/-/jsonld-1.5.3.tgz", - "integrity": "sha512-xDjKgwTBOrdevh46a6dota4Lusrn0R6lC1EKEQkBhTrOx4xzGpQKZ/JsXPx7NP2N9qVj7AYo6k5ubWtXAYJkLw==" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/jsonld/-/jsonld-1.5.4.tgz", + "integrity": "sha512-e51UoELQzKJWGsVNqoKI5nnXazupqoOYTBMAGe3Iram0sWxeVTzgk38BKYgmOZmuIXaMFfuAz1ZimK2oyQNnRA==" }, "@types/minimatch": { "version": "3.0.3", @@ -20425,6 +21714,343 @@ } } }, + "@typescript-eslint/eslint-plugin": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.16.1.tgz", + "integrity": "sha512-SK777klBdlkUZpZLC1mPvyOWk9yAFCWmug13eAjVQ4/Q1LATE/NbcQL1xDHkptQkZOLnPmLUA1Y54m8dqYwnoQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.16.1", + "@typescript-eslint/scope-manager": "4.16.1", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.15", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.16.1.tgz", + "integrity": "sha512-0Hm3LSlMYFK17jO4iY3un1Ve9x1zLNn4EM50Lia+0EV99NdbK+cn0er7HC7IvBA23mBg3P+8dUkMXy4leL33UQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.16.1", + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/typescript-estree": "4.16.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/types": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", + "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.16.1.tgz", + "integrity": "sha512-m8I/DKHa8YbeHt31T+UGd/l8Kwr0XCTCZL3H4HMvvLCT7HU9V7yYdinTOv1gf/zfqNeDcCgaFH2BMsS8x6NvJg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/visitor-keys": "4.16.1", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "@typescript-eslint/eslint-plugin-tslint": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-4.16.1.tgz", + "integrity": "sha512-IjcIWuTm5/Z5GQsHhetFLta63DvX2RCsDELbwnICavRDnQfiu1qW/RTxMaMwyYGa4W9B5XvOUgm4Fh55yu2cuw==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.16.1", + "lodash": "^4.17.15" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.16.1.tgz", + "integrity": "sha512-0Hm3LSlMYFK17jO4iY3un1Ve9x1zLNn4EM50Lia+0EV99NdbK+cn0er7HC7IvBA23mBg3P+8dUkMXy4leL33UQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.16.1", + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/typescript-estree": "4.16.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/types": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", + "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.16.1.tgz", + "integrity": "sha512-m8I/DKHa8YbeHt31T+UGd/l8Kwr0XCTCZL3H4HMvvLCT7HU9V7yYdinTOv1gf/zfqNeDcCgaFH2BMsS8x6NvJg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/visitor-keys": "4.16.1", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.3.0.tgz", + "integrity": "sha512-cmmIK8shn3mxmhpKfzMMywqiEheyfXLV/+yPDnOTvQX/ztngx7Lg/OD26J8gTZfkLKUmaEBxO2jYP3keV7h2OQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.3.0", + "@typescript-eslint/types": "4.3.0", + "@typescript-eslint/typescript-estree": "4.3.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.3.0.tgz", + "integrity": "sha512-cTeyP5SCNE8QBRfc+Lgh4Xpzje46kNUhXYfc3pQWmJif92sjrFuHT9hH4rtOkDTo/si9Klw53yIr+djqGZS1ig==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.3.0", + "@typescript-eslint/visitor-keys": "4.3.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.3.0.tgz", + "integrity": "sha512-xZxkuR7XLM6RhvLkgv9yYlTcBHnTULzfnw4i6+z2TGBLy9yljAypQaZl9c3zFvy7PNI7fYWyvKYtohyF8au3cw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.3.0", + "eslint-visitor-keys": "^2.0.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.16.1.tgz", + "integrity": "sha512-/c0LEZcDL5y8RyI1zLcmZMvJrsR6SM1uetskFkoh3dvqDKVXPsXI+wFB/CbVw7WkEyyTKobC1mUNp/5y6gRvXg==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.16.1", + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/typescript-estree": "4.16.1", + "debug": "^4.1.1" + }, + "dependencies": { + "@typescript-eslint/types": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", + "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.16.1.tgz", + "integrity": "sha512-m8I/DKHa8YbeHt31T+UGd/l8Kwr0XCTCZL3H4HMvvLCT7HU9V7yYdinTOv1gf/zfqNeDcCgaFH2BMsS8x6NvJg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/visitor-keys": "4.16.1", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.16.1.tgz", + "integrity": "sha512-6IlZv9JaurqV0jkEg923cV49aAn8V6+1H1DRfhRcvZUrptQ+UtSKHb5kwTayzOYTJJ/RsYZdcvhOEKiBLyc0Cw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/visitor-keys": "4.16.1" + }, + "dependencies": { + "@typescript-eslint/types": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", + "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "dev": true + } + } + }, + "@typescript-eslint/types": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.3.0.tgz", + "integrity": "sha512-Cx9TpRvlRjOppGsU6Y6KcJnUDOelja2NNCX6AZwtVHRzaJkdytJWMuYiqi8mS35MRNA3cJSwDzXePfmhU6TANw==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.3.0.tgz", + "integrity": "sha512-ZAI7xjkl+oFdLV/COEz2tAbQbR3XfgqHEGy0rlUXzfGQic6EBCR4s2+WS3cmTPG69aaZckEucBoTxW9PhzHxxw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.3.0", + "@typescript-eslint/visitor-keys": "4.3.0", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "@typescript-eslint/visitor-keys": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.3.0.tgz", + "integrity": "sha512-xZxkuR7XLM6RhvLkgv9yYlTcBHnTULzfnw4i6+z2TGBLy9yljAypQaZl9c3zFvy7PNI7fYWyvKYtohyF8au3cw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.3.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.16.1.tgz", + "integrity": "sha512-s/aIP1XcMkEqCNcPQtl60ogUYjSM8FU2mq1O7y5cFf3Xcob1z1iXWNB6cC43Op+NGRTFgGolri6s8z/efA9i1w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.16.1", + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "@typescript-eslint/types": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", + "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "dev": true + } + } + }, "@webassemblyjs/ast": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", @@ -20629,13 +22255,6 @@ "three": "^0.125.1", "three-forcegraph": "^1.37.0", "three-render-objects": "^1.24.6" - }, - "dependencies": { - "three": { - "version": "0.125.2", - "resolved": "https://registry.npmjs.org/three/-/three-0.125.2.tgz", - "integrity": "sha512-7rIRO23jVKWcAPFdW/HREU2NZMGWPBZ4XwEMt0Ak0jwLUKVJhcKM55eCBWyGZq/KiQbeo1IeuAoo/9l2dzhTXA==" - } } }, "accepts": { @@ -20860,6 +22479,19 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + } + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -20878,6 +22510,17 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, "arraybuffer.slice": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", @@ -21130,12 +22773,6 @@ "p-limit": "^2.0.0" } }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -21508,7 +23145,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true + "dev": true, + "peer": true }, "builtin-status-codes": { "version": "3.0.0", @@ -21640,9 +23278,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001192", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001192.tgz", - "integrity": "sha512-63OrUnwJj5T1rUmoyqYTdRWBqFFxZFlyZnRRjDR8NSUQFB6A+j/uBORU/SyJ5WzDLg4SPiZH40hQCBNdZ/jmAw==", + "version": "1.0.30001194", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001194.tgz", + "integrity": "sha512-iDUOH+oFeBYk5XawYsPtsx/8fFpndAPUQJC7gBTfxHM8xw5nOZv7ceAD4frS1MKCLUac7QL5wdAJiFQlDRjXlA==", "dev": true }, "canonical-path": { @@ -21996,6 +23634,12 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "comment-parser": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.2.tgz", + "integrity": "sha512-AOdq0i8ghZudnYv8RUnHrhTgafUGs61Rdz9jemU5x2lnZwAWyOq7vySo626K59e1fVKH1xSRorJwPVRLSWOoAQ==", + "dev": true + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -22132,6 +23776,12 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, "content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -22282,14 +23932,14 @@ } }, "core-js": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.9.0.tgz", - "integrity": "sha512-PyFBJaLq93FlyYdsndE5VaueA9K5cNB7CGzeCj191YYLhkQM0gdZR2SKihM70oF0wdqKSKClv/tEBOpoRmdOVQ==" + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.9.1.tgz", + "integrity": "sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg==" }, "core-js-compat": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.0.tgz", - "integrity": "sha512-YK6fwFjCOKWwGnjFUR3c544YsnA/7DoLL0ysncuOJ4pwbriAtOpvM2bygdlcXbvQCQZ7bBU9CL4t7tGl7ETRpQ==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.1.tgz", + "integrity": "sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA==", "dev": true, "requires": { "browserslist": "^4.16.3", @@ -23384,9 +25034,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.674", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.674.tgz", - "integrity": "sha512-DBmEKRVYLZAoQSW+AmLcTF5Bpwhk4RUkobtzXVDlfPPYIlbsH3Jfg3QbBjAfFcRARzMIo4YiMhp3N+RnMuo1Eg==", + "version": "1.3.677", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.677.tgz", + "integrity": "sha512-Tcmk+oKQgpjcM+KYanlkd76ZtpzalkpUULnlJDP6vjHtR7UU564IM9Qv5DxqHZNBQjzXm6mkn7Y8bw2OoE3FmQ==", "dev": true }, "elliptic": { @@ -23474,9 +25124,9 @@ } }, "engine.io-client": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.0.tgz", - "integrity": "sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.1.tgz", + "integrity": "sha512-oVu9kBkGbcggulyVF0kz6BV3ganqUeqXvD79WOFKa+11oK692w1NyFkuEj4xrkFRpZhn92QOqTk4RQq5LiBXbQ==", "dev": true, "requires": { "component-emitter": "~1.3.0", @@ -23570,25 +25220,27 @@ } }, "es-abstract": { - "version": "1.18.0-next.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", - "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", + "version": "1.18.0-next.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.3.tgz", + "integrity": "sha512-VMzHx/Bczjg59E6jZOQjHeN3DEoptdhejpARgflAViidlqSpjdq9zA6lKwlhRRs/lOw1gHJv2xkkSFRgvEwbQg==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2", + "get-intrinsic": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", "object-inspect": "^1.9.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.3", - "string.prototype.trimstart": "^1.0.3" + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" } }, "es-to-primitive": { @@ -23680,6 +25332,21 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, "globals": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", @@ -23699,6 +25366,12 @@ "resolve-from": "^4.0.0" } }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -23713,12 +25386,178 @@ } } }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "eslint-plugin-angular": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-angular/-/eslint-plugin-angular-4.0.1.tgz", "integrity": "sha512-OaW5G461C2lIkOG+/bhnBoXB9UQm/r0Dj2Qf9uiIN0/ncvf2Llp30L0q1tqWkN8/CxyBwQKh1v0hpCLLDjaIKQ==", "dev": true }, + "eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-jsdoc": { + "version": "32.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-32.2.0.tgz", + "integrity": "sha512-ikeVeF3JVmzjcmGd04OZK0rXjgiw46TWtNX+OhyF2jQlw3w1CAU1vyAyLv8PZcIjp7WxP4N20Vg1CI9bp/52dw==", + "dev": true, + "requires": { + "comment-parser": "1.1.2", + "debug": "^4.3.1", + "jsdoctypeparser": "^9.0.0", + "lodash": "^4.17.20", + "regextras": "^0.7.1", + "semver": "^7.3.4", + "spdx-expression-parse": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "eslint-plugin-prefer-arrow": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", + "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", + "dev": true, + "peer": true, + "requires": {} + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -23730,18 +25569,26 @@ } }, "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", "dev": true }, "espree": { @@ -23753,6 +25600,14 @@ "acorn": "^7.1.1", "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "esprima": { @@ -23820,9 +25675,9 @@ "dev": true }, "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, "eventsource": { @@ -24263,16 +26118,69 @@ "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } } }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "locate-path": "^2.0.0" } }, "flat-cache": { @@ -24314,9 +26222,9 @@ } }, "follow-redirects": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz", - "integrity": "sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", + "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==", "dev": true }, "for-in": { @@ -24583,6 +26491,12 @@ } } }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, "has-binary2": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", @@ -24613,9 +26527,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, "has-value": { @@ -25167,12 +27081,6 @@ "p-limit": "^2.0.0" } }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -25400,6 +27308,12 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", + "dev": true + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -25409,6 +27323,15 @@ "binary-extensions": "^2.0.0" } }, + "is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -25530,6 +27453,12 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true + }, "is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", @@ -25597,6 +27526,12 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, "is-svg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", @@ -25871,6 +27806,12 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, + "jsdoctypeparser": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz", + "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==", + "dev": true + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -26083,6 +28024,49 @@ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -26343,6 +28327,35 @@ "immediate": "~3.0.5" } }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -26361,12 +28374,13 @@ } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "^4.1.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "lodash": { @@ -27702,22 +29716,28 @@ } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "^2.2.0" + "p-limit": "^1.1.0" }, "dependencies": { "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { - "p-try": "^2.0.0" + "p-try": "^1.0.0" } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true } } }, @@ -28018,9 +30038,9 @@ "dev": true }, "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "path-is-absolute": { @@ -28105,12 +30125,12 @@ } }, "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "^4.0.0" + "find-up": "^2.1.0" } }, "polished": { @@ -28964,6 +30984,49 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -29319,6 +31382,44 @@ "util-promisify": "^2.1.0" } }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "dependencies": { + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -29411,9 +31512,9 @@ } }, "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true }, "regexpu-core": { @@ -29430,6 +31531,12 @@ "unicode-match-property-value-ecmascript": "^1.2.0" } }, + "regextras": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz", + "integrity": "sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==", + "dev": true + }, "regjsgen": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", @@ -30874,9 +32981,9 @@ } }, "string-width": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.1.tgz", - "integrity": "sha512-LL0OLyN6AnfV9xqGQpDBwedT2Rt63737LxvsRxbcwpa2aIeynBApG2Sm//F3TaLHIR1aJBN52DWklc06b94o5Q==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -30930,6 +33037,12 @@ "ansi-regex": "^4.1.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -31351,9 +33464,9 @@ "dev": true }, "three": { - "version": "0.125.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.125.0.tgz", - "integrity": "sha512-qL36qUGsPQ/Ofo/RZdXwHwM7A8wzUSAIyawtjIebJSPvounUQeneSqxI0aBY2iwKpseGy+RUtj3C5f/z4poyXw==" + "version": "0.125.2", + "resolved": "https://registry.npmjs.org/three/-/three-0.125.2.tgz", + "integrity": "sha512-7rIRO23jVKWcAPFdW/HREU2NZMGWPBZ4XwEMt0Ak0jwLUKVJhcKM55eCBWyGZq/KiQbeo1IeuAoo/9l2dzhTXA==" }, "three-forcegraph": { "version": "1.37.0", @@ -31569,16 +33682,40 @@ "yn": "^3.0.0" } }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "tslint": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", - "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", @@ -31588,10 +33725,10 @@ "glob": "^7.1.1", "js-yaml": "^3.13.1", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", + "mkdirp": "^0.5.3", "resolve": "^1.3.2", "semver": "^5.3.0", - "tslib": "^1.8.0", + "tslib": "^1.13.0", "tsutils": "^2.29.0" }, "dependencies": { @@ -31599,14 +33736,25 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "dev": true, + "peer": true + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "peer": true, + "requires": { + "tslib": "^1.8.1" + } } } }, "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz", + "integrity": "sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -31674,6 +33822,18 @@ "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==", "dev": true }, + "unbox-primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz", + "integrity": "sha512-P/51NX+JXyxK/aigg1/ZgyccdAxm5K1+n8+tvqSntjOivPt19gvm1VC49RWYetsiub8WViUchdxl/KWHHB0kzA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.0", + "has-symbols": "^1.0.0", + "which-boxed-primitive": "^1.0.1" + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -32644,12 +34804,6 @@ "p-limit": "^2.0.0" } }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -33152,12 +35306,6 @@ "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -33408,6 +35556,19 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", diff --git a/package.json b/package.json index 17573763ed..f9636f3a41 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "scripts": { "ng": "ng", "start": "ng serve", - "lint": "ng lint", + "lint-ci": "eslint --color -c .eslintrc.js --ext .ts ./src/app", + "lint-local": "eslint --color --fix -c .eslintrc.js --ext .ts ./src/app", "e2e": "ng e2e", "build": "ng build", "build-prod": "ng build --prod=true", @@ -60,6 +61,7 @@ }, "devDependencies": { "@angular-devkit/build-angular": "~0.901.12", + "@angular-eslint/eslint-plugin": "^1.2.0", "@angular/cli": "~9.1.12", "@angular/compiler-cli": "~9.1.12", "@angular/language-service": "~9.1.12", @@ -67,9 +69,14 @@ "@types/jasmine": "~3.4.4", "@types/jasminewd2": "~2.0.3", "@types/node": "^12.11.1", + "@typescript-eslint/eslint-plugin": "^4.15.2", + "@typescript-eslint/eslint-plugin-tslint": "^4.15.2", + "@typescript-eslint/parser": "^4.15.2", "codelyzer": "^5.1.2", - "eslint": "^6.5.1", + "eslint": "^6.8.0", "eslint-plugin-angular": "^4.0.1", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jsdoc": "^32.2.0", "jasmine-core": "~3.5.0", "jasmine-spec-reporter": "~4.2.1", "karma": "^5.1.1", @@ -79,7 +86,6 @@ "karma-jasmine-html-reporter": "^1.5.4", "protractor": "^7.0.0", "ts-node": "~8.4.1", - "tslint": "~5.20.0", "typescript": "3.8.3" } } diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 6ef7b80ec9..f8006a625e 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -8,7 +8,7 @@ import { Title } from '@angular/platform-browser'; }) export class AppComponent implements OnInit { - session: boolean = false; + session = false; constructor( private _titleService: Title) { diff --git a/src/app/app.module.ts b/src/app/app.module.ts index c23d915d8b..4c09eeba43 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -95,7 +95,7 @@ import { ResultsComponent } from './workspace/results/results.component'; // translate: AoT requires an exported function for factories -export function HttpLoaderFactory(httpClient: HttpClient) { +export function httpLoaderFactory(httpClient: HttpClient) { return new TranslateHttpLoader(httpClient, 'assets/i18n/', '.json'); } @@ -186,7 +186,7 @@ export function HttpLoaderFactory(httpClient: HttpClient) { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: HttpLoaderFactory, + useFactory: httpLoaderFactory, deps: [HttpClient] } }), @@ -197,9 +197,7 @@ export function HttpLoaderFactory(httpClient: HttpClient) { { provide: APP_INITIALIZER, useFactory: (appInitService: AppInitService) => - (): Promise => { - return appInitService.Init('config', environment); - }, + (): Promise => appInitService.Init('config', environment), deps: [AppInitService], multi: true }, diff --git a/src/app/main/cache/cache.service.ts b/src/app/main/cache/cache.service.ts index b7f95e4df0..ec12091893 100644 --- a/src/app/main/cache/cache.service.ts +++ b/src/app/main/cache/cache.service.ts @@ -12,49 +12,49 @@ interface CacheContent { providedIn: 'root' }) /** - * Cache Service is an observables based in-memory cache implementation + * cache Service is an observables based in-memory cache implementation * Keeps track of in-flight observables and sets a default expiry for cached values * @export * @class CacheService */ export class CacheService { - private cache: Map = new Map(); - private inFlightObservables: Map> = new Map>(); readonly DEFAULT_MAX_AGE: number = 3600000; // 3600000ms => 1 Stunde + private _cache: Map = new Map(); + private _inFlightObservables: Map> = new Map>(); constructor( private _errorHandler: ErrorHandlerService ) { } /** - * Gets the value from cache if the key is provided. + * gets the value from cache if the key is provided. * If no value exists in cache, then check if the same call exists * in flight, if so return the subject. If not create a new * Subject inFlightObservable and return the source observable. */ get(key: string, fallback?: Observable, maxAge?: number): Observable | Subject { - if (this.hasValidCachedValue(key)) { + if (this._hasValidCachedValue(key)) { // console.log(`%c Getting from cache by key: ${key}`, 'color: green'); // console.log(`%c Cache returns:` + JSON.stringify(this.cache.get(key).value), 'color: green'); // console.log(`%c Cache returns typeof:` + (typeof of(this.cache.get(key).value)), 'color: green'); // returns observable - return of(this.cache.get(key).value); + return of(this._cache.get(key).value); } if (!maxAge) { maxAge = this.DEFAULT_MAX_AGE; } - if (this.inFlightObservables.has(key)) { + if (this._inFlightObservables.has(key)) { // console.log(`%c inFlightObservables has key: ${key}`, 'color: orange'); // console.log(`%c inFlightObservables returns:` + JSON.stringify(this.inFlightObservables.get(key)), 'color: orange'); // console.log(`%c inFlightObservables returns typeof:` + (typeof this.inFlightObservables.get(key)), 'color: orange'); - return this.inFlightObservables.get(key); + return this._inFlightObservables.get(key); } else if (fallback && fallback instanceof Observable) { - this.inFlightObservables.set(key, new Subject()); + this._inFlightObservables.set(key, new Subject()); fallback.subscribe( (value: any) => { @@ -77,19 +77,19 @@ export class CacheService { } /** - * Sets the value with key in the cache + * sets the value with key in the cache * Notifies all observers of the new value */ set(key: string, value: any, maxAge: number = this.DEFAULT_MAX_AGE): void { - this.cache.set(key, { value: value, expiry: Date.now() + maxAge }); - this.notifyInFlightObservers(key, value); + this._cache.set(key, { value: value, expiry: Date.now() + maxAge }); + this._notifyInFlightObservers(key, value); } /** - * Checks if the key exists in cache + * checks if the key exists in cache */ has(key: string): boolean { - return this.cache.has(key); + return this._cache.has(key); } /** @@ -97,41 +97,41 @@ export class CacheService { * @param key Key is the id of the content */ del(key: string) { - this.cache.delete(key); + this._cache.delete(key); } /** - * Clear the whole cache + * clear the whole cache */ destroy() { sessionStorage.clear(); - this.cache.clear(); + this._cache.clear(); } /** - * Publishes the value to all observers of the given + * publishes the value to all observers of the given * in progress observables if observers exist. */ - private notifyInFlightObservers(key: string, value: any): void { - if (this.inFlightObservables.has(key)) { - const inFlight = this.inFlightObservables.get(key); + private _notifyInFlightObservers(key: string, value: any): void { + if (this._inFlightObservables.has(key)) { + const inFlight = this._inFlightObservables.get(key); const observersCount = inFlight.observers.length; if (observersCount) { // console.log(`%cNotifying ${inFlight.observers.length} flight subscribers for ${key}`, 'color: blue'); inFlight.next(value); } inFlight.complete(); - this.inFlightObservables.delete(key); + this._inFlightObservables.delete(key); } } /** - * Checks if the key exists and has not expired. + * checks if the key exists and has not expired. */ - private hasValidCachedValue(key: string): boolean { - if (this.cache.has(key)) { - if (this.cache.get(key).expiry < Date.now()) { - this.cache.delete(key); + private _hasValidCachedValue(key: string): boolean { + if (this._cache.has(key)) { + if (this._cache.get(key).expiry < Date.now()) { + this._cache.delete(key); return false; } return true; diff --git a/src/app/main/cookie-policy/cookie-policy.component.ts b/src/app/main/cookie-policy/cookie-policy.component.ts index afc68c5376..92835d2c58 100644 --- a/src/app/main/cookie-policy/cookie-policy.component.ts +++ b/src/app/main/cookie-policy/cookie-policy.component.ts @@ -2,19 +2,19 @@ import { Location } from '@angular/common'; import { Component, OnInit } from '@angular/core'; @Component({ - selector: 'app-cookie-policy', - templateUrl: './cookie-policy.component.html', - styleUrls: ['./cookie-policy.component.scss'] + selector: 'app-cookie-policy', + templateUrl: './cookie-policy.component.html', + styleUrls: ['./cookie-policy.component.scss'] }) export class CookiePolicyComponent implements OnInit { - constructor(private _location: Location) { } + constructor(private _location: Location) { } - ngOnInit() { - } + ngOnInit() { + } - goBack() { - this._location.back(); - } + goBack() { + this._location.back(); + } } diff --git a/src/app/main/dialog/dialog-header/dialog-header.component.ts b/src/app/main/dialog/dialog-header/dialog-header.component.ts index f95e8786ed..a86c477d83 100644 --- a/src/app/main/dialog/dialog-header/dialog-header.component.ts +++ b/src/app/main/dialog/dialog-header/dialog-header.component.ts @@ -1,20 +1,20 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; @Component({ - selector: 'app-dialog-header', - templateUrl: './dialog-header.component.html', - styleUrls: ['./dialog-header.component.scss'] + selector: 'app-dialog-header', + templateUrl: './dialog-header.component.html', + styleUrls: ['./dialog-header.component.scss'] }) export class DialogHeaderComponent implements OnInit { - @Input() title: string; - @Input() subtitle: string; + @Input() title: string; + @Input() subtitle: string; - @Output() close: EventEmitter = new EventEmitter(); + @Output() close: EventEmitter = new EventEmitter(); - constructor() { } + constructor() { } - ngOnInit() { - } + ngOnInit() { + } } diff --git a/src/app/main/dialog/dialog.component.ts b/src/app/main/dialog/dialog.component.ts index 6aa7ee75ba..84fa8a5505 100644 --- a/src/app/main/dialog/dialog.component.ts +++ b/src/app/main/dialog/dialog.component.ts @@ -32,7 +32,7 @@ export class DialogComponent implements OnInit { this.dialogRef.close(); } - replaceTitle(heading: { title: string, subtitle?: string }) { + replaceTitle(heading: { title: string; subtitle?: string }) { this.data.title = heading.title; if (heading.subtitle) { diff --git a/src/app/main/directive/base-value.directive.ts b/src/app/main/directive/base-value.directive.ts index 74e3bfc192..b251a8caaf 100644 --- a/src/app/main/directive/base-value.directive.ts +++ b/src/app/main/directive/base-value.directive.ts @@ -1,51 +1,52 @@ -import { Input, Directive } from '@angular/core'; -import { CreateValue, ReadValue, UpdateValue } from '@dasch-swiss/dsp-js'; +import { Directive, Input } from '@angular/core'; import { AbstractControl, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms'; +import { CreateValue, ReadValue, UpdateValue } from '@dasch-swiss/dsp-js'; import { Subscription } from 'rxjs'; @Directive() export abstract class BaseValueDirective { - shouldShowComment = false; /** - * Value to be displayed, if any. + * value to be displayed, if any. */ @Input() abstract displayValue?: ReadValue; /** - * Sets the mode of the component. + * sets the mode of the component. */ @Input() mode: 'read' | 'update' | 'create' | 'search'; + shouldShowComment = false; + /** - * FormControl element for the value. + * formControl element for the value. */ abstract valueFormControl: FormControl; /** - * FormControl element for the comment on the value. + * formControl element for the comment on the value. */ abstract commentFormControl: FormControl; /** - * FormGroup that contains FormControl elements. + * formGroup that contains FormControl elements. */ abstract form: FormGroup; /** - * Subscription used for when the value changes. + * subscription used for when the value changes. */ abstract valueChangesSubscription: Subscription; /** - * Custom validators for a specific value type. + * custom validators for a specific value type. * Can be initialized to an empty array if not needed. */ abstract customValidators: ValidatorFn[]; /** - * Standard implementation for comparison of primitive values. + * standard implementation for comparison of primitive values. * Returns true if two values are equal. * * @param initValue Initially given value. @@ -56,31 +57,23 @@ export abstract class BaseValueDirective { } /** - * Standard implementation to determine if a value or comment have been changed. + * standard implementation to determine if a value or comment have been changed. * * @param initValue Initially given value. * @param initComment Initially given comment. * @param commentFormControl FormControl of the current comment. */ standardValidatorFunc: (val: any, comment: string, commentCtrl: FormControl) - => ValidatorFn = (initValue: any, initComment: string, commentFormControl: FormControl): ValidatorFn => { - return (control: AbstractControl): { [key: string]: any } | null => { - - const invalid = this.standardValueComparisonFunc(initValue, control.value) - && (initComment === commentFormControl.value || (initComment === null && commentFormControl.value === '')); + => ValidatorFn = (initValue: any, initComment: string, commentFormControl: FormControl): ValidatorFn => (control: AbstractControl): { [key: string]: any } | null => { - return invalid ? { valueNotChanged: { value: control.value } } : null; - }; - } + const invalid = this.standardValueComparisonFunc(initValue, control.value) + && (initComment === commentFormControl.value || (initComment === null && commentFormControl.value === '')); - /** - * Returns the initially given value set via displayValue. - * Returns null if no value was given. - */ - abstract getInitValue(): any; + return invalid ? { valueNotChanged: { value: control.value } } : null; + }; /** - * Returns the initially given value comment set via displayValue. + * returns the initially given value comment set via displayValue. * Returns null if no value comment was given. */ getInitComment(): string | null { @@ -93,7 +86,7 @@ export abstract class BaseValueDirective { } /** - * Resets the form control elements + * resets the form control elements * with displayValue's value and value comment. * Depending on the mode, validators are reset. */ @@ -123,7 +116,7 @@ export abstract class BaseValueDirective { } /** - * Unsubscribes from the valueChangesSubscription + * unsubscribes from the valueChangesSubscription */ unsubscribeFromValueChanges(): void { if (this.valueChangesSubscription !== undefined) { @@ -132,27 +125,33 @@ export abstract class BaseValueDirective { } /** - * Hide comment field by default if in READ mode + * hide comment field by default if in READ mode */ updateCommentVisibility(): void { this.shouldShowComment = this.mode === 'read' ? true : false; } /** - * Toggles visibility of the comment field regardless of the mode + * toggles visibility of the comment field regardless of the mode */ toggleCommentVisibility(): void { this.shouldShowComment = !this.shouldShowComment; } /** - * Returns a value that is to be created. + * returns the initially given value set via displayValue. + * Returns null if no value was given. + */ + abstract getInitValue(): any; + + /** + * returns a value that is to be created. * Returns false if invalid. */ abstract getNewValue(): CreateValue | false; /** - * Returns a value that is to be updated. + * returns a value that is to be updated. * Returns false if invalid. */ abstract getUpdatedValue(): UpdateValue | false; diff --git a/src/app/main/directive/external-links.directive.ts b/src/app/main/directive/external-links.directive.ts index c90c22c8fa..cf9d36e8dd 100644 --- a/src/app/main/directive/external-links.directive.ts +++ b/src/app/main/directive/external-links.directive.ts @@ -18,7 +18,7 @@ export class ExternalLinksDirective implements OnChanges { ngOnChanges() { this.hrefAttr = this.href; - if (this.isLinkExternal()) { + if (this._isLinkExternal()) { // makes sure that the new browser tab does not run on the same process and prevent it from accessing window.opener this.relAttr = 'noopener'; // open the page in a new tab @@ -27,9 +27,9 @@ export class ExternalLinksDirective implements OnChanges { } /** - * Check if the link opens an external page + * check if the link opens an external page */ - private isLinkExternal() { + private _isLinkExternal() { return ( // get a token value from platformId to run the code only on the client and prevents errors isPlatformBrowser(this.platformId) && diff --git a/src/app/main/directive/invalid-control-scroll.directive.spec.ts b/src/app/main/directive/invalid-control-scroll.directive.spec.ts index f86c835ef0..9efb87c197 100644 --- a/src/app/main/directive/invalid-control-scroll.directive.spec.ts +++ b/src/app/main/directive/invalid-control-scroll.directive.spec.ts @@ -33,7 +33,7 @@ class TestLinkHostComponent implements OnInit { control1: new FormControl(), control2: new FormControl(), control3: new FormControl() - }); + }); } onSubmit() { diff --git a/src/app/main/directive/invalid-control-scroll.directive.ts b/src/app/main/directive/invalid-control-scroll.directive.ts index 1426d84c99..95a432dfdc 100644 --- a/src/app/main/directive/invalid-control-scroll.directive.ts +++ b/src/app/main/directive/invalid-control-scroll.directive.ts @@ -2,7 +2,7 @@ import { Directive, ElementRef, HostListener } from '@angular/core'; import { FormGroupDirective } from '@angular/forms'; @Directive({ - selector: '[appInvalidControlScroll]' + selector: '[appInvalidControlScroll]' }) export class InvalidControlScrollDirective { @@ -13,12 +13,12 @@ export class InvalidControlScrollDirective { @HostListener('ngSubmit') submitData() { if (this._formGroupDir.control.invalid) { - this._scrollToFirstInvalidControl(); + this._scrollToFirstInvalidControl(); } - } + } /** - * Target the first invalid element of the resource-instance form (2nd panel property) and scroll to it + * target the first invalid element of the resource-instance form (2nd panel property) and scroll to it */ private _scrollToFirstInvalidControl() { // target the first invalid form field diff --git a/src/app/main/error/error.component.ts b/src/app/main/error/error.component.ts index a77c981cc0..dfdeb90909 100644 --- a/src/app/main/error/error.component.ts +++ b/src/app/main/error/error.component.ts @@ -41,7 +41,7 @@ export class ErrorComponent implements OnInit { { status: 404, message: 'Not found', - description: `The content you were looking for cannot be found.`, + description: 'The content you were looking for cannot be found.', action: 'goback', image: 'dsp-error-404.svg' }, @@ -96,7 +96,7 @@ export class ErrorComponent implements OnInit { getErrorMsgByStatus(status: number): ErrorMsg { return this.errorMessages.filter(x => x.status === status)[0]; - } + } reload() { window.location.reload(); diff --git a/src/app/main/grid/grid.component.spec.ts b/src/app/main/grid/grid.component.spec.ts index 45d75d0580..9450160c0e 100644 --- a/src/app/main/grid/grid.component.spec.ts +++ b/src/app/main/grid/grid.component.spec.ts @@ -5,29 +5,29 @@ import { RouterTestingModule } from '@angular/router/testing'; import { GridComponent } from './grid.component'; describe('GridComponent', () => { - let component: GridComponent; - let fixture: ComponentFixture; + let component: GridComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ - GridComponent - ], - imports: [ - MatIconModule, - RouterTestingModule - ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ + GridComponent + ], + imports: [ + MatIconModule, + RouterTestingModule + ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(GridComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(GridComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/src/app/main/header/header.component.spec.ts b/src/app/main/header/header.component.spec.ts index 4b70a131da..eafe39c754 100644 --- a/src/app/main/header/header.component.spec.ts +++ b/src/app/main/header/header.component.spec.ts @@ -102,8 +102,8 @@ describe('HeaderComponent', () => { expect(searchPanel).toBeDefined(); }); - it('should display the login success message when the LoginSuccess event is emitted', () => { - componentCommsService.emit(new EmitEvent(Events.LoginSuccess)); + it('should display the login success message when the loginSuccess event is emitted', () => { + componentCommsService.emit(new EmitEvent(Events.loginSuccess)); fixture.detectChanges(); const message = fixture.debugElement.query(By.directive(MessageComponent)); expect(message).toBeTruthy(); diff --git a/src/app/main/header/header.component.ts b/src/app/main/header/header.component.ts index 59db088730..38ab976867 100644 --- a/src/app/main/header/header.component.ts +++ b/src/app/main/header/header.component.ts @@ -17,8 +17,8 @@ const { version: appVersion } = require('../../../../package.json'); }) export class HeaderComponent implements OnInit, OnDestroy { - session: boolean = false; - show: boolean = false; + session = false; + show = false; searchParams: SearchParams; appVersion: string = 'v' + appVersion; @@ -70,7 +70,7 @@ export class HeaderComponent implements OnInit, OnDestroy { ngOnInit() { this.componentCommsSubscription = this._componentCommsService.on( - Events.LoginSuccess, () => this.showMessage = true); + Events.loginSuccess, () => this.showMessage = true); } ngOnDestroy() { @@ -81,7 +81,7 @@ export class HeaderComponent implements OnInit, OnDestroy { } /** - * Navigate to the login page + * navigate to the login page */ goToLogin() { // console.log(decodeURI(this._router.url)); @@ -93,7 +93,7 @@ export class HeaderComponent implements OnInit, OnDestroy { } /** - * Show or hide search bar in phone version + * show or hide search bar in phone version */ showSearchBar() { this.show = !this.show; @@ -150,7 +150,7 @@ export class HeaderComponent implements OnInit, OnDestroy { position: { top: '112px' }, - data: { mode: mode, title: 'New resource', subtitle: 'Create new resource'}, + data: { mode: mode, title: 'New resource', subtitle: 'Create new resource' }, disableClose: true }; diff --git a/src/app/main/login/login.component.ts b/src/app/main/login/login.component.ts index b3ad1d4ff5..ada7ed53fa 100644 --- a/src/app/main/login/login.component.ts +++ b/src/app/main/login/login.component.ts @@ -34,7 +34,7 @@ export class LoginComponent { // otherwise go to the dashboard this._router.navigate(['dashboard']); } - this._componentCommsService.emit(new EmitEvent(Events.LoginSuccess, true)); + this._componentCommsService.emit(new EmitEvent(Events.loginSuccess, true)); } } diff --git a/src/app/main/main.component.spec.ts b/src/app/main/main.component.spec.ts index 8ef0be5aa2..58a6971458 100644 --- a/src/app/main/main.component.spec.ts +++ b/src/app/main/main.component.spec.ts @@ -64,9 +64,7 @@ describe('MainComponent', () => { let store = {}; spyOn(sessionStorage, 'getItem').and.callFake( - (key: string): string => { - return store[key] || null; - } + (key: string): string => store[key] || null ); spyOn(sessionStorage, 'removeItem').and.callFake( (key: string): void => { @@ -74,18 +72,14 @@ describe('MainComponent', () => { } ); spyOn(sessionStorage, 'setItem').and.callFake( - (key: string, value: string): string => { - return (store[key] = value); - } + (key: string, value: string): string => (store[key] = value) ); spyOn(sessionStorage, 'clear').and.callFake(() => { store = {}; }); spyOn(localStorage, 'getItem').and.callFake( - (key: string): string => { - return store[key] || null; - } + (key: string): string => store[key] || null ); spyOn(localStorage, 'removeItem').and.callFake( (key: string): void => { @@ -93,9 +87,7 @@ describe('MainComponent', () => { } ); spyOn(localStorage, 'setItem').and.callFake( - (key: string, value: string): string => { - return (store[key] = value); - } + (key: string, value: string): string => (store[key] = value) ); spyOn(localStorage, 'clear').and.callFake(() => { store = {}; @@ -153,7 +145,23 @@ describe('MainComponent', () => { id: 'http://rdfh.ch/projects/0803', description: [ { - value: '

Das interdisziplinäre Forschungsprojekt "Die Bilderfolgen der Basler Frühdrucke: Spätmittelalterliche Didaxe als Bild-Text-Lektüre" verbindet eine umfassende kunstwissenschaftliche Analyse der Bezüge zwischen den Bildern und Texten in den illustrierten Basler Inkunabeln mit der Digitalisierung der Bestände der Universitätsbibliothek und der Entwicklung einer elektronischen Edition in der Form einer neuartigen Web-0.2-Applikation.

Das Projekt wird durchgeführt vom Kunsthistorischen Seminar der Universität Basel (Prof. B. Schellewald) und dem Digital Humanities Lab der Universität Basel (PD Dr. L. Rosenthaler).

Das Kernstück der digitalen Edition besteht aus rund zwanzig reich bebilderten Frühdrucken aus vier verschiedenen Basler Offizinen. Viele davon sind bereits vor 1500 in mehreren Ausgaben erschienen, einige fast gleichzeitig auf Deutsch und Lateinisch. Es handelt sich um eine ausserordentlich vielfältige Produktion; neben dem Heilsspiegel finden sich ein Roman, die Melusine, die Reisebeschreibungen des Jean de Mandeville, einige Gebets- und Erbauungsbüchlein, theologische Schriften, Fastenpredigten, die Leben der Heiligen Fridolin und Meinrad, das berühmte Narrenschiff sowie die Exempelsammlung des Ritters vom Thurn.

Die Internetpublikation macht das digitalisierte Korpus dieser Frühdrucke durch die Möglichkeiten nichtlinearer Verknüpfung und Kommentierung der Bilder und Texte, für die wissenschaftliche Edition sowie für die Erforschung der Bilder und Texte nutzbar machen. Auch können bereits bestehende und entstehende Online-Editionen damit verknüpft werden , wodurch die Nutzung von Datenbanken anderer Institutionen im Hinblick auf unser Corpus optimiert wird.

' + value: '

Das interdisziplinäre Forschungsprojekt "Die Bilderfolgen der Basler Frühdrucke: ' + + 'Spätmittelalterliche Didaxe als Bild-Text-Lektüre" verbindet eine umfassende kunstwissenschaftliche ' + + 'Analyse der Bezüge zwischen den Bildern und Texten in den illustrierten Basler Inkunabeln mit der Digitalisierung ' + + 'der Bestände der Universitätsbibliothek und der Entwicklung einer elektronischen Edition in der Form einer ' + + 'neuartigen Web-0.2-Applikation.

Das Projekt wird durchgeführt vom ' + + 'Kunsthistorischen Seminar der Universität Basel (Prof. B. Schellewald) ' + + 'und dem Digital Humanities Lab der Universität Basel (PD Dr. L. Rosenthaler).

' + + '

Das Kernstück der digitalen Edition besteht aus rund zwanzig reich bebilderten Frühdrucken aus vier verschiedenen ' + + 'Basler Offizinen. Viele davon sind bereits vor 1500 in mehreren Ausgaben erschienen, einige fast gleichzeitig auf Deutsch ' + + 'und Lateinisch. Es handelt sich um eine ausserordentlich vielfältige Produktion; neben dem Heilsspiegel finden sich ein Roman, ' + + 'die Melusine, die Reisebeschreibungen des Jean de Mandeville, einige Gebets- und Erbauungsbüchlein, theologische Schriften, ' + + 'Fastenpredigten, die Leben der Heiligen Fridolin und Meinrad, das berühmte Narrenschiff sowie die Exempelsammlung ' + + 'des Ritters vom Thurn.

Die Internetpublikation macht das digitalisierte Korpus dieser Frühdrucke durch die ' + + 'Möglichkeiten nichtlinearer Verknüpfung und Kommentierung der Bilder und Texte, für die wissenschaftliche Edition ' + + 'sowie für die Erforschung der Bilder und Texte nutzbar machen. Auch können bereits bestehende und entstehende ' + + 'Online-Editionen damit verknüpft werden , wodurch die Nutzung von Datenbanken anderer Institutionen im Hinblick auf ' + + 'unser Corpus optimiert wird.

' } ], keywords: [ diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts index 823a267112..bd74c2197a 100644 --- a/src/app/main/main.component.ts +++ b/src/app/main/main.component.ts @@ -15,11 +15,11 @@ export class MainComponent implements OnInit { loading: boolean; - showCookieBanner: boolean = true; + showCookieBanner = true; - researchField: string = 'qualitative'; + researchField = 'qualitative'; - session: boolean = false; + session = false; disabledProjects: string[] = [ Constants.SystemProjectIRI, @@ -96,7 +96,7 @@ export class MainComponent implements OnInit { this.loading = true; this._dspApiConnection.admin.projectsEndpoint.getProjects().subscribe( (response: ApiResponseData) => { - const sliceLength: number = 160; + const sliceLength = 160; for (const project of response.body.projects) { // disable default test projects diff --git a/src/app/main/select-language/language.service.spec.ts b/src/app/main/select-language/language.service.spec.ts index 741afa7259..9bf28d0a93 100644 --- a/src/app/main/select-language/language.service.spec.ts +++ b/src/app/main/select-language/language.service.spec.ts @@ -3,13 +3,13 @@ import { inject, TestBed } from '@angular/core/testing'; import { LanguageService } from './language.service'; describe('LanguageService', () => { - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [LanguageService] + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [LanguageService] + }); }); - }); - it('should be created', inject([LanguageService], (service: LanguageService) => { - expect(service).toBeTruthy(); - })); + it('should be created', inject([LanguageService], (service: LanguageService) => { + expect(service).toBeTruthy(); + })); }); diff --git a/src/app/main/select-language/language.service.ts b/src/app/main/select-language/language.service.ts index 6c5a48b930..3164df22df 100644 --- a/src/app/main/select-language/language.service.ts +++ b/src/app/main/select-language/language.service.ts @@ -2,17 +2,17 @@ import { Injectable } from '@angular/core'; import { Observable, Subject } from 'rxjs'; @Injectable({ - providedIn: 'root' + providedIn: 'root' }) export class LanguageService { - private subject = new Subject(); + private _subject = new Subject(); - setLanguage(lang: string) { - this.subject.next({ var: lang }); - } - getLanguage(): Observable { - return this.subject.asObservable(); - } + setLanguage(lang: string) { + this._subject.next({ var: lang }); + } + getLanguage(): Observable { + return this._subject.asObservable(); + } } diff --git a/src/app/main/services/component-communication-event.service.spec.ts b/src/app/main/services/component-communication-event.service.spec.ts index 55e20489a6..ec6fcf1d68 100644 --- a/src/app/main/services/component-communication-event.service.spec.ts +++ b/src/app/main/services/component-communication-event.service.spec.ts @@ -3,14 +3,14 @@ import { TestBed } from '@angular/core/testing'; import { ComponentCommunicationEventService } from './component-communication-event.service'; describe('ComponentCommunicationEventService', () => { - let service: ComponentCommunicationEventService; + let service: ComponentCommunicationEventService; - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(ComponentCommunicationEventService); - }); + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(ComponentCommunicationEventService); + }); - it('should be created', () => { - expect(service).toBeTruthy(); - }); + it('should be created', () => { + expect(service).toBeTruthy(); + }); }); diff --git a/src/app/main/services/component-communication-event.service.ts b/src/app/main/services/component-communication-event.service.ts index 60f282c014..d25e46768a 100644 --- a/src/app/main/services/component-communication-event.service.ts +++ b/src/app/main/services/component-communication-event.service.ts @@ -12,7 +12,7 @@ export class ComponentCommunicationEventService { private _subject$ = new Subject(); // used in the listening component. - // i.e. this.componentCommunicationEventService = this._componentCommunicationEventService.on(Events.LoginSuccess, () => doSomething()); + // i.e. this.componentCommunicationEventService = this._componentCommunicationEventService.on(Events.loginSuccess, () => doSomething()); on(event: Events, action: () => void): Subscription { return this._subject$ .pipe( @@ -24,7 +24,7 @@ export class ComponentCommunicationEventService { } // used in the emitting component. - // i.e. this.componentCommunicationEventService.emit(new EmitEvent(Events.LoginSuccess)); + // i.e. this.componentCommunicationEventService.emit(new EmitEvent(Events.loginSuccess)); emit(event: EmitEvent) { this._subject$.next(event); } @@ -36,5 +36,5 @@ export class EmitEvent { // possible events that can be emitted. export enum Events { - LoginSuccess + loginSuccess } diff --git a/src/app/project/board/board.component.spec.ts b/src/app/project/board/board.component.spec.ts index 3a575047f8..88d1e5274d 100644 --- a/src/app/project/board/board.component.spec.ts +++ b/src/app/project/board/board.component.spec.ts @@ -78,9 +78,7 @@ describe('BoardComponent', () => { let store = {}; spyOn(localStorage, 'getItem').and.callFake( - (key: string): string => { - return store[key] || null; - } + (key: string): string => store[key] || null ); spyOn(localStorage, 'removeItem').and.callFake( (key: string): void => { @@ -88,9 +86,7 @@ describe('BoardComponent', () => { } ); spyOn(localStorage, 'setItem').and.callFake( - (key: string, value: string): string => { - return (store[key] = value); - } + (key: string, value: string): string => (store[key] = value) ); spyOn(localStorage, 'clear').and.callFake(() => { store = {}; diff --git a/src/app/project/board/board.component.ts b/src/app/project/board/board.component.ts index 8c8615dc44..94cef1cffc 100644 --- a/src/app/project/board/board.component.ts +++ b/src/app/project/board/board.component.ts @@ -39,8 +39,8 @@ export class BoardComponent implements OnInit { // permissions of logged-in user session: Session; - sysAdmin: boolean = false; - projectAdmin: boolean = false; + sysAdmin = false; + projectAdmin = false; // project shortcode; as identifier in project cache service projectcode: string; @@ -48,7 +48,7 @@ export class BoardComponent implements OnInit { // project data project: ReadProject; - color: string = 'primary'; + color = 'primary'; // variables to store metadata information projectsMetadata: ProjectsMetadata; @@ -189,8 +189,8 @@ export class BoardComponent implements OnInit { // download metadata downloadMetadata() { - const blob: Blob = new Blob([JSON.stringify(this.projectsMetadata)], {type: 'application/json'}); - const fileName: string = 'metadata.json'; + const blob: Blob = new Blob([JSON.stringify(this.projectsMetadata)], { type: 'application/json' }); + const fileName = 'metadata.json'; const objectUrl: string = URL.createObjectURL(blob); const a: HTMLAnchorElement = document.createElement('a') as HTMLAnchorElement; @@ -227,7 +227,7 @@ export class BoardComponent implements OnInit { position: { top: '112px' }, - data: {mode: mode, title: name, project: id} + data: { mode: mode, title: name, project: id } }; const dialogRef = this._dialog.open(DialogComponent, dialogConfig); diff --git a/src/app/project/board/contacts-tab-view/contacts-tab-view.component.spec.ts b/src/app/project/board/contacts-tab-view/contacts-tab-view.component.spec.ts index 45d8c0c23a..913fa7cbb1 100644 --- a/src/app/project/board/contacts-tab-view/contacts-tab-view.component.spec.ts +++ b/src/app/project/board/contacts-tab-view/contacts-tab-view.component.spec.ts @@ -5,7 +5,7 @@ import { PersonTemplateComponent } from '../person-template/person-template.comp import { AddressTemplateComponent } from '../address-template/address-template.component'; /** - * Test host component to simulate parent component. + * test host component to simulate parent component. */ @Component({ selector: 'app-board-host-component', @@ -17,13 +17,13 @@ class TestHostBoardComponent { // input parameters contactDetails = { - 'address': {'addressLocality': 'Basel', 'postalCode': '4000', 'streetAddress': 'Teststrasse'}, + 'address': { 'addressLocality': 'Basel', 'postalCode': '4000', 'streetAddress': 'Teststrasse' }, 'email': 'stewart.abraham@test.ch', 'familyName': 'Abraham', 'givenName': 'Stewart', 'jobTitle': 'Dr.', 'memberOf': 'http://ns.dasch.swiss/test-dasch', - 'sameAs': {'type': 'https://schema.org/URL', 'value': 'https://orcid.org/0000-0002-1825-0097'} + 'sameAs': { 'type': 'https://schema.org/URL', 'value': 'https://orcid.org/0000-0002-1825-0097' } }; } diff --git a/src/app/project/board/dataset-tab-view/dataset-tab-view.component.spec.ts b/src/app/project/board/dataset-tab-view/dataset-tab-view.component.spec.ts index ef1e8dd628..1080d56d32 100644 --- a/src/app/project/board/dataset-tab-view/dataset-tab-view.component.spec.ts +++ b/src/app/project/board/dataset-tab-view/dataset-tab-view.component.spec.ts @@ -1,10 +1,9 @@ +import { Component, ViewChild } from '@angular/core'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { DatasetTabViewComponent } from './dataset-tab-view.component'; -import { Component, ViewChild } from '@angular/core'; - /** -* Test host component to simulate parent component. +* test host component to simulate parent component. */ @Component({ selector: 'app-board-host-component', @@ -29,7 +28,7 @@ describe('DatasetTabViewComponent', () => { DatasetTabViewComponent ] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { diff --git a/src/app/project/board/person-template/person-template.component.spec.ts b/src/app/project/board/person-template/person-template.component.spec.ts index ed9214251f..b04d0ef8fb 100644 --- a/src/app/project/board/person-template/person-template.component.spec.ts +++ b/src/app/project/board/person-template/person-template.component.spec.ts @@ -5,7 +5,7 @@ import { AddressTemplateComponent } from '../address-template/address-template.c /** - * Test host component to simulate parent component. + * test host component to simulate parent component. */ @Component({ selector: 'app-contact-host-component', @@ -17,7 +17,7 @@ class TestHostContactComponent { // input parameters contactDetails = { - 'address': {'addressLocality': 'Basel', 'postalCode': '4000', 'streetAddress': 'Teststrasse'}, + 'address': { 'addressLocality': 'Basel', 'postalCode': '4000', 'streetAddress': 'Teststrasse' }, 'email': ['stewart.abraham@test.ch'], 'familyName': 'Abraham', 'givenName': 'Stewart', @@ -25,15 +25,15 @@ class TestHostContactComponent { 'id': 'http://ns.dasch.swiss/repository#test-berry', 'memberOf': [ { - 'address': {'addressLocality': 'Basel', 'postalCode': '4000', 'streetAddress': 'Teststrasse'}, + 'address': { 'addressLocality': 'Basel', 'postalCode': '4000', 'streetAddress': 'Teststrasse' }, 'email': 'info@dasch.swiss', 'id': 'http://ns.dasch.swiss/repository#test-dasch', 'name': ['TEST'], 'type': 'http://ns.dasch.swiss/repository#Organization', - 'url': [{'type': 'https://schema.org/URL', 'url': 'https://test.swiss'}] + 'url': [{ 'type': 'https://schema.org/URL', 'url': 'https://test.swiss' }] } ], - 'sameAs': [{'type': 'https://schema.org/URL', 'value': 'https://orcid.org/0000-0002-1825-0097', 'url': 'https://orcid.org/0000-0002-1825-0097'}] + 'sameAs': [{ 'type': 'https://schema.org/URL', 'value': 'https://orcid.org/0000-0002-1825-0097', 'url': 'https://orcid.org/0000-0002-1825-0097' }] }; } diff --git a/src/app/project/board/project-tab-view/project-tab-view.component.spec.ts b/src/app/project/board/project-tab-view/project-tab-view.component.spec.ts index e5ac26510b..bae2c741ff 100644 --- a/src/app/project/board/project-tab-view/project-tab-view.component.spec.ts +++ b/src/app/project/board/project-tab-view/project-tab-view.component.spec.ts @@ -9,7 +9,7 @@ import { PersonTemplateComponent } from '../person-template/person-template.comp import { ProjectTabViewComponent } from './project-tab-view.component'; /** - * Test host component to simulate parent component. + * test host component to simulate parent component. */ @Component({ selector: 'app-board-host-component', @@ -23,70 +23,70 @@ class TestHostBoardComponent { projectMetadata = { 'alternateName': 'test', 'contactPoint': { - 'address': {'addressLocality': 'Basel', 'postalCode': '4000', 'streetAddress': 'Teststrasse'}, + 'address': { 'addressLocality': 'Basel', 'postalCode': '4000', 'streetAddress': 'Teststrasse' }, 'email': 'stewart.abraham@test.ch', 'familyName': 'Abraham', 'givenName': 'Stewart', 'jobTitle': 'Dr.', 'memberOf': 'http://ns.dasch.swiss/test-dasch', - 'sameAs': {'type': 'https://schema.org/URL', 'value': 'https://orcid.org/0000-0002-1825-0097'}, + 'sameAs': { 'type': 'https://schema.org/URL', 'value': 'https://orcid.org/0000-0002-1825-0097' }, 'organisation': { - 'address': {'addressLocality': 'Toronto', 'postalCode': '40000', 'streetAddress': 'University of Toronto Street'}, + 'address': { 'addressLocality': 'Toronto', 'postalCode': '40000', 'streetAddress': 'University of Toronto Street' }, 'email': '/info@universityoftoronto.ca', 'name': 'University of Toronto', - 'url': {'type': 'https://schema.org/URL', 'value': 'http://www.utoronto.ca/'} + 'url': { 'type': 'https://schema.org/URL', 'value': 'http://www.utoronto.ca/' } } }, 'description': 'Dies ist ein Testprojekt...alle Properties wurden verwendet, um diese zu testen', - 'discipline': {'name': 'SKOS UNESCO Nomenclature', 'url': 'http://skos.um.es/unesco6/11'}, + 'discipline': { 'name': 'SKOS UNESCO Nomenclature', 'url': 'http://skos.um.es/unesco6/11' }, 'endDate': '2001-01-26', 'funder': 'http://ns.dasch.swiss/test-funder', 'grant': { 'funder': [ { - 'address': {'addressLocality': 'Toronto', 'postalCode': '40000', 'streetAddress': 'University of Toronto Street'}, + 'address': { 'addressLocality': 'Toronto', 'postalCode': '40000', 'streetAddress': 'University of Toronto Street' }, 'email': '/info@universityoftoronto.ca', 'name': 'University of Toronto', - 'url': {'type': 'https://schema.org/URL', 'value': 'http://www.utoronto.ca/'} + 'url': { 'type': 'https://schema.org/URL', 'value': 'http://www.utoronto.ca/' } }, { - 'address': {'addressLocality': 'Basel', 'postalCode': '4000', 'streetAddress': 'Teststrasse'}, + 'address': { 'addressLocality': 'Basel', 'postalCode': '4000', 'streetAddress': 'Teststrasse' }, 'email': 'lauren.berry@unibas.ch', 'familyName': 'Berry', 'givenName': 'Lauren', 'jobTitle': 'Dr.', 'organisation': { - 'address': {'addressLocality': 'Toronto', 'postalCode': '40000', 'streetAddress': 'University of Toronto Street'}, + 'address': { 'addressLocality': 'Toronto', 'postalCode': '40000', 'streetAddress': 'University of Toronto Street' }, 'email': 'info@universityoftoronto.ca', 'name': 'University of Toronto', 'url': 'http://www.utoronto.ca/' } - }], 'name': 'Test Grant Name', 'number': '0123456789', 'url': {'type': 'https://schema.org/URL', 'value': 'http://p3.snf.ch/testproject'} + }], 'name': 'Test Grant Name', 'number': '0123456789', 'url': { 'type': 'https://schema.org/URL', 'value': 'http://p3.snf.ch/testproject' } }, 'keywords': ['science', 'mathematics', 'history of science', 'history of mathematics'], 'name': 'Testprojektname (test)', 'publication': 'testpublication', 'shortcode': '0000', 'spatialCoverage': [ - {'place': {'name': 'Geonames', 'url': 'https://www.geonames.org/2017370/russian-federation.html'}}, { + { 'place': { 'name': 'Geonames', 'url': 'https://www.geonames.org/2017370/russian-federation.html' } }, { 'place': { 'name': 'Geonames', 'url': 'https://www.geonames.org/2658434/switzerland.html' } - }, {'place': {'name': 'Geonames', 'url': 'https://www.geonames.org/3175395/italian-republic.html'}}, { + }, { 'place': { 'name': 'Geonames', 'url': 'https://www.geonames.org/3175395/italian-republic.html' } }, { 'place': { 'name': 'Geonames', 'url': 'https://www.geonames.org/2921044/federal-republic-of-germany.html' } - }, {'place': {'name': 'Geonames', 'url': 'https://www.geonames.org/3017382/republic-of-france.html'}}, { + }, { 'place': { 'name': 'Geonames', 'url': 'https://www.geonames.org/3017382/republic-of-france.html' } }, { 'place': { 'name': 'Geonames', 'url': 'https://www.geonames.org/6269131/england.html' } - }, {'place': {'name': 'Geonames', 'url': 'https://www.geonames.org/6255148/europe.html'}}], + }, { 'place': { 'name': 'Geonames', 'url': 'https://www.geonames.org/6255148/europe.html' } }], 'startDate': '2000-07-26', - 'temporalCoverage': {'name': 'Chronontology Dainst', 'url': 'http://chronontology.dainst.org/period/Ef9SyESSafJ1'}, - 'url': {'type': 'https://schema.org/URL', 'value': 'https://test.dasch.swiss/'} + 'temporalCoverage': { 'name': 'Chronontology Dainst', 'url': 'http://chronontology.dainst.org/period/Ef9SyESSafJ1' }, + 'url': { 'type': 'https://schema.org/URL', 'value': 'https://test.dasch.swiss/' } }; } diff --git a/src/app/project/board/project-tab-view/project-tab-view.component.ts b/src/app/project/board/project-tab-view/project-tab-view.component.ts index 016f1a01a8..f776a38eaf 100644 --- a/src/app/project/board/project-tab-view/project-tab-view.component.ts +++ b/src/app/project/board/project-tab-view/project-tab-view.component.ts @@ -91,7 +91,6 @@ export class ProjectTabViewComponent implements OnInit { } // get funder details along with other details for (const grant of tmpGrants) { - let tmpGrantObj: object; // checck if grant contains person, organization or IId objects let ftype = this._metadataService.getContactType(grant.funder[0]); @@ -108,7 +107,7 @@ export class ProjectTabViewComponent implements OnInit { ftype = this._metadataService.getContactType(flist[0]); } - tmpGrantObj = { + const tmpGrantObj = { funder : flist, funderType: ftype, name: grant.name ? grant.name : undefined, diff --git a/src/app/project/board/terms-tab-view/terms-tab-view.component.spec.ts b/src/app/project/board/terms-tab-view/terms-tab-view.component.spec.ts index 93ff4fa1f0..133d40def6 100644 --- a/src/app/project/board/terms-tab-view/terms-tab-view.component.spec.ts +++ b/src/app/project/board/terms-tab-view/terms-tab-view.component.spec.ts @@ -3,7 +3,7 @@ import { TermsTabViewComponent } from './terms-tab-view.component'; import { Component, ViewChild } from '@angular/core'; /** - * Test host component to simulate parent component. + * test host component to simulate parent component. */ @Component({ selector: 'app-board-host-component', @@ -15,7 +15,7 @@ class TestHostBoardComponent { // input parameters conditionsOfAccess = 'Open Access'; - license = [{'type': 'https://schema.org/URL', 'value': 'https://creativecommons.org/licenses/by/3.0', 'url': 'https://creativecommons.org/licenses/by/3.0'}]; + license = [{ 'type': 'https://schema.org/URL', 'value': 'https://creativecommons.org/licenses/by/3.0', 'url': 'https://creativecommons.org/licenses/by/3.0' }]; } describe('TermsTabViewComponent', () => { diff --git a/src/app/project/collaboration/add-user/add-user.component.ts b/src/app/project/collaboration/add-user/add-user.component.ts index a6127f42a7..1b60c2e69b 100644 --- a/src/app/project/collaboration/add-user/add-user.component.ts +++ b/src/app/project/collaboration/add-user/add-user.component.ts @@ -26,11 +26,6 @@ import { ErrorHandlerService } from 'src/app/main/error/error-handler.service'; }) export class AddUserComponent implements OnInit { - /** - * status for the progress indicator - */ - loading: boolean = true; - /** * project name to get existing team members * or to know where to add selected user @@ -42,6 +37,11 @@ export class AddUserComponent implements OnInit { */ @Output() refreshParent: EventEmitter = new EventEmitter(); + /** + * status for the progress indicator + */ + loading = true; + /** * form group */ @@ -157,7 +157,7 @@ export class AddUserComponent implements OnInit { ); } - let i: number = 0; + let i = 0; for (const u of response.body.users) { // if the user is already member of the project @@ -170,7 +170,7 @@ export class AddUserComponent implements OnInit { new RegExp('(?:^|\W)' + u.username.toLowerCase() + '(?:$|\W)') ); - let existsInProject: string = ''; + let existsInProject = ''; if (members && members.indexOf(u.id) > -1) { existsInProject = '* '; @@ -277,13 +277,13 @@ export class AddUserComponent implements OnInit { } /** - * Add user to the project + * add user to the project * * @param val The value can be e-mail address or username */ addUser(val: string) { - // TODO: add getUserByEmail + // --> TODO add getUserByEmail // you can type username or email. We have to check, what we have now this._dspApiConnection.admin.usersEndpoint.getUserByUsername(val).subscribe( (response: ApiResponseData) => { diff --git a/src/app/project/collaboration/collaboration.component.spec.ts b/src/app/project/collaboration/collaboration.component.spec.ts index fe2f5bc014..16c3faa5a2 100644 --- a/src/app/project/collaboration/collaboration.component.spec.ts +++ b/src/app/project/collaboration/collaboration.component.spec.ts @@ -90,9 +90,7 @@ describe('CollaborationComponent', () => { let store = {}; spyOn(localStorage, 'getItem').and.callFake( - (key: string): string => { - return store[key] || null; - } + (key: string): string => store[key] || null ); spyOn(localStorage, 'removeItem').and.callFake( (key: string): void => { @@ -100,9 +98,7 @@ describe('CollaborationComponent', () => { } ); spyOn(localStorage, 'setItem').and.callFake( - (key: string, value: string): string => { - return (store[key] = value); - } + (key: string, value: string): string => (store[key] = value) ); spyOn(localStorage, 'clear').and.callFake(() => { store = {}; diff --git a/src/app/project/collaboration/collaboration.component.ts b/src/app/project/collaboration/collaboration.component.ts index a12ecd31b9..5d76ef2ff3 100644 --- a/src/app/project/collaboration/collaboration.component.ts +++ b/src/app/project/collaboration/collaboration.component.ts @@ -22,13 +22,15 @@ import { AddUserComponent } from './add-user/add-user.component'; }) export class CollaborationComponent implements OnInit { + @ViewChild('addUserComponent') addUser: AddUserComponent; + // loading for progess indicator loading: boolean; // permissions of logged-in user session: Session; - sysAdmin: boolean = false; - projectAdmin: boolean = false; + sysAdmin = false; + projectAdmin = false; // project shortcode; as identifier in project cache service projectcode: string; @@ -45,8 +47,6 @@ export class CollaborationComponent implements OnInit { // list of inactive (deleted) users inactive: ReadUser[] = []; - @ViewChild('addUserComponent') addUser: AddUserComponent; - constructor( @Inject(DspApiConnectionToken) private _dspApiConnection: KnoraApiConnection, private _cache: CacheService, @@ -63,7 +63,7 @@ export class CollaborationComponent implements OnInit { // set the page title this._titleService.setTitle('Project ' + this.projectcode + ' | Collaboration'); - // TODO: go back to project page, if the logged-in user has no admin rights + // --> TODO go back to project page, if the logged-in user has no admin rights // is the logged-in user a project admin? /* const session: Session = JSON.parse( diff --git a/src/app/project/collaboration/select-group/select-group.component.ts b/src/app/project/collaboration/select-group/select-group.component.ts index becc217751..d105db6d99 100644 --- a/src/app/project/collaboration/select-group/select-group.component.ts +++ b/src/app/project/collaboration/select-group/select-group.component.ts @@ -12,8 +12,6 @@ import { ErrorHandlerService } from 'src/app/main/error/error-handler.service'; styleUrls: ['./select-group.component.scss'] }) export class SelectGroupComponent implements OnInit { - // send data only, when the selection has changed - sendData: boolean = false; // project short code @Input() projectcode: string; @@ -35,6 +33,9 @@ export class SelectGroupComponent implements OnInit { groupCtrl = new FormControl(); + // send data only, when the selection has changed + sendData = false; + constructor( @Inject(DspApiConnectionToken) private _dspApiConnection: KnoraApiConnection, private _cache: CacheService, @@ -91,11 +92,11 @@ export class SelectGroupComponent implements OnInit { /** * compare two arrays and return true, if they are different - * @param arr_1 string array - * @param arr_2 string array + * @param arrOne string array + * @param arrTwo string array */ - compare(arr_1: string[], arr_2: string[]): boolean { - arr_1 = arr_1.sort((n1, n2) => { + compare(arrOne: string[], arrTwo: string[]): boolean { + arrOne = arrOne.sort((n1, n2) => { if (n1 > n2) { return 1; } @@ -107,7 +108,7 @@ export class SelectGroupComponent implements OnInit { return 0; }); - arr_2 = arr_2.sort((n1, n2) => { + arrTwo = arrTwo.sort((n1, n2) => { if (n1 > n2) { return 1; } @@ -119,6 +120,6 @@ export class SelectGroupComponent implements OnInit { return 0; }); - return JSON.stringify(arr_1) !== JSON.stringify(arr_2); + return JSON.stringify(arrOne) !== JSON.stringify(arrTwo); } } diff --git a/src/app/project/list/list-info-form/list-info-form.component.ts b/src/app/project/list/list-info-form/list-info-form.component.ts index ba734d23b2..b248665d5c 100644 --- a/src/app/project/list/list-info-form/list-info-form.component.ts +++ b/src/app/project/list/list-info-form/list-info-form.component.ts @@ -23,7 +23,6 @@ import { ErrorHandlerService } from 'src/app/main/error/error-handler.service'; }) export class ListInfoFormComponent implements OnInit { - loading: boolean; @Input() iri?: string; @@ -36,6 +35,8 @@ export class ListInfoFormComponent implements OnInit { @Output() updateParent: EventEmitter<{ title: string }> = new EventEmitter<{ title: string }>(); + loading: boolean; + project: ReadProject; list: ListNodeInfo; @@ -48,7 +49,7 @@ export class ListInfoFormComponent implements OnInit { * true after adding list * */ - createList: boolean = false; + createList = false; newList: List; nameMinLength = 3; @@ -212,7 +213,7 @@ export class ListInfoFormComponent implements OnInit { } /** - * Reset the form + * reset the form */ resetForm(ev: Event, list?: ListNodeInfo) { diff --git a/src/app/project/list/list-item-form/edit-list-item/edit-list-item.component.spec.ts b/src/app/project/list/list-item-form/edit-list-item/edit-list-item.component.spec.ts index 7996a3a0b4..edd6a58e97 100644 --- a/src/app/project/list/list-item-form/edit-list-item/edit-list-item.component.spec.ts +++ b/src/app/project/list/list-item-form/edit-list-item/edit-list-item.component.spec.ts @@ -1,4 +1,4 @@ -import { Component, DebugElement, OnInit, ViewChild } from '@angular/core'; +import { Component, DebugElement, ViewChild } from '@angular/core'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; @@ -10,10 +10,10 @@ import { AjaxResponse } from 'rxjs/ajax'; import { EditListItemComponent } from './edit-list-item.component'; /** - * Test host component to simulate parent component for updating an existing child node. + * test host component to simulate parent component for updating an existing child node. */ @Component({ - template: `` + template: '' }) class TestHostUpdateChildNodeComponent { @@ -29,10 +29,10 @@ class TestHostUpdateChildNodeComponent { } /** - * Test host component to simulate parent component for inserting a new child node. + * test host component to simulate parent component for inserting a new child node. */ @Component({ - template: `` + template: '' }) class TestHostInsertChildNodeComponent { @@ -97,9 +97,9 @@ describe('EditListItemComponent', () => { () => { const response = new ListNodeInfoResponse(); response.nodeinfo.id = 'http://rdfh.ch/lists/0001/otherTreeList01'; - response.nodeinfo.labels = [{'value': 'Tree list node 01', 'language': 'en'}]; - response.nodeinfo.comments = [{'value': 'My comment', 'language': 'en'}]; - return of(ApiResponseData.fromAjaxResponse({response} as AjaxResponse)); + response.nodeinfo.labels = [{ 'value': 'Tree list node 01', 'language': 'en' }]; + response.nodeinfo.comments = [{ 'value': 'My comment', 'language': 'en' }]; + return of(ApiResponseData.fromAjaxResponse({ response } as AjaxResponse)); } ); @@ -116,16 +116,16 @@ describe('EditListItemComponent', () => { it('should assign labels and comments', () => { const dspConnSpy = TestBed.inject(DspApiConnectionToken); - expect(testHostComponent.editListItem.labels).toEqual([{'value': 'Tree list node 01', 'language': 'en'}]); - expect(testHostComponent.editListItem.comments).toEqual([{'value': 'My comment', 'language': 'en'}]); + expect(testHostComponent.editListItem.labels).toEqual([{ 'value': 'Tree list node 01', 'language': 'en' }]); + expect(testHostComponent.editListItem.comments).toEqual([{ 'value': 'My comment', 'language': 'en' }]); expect(dspConnSpy.admin.listsEndpoint.getListNodeInfo).toHaveBeenCalledTimes(1); expect(dspConnSpy.admin.listsEndpoint.getListNodeInfo).toHaveBeenCalledWith('http://rdfh.ch/lists/0001/otherTreeList01'); }); it('should update labels when the value changes', () => { - expect(testHostComponent.editListItem.labels).toEqual([{'value': 'Tree list node 01', 'language': 'en'}]); - testHostComponent.editListItem.handleData([{'value': 'Tree list node 01', 'language': 'en'}, {'value': 'Baumlistenknoten 01', 'language': 'de'}], 'labels'); - expect(testHostComponent.editListItem.labels).toEqual([{'value': 'Tree list node 01', 'language': 'en'}, {'value': 'Baumlistenknoten 01', 'language': 'de'}]); + expect(testHostComponent.editListItem.labels).toEqual([{ 'value': 'Tree list node 01', 'language': 'en' }]); + testHostComponent.editListItem.handleData([{ 'value': 'Tree list node 01', 'language': 'en' }, { 'value': 'Baumlistenknoten 01', 'language': 'de' }], 'labels'); + expect(testHostComponent.editListItem.labels).toEqual([{ 'value': 'Tree list node 01', 'language': 'en' }, { 'value': 'Baumlistenknoten 01', 'language': 'de' }]); expect(testHostComponent.editListItem.saveButtonDisabled).toBeFalsy(); testHostComponent.editListItem.handleData([], 'labels'); expect(testHostComponent.editListItem.saveButtonDisabled).toBeTruthy(); @@ -135,9 +135,9 @@ describe('EditListItemComponent', () => { }); it('should update comments when the value changes', () => { - expect(testHostComponent.editListItem.comments).toEqual([{'value': 'My comment', 'language': 'en'}]); - testHostComponent.editListItem.handleData([{'value': 'My comment', 'language': 'en'}, {'value': 'Mein Kommentar', 'language': 'de'}], 'comments'); - expect(testHostComponent.editListItem.comments).toEqual([{'value': 'My comment', 'language': 'en'}, {'value': 'Mein Kommentar', 'language': 'de'}]); + expect(testHostComponent.editListItem.comments).toEqual([{ 'value': 'My comment', 'language': 'en' }]); + testHostComponent.editListItem.handleData([{ 'value': 'My comment', 'language': 'en' }, { 'value': 'Mein Kommentar', 'language': 'de' }], 'comments'); + expect(testHostComponent.editListItem.comments).toEqual([{ 'value': 'My comment', 'language': 'en' }, { 'value': 'Mein Kommentar', 'language': 'de' }]); expect(testHostComponent.editListItem.saveButtonDisabled).toBeFalsy(); testHostComponent.editListItem.handleData([], 'comments'); expect(testHostComponent.editListItem.saveButtonDisabled).toBeFalsy(); @@ -146,20 +146,20 @@ describe('EditListItemComponent', () => { it('should update the child node info', () => { const dspConnSpy = TestBed.inject(DspApiConnectionToken); - testHostComponent.editListItem.handleData([{'value': 'Tree list node 01', 'language': 'en'}, {'value': 'Baumlistenknoten 01', 'language': 'de'}], 'labels'); - testHostComponent.editListItem.handleData([{'value': 'My comment', 'language': 'en'}, {'value': 'Mein Kommentar', 'language': 'de'}], 'comments'); + testHostComponent.editListItem.handleData([{ 'value': 'Tree list node 01', 'language': 'en' }, { 'value': 'Baumlistenknoten 01', 'language': 'de' }], 'labels'); + testHostComponent.editListItem.handleData([{ 'value': 'My comment', 'language': 'en' }, { 'value': 'Mein Kommentar', 'language': 'de' }], 'comments'); (dspConnSpy.admin.listsEndpoint as jasmine.SpyObj).updateChildNode.and.callFake( () => { const response = new ListNodeInfoResponse(); response.nodeinfo.id = 'http://rdfh.ch/lists/0001/otherTreeList01'; - response.nodeinfo.labels = [{'value': 'Tree list node 01', 'language': 'en'}, {'value': 'Baumlistenknoten 01', 'language': 'de'}]; - response.nodeinfo.comments = [{'value': 'My comment', 'language': 'en'}, {'value': 'Mein Kommentar', 'language': 'de'}]; + response.nodeinfo.labels = [{ 'value': 'Tree list node 01', 'language': 'en' }, { 'value': 'Baumlistenknoten 01', 'language': 'de' }]; + response.nodeinfo.comments = [{ 'value': 'My comment', 'language': 'en' }, { 'value': 'Mein Kommentar', 'language': 'de' }]; expect(testHostComponent.editListItem.labels).toEqual(response.nodeinfo.labels); expect(testHostComponent.editListItem.comments).toEqual(response.nodeinfo.comments); - return of(ApiResponseData.fromAjaxResponse({response} as AjaxResponse)); + return of(ApiResponseData.fromAjaxResponse({ response } as AjaxResponse)); } ); @@ -196,23 +196,23 @@ describe('EditListItemComponent', () => { it('should create (insert) a new child node', () => { const dspConnSpy = TestBed.inject(DspApiConnectionToken); - testHostComponent.editListItem.handleData([{'value': 'My new child node value', 'language': 'en'}], 'labels'); - testHostComponent.editListItem.handleData([{'value': 'My new child node comment', 'language': 'en'}], 'comments'); + testHostComponent.editListItem.handleData([{ 'value': 'My new child node value', 'language': 'en' }], 'labels'); + testHostComponent.editListItem.handleData([{ 'value': 'My new child node comment', 'language': 'en' }], 'comments'); (dspConnSpy.admin.listsEndpoint as jasmine.SpyObj).createChildNode.and.callFake( () => { const response = new ListNodeInfoResponse(); response.nodeinfo.name = 'My new child node'; response.nodeinfo.id = 'http://rdfh.ch/lists/0001/otherTreeList0123'; - response.nodeinfo.labels = [{'value': 'My new child node value', 'language': 'en'}]; - response.nodeinfo.comments = [{'value': 'My new child node comment', 'language': 'en'}]; + response.nodeinfo.labels = [{ 'value': 'My new child node value', 'language': 'en' }]; + response.nodeinfo.comments = [{ 'value': 'My new child node comment', 'language': 'en' }]; response.nodeinfo.position = 0; expect(testHostComponent.editListItem.labels).toEqual(response.nodeinfo.labels); expect(testHostComponent.editListItem.comments).toEqual(response.nodeinfo.comments); expect(testHostComponent.editListItem.position).toEqual(response.nodeinfo.position); - return of(ApiResponseData.fromAjaxResponse({response} as AjaxResponse)); + return of(ApiResponseData.fromAjaxResponse({ response } as AjaxResponse)); } ); diff --git a/src/app/project/list/list-item-form/edit-list-item/edit-list-item.component.ts b/src/app/project/list/list-item-form/edit-list-item/edit-list-item.component.ts index 541fc9405c..47ebc63883 100644 --- a/src/app/project/list/list-item-form/edit-list-item/edit-list-item.component.ts +++ b/src/app/project/list/list-item-form/edit-list-item/edit-list-item.component.ts @@ -12,14 +12,14 @@ import { UpdateChildNodeRequest } from '@dasch-swiss/dsp-js'; import { DspApiConnectionToken } from '@dasch-swiss/dsp-ui'; +import { ErrorHandlerService } from 'src/app/main/error/error-handler.service'; @Component({ - selector: 'app-edit-list-item', - templateUrl: './edit-list-item.component.html', - styleUrls: ['./edit-list-item.component.scss'] + selector: 'app-edit-list-item', + templateUrl: './edit-list-item.component.html', + styleUrls: ['./edit-list-item.component.scss'] }) export class EditListItemComponent implements OnInit { - loading: boolean; @Input() iri: string; @@ -35,6 +35,8 @@ export class EditListItemComponent implements OnInit { @Output() closeDialog: EventEmitter = new EventEmitter(); + loading: boolean; + // the list node being edited listNode: ListNodeInfo; @@ -60,7 +62,10 @@ export class EditListItemComponent implements OnInit { formInvalidMessage: string; - constructor(@Inject(DspApiConnectionToken) private _dspApiConnection: KnoraApiConnection) { } + constructor( + @Inject(DspApiConnectionToken) private _dspApiConnection: KnoraApiConnection, + private _errorHandler: ErrorHandlerService + ) { } ngOnInit(): void { this.loading = true; @@ -73,7 +78,7 @@ export class EditListItemComponent implements OnInit { this.buildForm(response.body.nodeinfo); }, (error: ApiResponseError) => { - console.error(error); + this._errorHandler.showMessage(error); } ); } else { @@ -85,7 +90,7 @@ export class EditListItemComponent implements OnInit { } /** - * Separates the labels and comments of a list node into two local arrays. + * separates the labels and comments of a list node into two local arrays. * * @param listNode info about a list node */ @@ -103,7 +108,7 @@ export class EditListItemComponent implements OnInit { } /** - * Called from the template any time the labels or comments are changed to update the local arrays. + * called from the template any time the labels or comments are changed to update the local arrays. * At least one label is required. Otherwise, the 'update' button will be disabled. * * @param data the data that was changed @@ -131,8 +136,8 @@ export class EditListItemComponent implements OnInit { } /** - * Called from the template when the 'submit' button is clicked in update mode. - * Sends a request to DSP-API to update the list child node with the data inside the two local arrays. + * called from the template when the 'submit' button is clicked in update mode. + * sends a request to DSP-API to update the list child node with the data inside the two local arrays. */ updateChildNode() { const childNodeUpdateData: UpdateChildNodeRequest = new UpdateChildNodeRequest(); @@ -154,7 +159,7 @@ export class EditListItemComponent implements OnInit { } /** - * Called from the template when the 'submit' button is clicked in insert mode. + * called from the template when the 'submit' button is clicked in insert mode. * Sends a request to DSP-API to insert a new list child node in the provided position. */ insertChildNode() { diff --git a/src/app/project/list/list-item-form/list-item-form.component.spec.ts b/src/app/project/list/list-item-form/list-item-form.component.spec.ts index 6657da62c0..cd7cfd84df 100644 --- a/src/app/project/list/list-item-form/list-item-form.component.spec.ts +++ b/src/app/project/list/list-item-form/list-item-form.component.spec.ts @@ -22,7 +22,7 @@ import { DialogComponent } from 'src/app/main/dialog/dialog.component'; import { ListItemFormComponent, ListNodeOperation } from './list-item-form.component'; /** - * Test host component to simulate parent component. + * test host component to simulate parent component. */ @Component({ template: ` @@ -148,20 +148,20 @@ describe('ListItemFormComponent', () => { const response = deleteListNodeResponse; - return of(ApiResponseData.fromAjaxResponse({response} as AjaxResponse)); + return of(ApiResponseData.fromAjaxResponse({ response } as AjaxResponse)); } ); spyOn(testHostComponent.listItemForm.refreshParent, 'emit'); - const deleteButton = await rootLoader.getHarness(MatButtonHarness.with({selector: '.delete'})); + const deleteButton = await rootLoader.getHarness(MatButtonHarness.with({ selector: '.delete' })); await deleteButton.click(); const dialogHarnesses = await rootLoader.getAllHarnesses(MatDialogHarness); expect(dialogHarnesses.length).toEqual(1); - const confirmButton = await rootLoader.getHarness(MatButtonHarness.with({selector: '.confirm-button'})); + const confirmButton = await rootLoader.getHarness(MatButtonHarness.with({ selector: '.confirm-button' })); await confirmButton.click(); diff --git a/src/app/project/list/list-item-form/list-item-form.component.ts b/src/app/project/list/list-item-form/list-item-form.component.ts index 6914d029cc..646207bfd3 100644 --- a/src/app/project/list/list-item-form/list-item-form.component.ts +++ b/src/app/project/list/list-item-form/list-item-form.component.ts @@ -31,23 +31,23 @@ export class ListNodeOperation { // https://www.kdechant.com/blog/angular-animations-fade-in-and-fade-out trigger('simpleFadeAnimation', [ - // the "in" style determines the "resting" state of the element when it is visible. - state('in', style({opacity: 1})), + // the "in" style determines the "resting" state of the element when it is visible. + state('in', style({ opacity: 1 })), - // fade in when created. - transition(':enter', [ + // fade in when created. + transition(':enter', [ // the styles start from this point when the element appears - style({opacity: 0}), - // and animate toward the "in" state above - animate(150) - ]), + style({ opacity: 0 }), + // and animate toward the "in" state above + animate(150) + ]), - // fade out when destroyed. - transition(':leave', + // fade out when destroyed. + transition(':leave', // fading out uses a different syntax, with the "style" being passed into animate() - animate(150, style({opacity: 0}))) + animate(150, style({ opacity: 0 }))) ]) - ] + ] }) export class ListItemFormComponent implements OnInit { @@ -79,9 +79,9 @@ export class ListItemFormComponent implements OnInit { @Input() position: number; // is this node in the last position of the list - @Input() lastPosition: boolean = false; + @Input() lastPosition = false; - @Input() newNode: boolean = false; + @Input() newNode = false; @Output() refreshParent: EventEmitter = new EventEmitter(); @@ -89,9 +89,9 @@ export class ListItemFormComponent implements OnInit { initComponent: boolean; - placeholder: string = 'Append item to '; + placeholder = 'Append item to '; - showActionBubble: boolean = false; + showActionBubble = false; constructor( @Inject(DspApiConnectionToken) private _dspApiConnection: KnoraApiConnection, @@ -127,7 +127,7 @@ export class ListItemFormComponent implements OnInit { } /** - * Called from the template when the plus button is clicked. + * called from the template when the plus button is clicked. * Sends the info to make a new child node to DSP-API and refreshes the UI to show the newly added node at the end of the list. */ createChildNode() { @@ -152,7 +152,7 @@ export class ListItemFormComponent implements OnInit { childNode.labels[i].value = l.value; i++; } - childNode.comments = []; // TODO: comments are not yet implemented in the template + childNode.comments = []; // --> TODO comments are not yet implemented in the template // init data to emit to parent const listNodeOperation: ListNodeOperation = new ListNodeOperation(); @@ -178,7 +178,7 @@ export class ListItemFormComponent implements OnInit { } /** - * Called from the template any time the label changes. + * called from the template any time the label changes. * Currently only implemented for labels because entering comments is not yet supported. * * @param data the data that was changed. @@ -191,21 +191,21 @@ export class ListItemFormComponent implements OnInit { } /** - * Show action bubble with various CRUD buttons when hovered over. + * show action bubble with various CRUD buttons when hovered over. */ mouseEnter() { this.showActionBubble = true; } /** - * Hide action bubble with various CRUD buttons when not hovered over. + * hide action bubble with various CRUD buttons when not hovered over. */ mouseLeave() { this.showActionBubble = false; } /** - * Called when the 'edit' or 'delete' button is clicked. + * called when the 'edit' or 'delete' button is clicked. * * @param mode mode to tell DialogComponent which part of the template to show. * @param name label of the node; for now this is always the first label in the array. @@ -271,7 +271,7 @@ export class ListItemFormComponent implements OnInit { position: { top: '112px' }, - data: { mode: 'deleteListNodeError'} + data: { mode: 'deleteListNodeError' } }; // open the dialog box @@ -288,7 +288,7 @@ export class ListItemFormComponent implements OnInit { } /** - * Called from the template when either of the two reposition buttons is clicked + * called from the template when either of the two reposition buttons is clicked * @param direction in which direction the node should move */ repositionNode(direction: 'up' | 'down') { diff --git a/src/app/project/list/list-item/list-item.component.spec.ts b/src/app/project/list/list-item/list-item.component.spec.ts index f25538defe..f49b7ac7db 100644 --- a/src/app/project/list/list-item/list-item.component.spec.ts +++ b/src/app/project/list/list-item/list-item.component.spec.ts @@ -13,7 +13,7 @@ import { ListNodeOperation } from '../list-item-form/list-item-form.component'; import { ListItemComponent } from './list-item.component'; /** - * Test host component to simulate parent component. + * test host component to simulate parent component. */ @Component({ template: ` @@ -44,7 +44,7 @@ class TestHostComponent implements OnInit { { comments: [], id: 'http://rdfh.ch/lists/0001/otherTreeList', - labels: [{value: 'Tree List Node', language: 'en'}], + labels: [{ value: 'Tree List Node', language: 'en' }], isRootNode: true } ]; @@ -53,10 +53,10 @@ class TestHostComponent implements OnInit { } /** - * Mock ListItemForm. + * mock ListItemForm. */ @Component({ - template: `` + template: '' }) class MockListItemFormComponent { } @@ -103,16 +103,16 @@ describe('ListItemComponent', () => { const response = new ListResponse(); response.list.listinfo.id = 'http://rdfh.ch/lists/0001/otherTreeList'; response.list.listinfo.isRootNode = true; - response.list.listinfo.labels = [{value: 'Tree List Node Root', language: 'en'}]; + response.list.listinfo.labels = [{ value: 'Tree List Node Root', language: 'en' }]; response.list.children = [ { comments: [], - labels: [{value: 'Tree List Node 01', language: 'en'}], + labels: [{ value: 'Tree List Node 01', language: 'en' }], id: 'http://rdfh.ch/lists/0001/otherTreeList01', children: [ { comments: [], - labels: [{value: 'Tree List Node 03', language: 'en'}], + labels: [{ value: 'Tree List Node 03', language: 'en' }], id: 'http://rdfh.ch/lists/0001/otherTreeList03', children: [] } @@ -120,12 +120,12 @@ describe('ListItemComponent', () => { }, { comments: [], - labels: [{value: 'Tree List Node 02', language: 'en'}], + labels: [{ value: 'Tree List Node 02', language: 'en' }], id: 'http://rdfh.ch/lists/0001/otherTreeList02', children: [] } ]; - return of(ApiResponseData.fromAjaxResponse({response} as AjaxResponse)); + return of(ApiResponseData.fromAjaxResponse({ response } as AjaxResponse)); } ); @@ -140,11 +140,11 @@ describe('ListItemComponent', () => { it('should update the view to show a newly created node', () => { const listNodeOperation: ListNodeOperation = new ListNodeOperation(); listNodeOperation.listNode = { - children: [], - comments: [], - hasRootNode: 'http://rdfh.ch/lists/0001/otherTreeList', - id: 'http://rdfh.ch/lists/0001/otherTreeList04', - labels: [{value: 'Tree List Node 04', language: 'en'}] + children: [], + comments: [], + hasRootNode: 'http://rdfh.ch/lists/0001/otherTreeList', + id: 'http://rdfh.ch/lists/0001/otherTreeList04', + labels: [{ value: 'Tree List Node 04', language: 'en' }] }; listNodeOperation.operation = 'create'; @@ -156,12 +156,12 @@ describe('ListItemComponent', () => { it('should update the view to show an updated node', () => { const listNodeOperation: ListNodeOperation = new ListNodeOperation(); listNodeOperation.listNode = { - children: undefined, - comments: [], - hasRootNode: 'http://rdfh.ch/lists/0001/otherTreeList', - id: 'http://rdfh.ch/lists/0001/otherTreeList01', - labels: [{value: 'Tree List Node 0123', language: 'en'}], - position: 0 + children: undefined, + comments: [], + hasRootNode: 'http://rdfh.ch/lists/0001/otherTreeList', + id: 'http://rdfh.ch/lists/0001/otherTreeList01', + labels: [{ value: 'Tree List Node 0123', language: 'en' }], + position: 0 }; listNodeOperation.operation = 'update'; @@ -169,7 +169,7 @@ describe('ListItemComponent', () => { expect(testHostComponent.listItem.list.length).toEqual(2); - expect(testHostComponent.listItem.list[0].labels).toEqual([{value: 'Tree List Node 0123', language: 'en'}]); + expect(testHostComponent.listItem.list[0].labels).toEqual([{ value: 'Tree List Node 0123', language: 'en' }]); }); it('should update the view to show an inserted node', () => { @@ -180,16 +180,16 @@ describe('ListItemComponent', () => { const response = new ListResponse(); response.list.listinfo.id = 'http://rdfh.ch/lists/0001/otherTreeList'; response.list.listinfo.isRootNode = true; - response.list.listinfo.labels = [{value: 'Tree List Node Root', language: 'en'}]; + response.list.listinfo.labels = [{ value: 'Tree List Node Root', language: 'en' }]; response.list.children = [ { comments: [], - labels: [{value: 'Tree List Node 01', language: 'en'}], + labels: [{ value: 'Tree List Node 01', language: 'en' }], id: 'http://rdfh.ch/lists/0001/otherTreeList01', children: [ { comments: [], - labels: [{value: 'Tree List Node 03', language: 'en'}], + labels: [{ value: 'Tree List Node 03', language: 'en' }], id: 'http://rdfh.ch/lists/0001/otherTreeList03', children: [] } @@ -197,29 +197,29 @@ describe('ListItemComponent', () => { }, { comments: [], - labels: [{value: 'Tree List Node 04 between node 01 and node 02', language: 'en'}], + labels: [{ value: 'Tree List Node 04 between node 01 and node 02', language: 'en' }], id: 'http://rdfh.ch/lists/0001/otherTreeList04', children: [] }, { comments: [], - labels: [{value: 'Tree List Node 02', language: 'en'}], + labels: [{ value: 'Tree List Node 02', language: 'en' }], id: 'http://rdfh.ch/lists/0001/otherTreeList02', children: [] } ]; - return of(ApiResponseData.fromAjaxResponse({response} as AjaxResponse)); + return of(ApiResponseData.fromAjaxResponse({ response } as AjaxResponse)); } ); const listNodeOperation: ListNodeOperation = new ListNodeOperation(); listNodeOperation.listNode = { - children: undefined, - comments: [], - hasRootNode: 'http://rdfh.ch/lists/0001/otherTreeList', - id: 'http://rdfh.ch/lists/0001/otherTreeList04', - labels: [{value: 'Tree List Node 04 between node 01 and node 02', language: 'en'}], - position: 1 + children: undefined, + comments: [], + hasRootNode: 'http://rdfh.ch/lists/0001/otherTreeList', + id: 'http://rdfh.ch/lists/0001/otherTreeList04', + labels: [{ value: 'Tree List Node 04 between node 01 and node 02', language: 'en' }], + position: 1 }; listNodeOperation.operation = 'insert'; @@ -228,7 +228,7 @@ describe('ListItemComponent', () => { expect(testHostComponent.listItem.list.length).toEqual(3); - expect(testHostComponent.listItem.list[1].labels).toEqual([{value: 'Tree List Node 04 between node 01 and node 02', language: 'en'}]); + expect(testHostComponent.listItem.list[1].labels).toEqual([{ value: 'Tree List Node 04 between node 01 and node 02', language: 'en' }]); expect(dspConnSpy.admin.listsEndpoint.getList).toHaveBeenCalledWith(testHostComponent.parentIri); @@ -239,19 +239,19 @@ describe('ListItemComponent', () => { it('should update the view to remove a deleted node', () => { const listNodeOperation: ListNodeOperation = new ListNodeOperation(); listNodeOperation.listNode = { - children: [ - { - comments: [], - labels: [{value: 'Tree List Node 02', language: 'en'}], - id: 'http://rdfh.ch/lists/0001/otherTreeList02', - children: [] - } - ], - comments: [], - isRootNode: true, - id: 'http://rdfh.ch/lists/0001/otherTreeList01', - labels: [{value: 'Tree List Root', language: 'en'}], - projectIri: 'http://rdfh.ch/projects/0001' + children: [ + { + comments: [], + labels: [{ value: 'Tree List Node 02', language: 'en' }], + id: 'http://rdfh.ch/lists/0001/otherTreeList02', + children: [] + } + ], + comments: [], + isRootNode: true, + id: 'http://rdfh.ch/lists/0001/otherTreeList01', + labels: [{ value: 'Tree List Root', language: 'en' }], + projectIri: 'http://rdfh.ch/projects/0001' }; listNodeOperation.operation = 'delete'; @@ -259,7 +259,7 @@ describe('ListItemComponent', () => { expect(testHostComponent.listItem.list.length).toEqual(1); - expect(testHostComponent.listItem.list[0].labels).toEqual([{value: 'Tree List Node 02', language: 'en'}]); + expect(testHostComponent.listItem.list[0].labels).toEqual([{ value: 'Tree List Node 02', language: 'en' }]); }); it('should reposition the node in position 1 to position 0', () => { @@ -271,23 +271,23 @@ describe('ListItemComponent', () => { const response = new RepositionChildNodeResponse(); response.node.id = 'http://rdfh.ch/lists/0001/otherTreeList'; response.node.isRootNode = true; - response.node.labels = [{value: 'Tree List Node Root', language: 'en'}]; + response.node.labels = [{ value: 'Tree List Node Root', language: 'en' }]; response.node.children = [ { comments: [], - labels: [{value: 'Tree List Node 02', language: 'en'}], + labels: [{ value: 'Tree List Node 02', language: 'en' }], id: 'http://rdfh.ch/lists/0001/otherTreeList02', children: [], position: 0 }, { comments: [], - labels: [{value: 'Tree List Node 01', language: 'en'}], + labels: [{ value: 'Tree List Node 01', language: 'en' }], id: 'http://rdfh.ch/lists/0001/otherTreeList01', children: [ { comments: [], - labels: [{value: 'Tree List Node 03', language: 'en'}], + labels: [{ value: 'Tree List Node 03', language: 'en' }], id: 'http://rdfh.ch/lists/0001/otherTreeList03', children: [] } @@ -295,7 +295,7 @@ describe('ListItemComponent', () => { position: 1 } ]; - return of(ApiResponseData.fromAjaxResponse({response} as AjaxResponse)); + return of(ApiResponseData.fromAjaxResponse({ response } as AjaxResponse)); } ); diff --git a/src/app/project/list/list-item/list-item.component.ts b/src/app/project/list/list-item/list-item.component.ts index e3a82d3812..67f38b3d89 100644 --- a/src/app/project/list/list-item/list-item.component.ts +++ b/src/app/project/list/list-item/list-item.component.ts @@ -57,7 +57,7 @@ export class ListItemComponent implements OnInit { } /** - * Checks if parent node should show its children. + * checks if parent node should show its children. * @param id id of parent node. */ showChildren(id: string): boolean { @@ -65,7 +65,7 @@ export class ListItemComponent implements OnInit { } /** - * Called from template when the 'expand' button is clicked. + * called from template when the 'expand' button is clicked. * * @param id id of parent node for which the 'expand' button was clicked. */ @@ -78,7 +78,7 @@ export class ListItemComponent implements OnInit { } /** - * Called when the 'refreshParent' event from ListItemFormComponent is triggered. + * called when the 'refreshParent' event from ListItemFormComponent is triggered. * * @param data info about the operation that was performed on the node and should be reflected in the UI. * @param firstNode states whether or not the node is a new child node; defaults to false. diff --git a/src/app/project/list/list.component.spec.ts b/src/app/project/list/list.component.spec.ts index 0c13d748a4..beb08adcc0 100644 --- a/src/app/project/list/list.component.spec.ts +++ b/src/app/project/list/list.component.spec.ts @@ -33,28 +33,28 @@ import { TestConfig } from 'test.config'; import { ListComponent } from './list.component'; /** - * Test Host Component + * test Host Component */ @Component({ - template: `` + template: '' }) class TestHostComponent { @ViewChild('listComponent') listComponent: ListComponent; } /** - * Mock ListItem. + * mock ListItem. */ @Component({ - template: `` + template: '' }) class MockListItemComponent { } /** - * Mock ListItemForm. + * mock ListItemForm. */ @Component({ - template: `` + template: '' }) class MockListItemFormComponent { } @@ -178,7 +178,7 @@ describe('ListComponent', () => { response.project = mockProjects.body.projects[0]; - return of(ApiResponseData.fromAjaxResponse({response} as AjaxResponse)); + return of(ApiResponseData.fromAjaxResponse({ response } as AjaxResponse)); } ); @@ -201,19 +201,19 @@ describe('ListComponent', () => { mockList1.comments = []; mockList1.id = 'http://rdfh.ch/lists/0001/mockList01'; mockList1.isRootNode = true; - mockList1.labels = [{language: 'en', value: 'Mock List 01'}]; + mockList1.labels = [{ language: 'en', value: 'Mock List 01' }]; mockList1.projectIri = 'http://rdfh.ch/projects/myProjectIri'; const mockList2 = new ListNodeInfo(); mockList2.comments = []; mockList2.id = 'http://rdfh.ch/lists/0001/mockList02'; mockList2.isRootNode = true; - mockList2.labels = [{language: 'en', value: 'Mock List 02'}]; + mockList2.labels = [{ language: 'en', value: 'Mock List 02' }]; mockList2.projectIri = 'http://rdfh.ch/projects/myProjectIri'; response.lists.push(mockList1, mockList2); - return of(ApiResponseData.fromAjaxResponse({response} as AjaxResponse)); + return of(ApiResponseData.fromAjaxResponse({ response } as AjaxResponse)); } ); @@ -233,7 +233,7 @@ describe('ListComponent', () => { response.project = mockProjects.body.projects[0]; - return of(ApiResponseData.fromAjaxResponse({response} as AjaxResponse)); + return of(ApiResponseData.fromAjaxResponse({ response } as AjaxResponse)); } ); @@ -262,14 +262,14 @@ describe('ListComponent', () => { list1.comments = []; list1.id = 'http://rdfh.ch/lists/0001/mockList01'; list1.isRootNode = true; - list1.labels = [{language: 'en', value: 'Mock List 01'}]; + list1.labels = [{ language: 'en', value: 'Mock List 01' }]; list1.projectIri = 'http://rdfh.ch/projects/myProjectIri'; const list2 = new ListNodeInfo(); list2.comments = []; list2.id = 'http://rdfh.ch/lists/0001/mockList02'; list2.isRootNode = true; - list2.labels = [{language: 'en', value: 'Mock List 02'}]; + list2.labels = [{ language: 'en', value: 'Mock List 02' }]; list2.projectIri = 'http://rdfh.ch/projects/myProjectIri'; listOfLists.push(list1, list2); @@ -282,7 +282,7 @@ describe('ListComponent', () => { await select.open(); - const options = await select.getOptions({ text: 'Mock List 01 (en)'}); + const options = await select.getOptions({ text: 'Mock List 01 (en)' }); expect(options.length).toEqual(1); @@ -303,7 +303,7 @@ describe('ListComponent', () => { () => { const response = deleteListResponse; - return of(ApiResponseData.fromAjaxResponse({response} as AjaxResponse)); + return of(ApiResponseData.fromAjaxResponse({ response } as AjaxResponse)); } ); @@ -320,12 +320,12 @@ describe('ListComponent', () => { mockList2.comments = []; mockList2.id = 'http://rdfh.ch/lists/0001/mockList02'; mockList2.isRootNode = true; - mockList2.labels = [{language: 'en', value: 'Mock List 02'}]; + mockList2.labels = [{ language: 'en', value: 'Mock List 02' }]; mockList2.projectIri = 'http://rdfh.ch/projects/myProjectIri'; response.lists.push(mockList2); - return of(ApiResponseData.fromAjaxResponse({response} as AjaxResponse)); + return of(ApiResponseData.fromAjaxResponse({ response } as AjaxResponse)); } ); @@ -334,14 +334,14 @@ describe('ListComponent', () => { await select.open(); - const options = await select.getOptions({ text: 'Mock List 01 (en)'}); + const options = await select.getOptions({ text: 'Mock List 01 (en)' }); expect(options.length).toEqual(1); await options[0].click(); // click delete button - const deleteButton = await rootLoader.getHarness(MatButtonHarness.with({selector: '.delete'})); + const deleteButton = await rootLoader.getHarness(MatButtonHarness.with({ selector: '.delete' })); await deleteButton.click(); // get dialog harness @@ -350,7 +350,7 @@ describe('ListComponent', () => { expect(dialogHarnesses.length).toEqual(1); // click confirm button - const confirmButton = await rootLoader.getHarness(MatButtonHarness.with({selector: '.confirm-button'})); + const confirmButton = await rootLoader.getHarness(MatButtonHarness.with({ selector: '.confirm-button' })); await confirmButton.click(); diff --git a/src/app/project/list/list.component.ts b/src/app/project/list/list.component.ts index 4dbb7bc581..8887ad2c7a 100644 --- a/src/app/project/list/list.component.ts +++ b/src/app/project/list/list.component.ts @@ -33,8 +33,8 @@ export class ListComponent implements OnInit { // permissions of logged-in user session: Session; - sysAdmin: boolean = false; - projectAdmin: boolean = false; + sysAdmin = false; + projectAdmin = false; // project shortcode; as identifier in project cache service projectcode: string; @@ -234,7 +234,7 @@ export class ListComponent implements OnInit { position: { top: '112px' }, - data: { mode: 'deleteListNodeError'} + data: { mode: 'deleteListNodeError' } }; // open the dialog box diff --git a/src/app/project/ontology/default-data/default-properties.ts b/src/app/project/ontology/default-data/default-properties.ts index 301ff1ba93..d8b0d47bc0 100644 --- a/src/app/project/ontology/default-data/default-properties.ts +++ b/src/app/project/ontology/default-data/default-properties.ts @@ -10,7 +10,7 @@ export interface PropertyType { label: string; subPropOf: string; objectType?: string; - gui_ele: string; + guiEle: string; group: string; } @@ -24,7 +24,7 @@ export class DefaultProperties { label: 'Short', subPropOf: Constants.HasValue, objectType: Constants.TextValue, - gui_ele: Constants.SalsahGui + Constants.HashDelimiter + 'SimpleText', // 'Input', + guiEle: Constants.SalsahGui + Constants.HashDelimiter + 'SimpleText', // 'Input', group: 'Text' // redundant information, but otherwise we don't get the main group name after selecting type }, { @@ -32,7 +32,7 @@ export class DefaultProperties { label: 'Paragraph', subPropOf: Constants.HasValue, objectType: Constants.TextValue, - gui_ele: Constants.SalsahGui + Constants.HashDelimiter + 'Textarea', + guiEle: Constants.SalsahGui + Constants.HashDelimiter + 'Textarea', group: 'Text' }, { @@ -40,7 +40,7 @@ export class DefaultProperties { label: 'Editor', subPropOf: Constants.HasValue, objectType: Constants.TextValue, - gui_ele: Constants.SalsahGui + Constants.HashDelimiter + 'Richtext', + guiEle: Constants.SalsahGui + Constants.HashDelimiter + 'Richtext', group: 'Text' } ] @@ -53,7 +53,7 @@ export class DefaultProperties { label: 'Multiple choice', subPropOf: Constants.HasValue, objectType: Constants.ListValue, - gui_ele: Constants.SalsahGui + Constants.HashDelimiter + 'Radio', + guiEle: Constants.SalsahGui + Constants.HashDelimiter + 'Radio', group: 'List' }, { @@ -61,7 +61,7 @@ export class DefaultProperties { label: 'Checkboxes', subPropOf: Constants.HasValue, objectType: Constants.ListValue, - gui_ele: Constants.SalsahGui + Constants.HashDelimiter + 'Checkbox', + guiEle: Constants.SalsahGui + Constants.HashDelimiter + 'Checkbox', group: 'List' }, { @@ -69,7 +69,7 @@ export class DefaultProperties { label: 'Dropdown', subPropOf: Constants.HasValue, objectType: Constants.ListValue, - gui_ele: Constants.SalsahGui + Constants.HashDelimiter + 'List', // 'Pulldown' + guiEle: Constants.SalsahGui + Constants.HashDelimiter + 'List', // 'Pulldown' group: 'List' }, { @@ -77,7 +77,7 @@ export class DefaultProperties { label: 'On / Off', subPropOf: Constants.HasValue, objectType: Constants.BooleanValue, - gui_ele: Constants.SalsahGui + Constants.HashDelimiter + 'Checkbox', // 'Toggle', + guiEle: Constants.SalsahGui + Constants.HashDelimiter + 'Checkbox', // 'Toggle', group: 'List' } ] @@ -90,7 +90,7 @@ export class DefaultProperties { label: 'Date', subPropOf: Constants.HasValue, objectType: Constants.DateValue, - gui_ele: Constants.SalsahGui + Constants.HashDelimiter + 'Date', + guiEle: Constants.SalsahGui + Constants.HashDelimiter + 'Date', group: 'Date / Time' }, { @@ -98,7 +98,7 @@ export class DefaultProperties { label: 'Period', subPropOf: Constants.HasValue, objectType: Constants.DateValue, - gui_ele: Constants.SalsahGui + Constants.HashDelimiter + 'Date', + guiEle: Constants.SalsahGui + Constants.HashDelimiter + 'Date', group: 'Date / Time' }, { @@ -106,7 +106,7 @@ export class DefaultProperties { label: 'Time', subPropOf: Constants.HasValue, objectType: Constants.TimeValue, - gui_ele: Constants.SalsahGui + Constants.HashDelimiter + 'Interval', + guiEle: Constants.SalsahGui + Constants.HashDelimiter + 'Interval', group: 'Date / Time' }, { @@ -114,7 +114,7 @@ export class DefaultProperties { label: 'Duration', subPropOf: Constants.HasValue, objectType: Constants.TimeValue, - gui_ele: Constants.SalsahGui + Constants.HashDelimiter + 'Interval', + guiEle: Constants.SalsahGui + Constants.HashDelimiter + 'Interval', group: 'Date / Time' } ] @@ -127,7 +127,7 @@ export class DefaultProperties { label: 'Integer', subPropOf: Constants.HasValue, objectType: Constants.IntValue, - gui_ele: Constants.SalsahGui + Constants.HashDelimiter + 'Spinbox', // 'Number', + guiEle: Constants.SalsahGui + Constants.HashDelimiter + 'Spinbox', // 'Number', group: 'Number' }, { @@ -135,7 +135,7 @@ export class DefaultProperties { label: 'Decimal', subPropOf: Constants.HasValue, objectType: Constants.DecimalValue, - gui_ele: Constants.SalsahGui + Constants.HashDelimiter + 'Spinbox', // 'Number', + guiEle: Constants.SalsahGui + Constants.HashDelimiter + 'Spinbox', // 'Number', group: 'Number' } ] @@ -148,7 +148,7 @@ export class DefaultProperties { label: 'Other resource e.g. Person', subPropOf: Constants.HasLinkTo, objectType: Constants.LinkValue, - gui_ele: Constants.SalsahGui + Constants.HashDelimiter + 'Searchbox', // 'Autocomplete', + guiEle: Constants.SalsahGui + Constants.HashDelimiter + 'Searchbox', // 'Autocomplete', group: 'Link' }, // { @@ -156,7 +156,7 @@ export class DefaultProperties { // label: 'External resource', // subPropOf: Constants.HasValue, // objectType: Constants.UriValue, - // gui_ele: Constants.SalsahGui + Constants.HashDelimiter + 'SimpleText', + // guiEle: Constants.SalsahGui + Constants.HashDelimiter + 'SimpleText', // group: 'Link' // }, { @@ -164,7 +164,7 @@ export class DefaultProperties { label: 'External URL', subPropOf: Constants.HasValue, objectType: Constants.UriValue, - gui_ele: Constants.SalsahGui + Constants.HashDelimiter + 'SimpleText', + guiEle: Constants.SalsahGui + Constants.HashDelimiter + 'SimpleText', group: 'Link' } ] @@ -177,7 +177,7 @@ export class DefaultProperties { label: 'Place', subPropOf: Constants.HasValue, objectType: Constants.GeonameValue, - gui_ele: Constants.SalsahGui + Constants.HashDelimiter + 'Geonames', + guiEle: Constants.SalsahGui + Constants.HashDelimiter + 'Geonames', group: 'Location' } ] @@ -190,7 +190,7 @@ export class DefaultProperties { label: 'Color', subPropOf: Constants.HasValue, objectType: Constants.ColorValue, - gui_ele: Constants.SalsahGui + Constants.HashDelimiter + 'Colorpicker', + guiEle: Constants.SalsahGui + Constants.HashDelimiter + 'Colorpicker', group: 'Shape' } ] diff --git a/src/app/project/ontology/ontology-form/ontology-form.component.ts b/src/app/project/ontology/ontology-form/ontology-form.component.ts index 5a2266deb6..2fc4a0e45c 100644 --- a/src/app/project/ontology/ontology-form/ontology-form.component.ts +++ b/src/app/project/ontology/ontology-form/ontology-form.component.ts @@ -26,7 +26,6 @@ export interface NewOntology { }) export class OntologyFormComponent implements OnInit { - loading: boolean; // project short code @Input() projectcode: string; @@ -38,11 +37,13 @@ export class OntologyFormComponent implements OnInit { @Output() updateParent: EventEmitter = new EventEmitter(); + loading: boolean; + project: ReadProject; ontologyForm: FormGroup; - ontologyLabel: string = ''; + ontologyLabel = ''; nameRegex = /^(?![vV][0-9]|[0-9]|[\u00C0-\u017F]).[a-zA-Z0-9]+\S*$/; @@ -201,7 +202,7 @@ export class OntologyFormComponent implements OnInit { } /** - * Reset the form + * reset the form */ resetForm(ev: Event, resourceClass?: any) { diff --git a/src/app/project/ontology/ontology-visualizer/ontology-visualizer.component.spec.ts b/src/app/project/ontology/ontology-visualizer/ontology-visualizer.component.spec.ts index 9bd377bcc2..fcd0b5a409 100644 --- a/src/app/project/ontology/ontology-visualizer/ontology-visualizer.component.spec.ts +++ b/src/app/project/ontology/ontology-visualizer/ontology-visualizer.component.spec.ts @@ -103,18 +103,18 @@ describe('OntologyVisualizerComponent', () => { testHostComponent.ontology = testOntology; testHostFixture.detectChanges(); }); - it(`should check the component input (ontology and ontoClasses)`, async( () => { + it('should check the component input (ontology and ontoClasses)', async( () => { expect(testHostComponent.ontoClasses.length).toEqual(1); expect(testHostComponent.ontoClasses[0].propertiesList.length).toEqual(2); expect(testHostComponent.ontology.id).toMatch('http://www.knora.org/ontology/0000/testontology'); })); - it(`should get ontology prefix, resource label, and combination of both from class IRI`, async( () => { - const resLabelInfo = testHostComponent.createLabelFromIRI('http://www.knora.org/ontology/0000/testontology/v2#testResource1'); - expect(resLabelInfo.ontoName).toEqual('testontology'); - expect(resLabelInfo.type).toEqual('testResource1'); - expect(resLabelInfo.newLabel).toEqual(resLabelInfo.ontoName + ':' + resLabelInfo.type); + it('should get ontology prefix, resource label, and combination of both from class IRI', async( () => { + const resLabelInfo = testHostComponent.createLabelFromIRI('http://www.knora.org/ontology/0000/testontology/v2#testResource1'); + expect(resLabelInfo.ontoName).toEqual('testontology'); + expect(resLabelInfo.type).toEqual('testResource1'); + expect(resLabelInfo.newLabel).toEqual(resLabelInfo.ontoName + ':' + resLabelInfo.type); })); - it(`should convert resource classes defined in ontology to nodes`, async( () => { + it('should convert resource classes defined in ontology to nodes', async( () => { expect(testHostComponent.nodes.length).toEqual(4); const nodeForTestResource1 = testHostComponent.nodes[0]; expect(nodeForTestResource1['id']).toEqual('http://www.knora.org/ontology/0000/testontology/v2#testResource1'); @@ -122,7 +122,7 @@ describe('OntologyVisualizerComponent', () => { expect(nodeForTestResource1['class']).toEqual('native'); expect(nodeForTestResource1['group']).toEqual('resource'); })); - it(`should convert super classes defined for resources to nodes as external resource`, async( () => { + it('should convert super classes defined for resources to nodes as external resource', async( () => { const nodeForKnoraResource = { 'id': 'http://api.knora.org/ontology/knora-api/v2#Resource', 'label': 'knora-api:Resource', @@ -138,11 +138,11 @@ describe('OntologyVisualizerComponent', () => { }; expect(testHostComponent.nodes).toContain(nodeForbiboResource); })); - it(`should check if a resource class is in nodes list with its IRI`, async( () => { + it('should check if a resource class is in nodes list with its IRI', async( () => { expect(testHostComponent.isInNodes('http://www.knora.org/ontology/0000/testontology/v2#testResource1')).toBeTruthy(); })); - it(`should create links defining subclass relations`, async( () => { + it('should create links defining subclass relations', async( () => { expect(testHostComponent.links.length).toEqual(4); const subClassofKnoraAPiResource = { 'source': 'http://www.knora.org/ontology/0000/testontology/v2#testResource1', @@ -162,7 +162,7 @@ describe('OntologyVisualizerComponent', () => { expect(testHostComponent.links).toContain(subClassofBiboResource); expect(testHostComponent.links).toContain(subClassofKnoraAPiResource); })); - it(`should convert literal object type to a node`, async( () => { + it('should convert literal object type to a node', async( () => { const targetnodeID = testHostComponent.addObjectTypeToNodes('http://api.knora.org/ontology/knora-api/v2#TextValue', 'http://www.knora.org/ontology/0000/testontology/v2#hasText', 'Test Resource 1'); expect(targetnodeID).toEqual('Test Resource 1_hasText'); @@ -174,7 +174,7 @@ describe('OntologyVisualizerComponent', () => { }; expect(testHostComponent.nodes).toContain(textValueNode); })); - it(`should convert property to link`, async( () => { + it('should convert property to link', async( () => { const textValueLink = { 'source': 'http://www.knora.org/ontology/0000/testontology/v2#testResource1', 'target': 'Test Resource 1_hasText', @@ -184,7 +184,7 @@ describe('OntologyVisualizerComponent', () => { }; expect(testHostComponent.links).toContain(textValueLink); })); - it(`should convert property to a circular link`, async( () => { + it('should convert property to a circular link', async( () => { const circularLink = { 'source': 'http://www.knora.org/ontology/0000/testontology/v2#testResource1', 'target': 'http://www.knora.org/ontology/0000/testontology/v2#testResource1', diff --git a/src/app/project/ontology/ontology-visualizer/ontology-visualizer.component.ts b/src/app/project/ontology/ontology-visualizer/ontology-visualizer.component.ts index 21f9bbd758..988c8328b5 100644 --- a/src/app/project/ontology/ontology-visualizer/ontology-visualizer.component.ts +++ b/src/app/project/ontology/ontology-visualizer/ontology-visualizer.component.ts @@ -1,4 +1,4 @@ -import {Component, Inject, Input, OnInit, Output} from '@angular/core'; +import { Component, Inject, Input, OnInit, Output } from '@angular/core'; import { ClassDefinition, KnoraApiConnection, ReadOntology } from '@dasch-swiss/dsp-js'; import { DspApiConnectionToken } from '@dasch-swiss/dsp-ui'; import { Link, Node } from '../../../../../node_modules/d3-force-3d'; @@ -51,13 +51,13 @@ export class OntologyVisualizerComponent implements OnInit { newLabel = iri; } - return {'ontoName': ontoName, 'type': type, 'newLabel': newLabel}; + return { 'ontoName': ontoName, 'type': type, 'newLabel': newLabel }; } getSubclassLinksAndExternalResources(res: ClassDefinition): void { for (const item of res.subClassOf) { if (!this.isInNodes(item)) { const nodeInfo = this.createLabelFromIRI(item); - this.nodes.push({'id': item, 'label': nodeInfo.newLabel, 'group': 'resource', 'class': 'external'}); + this.nodes.push({ 'id': item, 'label': nodeInfo.newLabel, 'group': 'resource', 'class': 'external' }); } const source = res.id; const target = item; @@ -67,7 +67,7 @@ export class OntologyVisualizerComponent implements OnInit { rotation = 1; curvature = 0.5; } - const link = {'source': res.id, 'target': item, 'label': 'subClassOf', 'rotation': rotation, 'curvature': curvature}; + const link = { 'source': res.id, 'target': item, 'label': 'subClassOf', 'rotation': rotation, 'curvature': curvature }; this.links.push(link); } } @@ -75,7 +75,7 @@ export class OntologyVisualizerComponent implements OnInit { addResourceClassesToNodes() { for (const res of this.ontoClasses) { const resInfo = this.createLabelFromIRI(res.id); - const node = {'id': res.id, 'label': resInfo.newLabel, 'group': 'resource', 'class': 'native'}; + const node = { 'id': res.id, 'label': resInfo.newLabel, 'group': 'resource', 'class': 'native' }; this.nodes.push(node); } } @@ -85,10 +85,10 @@ export class OntologyVisualizerComponent implements OnInit { const nodeInfo = this.createLabelFromIRI(targetID); if (targetID.endsWith('Value')) { targetID = resLabel + '_' + propID.split('#', 2)[1]; - newNode = {'id': targetID, 'label': nodeInfo.newLabel, 'group': 'literal', 'class': nodeInfo.type}; + newNode = { 'id': targetID, 'label': nodeInfo.newLabel, 'group': 'literal', 'class': nodeInfo.type }; // object Value is a resource defined in another ontology } else { - newNode = {'id': targetID, 'label': nodeInfo.newLabel, 'group': 'resource', 'class': 'external'}; + newNode = { 'id': targetID, 'label': nodeInfo.newLabel, 'group': 'resource', 'class': 'external' }; } if (!this.isInNodes(targetID)) { this.nodes.push(newNode); @@ -112,13 +112,13 @@ export class OntologyVisualizerComponent implements OnInit { rotation = 1; curvature = 0.5; } - const link = {'source': source, 'target': target, 'label': proplabel, 'rotation': rotation, 'curvature': curvature}; + const link = { 'source': source, 'target': target, 'label': proplabel, 'rotation': rotation, 'curvature': curvature }; this.links.push(link); } } } - return { 'nodes': this.nodes, 'links': this.links}; + return { 'nodes': this.nodes, 'links': this.links }; } ngOnInit() { this.graphInfo = this.convertOntolologytoGraph(); diff --git a/src/app/project/ontology/ontology-visualizer/visualizer/visualizer.component.html b/src/app/project/ontology/ontology-visualizer/visualizer/visualizer.component.html index 9c4bbd54e5..a6ba2e09e0 100644 --- a/src/app/project/ontology/ontology-visualizer/visualizer/visualizer.component.html +++ b/src/app/project/ontology/ontology-visualizer/visualizer/visualizer.component.html @@ -11,8 +11,8 @@ - Show Node Labels - Show Link Labels + Show Node Labels + Show Link Labels diff --git a/src/app/project/ontology/ontology-visualizer/visualizer/visualizer.component.spec.ts b/src/app/project/ontology/ontology-visualizer/visualizer/visualizer.component.spec.ts index 0f92f31320..c48f1cdc82 100644 --- a/src/app/project/ontology/ontology-visualizer/visualizer/visualizer.component.spec.ts +++ b/src/app/project/ontology/ontology-visualizer/visualizer/visualizer.component.spec.ts @@ -6,24 +6,24 @@ import { MatSliderModule } from '@angular/material/slider'; import { VisualizerComponent } from './visualizer.component'; describe('VisualizerComponent', () => { - let component: VisualizerComponent; - let fixture: ComponentFixture; + let component: VisualizerComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ VisualizerComponent ], - imports: [ - MatRadioModule, - MatSliderModule, - MatSlideToggleModule - ], - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ VisualizerComponent ], + imports: [ + MatRadioModule, + MatSliderModule, + MatSlideToggleModule + ], + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(VisualizerComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(VisualizerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); }); diff --git a/src/app/project/ontology/ontology-visualizer/visualizer/visualizer.component.ts b/src/app/project/ontology/ontology-visualizer/visualizer/visualizer.component.ts index 66b67980ff..cee5cd65ae 100644 --- a/src/app/project/ontology/ontology-visualizer/visualizer/visualizer.component.ts +++ b/src/app/project/ontology/ontology-visualizer/visualizer/visualizer.component.ts @@ -1,4 +1,4 @@ -import {Component, OnInit, ViewChild, ElementRef, AfterViewInit, Input} from '@angular/core'; +import { Component, OnInit, ViewChild, ElementRef, AfterViewInit, Input } from '@angular/core'; import { MatRadioChange } from '@angular/material/radio'; import { MatSlideToggle } from '@angular/material/slide-toggle'; @@ -14,12 +14,12 @@ export interface Coordinates { } @Component({ - selector: 'app-visualizer', - templateUrl: './visualizer.component.html', - styleUrls: ['./visualizer.component.scss'] + selector: 'app-visualizer', + templateUrl: './visualizer.component.html', + styleUrls: ['./visualizer.component.scss'] }) export class VisualizerComponent implements OnInit, AfterViewInit { - @ViewChild('graphcontainer', {read: ElementRef}) graphcontainer: ElementRef; + @ViewChild('graphcontainer', { read: ElementRef }) graphcontainer: ElementRef; @Input() graphInfo; graph = ForceGraph3D(); dimension = '3'; @@ -32,21 +32,21 @@ export class VisualizerComponent implements OnInit, AfterViewInit { if (this.showNodeLabel) { depthWrite = false; } - const sprite = new SpriteText(node[`label`], 1); + const sprite = new SpriteText(node['label'], 1); sprite.fontFace = 'Arial'; sprite.fontWeight = 'bold'; sprite.textHeight = 8; sprite.color = 'black'; const geometricalWidth = sprite.text.length + 5; let geometry; - if (node[`group`] === 'literal') { + if (node['group'] === 'literal') { geometry = new THREE.BoxGeometry(geometricalWidth, 12, 10); } else { geometry = new THREE.SphereGeometry(10, geometricalWidth, 12); geometry.applyMatrix4(new THREE.Matrix4().makeScale(2, 1.0, 1.5)); } const material = new THREE.MeshLambertMaterial({ - color: node[`color`], + color: node['color'], depthWrite: depthWrite, transparent: false, opacity: 1 @@ -73,7 +73,7 @@ export class VisualizerComponent implements OnInit, AfterViewInit { return middlePos; } ngOnInit(): void { - const gData = {'nodes': this.graphInfo.nodes, 'links': this.graphInfo.links}; + const gData = { 'nodes': this.graphInfo.nodes, 'links': this.graphInfo.links }; this.graph.graphData(gData); this.graph.width(1280); // node design @@ -93,13 +93,13 @@ export class VisualizerComponent implements OnInit, AfterViewInit { if (this.showLinkLabel === true) { this.graph.linkThreeObject(link => { // extend link with text sprite - const sprite = new SpriteText(link[`label`]); + const sprite = new SpriteText(link['label']); sprite.color = 'lightgrey'; sprite.textHeight = 3; sprite.fontWeight = 'bold'; return sprite; }); - this.graph.linkPositionUpdate((sprite, {start, end}) => { + this.graph.linkPositionUpdate((sprite, { start, end }) => { // position sprite Object.assign(sprite.position, this.calcMiddlePos(start, end)); return false; @@ -130,12 +130,12 @@ export class VisualizerComponent implements OnInit, AfterViewInit { } } - LinkLabelHandler(showlinkLabel: MatSlideToggle) { + linkLabelHandler(showlinkLabel: MatSlideToggle) { this.showLinkLabel = showlinkLabel.checked; this.ngOnInit(); // re-heat simulation } - NodeLabelHandler(showNodeLabel: MatSlideToggle) { + nodeLabelHandler(showNodeLabel: MatSlideToggle) { this.showNodeLabel = showNodeLabel.checked; this.ngOnInit(); // re-heat simulation } diff --git a/src/app/project/ontology/ontology.component.spec.ts b/src/app/project/ontology/ontology.component.spec.ts index 32ccff87ef..0bff601192 100644 --- a/src/app/project/ontology/ontology.component.spec.ts +++ b/src/app/project/ontology/ontology.component.spec.ts @@ -95,9 +95,7 @@ describe('OntologyComponent', () => { let store = {}; spyOn(localStorage, 'getItem').and.callFake( - (key: string): string => { - return store[key] || null; - } + (key: string): string => store[key] || null ); spyOn(localStorage, 'removeItem').and.callFake( (key: string): void => { @@ -105,9 +103,7 @@ describe('OntologyComponent', () => { } ); spyOn(localStorage, 'setItem').and.callFake( - (key: string, value: string): string => { - return (store[key] = value); - } + (key: string, value: string): string => (store[key] = value) ); spyOn(localStorage, 'clear').and.callFake(() => { store = {}; diff --git a/src/app/project/ontology/ontology.component.ts b/src/app/project/ontology/ontology.component.ts index 55b2e6502d..69ea937390 100644 --- a/src/app/project/ontology/ontology.component.ts +++ b/src/app/project/ontology/ontology.component.ts @@ -40,6 +40,8 @@ export interface OntologyInfo { }) export class OntologyComponent implements OnInit { + @ViewChild('ontologyEditor', { read: ViewContainerRef }) ontologyEditor: ViewContainerRef; + // general loading status for progess indicator loading: boolean; @@ -48,8 +50,8 @@ export class OntologyComponent implements OnInit { // permissions of logged-in user session: Session; - sysAdmin: boolean = false; - projectAdmin: boolean = false; + sysAdmin = false; + projectAdmin = false; // project shortcode; as identifier in project cache service projectcode: string; @@ -92,8 +94,6 @@ export class OntologyComponent implements OnInit { */ defaultClasses: DefaultInfo[] = DefaultResourceClasses.data; - @ViewChild('ontologyEditor', { read: ViewContainerRef }) ontologyEditor: ViewContainerRef; - // @ViewChild(AddToDirective, { static: false }) addToHost: AddToDirective; // @ViewChild('addResourceClassComponent', { static: false }) addResourceClass: AddResourceClassComponent; @@ -298,7 +298,7 @@ export class OntologyComponent implements OnInit { } /** - * Opens ontology route by iri + * opens ontology route by iri * @param id ontology id/iri * @param view 'classes' | 'properties' | ' graph' */ @@ -322,7 +322,7 @@ export class OntologyComponent implements OnInit { } /** - * Opens ontology form + * opens ontology form * @param mode * @param [iri] only in edit mode */ @@ -355,7 +355,7 @@ export class OntologyComponent implements OnInit { } /** - * Opens resource class form + * opens resource class form * @param mode * @param resClassInfo (could be subClassOf (create mode) or resource class itself (edit mode)) */ @@ -383,7 +383,7 @@ export class OntologyComponent implements OnInit { } /** - * Updates cardinality + * updates cardinality * @param subClassOf resource class */ updateCard(subClassOf: ResourceClassDefinition) { @@ -410,7 +410,7 @@ export class OntologyComponent implements OnInit { } /** - * Delete either ontology or resource class + * delete either ontology or resource class * * @param mode Can be 'Ontology' or 'ResourceClass' * @param id diff --git a/src/app/project/ontology/property-form/property-form.component.html b/src/app/project/ontology/property-form/property-form.component.html index ff84b44a65..45d5300ed9 100644 --- a/src/app/project/ontology/property-form/property-form.component.html +++ b/src/app/project/ontology/property-form/property-form.component.html @@ -52,7 +52,7 @@
-
+
Select list @@ -63,7 +63,7 @@
-
+
Select resource class @@ -75,7 +75,7 @@
+ *ngSwitchCase="propertyForm.controls['type'].value.objectType === dspConstants.IntValue || propertyForm.controls['type'].value.objectType === dspConstants.DecimalValue ? propertyForm.controls['type'].value.objectType : ''"> Define range diff --git a/src/app/project/ontology/property-form/property-form.component.ts b/src/app/project/ontology/property-form/property-form.component.ts index 49dbefa972..0d680e3391 100644 --- a/src/app/project/ontology/property-form/property-form.component.ts +++ b/src/app/project/ontology/property-form/property-form.component.ts @@ -20,7 +20,7 @@ import { CacheService } from 'src/app/main/cache/cache.service'; import { ErrorHandlerService } from 'src/app/main/error/error-handler.service'; import { Category, DefaultProperties, PropertyType } from '../default-data/default-properties'; -// TODO: should be removed and replaced by AutocompleteItem from dsp-ui +// --> TODO should be removed and replaced by AutocompleteItem from dsp-ui /** * a list, which is used in the mat-autocomplete form field * contains objects with id and name. the id is usual the iri @@ -60,7 +60,7 @@ export class PropertyFormComponent implements OnInit { // selection of default property types propertyTypes: Category[] = DefaultProperties.data; - showGuiAttr: boolean = false; + showGuiAttr = false; // list of project specific lists (TODO: probably we have to add default knora lists?!) lists: ListNodeInfo[]; @@ -80,7 +80,7 @@ export class PropertyFormComponent implements OnInit { loading = false; - Constants = Constants; + dspConstants = Constants; constructor( @Inject(DspApiConnectionToken) private _dspApiConnection: KnoraApiConnection, @@ -225,7 +225,7 @@ export class PropertyFormComponent implements OnInit { let obj: PropertyType; // find gui ele from list of default property-types to set type value for (const group of this.propertyTypes) { - obj = group.elements.find(i => i.gui_ele === tempProp.guiElement && (i.objectType === tempProp.objectType || i.subPropOf === tempProp.subPropertyOf[0])); + obj = group.elements.find(i => i.guiEle === tempProp.guiElement && (i.objectType === tempProp.objectType || i.subPropOf === tempProp.subPropertyOf[0])); if (obj) { this.propertyForm.controls['type'].setValue(obj); @@ -242,7 +242,7 @@ export class PropertyFormComponent implements OnInit { const i = tempProp.guiAttributes.findIndex(element => element.includes('hlist')); // find content beteween pointy brackets to get list iri - const re: RegExp = /\<([^)]+)\>/; + const re = /\<([^)]+)\>/; const listIri = tempProp.guiAttributes[i].match(re)[1]; this.showGuiAttr = true; diff --git a/src/app/project/ontology/property-info/property-info.component.spec.ts b/src/app/project/ontology/property-info/property-info.component.spec.ts index 74247a9dcf..f7fefcb12a 100644 --- a/src/app/project/ontology/property-info/property-info.component.spec.ts +++ b/src/app/project/ontology/property-info/property-info.component.spec.ts @@ -13,11 +13,11 @@ import { CacheService } from 'src/app/main/cache/cache.service'; import { PropertyInfoComponent } from './property-info.component'; /** - * Test host component to simulate parent component + * test host component to simulate parent component * Property is of type simple text */ @Component({ - template: `` + template: '' }) class SimpleTextHostComponent { @@ -53,11 +53,11 @@ class SimpleTextHostComponent { } /** - * Test host component to simulate parent component + * test host component to simulate parent component * Property is of type resource link */ @Component({ - template: `` + template: '' }) class LinkHostComponent { @@ -99,11 +99,11 @@ class LinkHostComponent { } /** - * Test host component to simulate parent component + * test host component to simulate parent component * Property is of type list dropdown */ @Component({ - template: `` + template: '' }) class ListHostComponent { diff --git a/src/app/project/ontology/property-info/property-info.component.ts b/src/app/project/ontology/property-info/property-info.component.ts index ee8ff5b447..8221682a87 100644 --- a/src/app/project/ontology/property-info/property-info.component.ts +++ b/src/app/project/ontology/property-info/property-info.component.ts @@ -82,7 +82,7 @@ export class PropertyInfoComponent implements OnInit, AfterContentInit { // find gui ele from list of default property-types to set type value if (this.propDef.guiElement) { for (const group of this.propertyTypes) { - this.propType = group.elements.find(i => i.gui_ele === this.propDef.guiElement && (i.objectType === this.propDef.objectType || i.subPropOf === this.propDef.subPropertyOf[0])); + this.propType = group.elements.find(i => i.guiEle === this.propDef.guiElement && (i.objectType === this.propDef.objectType || i.subPropOf === this.propDef.subPropertyOf[0])); if (this.propType) { break; @@ -126,7 +126,7 @@ export class PropertyInfoComponent implements OnInit, AfterContentInit { // get current ontology lists to get linked list information this._cache.get('currentOntologyLists').subscribe( (response: ListNodeInfo[]) => { - const re: RegExp = /\<([^)]+)\>/; + const re = /\<([^)]+)\>/; const listIri = this.propDef.guiAttributes[0].match(re)[1]; const listUrl = `/project/${this.projectcode}/lists/${encodeURIComponent(listIri)}`; const list = response.find(i => i.id === listIri); diff --git a/src/app/project/ontology/resource-class-form/resource-class-form.component.ts b/src/app/project/ontology/resource-class-form/resource-class-form.component.ts index d02d80e011..2551a57349 100644 --- a/src/app/project/ontology/resource-class-form/resource-class-form.component.ts +++ b/src/app/project/ontology/resource-class-form/resource-class-form.component.ts @@ -55,8 +55,6 @@ export class ResourceClassFormComponent implements OnInit, OnDestroy, AfterViewC * this will be used to update title of resource class form */ @Input() name: string; - // store name as resourceClassTitle on init; in this case it can't be overwritten in the next / prev navigation - resourceClassTitle: string; // two step form: which should be active? /** @@ -64,7 +62,7 @@ export class ResourceClassFormComponent implements OnInit, OnDestroy, AfterViewC * true => step 1 shows label and comment of resource class * false => step 2 shows list of properties of resource class */ - @Input() showResourceClassForm: boolean = true; + @Input() showResourceClassForm = true; /** * edit mode (true); otherwise create mode @@ -79,7 +77,10 @@ export class ResourceClassFormComponent implements OnInit, OnDestroy, AfterViewC /** * update title and subtitle in dialog header (by switching from step 1 (resource class) to step 2 (properties)) */ - @Output() updateParent: EventEmitter<{ title: string, subtitle: string }> = new EventEmitter<{ title: string, subtitle: string }>(); + @Output() updateParent: EventEmitter<{ title: string; subtitle: string }> = new EventEmitter<{ title: string; subtitle: string }>(); + + // store name as resourceClassTitle on init; in this case it can't be overwritten in the next / prev navigation + resourceClassTitle: string; // current ontology; will get it from cache by key 'currentOntology' ontology: ReadOntology; @@ -120,7 +121,7 @@ export class ResourceClassFormComponent implements OnInit, OnDestroy, AfterViewC existingPropertyNames: [RegExp]; - // TODO: move to knora-api-js-lib + // --> TODO move to knora-api-js-lib // nameRegex: RegExp = /^(?![0-9]).(?![\u00C0-\u017F]).[a-zA-Z0-9]+\S*$/; // form errors on the following fields: @@ -341,7 +342,7 @@ export class ResourceClassFormComponent implements OnInit, OnDestroy, AfterViewC // form navigation: /** - * Go to next step: from resource-class form forward to properties form + * go to next step: from resource-class form forward to properties form * In create mode only */ nextStep(ev: Event) { @@ -361,7 +362,7 @@ export class ResourceClassFormComponent implements OnInit, OnDestroy, AfterViewC } } /** - * Go to previous step: from properties form back to resource-class form + * go to previous step: from properties form back to resource-class form * In create mode only */ prevStep(ev: Event) { @@ -374,7 +375,7 @@ export class ResourceClassFormComponent implements OnInit, OnDestroy, AfterViewC // submit /** - * Submit data to create resource class with properties and cardinalities + * submit data to create resource class with properties and cardinalities */ submitData() { this.loading = true; @@ -470,7 +471,7 @@ export class ResourceClassFormComponent implements OnInit, OnDestroy, AfterViewC } /** - * Close dialog box and reset all forms + * close dialog box and reset all forms */ closeMessage() { this.resourceClassForm.reset(); @@ -533,7 +534,7 @@ export class ResourceClassFormComponent implements OnInit, OnDestroy, AfterViewC // prepare payload for property const newResProp = new CreateResourceProperty(); newResProp.name = uniquePropName; - // TODO: update prop.label and use StringLiteralInput in property-form + // --> TODO update prop.label and use StringLiteralInput in property-form newResProp.label = [ { 'value': prop.label, @@ -541,7 +542,7 @@ export class ResourceClassFormComponent implements OnInit, OnDestroy, AfterViewC } ]; if (prop.guiAttr) { - switch (prop.type.gui_ele) { + switch (prop.type.guiEle) { case Constants.SalsahGui + Constants.HashDelimiter + 'Colorpicker': newResProp.guiAttributes = ['ncolors=' + prop.guiAttr]; @@ -552,22 +553,22 @@ export class ResourceClassFormComponent implements OnInit, OnDestroy, AfterViewC newResProp.guiAttributes = ['hlist=<' + prop.guiAttr + '>']; break; case Constants.SalsahGui + Constants.HashDelimiter + 'SimpleText': - // TODO: could have two guiAttr fields: size and maxlength + // --> TODO could have two guiAttr fields: size and maxlength // we suggest to use default value for size; we do not support this guiAttr in DSP-App newResProp.guiAttributes = ['maxlength=' + prop.guiAttr]; break; case Constants.SalsahGui + Constants.HashDelimiter + 'Spinbox': - // TODO: could have two guiAttr fields: min and max + // --> TODO could have two guiAttr fields: min and max newResProp.guiAttributes = ['min=' + prop.guiAttr, 'max=' + prop.guiAttr]; break; case Constants.SalsahGui + Constants.HashDelimiter + 'Textarea': - // TODO: could have four guiAttr fields: width, cols, rows, wrap + // --> TODO could have four guiAttr fields: width, cols, rows, wrap // we suggest to use default values; we do not support this guiAttr in DSP-App newResProp.guiAttributes = ['width=100%']; break; } } - newResProp.guiElement = prop.type.gui_ele; + newResProp.guiElement = prop.type.guiEle; newResProp.subPropertyOf = [prop.type.subPropOf]; if (prop.type.subPropOf === Constants.HasLinkTo) { diff --git a/src/app/project/ontology/resource-class-form/resource-class-form.service.ts b/src/app/project/ontology/resource-class-form/resource-class-form.service.ts index 0423b9aacd..8b67cbad75 100644 --- a/src/app/project/ontology/resource-class-form/resource-class-form.service.ts +++ b/src/app/project/ontology/resource-class-form/resource-class-form.service.ts @@ -61,7 +61,7 @@ export class PropertyForm { this.guiAttr.setValue(property.guiAttr); // this.permission.setValue(property.permission); - // TODO: permission is not implemented yet + // --> TODO permission is not implemented yet // this.permission.setValidators([Validators.required]); } } @@ -100,7 +100,8 @@ export class ResourceClassForm { }) export class ResourceClassFormService { - private resourceClassForm: BehaviorSubject = new BehaviorSubject(this._fb.group( + + resourceClassForm: BehaviorSubject = new BehaviorSubject(this._fb.group( new ResourceClassForm(new ResourceClass()) )); @@ -121,7 +122,7 @@ export class ResourceClassFormService { } /** - * Sets properties in case of update resource class' cardinalities + * sets properties in case of update resource class' cardinalities * @param resClass */ setProperties(resClass: ResourceClassDefinition, ontoProperties: PropertyDefinition[]) { @@ -207,7 +208,7 @@ export class ResourceClassFormService { } /** - * Create a unique name (id) for resource classes or properties; + * create a unique name (id) for resource classes or properties; * * @param ontologyIri * @param [label] @@ -227,7 +228,7 @@ export class ResourceClassFormService { } /** - * Get the ontolgoy name from ontology iri + * get the ontolgoy name from ontology iri * * @param {string} ontologyIri * @returns string @@ -242,7 +243,7 @@ export class ResourceClassFormService { } /** - * Convert cardinality values (multiple? & required?) from form to DSP-JS cardinality enum 1-n, 0-n, 1, 0-1 + * convert cardinality values (multiple? & required?) from form to DSP-JS cardinality enum 1-n, 0-n, 1, 0-1 * @param {boolean} multiple * @param {boolean} required * @returns Cardinality diff --git a/src/app/project/ontology/resource-class-info/resource-class-info.component.spec.ts b/src/app/project/ontology/resource-class-info/resource-class-info.component.spec.ts index b92524ea03..84263f17b0 100644 --- a/src/app/project/ontology/resource-class-info/resource-class-info.component.spec.ts +++ b/src/app/project/ontology/resource-class-info/resource-class-info.component.spec.ts @@ -16,7 +16,7 @@ import { ResourceClassInfoComponent } from './resource-class-info.component'; * Property is of type simple text */ @Component({ - template: `` + template: '' }) class HostComponent implements OnInit { diff --git a/src/app/project/permission/add-group/add-group.component.spec.ts b/src/app/project/permission/add-group/add-group.component.spec.ts index e78989208a..7603433e51 100644 --- a/src/app/project/permission/add-group/add-group.component.spec.ts +++ b/src/app/project/permission/add-group/add-group.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { AddGroupComponent } from './add-group.component'; describe('AddGroupComponent', () => { - let component: AddGroupComponent; - let fixture: ComponentFixture; + let component: AddGroupComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ AddGroupComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AddGroupComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(AddGroupComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(AddGroupComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/src/app/project/permission/add-group/add-group.component.ts b/src/app/project/permission/add-group/add-group.component.ts index 47b49fd53a..716b3e5afb 100644 --- a/src/app/project/permission/add-group/add-group.component.ts +++ b/src/app/project/permission/add-group/add-group.component.ts @@ -1,22 +1,22 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; @Component({ - selector: 'app-add-group', - templateUrl: './add-group.component.html', - styleUrls: ['./add-group.component.scss'] + selector: 'app-add-group', + templateUrl: './add-group.component.html', + styleUrls: ['./add-group.component.scss'] }) export class AddGroupComponent implements OnInit { - @Input() projectcode: string; + @Input() projectcode: string; - @Output() refreshParent: EventEmitter = new EventEmitter(); + @Output() refreshParent: EventEmitter = new EventEmitter(); - constructor () { } + constructor () { } - ngOnInit() { - } + ngOnInit() { + } - buildForm(): void { + buildForm(): void { - } + } } diff --git a/src/app/project/permission/permission.component.spec.ts b/src/app/project/permission/permission.component.spec.ts index 2b81e5c7b7..5b2950424c 100644 --- a/src/app/project/permission/permission.component.spec.ts +++ b/src/app/project/permission/permission.component.spec.ts @@ -73,9 +73,7 @@ describe('PermissionComponent', () => { let store = {}; spyOn(localStorage, 'getItem').and.callFake( - (key: string): string => { - return store[key] || null; - } + (key: string): string => store[key] || null ); spyOn(localStorage, 'removeItem').and.callFake( (key: string): void => { @@ -83,9 +81,7 @@ describe('PermissionComponent', () => { } ); spyOn(localStorage, 'setItem').and.callFake( - (key: string, value: string): string => { - return (store[key] = value); - } + (key: string, value: string): string => (store[key] = value) ); spyOn(localStorage, 'clear').and.callFake(() => { store = {}; diff --git a/src/app/project/permission/permission.component.ts b/src/app/project/permission/permission.component.ts index 3de47b0181..5c2b0abf6d 100644 --- a/src/app/project/permission/permission.component.ts +++ b/src/app/project/permission/permission.component.ts @@ -21,13 +21,15 @@ import { AddGroupComponent } from './add-group/add-group.component'; }) export class PermissionComponent implements OnInit { + @ViewChild('addGroupComponent') addGroup: AddGroupComponent; + // loading for progess indicator loading: boolean; // permissions of logged-in user session: Session; - sysAdmin: boolean = false; - projectAdmin: boolean = false; + sysAdmin = false; + projectAdmin = false; // project shortcode; as identifier in project cache service projectcode: string; @@ -38,7 +40,6 @@ export class PermissionComponent implements OnInit { // project members projectGroups: ReadGroup[] = []; - @ViewChild('addGroupComponent') addGroup: AddGroupComponent; constructor( @Inject(DspApiConnectionToken) private _dspApiConnection: KnoraApiConnection, diff --git a/src/app/project/project-form/project-form.component.ts b/src/app/project/project-form/project-form.component.ts index 782e411acf..4aaca68e15 100644 --- a/src/app/project/project-form/project-form.component.ts +++ b/src/app/project/project-form/project-form.component.ts @@ -27,14 +27,14 @@ import { CacheService } from '../../main/cache/cache.service'; export class ProjectFormComponent implements OnInit { /** - * Param of project form component: + * param of project form component: * Optional projectcode; if exists we are in edit mode * otherwise we build empty form to create new project */ @Input() projectcode?: string; /** - * Output of project form component: + * output of project form component: * emits info to parent that dialog box was closed */ @Output() closeDialog: EventEmitter = new EventEmitter(); @@ -45,7 +45,7 @@ export class ProjectFormComponent implements OnInit { loading = true; // is the logged-in user system admin? - sysAdmin: boolean = false; + sysAdmin = false; /** * shortcode and shortname must be unique @@ -195,7 +195,7 @@ export class ProjectFormComponent implements OnInit { } /** - * Build form with project data + * build form with project data * Project data contains exising data (edit mode) * or no data (create mode) => new ReadProject() * @@ -207,7 +207,7 @@ export class ProjectFormComponent implements OnInit { // edit mode is true, when a projectcode exists // disabled is true, if project status is false (= archived); - const disabled: boolean = (!project.status); + const disabled = (!project.status); // separate description if (!this.projectcode) { @@ -258,7 +258,7 @@ export class ProjectFormComponent implements OnInit { } /** - * This method is for the form error handling + * this method is for the form error handling * * @param data Data which changed. */ @@ -284,7 +284,7 @@ export class ProjectFormComponent implements OnInit { } /** - * Gets string literal + * gets string literal * @param data */ getStringLiteral(data: StringLiteral[]) { @@ -334,8 +334,8 @@ export class ProjectFormComponent implements OnInit { // this.form.controls['keywords'].disabled = !this.project.status; // b) update description field / multi language preparation - // FIXME: this is a quick (hardcoded) hack: - // TODO: create multi language input fields + // fIXME: this is a quick (hardcoded) hack: + // --> TODO create multi language input fields // this.form.controls['description'].setValue([{ // 'language': 'en', // 'value': this.form.controls['description'].value @@ -439,12 +439,12 @@ export class ProjectFormComponent implements OnInit { } /** - * Deactivate project + * deactivate project * @param id Project Iri */ delete(id: string) { // ev.preventDefault(); - // TODO: "are you sure?"-dialog + // --> TODO "are you sure?"-dialog // if true this._dspApiConnection.admin.projectsEndpoint.deleteProject(id).subscribe( @@ -472,7 +472,7 @@ export class ProjectFormComponent implements OnInit { } /** - * Activate already deleted project + * activate already deleted project * * @param id Project Iri */ @@ -537,7 +537,7 @@ export class ProjectFormComponent implements OnInit { this.buildForm(project); - // TODO: fix "set value" for keywords field + // --> TODO fix "set value" for keywords field // this.form.controls['keywords'].setValue(this.keywords); } diff --git a/src/app/project/project.component.ts b/src/app/project/project.component.ts index 18998e0d8a..8200bea447 100644 --- a/src/app/project/project.component.ts +++ b/src/app/project/project.component.ts @@ -22,8 +22,8 @@ export class ProjectComponent implements OnInit { // permissions of logged-in user session: Session; - sysAdmin: boolean = false; - projectAdmin: boolean = false; + sysAdmin = false; + projectAdmin = false; // project shortcode; as identifier in project cache service projectcode: string; @@ -31,10 +31,10 @@ export class ProjectComponent implements OnInit { // project data project: ReadProject; - color: string = 'primary'; + color = 'primary'; // for the sidenav - open: boolean = true; + open = true; navigation: MenuItem[] = AppGlobal.projectNav; @@ -111,12 +111,12 @@ export class ProjectComponent implements OnInit { ); } else { // shortcode isn't valid - // TODO: show an error page + // --> TODO show an error page } } /** - * Checks if the shortcode is valid: hexadecimal and length = 4 + * checks if the shortcode is valid: hexadecimal and length = 4 * * @param code project shortcode which is a parameter in the route */ diff --git a/src/app/system/groups/groups.component.ts b/src/app/system/groups/groups.component.ts index 04cf82b624..44d1b3f482 100644 --- a/src/app/system/groups/groups.component.ts +++ b/src/app/system/groups/groups.component.ts @@ -1,17 +1,17 @@ import { Component, OnInit } from '@angular/core'; @Component({ - selector: 'app-groups', - templateUrl: './groups.component.html', - styleUrls: ['./groups.component.scss'] + selector: 'app-groups', + templateUrl: './groups.component.html', + styleUrls: ['./groups.component.scss'] }) export class GroupsComponent implements OnInit { - loading: boolean = false; + loading = false; - constructor () { } + constructor () { } - ngOnInit() { - } + ngOnInit() { + } } diff --git a/src/app/system/projects/projects-list/projects-list.component.spec.ts b/src/app/system/projects/projects-list/projects-list.component.spec.ts index 0aeb71d5a9..22e39c8d4c 100644 --- a/src/app/system/projects/projects-list/projects-list.component.spec.ts +++ b/src/app/system/projects/projects-list/projects-list.component.spec.ts @@ -61,9 +61,7 @@ describe('ProjectsListComponent', () => { let store = {}; spyOn(localStorage, 'getItem').and.callFake( - (key: string): string => { - return store[key] || null; - } + (key: string): string => store[key] || null ); spyOn(localStorage, 'removeItem').and.callFake( (key: string): void => { @@ -71,9 +69,7 @@ describe('ProjectsListComponent', () => { } ); spyOn(localStorage, 'setItem').and.callFake( - (key: string, value: string): string => { - return (store[key] = value); - } + (key: string, value: string): string => (store[key] = value) ); spyOn(localStorage, 'clear').and.callFake(() => { store = {}; diff --git a/src/app/system/projects/projects-list/projects-list.component.ts b/src/app/system/projects/projects-list/projects-list.component.ts index 8d3b6dde40..8923b2cf93 100644 --- a/src/app/system/projects/projects-list/projects-list.component.ts +++ b/src/app/system/projects/projects-list/projects-list.component.ts @@ -26,19 +26,6 @@ import { ErrorHandlerService } from 'src/app/main/error/error-handler.service'; styleUrls: ['./projects-list.component.scss'] }) export class ProjectsListComponent implements OnInit { - // loading for progess indicator - loading: boolean; - - // permissions of logged-in user - session: Session; - sysAdmin: boolean = false; - projectAdmin: boolean = false; - - // list of default, dsp-specific projects, which are not able to be deleted or to be editied - doNotDelete: string[] = [ - Constants.SystemProjectIRI, - Constants.DefaultSharedOntologyIRI - ]; // list of users: status active or inactive (deleted) @Input() status: boolean; @@ -47,11 +34,25 @@ export class ProjectsListComponent implements OnInit { @Input() list: StoredProject[]; // enable the button to create new project - @Input() createNew: boolean = false; + @Input() createNew = false; // in case of modification @Output() refreshParent: EventEmitter = new EventEmitter(); + // loading for progess indicator + loading: boolean; + + // permissions of logged-in user + session: Session; + sysAdmin = false; + projectAdmin = false; + + // list of default, dsp-specific projects, which are not able to be deleted or to be editied + doNotDelete: string[] = [ + Constants.SystemProjectIRI, + Constants.DefaultSharedOntologyIRI + ]; + // i18n plural mapping itemPluralMapping = { project: { @@ -77,7 +78,7 @@ export class ProjectsListComponent implements OnInit { ]; // ... and sort by 'longname' - sortBy: string = 'longname'; + sortBy = 'longname'; constructor( @Inject(DspApiConnectionToken) private _dspApiConnection: KnoraApiConnection, @@ -123,7 +124,7 @@ export class ProjectsListComponent implements OnInit { } /** - * Navigate to the project pages (e.g. board, collaboration or ontology) + * navigate to the project pages (e.g. board, collaboration or ontology) * * @param code * @param page diff --git a/src/app/system/projects/projects.component.ts b/src/app/system/projects/projects.component.ts index c92630b2a7..f3eba7827b 100644 --- a/src/app/system/projects/projects.component.ts +++ b/src/app/system/projects/projects.component.ts @@ -24,12 +24,6 @@ import { CacheService } from '../../main/cache/cache.service'; }) export class ProjectsComponent implements OnInit { - /** - * general variables - */ - loading: boolean; - error: any; - /** * if username is definded: show only projects, * where this user is member of; @@ -40,6 +34,12 @@ export class ProjectsComponent implements OnInit { // do we still need this? NO! @Input() system?: boolean = true; + /** + * general variables + */ + loading: boolean; + error: any; + /** * who is logged-in? does he have project-admin, system-admin or no rights? * get the information from localstorage diff --git a/src/app/system/system.component.spec.ts b/src/app/system/system.component.spec.ts index b49ac1c907..d20a0eb905 100644 --- a/src/app/system/system.component.spec.ts +++ b/src/app/system/system.component.spec.ts @@ -36,9 +36,7 @@ describe('SystemComponent', () => { let store = {}; spyOn(localStorage, 'getItem').and.callFake( - (key: string): string => { - return store[key] || null; - } + (key: string): string => store[key] || null ); spyOn(localStorage, 'removeItem').and.callFake( (key: string): void => { @@ -46,9 +44,7 @@ describe('SystemComponent', () => { } ); spyOn(localStorage, 'setItem').and.callFake( - (key: string, value: string): string => { - return (store[key] = value); - } + (key: string, value: string): string => (store[key] = value) ); spyOn(localStorage, 'clear').and.callFake(() => { store = {}; diff --git a/src/app/system/system.component.ts b/src/app/system/system.component.ts index 5c3c463236..1066e72c75 100644 --- a/src/app/system/system.component.ts +++ b/src/app/system/system.component.ts @@ -12,9 +12,9 @@ import { SessionService } from '@dasch-swiss/dsp-ui'; }) export class SystemComponent implements OnInit { - loading: boolean = true; + loading = true; - sysAdmin: boolean = false; + sysAdmin = false; navigation: MenuItem[] = AppGlobal.systemNav; diff --git a/src/app/system/users/users-list/users-list.component.spec.ts b/src/app/system/users/users-list/users-list.component.spec.ts index 29ebb1d0a0..1a4d8ea0e1 100644 --- a/src/app/system/users/users-list/users-list.component.spec.ts +++ b/src/app/system/users/users-list/users-list.component.spec.ts @@ -83,9 +83,7 @@ describe('UsersListComponent', () => { let store = {}; spyOn(localStorage, 'getItem').and.callFake( - (key: string): string => { - return store[key] || null; - } + (key: string): string => store[key] || null ); spyOn(localStorage, 'removeItem').and.callFake( (key: string): void => { @@ -93,9 +91,7 @@ describe('UsersListComponent', () => { } ); spyOn(localStorage, 'setItem').and.callFake( - (key: string, value: string): string => { - return (store[key] = value); - } + (key: string, value: string): string => (store[key] = value) ); spyOn(localStorage, 'clear').and.callFake(() => { store = {}; diff --git a/src/app/system/users/users-list/users-list.component.ts b/src/app/system/users/users-list/users-list.component.ts index 6b58c74bf2..29a87be645 100644 --- a/src/app/system/users/users-list/users-list.component.ts +++ b/src/app/system/users/users-list/users-list.component.ts @@ -24,13 +24,6 @@ import { ErrorHandlerService } from 'src/app/main/error/error-handler.service'; styleUrls: ['./users-list.component.scss'] }) export class UsersListComponent implements OnInit { - // loading for progess indicator - loading: boolean; - - // permissions of logged-in user - session: Session; - sysAdmin: boolean = false; - projectAdmin: boolean = false; // list of users: status active or inactive (deleted) @Input() status: boolean; @@ -39,11 +32,19 @@ export class UsersListComponent implements OnInit { @Input() list: ReadUser[]; // enable the button to create new user - @Input() createNew: boolean = false; + @Input() createNew = false; // in case of modification @Output() refreshParent: EventEmitter = new EventEmitter(); + // loading for progess indicator + loading: boolean; + + // permissions of logged-in user + session: Session; + sysAdmin = false; + projectAdmin = false; + // i18n plural mapping itemPluralMapping = { user: { @@ -89,7 +90,7 @@ export class UsersListComponent implements OnInit { ]; // ... and sort by 'username' - sortBy: string = 'username'; + sortBy = 'username'; constructor( @Inject(DspApiConnectionToken) private _dspApiConnection: KnoraApiConnection, @@ -174,7 +175,7 @@ export class UsersListComponent implements OnInit { */ userIsSystemAdmin(permissions: Permissions): boolean { - let admin: boolean = false; + let admin = false; const groupsPerProjectKeys: string[] = Object.keys(permissions.groupsPerProject); for (const key of groupsPerProjectKeys) { @@ -396,7 +397,7 @@ export class UsersListComponent implements OnInit { } /** - * Reactivate user + * reactivate user * * @param id user's IRI */ diff --git a/src/app/user/account/account.component.ts b/src/app/user/account/account.component.ts index e1bd84fa38..bf3a7818a8 100644 --- a/src/app/user/account/account.component.ts +++ b/src/app/user/account/account.component.ts @@ -21,14 +21,14 @@ import { CacheService } from '../../main/cache/cache.service'; }) export class AccountComponent implements OnInit { - loading: boolean; + // in case of modification + @Output() refreshParent: EventEmitter = new EventEmitter(); @Input() username: string; - user: ReadUser; + loading: boolean; - // in case of modification - @Output() refreshParent: EventEmitter = new EventEmitter(); + user: ReadUser; constructor( @Inject(DspApiConnectionToken) private _dspApiConnection: KnoraApiConnection, diff --git a/src/app/user/collection-list/collection-list.component.ts b/src/app/user/collection-list/collection-list.component.ts index 2edd5786a2..52c9255a1a 100644 --- a/src/app/user/collection-list/collection-list.component.ts +++ b/src/app/user/collection-list/collection-list.component.ts @@ -7,7 +7,7 @@ import { Title } from '@angular/platform-browser'; styleUrls: ['./collection-list.component.scss'] }) export class CollectionListComponent implements OnInit { - loading: boolean = false; + loading = false; constructor(private _titleService: Title) { // set the page title diff --git a/src/app/user/dashboard/dashboard.component.spec.ts b/src/app/user/dashboard/dashboard.component.spec.ts index 96e53477e8..614bd36b86 100644 --- a/src/app/user/dashboard/dashboard.component.spec.ts +++ b/src/app/user/dashboard/dashboard.component.spec.ts @@ -62,9 +62,7 @@ describe('DashboardComponent', () => { let store = {}; spyOn(localStorage, 'getItem').and.callFake( - (key: string): string => { - return store[key] || null; - } + (key: string): string => store[key] || null ); spyOn(localStorage, 'removeItem').and.callFake( (key: string): void => { @@ -72,9 +70,7 @@ describe('DashboardComponent', () => { } ); spyOn(localStorage, 'setItem').and.callFake( - (key: string, value: string): string => { - return (store[key] = value); - } + (key: string, value: string): string => (store[key] = value) ); spyOn(localStorage, 'clear').and.callFake(() => { store = {}; diff --git a/src/app/user/dashboard/dashboard.component.ts b/src/app/user/dashboard/dashboard.component.ts index 9451cdbeb6..10c6837765 100644 --- a/src/app/user/dashboard/dashboard.component.ts +++ b/src/app/user/dashboard/dashboard.component.ts @@ -12,13 +12,13 @@ import { ErrorHandlerService } from 'src/app/main/error/error-handler.service'; }) export class DashboardComponent implements OnInit { - loading: boolean = true; + loading = true; user: ReadUser; session: Session; username: string; - sysAdmin: boolean = false; + sysAdmin = false; showSystemProjects: boolean = this.sysAdmin; diff --git a/src/app/user/membership/membership.component.ts b/src/app/user/membership/membership.component.ts index 57b8f14281..89fe4323f3 100644 --- a/src/app/user/membership/membership.component.ts +++ b/src/app/user/membership/membership.component.ts @@ -15,7 +15,7 @@ import { CacheService } from 'src/app/main/cache/cache.service'; import { AutocompleteItem } from 'src/app/main/declarations/autocomplete-item'; import { ErrorHandlerService } from 'src/app/main/error/error-handler.service'; -// TODO: replace it by IPermissions from dsp-js +// --> TODO replace it by IPermissions from dsp-js export interface IPermissions { groupsPerProject: any; administrativePermissionsPerProject: any; @@ -28,16 +28,16 @@ export interface IPermissions { }) export class MembershipComponent implements OnInit { + @Input() username: string; + + @Output() closeDialog: EventEmitter = new EventEmitter(); + loading: boolean; session: Session; - @Input() username: string; - user: ReadUser; - @Output() closeDialog: EventEmitter = new EventEmitter(); - projects: AutocompleteItem[] = []; newProject = new FormControl(); @@ -122,7 +122,7 @@ export class MembershipComponent implements OnInit { } updateProjectCache(iri: string) { - // TODO: update cache of project + // --> TODO update cache of project // get shortcode from iri; not the best way right now const projectcode: string = iri.replace('http://rdfh.ch/projects/', ''); diff --git a/src/app/user/profile/profile.component.ts b/src/app/user/profile/profile.component.ts index e4a13196fc..20a268cd8a 100644 --- a/src/app/user/profile/profile.component.ts +++ b/src/app/user/profile/profile.component.ts @@ -20,16 +20,16 @@ import { DialogComponent } from '../../main/dialog/dialog.component'; }) export class ProfileComponent implements OnInit { - loading: boolean; - error: boolean; - @Input() username: string; @Input() loggedInUser?: boolean = false; @Output() refreshParent: EventEmitter = new EventEmitter(); - sysAdmin: boolean = false; + loading: boolean; + error: boolean; + + sysAdmin = false; user: ReadUser; diff --git a/src/app/user/user-form/password-form/password-form.component.spec.ts b/src/app/user/user-form/password-form/password-form.component.spec.ts index 3dd27252e3..0d1eb4998b 100644 --- a/src/app/user/user-form/password-form/password-form.component.spec.ts +++ b/src/app/user/user-form/password-form/password-form.component.spec.ts @@ -61,9 +61,7 @@ describe('PasswordFormComponent', () => { let store = {}; spyOn(localStorage, 'getItem').and.callFake( - (key: string): string => { - return store[key] || null; - } + (key: string): string => store[key] || null ); spyOn(localStorage, 'removeItem').and.callFake( (key: string): void => { @@ -71,9 +69,7 @@ describe('PasswordFormComponent', () => { } ); spyOn(localStorage, 'setItem').and.callFake( - (key: string, value: string): string => { - return (store[key] = value); - } + (key: string, value: string): string => (store[key] = value) ); spyOn(localStorage, 'clear').and.callFake(() => { store = {}; diff --git a/src/app/user/user-form/password-form/password-form.component.ts b/src/app/user/user-form/password-form/password-form.component.ts index c19c71d4b9..a9b31b3695 100644 --- a/src/app/user/user-form/password-form/password-form.component.ts +++ b/src/app/user/user-form/password-form/password-form.component.ts @@ -19,11 +19,20 @@ import { ErrorHandlerService } from 'src/app/main/error/error-handler.service'; }) export class PasswordFormComponent implements OnInit { + // update password for: + @Input() username: string; + + // output to close dialog + @Output() closeDialog: EventEmitter = new EventEmitter(); + + // in case of child component inside parent form + @Output() sendToParent: EventEmitter = new EventEmitter(); + // progress indicator loading: boolean; - // TODO: replace RegexPassword by CustomRegex.PASSWORD_REGEX from dsp-ui - public readonly RegexPassword = /^(?=.*\d)(?=.*[a-zA-Z]).{8,}$/i; + // --> TODO replace regexPassword by CustomRegex.PASSWORD_REGEX from dsp-ui + public readonly REGEX_PASSWORD = /^(?=.*\d)(?=.*[a-zA-Z]).{8,}$/i; // in case of updating data: was it succesful or does it failed apiResponses: DspMessageData[] = [ @@ -44,18 +53,10 @@ export class PasswordFormComponent implements OnInit { showResponse: DspMessageData; - // update password for: - @Input() username: string; user: ReadUser; loggedInUserName: string; - // output to close dialog - @Output() closeDialog: EventEmitter = new EventEmitter(); - - // in case of child component inside parent form - @Output() sendToParent: EventEmitter = new EventEmitter(); - // who is logged in? // loggedInUserName: string; // update own password? @@ -67,7 +68,7 @@ export class PasswordFormComponent implements OnInit { // password form form: FormGroup; - matchingPasswords: boolean = false; + matchingPasswords = false; // in case of change not own password, we need a sys admin confirm password form confirmForm: FormGroup; @@ -170,7 +171,9 @@ export class PasswordFormComponent implements OnInit { ) }); - this.confirmForm.valueChanges.subscribe(data => { this.onValueChanged(this.confirmForm, data); }); + this.confirmForm.valueChanges.subscribe(data => { + this.onValueChanged(this.confirmForm, data); + }); this.onValueChanged(this.confirmForm); // (re)set validation messages now @@ -205,7 +208,7 @@ export class PasswordFormComponent implements OnInit { [ Validators.required, Validators.minLength(8), - Validators.pattern(this.RegexPassword) // TODO: replace by CustomRegex.PASSWORD_REGEX from dsp-ui + Validators.pattern(this.REGEX_PASSWORD) // --> TODO replace by CustomRegex.PASSWORD_REGEX from dsp-ui ] ), confirmPassword: new FormControl( diff --git a/src/app/user/user-form/user-form.component.ts b/src/app/user/user-form/user-form.component.ts index facb850af2..514c716dbc 100644 --- a/src/app/user/user-form/user-form.component.ts +++ b/src/app/user/user-form/user-form.component.ts @@ -33,16 +33,6 @@ export class UserFormComponent implements OnInit, OnChanges { // => so, this component has to know who is who and who is doing what; // the form needs then some permission checks - public readonly RegexUsername = /^[a-zA-Z0-9]+$/; - - // TODO: replace RegexEmail by CustomRegex.EMAIL_REGEX from dsp-ui - public readonly RegexEmail = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i; - - /** - * status for the progress indicator - */ - loading: boolean = true; - /** * user iri, email or username: in case of edit * @@ -57,6 +47,22 @@ export class UserFormComponent implements OnInit, OnChanges { @Input() projectcode?: string; @Input() name?: string; + /** + * send user data to parent component; + * in case of dialog box? + */ + @Output() closeDialog: EventEmitter = new EventEmitter(); + + public readonly REGEX_USERNAME = /^[a-zA-Z0-9]+$/; + + // --> TODO replace REGEX_EMAIL by CustomRegex.EMAIL_REGEX from dsp-ui + public readonly REGEX_EMAIL = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i; + + /** + * status for the progress indicator + */ + loading = true; + /** * user data */ @@ -65,16 +71,10 @@ export class UserFormComponent implements OnInit, OnChanges { title: string; subtitle: string; - /** - * send user data to parent component; - * in case of dialog box? - */ - @Output() closeDialog: EventEmitter = new EventEmitter(); - /** * define, if the user has system administration permission */ - sysAdminPermission: boolean = false; + sysAdminPermission = false; /** * username should be unique @@ -82,7 +82,7 @@ export class UserFormComponent implements OnInit, OnChanges { existingUsernames: [RegExp] = [ new RegExp('anEmptyRegularExpressionWasntPossible') ]; - usernameMinLength: number = 4; + usernameMinLength = 4; /** * email should be unique @@ -156,7 +156,7 @@ export class UserFormComponent implements OnInit, OnChanges { // permissions of logged-in user session: Session; - sysAdmin: boolean = false; + sysAdmin = false; constructor( @Inject(DspApiConnectionToken) private _dspApiConnection: KnoraApiConnection, @@ -231,8 +231,8 @@ export class UserFormComponent implements OnInit, OnChanges { // const name: string = this._route.snapshot.queryParams['value']; const newUser: ReadUser = new ReadUser(); - // TODO: replace this.RegexEmail by CustomRegex.EMAIL_REGEX from dsp-ui - if (this.RegexEmail.test(this.name)) { + // --> TODO replace this.REGEX_EMAIL by CustomRegex.EMAIL_REGEX from dsp-ui + if (this.REGEX_EMAIL.test(this.name)) { newUser.email = this.name; } else { newUser.username = this.name; @@ -262,7 +262,7 @@ export class UserFormComponent implements OnInit, OnChanges { // if user is defined, we're in the edit mode // otherwise "create new user" mode is active - const editMode: boolean = !!user.id; + const editMode = !!user.id; this.form = this._formBuilder.group({ givenName: new FormControl( @@ -286,7 +286,7 @@ export class UserFormComponent implements OnInit, OnChanges { }, [ Validators.required, - Validators.pattern(this.RegexEmail), // TODO: replace this.RegexEmail by CustomRegex.EMAIL_REGEX from dsp-ui + Validators.pattern(this.REGEX_EMAIL), // --> TODO replace this.REGEX_EMAIL by CustomRegex.EMAIL_REGEX from dsp-ui existingNamesValidator(this.existingEmails) ] ), @@ -298,7 +298,7 @@ export class UserFormComponent implements OnInit, OnChanges { [ Validators.required, Validators.minLength(4), - Validators.pattern(this.RegexUsername), + Validators.pattern(this.REGEX_USERNAME), existingNamesValidator(this.existingUsernames) ] ), @@ -457,7 +457,7 @@ export class UserFormComponent implements OnInit, OnChanges { } /** - * Reset the form + * reset the form */ resetForm(ev: Event, user?: ReadUser) { ev.preventDefault(); diff --git a/src/app/user/user-menu/user-menu.component.spec.ts b/src/app/user/user-menu/user-menu.component.spec.ts index fff00361ab..f09a43a8fd 100644 --- a/src/app/user/user-menu/user-menu.component.spec.ts +++ b/src/app/user/user-menu/user-menu.component.spec.ts @@ -58,9 +58,7 @@ describe('UserMenuComponent', () => { let store = {}; spyOn(localStorage, 'getItem').and.callFake( - (key: string): string => { - return store[key] || null; - } + (key: string): string => store[key] || null ); spyOn(localStorage, 'removeItem').and.callFake( (key: string): void => { @@ -68,9 +66,7 @@ describe('UserMenuComponent', () => { } ); spyOn(localStorage, 'setItem').and.callFake( - (key: string, value: string): string => { - return (store[key] = value); - } + (key: string, value: string): string => (store[key] = value) ); spyOn(localStorage, 'clear').and.callFake(() => { store = {}; diff --git a/src/app/user/user-menu/user-menu.component.ts b/src/app/user/user-menu/user-menu.component.ts index 9da838370f..248f3c7075 100644 --- a/src/app/user/user-menu/user-menu.component.ts +++ b/src/app/user/user-menu/user-menu.component.ts @@ -23,7 +23,7 @@ export class UserMenuComponent implements OnInit { username: string; - sysAdmin: boolean = false; + sysAdmin = false; navigation: MenuItem[]; diff --git a/src/app/user/user.component.spec.ts b/src/app/user/user.component.spec.ts index b550f1db7b..b070bdb981 100644 --- a/src/app/user/user.component.spec.ts +++ b/src/app/user/user.component.spec.ts @@ -106,9 +106,7 @@ describe('UserComponent', () => { let store = {}; spyOn(localStorage, 'getItem').and.callFake( - (key: string): string => { - return store[key] || null; - } + (key: string): string => store[key] || null ); spyOn(localStorage, 'removeItem').and.callFake( (key: string): void => { @@ -116,9 +114,7 @@ describe('UserComponent', () => { } ); spyOn(localStorage, 'setItem').and.callFake( - (key: string, value: string): string => { - return (store[key] = value); - } + (key: string, value: string): string => (store[key] = value) ); spyOn(localStorage, 'clear').and.callFake(() => { store = {}; diff --git a/src/app/user/user.component.ts b/src/app/user/user.component.ts index f6ecc39121..f53c301fee 100644 --- a/src/app/user/user.component.ts +++ b/src/app/user/user.component.ts @@ -22,7 +22,7 @@ export class UserComponent implements OnInit { route: string; // for the sidenav - open: boolean = true; + open = true; navigation: MenuItem[] = AppGlobal.userNav; diff --git a/src/app/workspace/resource/resource-instance-form/resource-instance-form.component.spec.ts b/src/app/workspace/resource/resource-instance-form/resource-instance-form.component.spec.ts index ac1b184a0b..d1c230292f 100644 --- a/src/app/workspace/resource/resource-instance-form/resource-instance-form.component.spec.ts +++ b/src/app/workspace/resource/resource-instance-form/resource-instance-form.component.spec.ts @@ -45,7 +45,7 @@ import { SwitchPropertiesComponent } from './select-properties/switch-properties const resolvedPromise = Promise.resolve(null); /** - * Test host component to simulate parent component. + * test host component to simulate parent component. */ @Component({ template: ` @@ -63,10 +63,10 @@ class TestHostComponent implements OnInit { } /** - * Mock select-project component to use in tests. + * mock select-project component to use in tests. */ @Component({ - selector: `app-select-project` + selector: 'app-select-project' }) class MockSelectProjectComponent implements OnInit { @Input() formGroup: FormGroup; @@ -90,10 +90,10 @@ class MockSelectProjectComponent implements OnInit { } /** - * Mock select-ontology component to use in tests. + * mock select-ontology component to use in tests. */ @Component({ - selector: `app-select-ontology` + selector: 'app-select-ontology' }) class MockSelectOntologyComponent implements OnInit { @Input() formGroup: FormGroup; @@ -117,10 +117,10 @@ class MockSelectOntologyComponent implements OnInit { } /** - * Mock select-resource-class component to use in tests. + * mock select-resource-class component to use in tests. */ @Component({ - selector: `app-select-resource-class` + selector: 'app-select-resource-class' }) class MockSelectResourceClassComponent implements OnInit { @Input() formGroup: FormGroup; @@ -145,10 +145,10 @@ class MockSelectResourceClassComponent implements OnInit { } /** - * Mock select-properties component to use in tests. + * mock select-properties component to use in tests. */ @Component({ - selector: `app-select-properties` + selector: 'app-select-properties' }) class MockSelectPropertiesComponent { @ViewChildren('switchProp') switchPropertiesComponent: QueryList; @@ -167,10 +167,10 @@ class MockSelectPropertiesComponent { } /** - * Mock switch-properties component to use in tests. + * mock switch-properties component to use in tests. */ @Component({ - selector: `app-switch-properties` + selector: 'app-switch-properties' }) class MockSwitchPropertiesComponent { @ViewChild('createVal') createValueComponent: BaseValueDirective; @@ -185,10 +185,10 @@ class MockSwitchPropertiesComponent { } /** - * Mock value component to use in tests. + * mock value component to use in tests. */ @Component({ - selector: `dsp-int-value` + selector: 'dsp-int-value' }) class MockCreateIntValueComponent implements OnInit { @@ -529,12 +529,12 @@ describe('ResourceInstanceFormComponent', () => { expectedCreateResource.type = 'http://0.0.0.0:3333/ontology/0001/anything/v2#Thing'; expectedCreateResource.properties = props; - // TODO: create a Router spy to mock the navigation + // --> TODO create a Router spy to mock the navigation testHostComponent.resourceInstanceFormComponent.submitData(); expect(dspConnSpy.v2.res.createResource).toHaveBeenCalledTimes(1); - // TODO: check if the spy was called with the correct argument + // --> TODO check if the spy was called with the correct argument // expect(dspConnSpy.v2.res.createResource).toHaveBeenCalledWith(expectedCreateResource); }); diff --git a/src/app/workspace/resource/resource-instance-form/resource-instance-form.component.ts b/src/app/workspace/resource/resource-instance-form/resource-instance-form.component.ts index e5fff9c68f..034cd8a10b 100644 --- a/src/app/workspace/resource/resource-instance-form/resource-instance-form.component.ts +++ b/src/app/workspace/resource/resource-instance-form/resource-instance-form.component.ts @@ -43,7 +43,7 @@ export class ResourceInstanceFormComponent implements OnInit, OnDestroy { /** * update title and subtitle in dialog header (by switching from step 1 (resource class) to step 2 (properties)) */ - @Output() updateParent: EventEmitter<{ title: string, subtitle: string }> = new EventEmitter<{ title: string, subtitle: string }>(); + @Output() updateParent: EventEmitter<{ title: string; subtitle: string }> = new EventEmitter<{ title: string; subtitle: string }>(); @ViewChild('selectProps') selectPropertiesComponent: SelectPropertiesComponent; @ViewChild('selectResourceClass') selectResourceClassComponent: SelectResourceClassComponent; @@ -113,7 +113,7 @@ export class ResourceInstanceFormComponent implements OnInit, OnDestroy { } /** - * Go to the next form page: from project/onto/resource selections to properties form + * go to the next form page: from project/onto/resource selections to properties form */ nextStep() { this.showNextStepForm = !this.showNextStepForm; @@ -123,7 +123,7 @@ export class ResourceInstanceFormComponent implements OnInit, OnDestroy { } /** - * Go to previous step: from properties form back to project/onto/resource selections + * go to previous step: from properties form back to project/onto/resource selections */ prevStep(ev: Event) { ev.preventDefault(); @@ -182,7 +182,7 @@ export class ResourceInstanceFormComponent implements OnInit, OnDestroy { } /** - * Get the user's project(s) + * get the user's project(s) */ initializeProjects(): void { this.usersProjects = []; @@ -218,7 +218,7 @@ export class ResourceInstanceFormComponent implements OnInit, OnDestroy { } /** - * Get all the ontologies of the selected project + * get all the ontologies of the selected project * @param projectIri */ selectOntologies(projectIri: string) { @@ -269,7 +269,7 @@ export class ResourceInstanceFormComponent implements OnInit, OnDestroy { } /** - * Get all the resource classes of the selected ontology + * get all the resource classes of the selected ontology * @param ontologyIri */ selectResourceClasses(ontologyIri: string) { @@ -328,7 +328,7 @@ export class ResourceInstanceFormComponent implements OnInit, OnDestroy { } /** - * Get the resource label typed in the form in select-resource-class + * get the resource label typed in the form in select-resource-class * @param label */ getResourceLabel(label: string) { @@ -336,7 +336,7 @@ export class ResourceInstanceFormComponent implements OnInit, OnDestroy { } /** - * Get all the properties of the selected resource class + * get all the properties of the selected resource class * @param resourceClassIri */ selectProperties(resourceClassIri: string) { diff --git a/src/app/workspace/resource/resource-instance-form/select-ontology/select-ontology.component.spec.ts b/src/app/workspace/resource/resource-instance-form/select-ontology/select-ontology.component.spec.ts index 7943e0ac8e..4b5f8a343b 100644 --- a/src/app/workspace/resource/resource-instance-form/select-ontology/select-ontology.component.spec.ts +++ b/src/app/workspace/resource/resource-instance-form/select-ontology/select-ontology.component.spec.ts @@ -12,7 +12,7 @@ import { MockOntology, OntologiesMetadata } from '@dasch-swiss/dsp-js'; import { SelectOntologyComponent } from './select-ontology.component'; /** - * Test host component to simulate parent component. + * test host component to simulate parent component. */ @Component({ template: ` @@ -51,16 +51,16 @@ describe('SelectOntologyComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ SelectOntologyComponent, TestHostComponent ], - imports: [ - ReactiveFormsModule, - FormsModule, - BrowserAnimationsModule, - MatFormFieldModule, - MatSelectModule + declarations: [ SelectOntologyComponent, TestHostComponent ], + imports: [ + ReactiveFormsModule, + FormsModule, + BrowserAnimationsModule, + MatFormFieldModule, + MatSelectModule ] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { diff --git a/src/app/workspace/resource/resource-instance-form/select-ontology/select-ontology.component.ts b/src/app/workspace/resource/resource-instance-form/select-ontology/select-ontology.component.ts index 8189fc76db..695531270f 100644 --- a/src/app/workspace/resource/resource-instance-form/select-ontology/select-ontology.component.ts +++ b/src/app/workspace/resource/resource-instance-form/select-ontology/select-ontology.component.ts @@ -15,9 +15,9 @@ import { Subscription } from 'rxjs'; const resolvedPromise = Promise.resolve(null); @Component({ - selector: 'app-select-ontology', - templateUrl: './select-ontology.component.html', - styleUrls: ['./select-ontology.component.scss'] + selector: 'app-select-ontology', + templateUrl: './select-ontology.component.html', + styleUrls: ['./select-ontology.component.scss'] }) export class SelectOntologyComponent implements OnInit, OnDestroy, AfterViewInit { diff --git a/src/app/workspace/resource/resource-instance-form/select-project/select-project.component.spec.ts b/src/app/workspace/resource/resource-instance-form/select-project/select-project.component.spec.ts index a017642761..a5b487dcbc 100644 --- a/src/app/workspace/resource/resource-instance-form/select-project/select-project.component.spec.ts +++ b/src/app/workspace/resource/resource-instance-form/select-project/select-project.component.spec.ts @@ -14,7 +14,7 @@ import { SelectProjectComponent } from './select-project.component'; /** - * Test host component to simulate parent component. + * test host component to simulate parent component. */ @Component({ template: ` @@ -54,15 +54,15 @@ describe('SelectProjectComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ SelectProjectComponent, TestHostComponent ], - imports: [ - ReactiveFormsModule, - FormsModule, - BrowserAnimationsModule, - MatFormFieldModule, - MatSelectModule ] + declarations: [ SelectProjectComponent, TestHostComponent ], + imports: [ + ReactiveFormsModule, + FormsModule, + BrowserAnimationsModule, + MatFormFieldModule, + MatSelectModule ] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { diff --git a/src/app/workspace/resource/resource-instance-form/select-properties/select-properties.component.spec.ts b/src/app/workspace/resource/resource-instance-form/select-properties/select-properties.component.spec.ts index 793aef53f7..d9b52a7dcd 100644 --- a/src/app/workspace/resource/resource-instance-form/select-properties/select-properties.component.spec.ts +++ b/src/app/workspace/resource/resource-instance-form/select-properties/select-properties.component.spec.ts @@ -14,10 +14,10 @@ import { SelectPropertiesComponent } from './select-properties.component'; import { SwitchPropertiesComponent } from './switch-properties/switch-properties.component'; /** - * Test host component to simulate parent component. + * test host component to simulate parent component. */ @Component({ -template: ` + template: ` { SelectPropertiesComponent, SwitchPropertiesComponent, TestSelectPropertiesParentComponent - ], + ], imports: [ BrowserAnimationsModule, MatTooltipModule @@ -73,7 +73,7 @@ describe('SelectPropertiesComponent', () => { ], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { diff --git a/src/app/workspace/resource/resource-instance-form/select-properties/select-properties.component.ts b/src/app/workspace/resource/resource-instance-form/select-properties/select-properties.component.ts index cd58e271b2..e6b95b792b 100644 --- a/src/app/workspace/resource/resource-instance-form/select-properties/select-properties.component.ts +++ b/src/app/workspace/resource/resource-instance-form/select-properties/select-properties.component.ts @@ -1,13 +1,21 @@ -import { AfterViewInit, Component, Input, OnInit, QueryList, ViewChildren } from '@angular/core'; +import { Component, Input, OnInit, QueryList, ViewChildren } from '@angular/core'; import { FormGroup } from '@angular/forms'; -import { Cardinality, CardinalityUtil, IHasProperty, ReadResource, ResourceClassAndPropertyDefinitions, ResourceClassDefinition, ResourcePropertyDefinition } from '@dasch-swiss/dsp-js'; +import { + Cardinality, + CardinalityUtil, + IHasProperty, + ReadResource, + ResourceClassAndPropertyDefinitions, + ResourceClassDefinition, + ResourcePropertyDefinition +} from '@dasch-swiss/dsp-js'; import { ValueService } from '@dasch-swiss/dsp-ui'; import { SwitchPropertiesComponent } from './switch-properties/switch-properties.component'; @Component({ - selector: 'app-select-properties', - templateUrl: './select-properties.component.html', - styleUrls: ['./select-properties.component.scss'] + selector: 'app-select-properties', + templateUrl: './select-properties.component.html', + styleUrls: ['./select-properties.component.scss'] }) export class SelectPropertiesComponent implements OnInit { @@ -61,7 +69,7 @@ export class SelectPropertiesComponent implements OnInit { /** - * Given a resource property, check if an add button should be displayed under the property values + * given a resource property, check if an add button should be displayed under the property values * * @param prop the resource property */ @@ -74,7 +82,7 @@ export class SelectPropertiesComponent implements OnInit { } /** - * Check the cardinality of a property + * check the cardinality of a property * If the cardinality is 1 or 1-N, the property will be marked as required * If the cardinality is 0-1 or 0-N, the property will not be required * @@ -99,7 +107,7 @@ export class SelectPropertiesComponent implements OnInit { } /** - * Called from the template when the user clicks on the add button + * called from the template when the user clicks on the add button */ addNewValueFormToProperty(prop: ResourcePropertyDefinition) { // get the length of the corresponding property values array @@ -123,18 +131,16 @@ export class SelectPropertiesComponent implements OnInit { // update the filtered version of the corresponding property values array. // used in the template to calculate if the delete button should be shown. // e.i don't show the delete button if there is only one value - this.propertyValuesKeyValuePair[prop.id + '-filtered'] = this.filterValueArray(this.propertyValuesKeyValuePair[prop.id]); + this.propertyValuesKeyValuePair[prop.id + '-filtered'] = this._filterValueArray(this.propertyValuesKeyValuePair[prop.id]); } /** - * Given an array of numbers, returns a filtered list with no undefined elements + * given an array of numbers, returns a filtered list with no undefined elements * * @param arrayToFilter an array of number containing undefined elements you wish to filter */ - private filterValueArray(arrayToFilter: number[]): number[] { - arrayToFilter = arrayToFilter.filter( element => { - return element !== undefined; - }); + private _filterValueArray(arrayToFilter: number[]): number[] { + arrayToFilter = arrayToFilter.filter(element => element !== undefined); return arrayToFilter; diff --git a/src/app/workspace/resource/resource-instance-form/select-properties/switch-properties/switch-properties.component.spec.ts b/src/app/workspace/resource/resource-instance-form/select-properties/switch-properties/switch-properties.component.spec.ts index fb350925b3..55fb8d6645 100644 --- a/src/app/workspace/resource/resource-instance-form/select-properties/switch-properties/switch-properties.component.spec.ts +++ b/src/app/workspace/resource/resource-instance-form/select-properties/switch-properties/switch-properties.component.spec.ts @@ -8,10 +8,10 @@ import { SwitchPropertiesComponent } from './switch-properties.component'; /** - * Test host component to simulate parent component. + * test host component to simulate parent component. */ @Component({ -template: ` + template: ` { FormBuilder ] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { diff --git a/src/app/workspace/resource/resource-instance-form/select-properties/switch-properties/switch-properties.component.ts b/src/app/workspace/resource/resource-instance-form/select-properties/switch-properties/switch-properties.component.ts index 6f71b7eb30..a68feb2b87 100644 --- a/src/app/workspace/resource/resource-instance-form/select-properties/switch-properties/switch-properties.component.ts +++ b/src/app/workspace/resource/resource-instance-form/select-properties/switch-properties/switch-properties.component.ts @@ -4,9 +4,9 @@ import { Constants, ReadResource, ResourcePropertyDefinition } from '@dasch-swis import { BaseValueDirective } from 'src/app/main/directive/base-value.directive'; @Component({ - selector: 'app-switch-properties', - templateUrl: './switch-properties.component.html', - styleUrls: ['./switch-properties.component.scss'] + selector: 'app-switch-properties', + templateUrl: './switch-properties.component.html', + styleUrls: ['./switch-properties.component.scss'] }) export class SwitchPropertiesComponent implements OnInit { diff --git a/src/app/workspace/resource/resource-instance-form/select-resource-class/select-resource-class.component.spec.ts b/src/app/workspace/resource/resource-instance-form/select-resource-class/select-resource-class.component.spec.ts index 7596be9842..5b9e2a3de3 100644 --- a/src/app/workspace/resource/resource-instance-form/select-resource-class/select-resource-class.component.spec.ts +++ b/src/app/workspace/resource/resource-instance-form/select-resource-class/select-resource-class.component.spec.ts @@ -14,7 +14,7 @@ import { SelectResourceClassComponent } from './select-resource-class.component' import { By } from '@angular/platform-browser'; /** - * Test host component to simulate parent component. + * test host component to simulate parent component. */ @Component({ template: ` @@ -66,24 +66,24 @@ describe('SelectResourceClassComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ SelectResourceClassComponent, TestHostComponent ], - imports: [ - ReactiveFormsModule, - FormsModule, - BrowserAnimationsModule, - MatFormFieldModule, - MatSelectModule, - MatInputModule ] + declarations: [ SelectResourceClassComponent, TestHostComponent ], + imports: [ + ReactiveFormsModule, + FormsModule, + BrowserAnimationsModule, + MatFormFieldModule, + MatSelectModule, + MatInputModule ] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { testHostFixture = TestBed.createComponent(TestHostComponent); - testHostComponent = testHostFixture.componentInstance; - loader = TestbedHarnessEnvironment.loader(testHostFixture); + testHostComponent = testHostFixture.componentInstance; + loader = TestbedHarnessEnvironment.loader(testHostFixture); - testHostFixture.detectChanges(); + testHostFixture.detectChanges(); }); it('should create', () => { @@ -165,7 +165,7 @@ describe('SelectResourceClassComponent', () => { it('should emit the label of the resource class', async () => { - const inputElement = await loader.getHarness(MatInputHarness.with({selector: 'input.label'})); + const inputElement = await loader.getHarness(MatInputHarness.with({ selector: 'input.label' })); expect(await inputElement.getValue()).toEqual(''); expect(testHostComponent.resLabel).toBeUndefined(); diff --git a/src/tslint.json b/src/tslint.json deleted file mode 100644 index 7b12221aed..0000000000 --- a/src/tslint.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "extends": "../tslint.json", - "rules": { - "directive-selector": [ - true, - "attribute", - "", - "camelCase" - ], - "component-selector": [ - true, - "element", - "", - "kebab-case" - ], - "typedef": [ - true, - "parameter" - ], - "no-inferrable-types": false - } -} diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json new file mode 100644 index 0000000000..f715bd18de --- /dev/null +++ b/tsconfig.eslint.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "include": [ + // custom include - what do you want to be tested + "./src/app/**/*.ts", + // "./src/app/**/*.somelib.js" +] +} diff --git a/tslint-to-eslint-config.log b/tslint-to-eslint-config.log new file mode 100644 index 0000000000..9b8b61349a --- /dev/null +++ b/tslint-to-eslint-config.log @@ -0,0 +1,22 @@ +8 ESLint rules behave differently from their TSLint counterparts: + * arrow-body-style: + - ESLint will throw an error if the function body is multiline yet has a one-line return on it. + * capitalized-comments: + - Only accepts a single string pattern to be ignored. + * no-console: + - Custom console methods, if they exist, will no longer be allowed. + * @typescript-eslint/no-unused-expressions: + - The TSLint optional config "allow-new" is the default ESLint behavior and will no longer be ignored. + * brace-style: + - ESLint's brace-style will check all tokens. + * @typescript-eslint/quotes: + - Option "jsx-single" is not supported by ESLint. + * eqeqeq: + - Option "smart" allows for comparing two literal values, evaluating the value of typeof and null comparisons. + * no-underscore-dangle: + - Leading or trailing underscores (_) on identifiers will now be forbidden. + +2 rules are not known by tslint-to-eslint-config to have ESLint equivalents: + * tslint-to-eslint-config does not know the ESLint equivalent for TSLint's "import-spacing". + * tslint-to-eslint-config does not know the ESLint equivalent for TSLint's "whitespace". + diff --git a/tslint.json b/tslint.json deleted file mode 100644 index be7ccc932b..0000000000 --- a/tslint.json +++ /dev/null @@ -1,141 +0,0 @@ -{ - "rulesDirectory": [ - "node_modules/codelyzer" - ], - "rules": { - "arrow-return-shorthand": true, - "callable-types": true, - "class-name": true, - "comment-format": [ - true, - "check-space", - "check-lowercase", - { - "ignore-words": [ - "FIXME", - "HACK", - "TODO" - ] - } - ], - "curly": true, - "deprecation": { - "severity": "warn" - }, - "eofline": true, - "forin": true, - "import-blacklist": [ - true, - "rxjs/Rx" - ], - "import-spacing": true, - "indent": [ - true, - "spaces" - ], - "interface-over-type-literal": true, - "label-position": true, - "max-line-length": [ - true, - 200 - ], - "member-access": false, - "member-ordering": [ - true, - { - "order": [ - "static-field", - "instance-field", - "static-method", - "instance-method" - ] - } - ], - "no-arg": true, - "no-bitwise": true, - "no-console": [ - true, - "debug", - "info", - "time", - "timeEnd", - "trace" - ], - "no-construct": true, - "no-debugger": true, - "no-duplicate-super": true, - "no-empty": false, - "no-empty-interface": true, - "no-eval": true, - "no-inferrable-types": [ - true, - "ignore-params" - ], - "no-misused-new": true, - "no-non-null-assertion": true, - "no-redundant-jsdoc": false, - "no-shadowed-variable": true, - "no-string-literal": false, - "no-string-throw": true, - "no-switch-case-fall-through": true, - "no-trailing-whitespace": true, - "no-unnecessary-initializer": true, - "no-unused-expression": true, - "no-use-before-declare": true, - "no-var-keyword": true, - "object-literal-sort-keys": false, - "one-line": [ - true, - "check-open-brace", - "check-catch", - "check-else", - "check-whitespace" - ], - "prefer-const": true, - "quotemark": [ - true, - "single", - "jsx-single", - "avoid-escape" - ], - "radix": true, - "semicolon": [ - true, - "always" - ], - "triple-equals": [ - true, - "allow-null-check" - ], - "typedef-whitespace": [ - true, - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - } - ], - "unified-signatures": true, - "variable-name": false, - "whitespace": [ - true, - "check-branch", - "check-decl", - "check-operator", - "check-separator", - "check-type" - ], - "no-output-on-prefix": true, - "no-inputs-metadata-property": true, - "no-outputs-metadata-property": true, - "no-host-metadata-property": true, - "no-input-rename": true, - "no-output-rename": true, - "use-lifecycle-interface": true, - "use-pipe-transform-interface": true, - "component-class-suffix": true, - "directive-class-suffix": true - } -} \ No newline at end of file