diff --git a/e2e-tests/.eslintrc.json b/e2e-tests/.eslintrc.json index 52ca2f540..f73906516 100644 --- a/e2e-tests/.eslintrc.json +++ b/e2e-tests/.eslintrc.json @@ -1,9 +1,15 @@ { - "extends": "./node_modules/gts/", + "extends": "./node_modules/gts", + "env": { + "jasmine": true + }, + "parser": "@typescript-eslint/parser", + "root": true, "rules": { "node/no-unpublished-import": ["error", { "allowModules": ["jasmine"] }], - "eqeqeq": ["error", "always", {"null": "ignore"}] + "eqeqeq": ["error", "always", {"null": "ignore"}], + "object-curly-spacing": ["error", "always"] } } diff --git a/e2e-tests/.prettierrc.js b/e2e-tests/.prettierrc.js new file mode 100644 index 000000000..eab241e52 --- /dev/null +++ b/e2e-tests/.prettierrc.js @@ -0,0 +1,4 @@ +module.exports = { + ...require('gts/.prettierrc.json'), + bracketSpacing: true +} diff --git a/e2e-tests/package-lock.json b/e2e-tests/package-lock.json new file mode 100644 index 000000000..b5935e478 --- /dev/null +++ b/e2e-tests/package-lock.json @@ -0,0 +1,5470 @@ +{ + "name": "@ground/e2e-tests", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@ground/e2e-tests", + "version": "0.0.1", + "license": "Apache-2.0", + "dependencies": { + "selenium-webdriver": "^4.19.0" + }, + "devDependencies": { + "@types/jasmine": "^5.1.4", + "@types/node": "^14.11.2", + "@types/selenium-webdriver": "^4.1.22", + "@typescript-eslint/eslint-plugin": "^5.39.0", + "@typescript-eslint/parser": "^5.39.0", + "esbuild": "^0.25.0", + "eslint": "^8.26.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-absolute-imports": "^0.0.3", + "eslint-plugin-prettier": "^4.2.1", + "gts": "^3.1.1", + "jasmine": "^5.1.0", + "jasmine-expect": "^5.0.0", + "prettier": "^2.8.1", + "tsx": "^4.7.1", + "typescript": "~4.7.0" + }, + "engines": { + "node": "20" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", + "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@bazel/runfiles": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@bazel/runfiles/-/runfiles-6.5.0.tgz", + "integrity": "sha512-RzahvqTkfpY2jsDxo8YItPX+/iZ6hbiikw1YhE0bA9EKBR5Og8Pa6FHn9PO9M0zaXRVsr0GFQLKbB/0rzy9SzA==", + "license": "Apache-2.0" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@types/jasmine": { + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.13.tgz", + "integrity": "sha512-MYCcDkruFc92LeYZux5BC0dmqo2jk+M5UIZ4/oFnAPCXN9mCcQhLyj7F3/Za7rocVyt5YRr1MmqJqFlvQ9LVcg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/selenium-webdriver": { + "version": "4.35.4", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.35.4.tgz", + "integrity": "sha512-hZFsK0dt/2PA5eLrFOJwkoTBpPXtaKnln7NCtg3pMAPwg7DXG6kTilHoAw8KzsQeDFLJ0mYcL6dPSMt1Qk7eSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/ws": "*" + } + }, + "node_modules/@types/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", + "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.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.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.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/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "dev": true, + "license": "MIT", + "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/typescript-estree": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "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/experimental-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "4.33.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/experimental-utils/node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/add-matchers": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/add-matchers/-/add-matchers-0.6.2.tgz", + "integrity": "sha512-hVO2wodMei9RF00qe+506MoeJ/NEOdCMEkSJ12+fC3hx/5Z4zmhNiP92nJEF6XhmXokeB0hOtuQrjHCx2vmXrQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.10.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.2.tgz", + "integrity": "sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-absolute-imports": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-absolute-imports/-/eslint-plugin-absolute-imports-0.0.3.tgz", + "integrity": "sha512-7gjXEpfCWP8yqPEWU4Ozbfo2wOlV2y3tkHJeJ50kCmBGDr3osx0VRiCwIvvmVXhVA6mags9J4qva+AClmSnWvg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, + "node_modules/eslint-plugin-node/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.5.tgz", + "integrity": "sha512-9Ni+xgemM2IWLq6aXEpP2+V/V30GeA/46Ar629vcMqVPodFFWC9skHu/D1phvuqtS8bJCFnNf01/qcmqYEwNfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "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, + "license": "MIT", + "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, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/gts": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/gts/-/gts-3.1.1.tgz", + "integrity": "sha512-Jw44aBbzMnd1vtZs7tZt3LMstKQukCBg7N4CKVGzviIQ45Cz5b9lxDJGXVKj/9ySuGv6TYEeijZJGbiiVcM27w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@typescript-eslint/eslint-plugin": "^4.2.0", + "@typescript-eslint/parser": "^4.2.0", + "chalk": "^4.1.0", + "eslint": "^7.10.0", + "eslint-config-prettier": "^7.0.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^3.1.4", + "execa": "^5.0.0", + "inquirer": "^7.3.3", + "json5": "^2.1.3", + "meow": "^9.0.0", + "ncp": "^2.0.0", + "prettier": "^2.1.2", + "rimraf": "^3.0.2", + "write-file-atomic": "^3.0.3" + }, + "bin": { + "gts": "build/src/cli.js" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "typescript": ">=3" + } + }, + "node_modules/gts/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/gts/node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/gts/node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/gts/node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/gts/node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/gts/node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", + "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/experimental-utils": "4.33.0", + "@typescript-eslint/scope-manager": "4.33.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "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/gts/node_modules/@typescript-eslint/parser": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", + "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "debug": "^4.3.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/gts/node_modules/@typescript-eslint/scope-manager": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/gts/node_modules/@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/gts/node_modules/@typescript-eslint/typescript-estree": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/gts/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "4.33.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/gts/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/gts/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gts/node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/gts/node_modules/eslint-config-prettier": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", + "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/gts/node_modules/eslint-plugin-prettier": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", + "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=5.0.0", + "prettier": ">=1.13.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/gts/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/gts/node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/gts/node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/gts/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, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/gts/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gts/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jasmine": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-5.13.0.tgz", + "integrity": "sha512-oLCXIhEb5e0zzjn9GyuvcuisvLBwUjmgz7a0RNGWKwQtJCDld4m+vwKUpAIJVLB5vbmQFdtKhT86/tIZlJ5gYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^10.2.2", + "jasmine-core": "~5.13.0" + }, + "bin": { + "jasmine": "bin/jasmine.js" + } + }, + "node_modules/jasmine-core": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.13.0.tgz", + "integrity": "sha512-vsYjfh7lyqvZX5QgqKc4YH8phs7g96Z8bsdIFNEU3VqXhlHaq+vov/Fgn/sr6MiUczdZkyXRC3TX369Ll4Nzbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jasmine-expect": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jasmine-expect/-/jasmine-expect-5.0.0.tgz", + "integrity": "sha512-byn1zq0EQBA9UKs5A+H6gk5TRcanV+TqQMRxrjurGuqKkclaqgjw/vV6aT/jtf5tabXGonTH6VDZJ33Z1pxSxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "add-matchers": "0.6.2" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true, + "license": "ISC" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "dev": true, + "license": "MIT", + "bin": { + "ncp": "bin/ncp" + } + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/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, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/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, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/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, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/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, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/selenium-webdriver": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.39.0.tgz", + "integrity": "sha512-NAs9jCU+UeZ/ZmRb8R6zOp7N8eMklefdBYASnaRmCNXdgFE8w3OCxxZmLixkwqnGDHY5VF7hCulfw1Mls43N/A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/SeleniumHQ" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/selenium" + } + ], + "license": "Apache-2.0", + "dependencies": { + "@bazel/runfiles": "^6.5.0", + "jszip": "^3.10.1", + "tmp": "^0.2.5", + "ws": "^8.18.3" + }, + "engines": { + "node": ">= 20.0.0" + } + }, + "node_modules/selenium-webdriver/node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "license": "MIT", + "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/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.1.tgz", + "integrity": "sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.1.tgz", + "integrity": "sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.1.tgz", + "integrity": "sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.1.tgz", + "integrity": "sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.1.tgz", + "integrity": "sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.1.tgz", + "integrity": "sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.1.tgz", + "integrity": "sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.1.tgz", + "integrity": "sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.1.tgz", + "integrity": "sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.1.tgz", + "integrity": "sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.1.tgz", + "integrity": "sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.1.tgz", + "integrity": "sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.1.tgz", + "integrity": "sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.1.tgz", + "integrity": "sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.1.tgz", + "integrity": "sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.1.tgz", + "integrity": "sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.1.tgz", + "integrity": "sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.1.tgz", + "integrity": "sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.1.tgz", + "integrity": "sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.1.tgz", + "integrity": "sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.1.tgz", + "integrity": "sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.1.tgz", + "integrity": "sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.1.tgz", + "integrity": "sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.1.tgz", + "integrity": "sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.1.tgz", + "integrity": "sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.1.tgz", + "integrity": "sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.1.tgz", + "integrity": "sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.1", + "@esbuild/android-arm": "0.27.1", + "@esbuild/android-arm64": "0.27.1", + "@esbuild/android-x64": "0.27.1", + "@esbuild/darwin-arm64": "0.27.1", + "@esbuild/darwin-x64": "0.27.1", + "@esbuild/freebsd-arm64": "0.27.1", + "@esbuild/freebsd-x64": "0.27.1", + "@esbuild/linux-arm": "0.27.1", + "@esbuild/linux-arm64": "0.27.1", + "@esbuild/linux-ia32": "0.27.1", + "@esbuild/linux-loong64": "0.27.1", + "@esbuild/linux-mips64el": "0.27.1", + "@esbuild/linux-ppc64": "0.27.1", + "@esbuild/linux-riscv64": "0.27.1", + "@esbuild/linux-s390x": "0.27.1", + "@esbuild/linux-x64": "0.27.1", + "@esbuild/netbsd-arm64": "0.27.1", + "@esbuild/netbsd-x64": "0.27.1", + "@esbuild/openbsd-arm64": "0.27.1", + "@esbuild/openbsd-x64": "0.27.1", + "@esbuild/openharmony-arm64": "0.27.1", + "@esbuild/sunos-x64": "0.27.1", + "@esbuild/win32-arm64": "0.27.1", + "@esbuild/win32-ia32": "0.27.1", + "@esbuild/win32-x64": "0.27.1" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/v8-compile-cache": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", + "dev": true, + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "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, + "license": "ISC" + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/e2e-tests/package.json b/e2e-tests/package.json index 038cfffa6..2eaae8a6f 100644 --- a/e2e-tests/package.json +++ b/e2e-tests/package.json @@ -2,7 +2,6 @@ "name": "@ground/e2e-tests", "version": "0.0.1", "description": "Automated testing of the Ground platform.", - "type": "module", "scripts": { "test:create": "tsx node_modules/jasmine/bin/jasmine spec/create-survey.spec.ts", "test:create:debug": "tsx --inspect node_modules/jasmine/bin/jasmine spec/create-survey.spec.ts", diff --git a/e2e-tests/webdriver-helpers.ts b/e2e-tests/webdriver-helpers.ts index 71c9fc80d..7426eb4c4 100644 --- a/e2e-tests/webdriver-helpers.ts +++ b/e2e-tests/webdriver-helpers.ts @@ -274,7 +274,7 @@ export class WebDriverHelper { } private delay(timeout = SHORT_TIMEOUT) { - return new Promise((resolve) => { + return new Promise(resolve => { setTimeout(resolve, timeout); }); } diff --git a/functions/.eslintrc.json b/functions/.eslintrc.json index d1ffdb39e..52bcafc42 100644 --- a/functions/.eslintrc.json +++ b/functions/.eslintrc.json @@ -8,6 +8,7 @@ }, "root": true, "rules": { - "eqeqeq": ["error", "always", {"null": "ignore"}] + "eqeqeq": ["error", "always", {"null": "ignore"}], + "object-curly-spacing": ["error", "always"] } } diff --git a/functions/.prettierrc.js b/functions/.prettierrc.js index ff1548339..eab241e52 100644 --- a/functions/.prettierrc.js +++ b/functions/.prettierrc.js @@ -1,3 +1,4 @@ module.exports = { - ...require('gts/.prettierrc.json') + ...require('gts/.prettierrc.json'), + bracketSpacing: true } diff --git a/functions/src/common/auth.ts b/functions/src/common/auth.ts index 617fbbfe9..6bfacc504 100644 --- a/functions/src/common/auth.ts +++ b/functions/src/common/auth.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import {DecodedIdToken, getAuth} from 'firebase-admin/auth'; -import {DocumentSnapshot} from 'firebase-admin/firestore'; -import {https, Response} from 'firebase-functions/v1'; -import {EmulatorIdToken} from '../handlers'; -import {GroundProtos} from '@ground/proto'; -import {registry} from '@ground/lib'; +import { DecodedIdToken, getAuth } from 'firebase-admin/auth'; +import { DocumentSnapshot } from 'firebase-admin/firestore'; +import { https, Response } from 'firebase-functions/v1'; +import { EmulatorIdToken } from '../handlers'; +import { GroundProtos } from '@ground/proto'; +import { registry } from '@ground/lib'; import Pb = GroundProtos.ground.v1beta1; const s = registry.getFieldIds(Pb.Survey); @@ -71,7 +71,7 @@ export async function setSessionCookie( ): Promise { const token = getAuthBearer(req); const expiresIn = 60 * 60 * 24 * 5 * 1000; // 5 days - const cookie = await getAuth().createSessionCookie(token!, {expiresIn}); + const cookie = await getAuth().createSessionCookie(token!, { expiresIn }); res.cookie(SESSION_COOKIE_NAME, cookie, { maxAge: expiresIn, httpOnly: true, diff --git a/functions/src/common/broadcast-survey-update.ts b/functions/src/common/broadcast-survey-update.ts index dea341b8b..bca4410ab 100644 --- a/functions/src/common/broadcast-survey-update.ts +++ b/functions/src/common/broadcast-survey-update.ts @@ -27,5 +27,5 @@ import * as admin from 'firebase-admin'; export async function broadcastSurveyUpdate(topic: string): Promise { console.debug(`Sending message to ${topic}`); - return admin.messaging().send({topic}); + return admin.messaging().send({ topic }); } diff --git a/functions/src/common/context.ts b/functions/src/common/context.ts index e2a36718f..9903551f8 100644 --- a/functions/src/common/context.ts +++ b/functions/src/common/context.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import {Datastore} from './datastore'; -import {MailService} from './mail-service'; -import {initializeApp, getApp} from 'firebase-admin/app'; -import {getFirestore} from 'firebase-admin/firestore'; +import { Datastore } from './datastore'; +import { MailService } from './mail-service'; +import { initializeApp, getApp } from 'firebase-admin/app'; +import { getFirestore } from 'firebase-admin/firestore'; let datastore: Datastore | undefined; let mailService: MailService | undefined; diff --git a/functions/src/common/datastore.ts b/functions/src/common/datastore.ts index b61c09f3d..d726af9b9 100644 --- a/functions/src/common/datastore.ts +++ b/functions/src/common/datastore.ts @@ -15,13 +15,13 @@ */ import * as functions from 'firebase-functions'; -import {firestore} from 'firebase-admin'; -import {DocumentData, FieldPath, GeoPoint} from 'firebase-admin/firestore'; -import {registry} from '@ground/lib'; -import {GroundProtos} from '@ground/proto'; +import { firestore } from 'firebase-admin'; +import { DocumentData, FieldPath, GeoPoint } from 'firebase-admin/firestore'; +import { registry } from '@ground/lib'; +import { GroundProtos } from '@ground/proto'; import Pb = GroundProtos.ground.v1beta1; -import {leftOuterJoinSorted, QueryIterator} from './query-iterator'; +import { leftOuterJoinSorted, QueryIterator } from './query-iterator'; const l = registry.getFieldIds(Pb.LocationOfInterest); const sb = registry.getFieldIds(Pb.Submission); @@ -104,7 +104,7 @@ export class Datastore { constructor(db: firestore.Firestore) { this.db_ = db; - db.settings({ignoreUndefinedProperties: true}); + db.settings({ ignoreUndefinedProperties: true }); } /** @@ -112,14 +112,14 @@ export class Datastore { * These attributes are merged with other existing ones if already present. */ async mergeUserProfile(user: functions.auth.UserRecord) { - const {uid, email, displayName, photoURL} = user; + const { uid, email, displayName, photoURL } = user; await this.db_.doc(`users/${uid}`).set( { email, displayName, photoURL: photoURL && Datastore.trimPhotoURLSizeSuffix(photoURL), }, - {merge: true} + { merge: true } ); } @@ -226,7 +226,7 @@ export class Datastore { async updateSubmissionCount(surveyId: string, loiId: string, count: number) { const loiRef = this.db_.doc(loi(surveyId, loiId)); - await loiRef.update({[l.submissionCount]: count}); + await loiRef.update({ [l.submissionCount]: count }); } async updateLoiProperties( @@ -235,7 +235,7 @@ export class Datastore { loiDoc: DocumentData ) { const loiRef = this.db_.doc(loi(surveyId, loiId)); - await loiRef.update({[l.properties]: loiDoc[l.properties]}); + await loiRef.update({ [l.properties]: loiDoc[l.properties] }); } static toFirestoreMap(geometry: any) { diff --git a/functions/src/common/mail-service.ts b/functions/src/common/mail-service.ts index 54ca60b4b..3043e353b 100644 --- a/functions/src/common/mail-service.ts +++ b/functions/src/common/mail-service.ts @@ -16,7 +16,7 @@ import * as nodemailer from 'nodemailer'; import sanitizeHtml from 'sanitize-html'; -import {Datastore} from './datastore'; +import { Datastore } from './datastore'; type MailConfig = { server?: MailServerConfig; @@ -45,14 +45,14 @@ export class MailService { private sender_: string; constructor(mailServerConfig: MailServerConfig) { - const {host, port, username, password, sender} = mailServerConfig; + const { host, port, username, password, sender } = mailServerConfig; this.sender_ = sender || username; this.transporter_ = nodemailer.createTransport({ host, port, - auth: {user: username, pass: password}, + auth: { user: username, pass: password }, sender: this.sender_, }); } @@ -63,7 +63,7 @@ export class MailService { * @param email - Email object containing recipient, subject, and body. */ async sendMail(email: MailServiceEmail): Promise { - const {html} = email; + const { html } = email; const safeHtml = sanitizeHtml(html, { allowedTags: ['br', 'a'], diff --git a/functions/src/common/utils.ts b/functions/src/common/utils.ts index 86904e189..cd50928f7 100644 --- a/functions/src/common/utils.ts +++ b/functions/src/common/utils.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {GroundProtos} from '@ground/proto'; +import { GroundProtos } from '@ground/proto'; import Pb = GroundProtos.ground.v1beta1; diff --git a/functions/src/export-csv.ts b/functions/src/export-csv.ts index 4ac4f7378..6b6477662 100644 --- a/functions/src/export-csv.ts +++ b/functions/src/export-csv.ts @@ -16,17 +16,17 @@ import * as functions from 'firebase-functions'; import * as csv from '@fast-csv/format'; -import {canExport, hasOrganizerRole} from './common/auth'; -import {isAccessibleLoi} from './common/utils'; -import {geojsonToWKT} from '@terraformer/wkt'; -import {getDatastore} from './common/context'; +import { canExport, hasOrganizerRole } from './common/auth'; +import { isAccessibleLoi } from './common/utils'; +import { geojsonToWKT } from '@terraformer/wkt'; +import { getDatastore } from './common/context'; import * as HttpStatus from 'http-status-codes'; -import {DecodedIdToken} from 'firebase-admin/auth'; -import {List} from 'immutable'; -import {QuerySnapshot} from 'firebase-admin/firestore'; -import {timestampToInt, toMessage} from '@ground/lib'; -import {GroundProtos} from '@ground/proto'; -import {toGeoJsonGeometry} from '@ground/lib'; +import { DecodedIdToken } from 'firebase-admin/auth'; +import { List } from 'immutable'; +import { QuerySnapshot } from 'firebase-admin/firestore'; +import { timestampToInt, toMessage } from '@ground/lib'; +import { GroundProtos } from '@ground/proto'; +import { toGeoJsonGeometry } from '@ground/lib'; import Pb = GroundProtos.ground.v1beta1; @@ -40,7 +40,7 @@ export async function exportCsvHandler( user: DecodedIdToken ) { const db = getDatastore(); - const {uid: userId} = user; + const { uid: userId } = user; const surveyId = req.query.survey as string; const jobId = req.query.job as string; @@ -73,7 +73,7 @@ export async function exportCsvHandler( .send('Unsupported or corrupt job'); return; } - const {name: jobName} = job; + const { name: jobName } = job; const isOrganizer = hasOrganizerRole(user, surveyDoc); @@ -164,11 +164,11 @@ function writeRow( // Header: One column for each loi property (merged over all properties across all LOIs) getPropertiesByName(loi, loiProperties).forEach(v => row.push(quote(v))); if (submission) { - const {taskData: data} = submission; + const { taskData: data } = submission; // Header: One column for each task tasks.forEach(task => row.push(quote(getValue(task, data)))); // Header: contributor_username, contributor_email, created_client_timestamp, created_server_timestamp - const {created} = submission; + const { created } = submission; row.push(quote(created?.displayName)); row.push(quote(created?.emailAddress)); row.push( diff --git a/functions/src/export-geojson.spec.ts b/functions/src/export-geojson.spec.ts index 62d5aa2e1..8673ac98a 100644 --- a/functions/src/export-geojson.spec.ts +++ b/functions/src/export-geojson.spec.ts @@ -22,14 +22,14 @@ import { createGetRequestSpy, createResponseSpy, } from './testing/http-test-helpers'; -import {DecodedIdToken} from 'firebase-admin/auth'; +import { DecodedIdToken } from 'firebase-admin/auth'; import HttpStatus from 'http-status-codes'; -import {DATA_COLLECTOR_ROLE} from './common/auth'; -import {resetDatastore} from './common/context'; -import {Firestore} from 'firebase-admin/firestore'; -import {exportGeojsonHandler} from './export-geojson'; -import {registry} from '@ground/lib'; -import {GroundProtos} from '@ground/proto'; +import { DATA_COLLECTOR_ROLE } from './common/auth'; +import { resetDatastore } from './common/context'; +import { Firestore } from 'firebase-admin/firestore'; +import { exportGeojsonHandler } from './export-geojson'; +import { registry } from '@ground/lib'; +import { GroundProtos } from '@ground/proto'; import Pb = GroundProtos.ground.v1beta1; const sv = registry.getFieldIds(Pb.Survey); @@ -122,13 +122,15 @@ describe('export()', () => { [l.jobId]: job1.id, [l.customTag]: 'POINT_001', [l.geometry]: { - [g.point]: {[p.coordinates]: {[c.latitude]: 10.1, [c.longitude]: 125.6}}, + [g.point]: { + [p.coordinates]: { [c.latitude]: 10.1, [c.longitude]: 125.6 }, + }, }, [l.submissionCount]: 0, [l.source]: Pb.LocationOfInterest.Source.FIELD_DATA, [l.properties]: { - area: {[pr.numericValue]: 3.08}, - name: {[pr.stringValue]: 'Dinagat Islands'}, + area: { [pr.numericValue]: 3.08 }, + name: { [pr.stringValue]: 'Dinagat Islands' }, }, [l.ownerId]: userId, }; @@ -138,12 +140,14 @@ describe('export()', () => { [l.jobId]: job1.id, [l.customTag]: 'POINT_002', [l.geometry]: { - [g.point]: {[p.coordinates]: {[c.latitude]: 47.05, [c.longitude]: 8.3}}, + [g.point]: { + [p.coordinates]: { [c.latitude]: 47.05, [c.longitude]: 8.3 }, + }, }, [l.submissionCount]: 0, [l.source]: Pb.LocationOfInterest.Source.FIELD_DATA, [l.properties]: { - name: {[pr.stringValue]: 'Luzern'}, + name: { [pr.stringValue]: 'Luzern' }, }, }; const testCases = [ @@ -159,8 +163,8 @@ describe('export()', () => { features: [ { type: 'Feature', - properties: {area: 3.08, name: 'Dinagat Islands'}, - geometry: {type: 'Point', coordinates: [125.6, 10.1]}, + properties: { area: 3.08, name: 'Dinagat Islands' }, + geometry: { type: 'Point', coordinates: [125.6, 10.1] }, }, ], }, @@ -177,14 +181,14 @@ describe('export()', () => { }); testCases.forEach( - ({desc, jobId, survey, jobs, lois, expectedFilename, expectedGeojson}) => + ({ desc, jobId, survey, jobs, lois, expectedFilename, expectedGeojson }) => it(desc, async () => { // Populate database. mockFirestore.doc(`surveys/${survey.id}`).set(survey); - jobs?.forEach(({id, ...job}) => + jobs?.forEach(({ id, ...job }) => mockFirestore.doc(`surveys/${survey.id}/jobs/${id}`).set(job) ); - lois?.forEach(({id, ...loi}) => + lois?.forEach(({ id, ...loi }) => mockFirestore.doc(`surveys/${survey.id}/lois/${id}`).set(loi) ); diff --git a/functions/src/export-geojson.ts b/functions/src/export-geojson.ts index 18162ffcd..595851dd9 100644 --- a/functions/src/export-geojson.ts +++ b/functions/src/export-geojson.ts @@ -15,14 +15,14 @@ */ import * as functions from 'firebase-functions'; -import {canExport, hasOrganizerRole} from './common/auth'; -import {getDatastore} from './common/context'; -import {isAccessibleLoi} from './common/utils'; +import { canExport, hasOrganizerRole } from './common/auth'; +import { getDatastore } from './common/context'; +import { isAccessibleLoi } from './common/utils'; import * as HttpStatus from 'http-status-codes'; -import {DecodedIdToken} from 'firebase-admin/auth'; -import {toMessage} from '@ground/lib'; -import {GroundProtos} from '@ground/proto'; -import {toGeoJsonGeometry} from '@ground/lib'; +import { DecodedIdToken } from 'firebase-admin/auth'; +import { toMessage } from '@ground/lib'; +import { GroundProtos } from '@ground/proto'; +import { toGeoJsonGeometry } from '@ground/lib'; import Pb = GroundProtos.ground.v1beta1; @@ -35,7 +35,7 @@ export async function exportGeojsonHandler( user: DecodedIdToken ) { const db = getDatastore(); - const {uid: userId} = user; + const { uid: userId } = user; const surveyId = req.query.survey as string; const jobId = req.query.job as string; @@ -68,7 +68,7 @@ export async function exportGeojsonHandler( .send('Unsupported or corrupt job'); return; } - const {name: jobName} = job; + const { name: jobName } = job; const isOrganizer = hasOrganizerRole(user, surveyDoc); @@ -143,8 +143,8 @@ function getFileName(jobName: string | null) { function propertiesPbToObject(pb: { [k: string]: Pb.LocationOfInterest.IProperty; -}): {[k: string]: string | number} { - const properties: {[k: string]: string | number} = {}; +}): { [k: string]: string | number } { + const properties: { [k: string]: string | number } = {}; for (const k of Object.keys(pb).sort()) { const v = pb[k].stringValue || pb[k].numericValue; if (v !== null && v !== undefined) { diff --git a/functions/src/handlers.ts b/functions/src/handlers.ts index e830d1d51..93b9f6695 100644 --- a/functions/src/handlers.ts +++ b/functions/src/handlers.ts @@ -15,14 +15,14 @@ */ import cors from 'cors'; -import {DecodedIdToken} from 'firebase-admin/auth'; -import {https, Response} from 'firebase-functions'; -import {getDecodedIdToken} from './common/auth'; -import {INTERNAL_SERVER_ERROR, UNAUTHORIZED} from 'http-status-codes'; +import { DecodedIdToken } from 'firebase-admin/auth'; +import { https, Response } from 'firebase-functions'; +import { getDecodedIdToken } from './common/auth'; +import { INTERNAL_SERVER_ERROR, UNAUTHORIZED } from 'http-status-codes'; import cookieParser from 'cookie-parser'; import HttpStatus from 'http-status-codes'; -const corsOptions = {origin: true}; +const corsOptions = { origin: true }; const corsMiddleware = cors(corsOptions); /** Token to be used when running on local emulator for debugging. */ @@ -30,7 +30,7 @@ export class EmulatorIdToken implements DecodedIdToken { aud = ''; auth_time = 0; exp = 0; - firebase = {identities: {}, sign_in_provider: ''}; + firebase = { identities: {}, sign_in_provider: '' }; iat = 0; iss = ''; sub = ''; diff --git a/functions/src/import-geojson.spec.ts b/functions/src/import-geojson.spec.ts index b92af975d..e5cffe7cc 100644 --- a/functions/src/import-geojson.spec.ts +++ b/functions/src/import-geojson.spec.ts @@ -22,16 +22,16 @@ import { createPostRequestSpy, createResponseSpy, } from './testing/http-test-helpers'; -import {importGeoJsonCallback} from './import-geojson'; -import {DecodedIdToken} from 'firebase-admin/auth'; -import {Blob, FormData} from 'formdata-node'; +import { importGeoJsonCallback } from './import-geojson'; +import { DecodedIdToken } from 'firebase-admin/auth'; +import { Blob, FormData } from 'formdata-node'; import HttpStatus from 'http-status-codes'; -import {invokeCallbackAsync} from './handlers'; -import {SURVEY_ORGANIZER_ROLE} from './common/auth'; -import {resetDatastore} from './common/context'; -import {Firestore} from 'firebase-admin/firestore'; -import {registry} from '@ground/lib'; -import {GroundProtos} from '@ground/proto'; +import { invokeCallbackAsync } from './handlers'; +import { SURVEY_ORGANIZER_ROLE } from './common/auth'; +import { resetDatastore } from './common/context'; +import { Firestore } from 'firebase-admin/firestore'; +import { registry } from '@ground/lib'; +import { GroundProtos } from '@ground/proto'; import Pb = GroundProtos.ground.v1beta1; const sv = registry.getFieldIds(Pb.Survey); @@ -75,13 +75,15 @@ describe('importGeoJson()', () => { const pointLoi = { [l.jobId]: 'job123', [l.geometry]: { - [g.point]: {[p.coordinates]: {[c.latitude]: 10.1, [c.longitude]: 125.6}}, + [g.point]: { + [p.coordinates]: { [c.latitude]: 10.1, [c.longitude]: 125.6 }, + }, }, [l.submissionCount]: 0, [l.source]: 1, // IMPORTED [l.properties]: { - name: {[pr.stringValue]: 'Dinagat Islands'}, - area: {[pr.numericValue]: 3.08}, + name: { [pr.stringValue]: 'Dinagat Islands' }, + area: { [pr.numericValue]: 3.08 }, }, }; const geoJsonWithPolygon = { @@ -109,10 +111,10 @@ describe('importGeoJson()', () => { [g.polygon]: { [pg.shell]: { [lr.coordinates]: [ - {[c.latitude]: 0, [c.longitude]: 100}, - {[c.latitude]: 0, [c.longitude]: 101}, - {[c.latitude]: 1, [c.longitude]: 101}, - {[c.latitude]: 0, [c.longitude]: 100}, + { [c.latitude]: 0, [c.longitude]: 100 }, + { [c.latitude]: 0, [c.longitude]: 101 }, + { [c.latitude]: 1, [c.longitude]: 101 }, + { [c.latitude]: 0, [c.longitude]: 100 }, ], }, }, @@ -158,10 +160,10 @@ describe('importGeoJson()', () => { { [pg.shell]: { [lr.coordinates]: [ - {[c.latitude]: 0, [c.longitude]: 100}, - {[c.latitude]: 0, [c.longitude]: 101}, - {[c.latitude]: 1, [c.longitude]: 101}, - {[c.latitude]: 0, [c.longitude]: 100}, + { [c.latitude]: 0, [c.longitude]: 100 }, + { [c.latitude]: 0, [c.longitude]: 101 }, + { [c.latitude]: 1, [c.longitude]: 101 }, + { [c.latitude]: 0, [c.longitude]: 100 }, ], }, }, @@ -169,10 +171,10 @@ describe('importGeoJson()', () => { { [pg.shell]: { [lr.coordinates]: [ - {[c.latitude]: 1, [c.longitude]: 120}, - {[c.latitude]: 1, [c.longitude]: 121}, - {[c.latitude]: 2, [c.longitude]: 121}, - {[c.latitude]: 1, [c.longitude]: 120}, + { [c.latitude]: 1, [c.longitude]: 120 }, + { [c.latitude]: 1, [c.longitude]: 121 }, + { [c.latitude]: 2, [c.longitude]: 121 }, + { [c.latitude]: 1, [c.longitude]: 120 }, ], }, }, @@ -217,7 +219,7 @@ describe('importGeoJson()', () => { }, { desc: 'imports unsupported feature type', - input: {...geoJsonWithPoint, type: 'UnsupportedFeature'}, + input: { ...geoJsonWithPoint, type: 'UnsupportedFeature' }, expectedStatus: HttpStatus.BAD_REQUEST, expected: [], }, @@ -253,14 +255,14 @@ describe('importGeoJson()', () => { return form; } - testCases.forEach(({desc, input, expectedStatus, expected}) => + testCases.forEach(({ desc, input, expectedStatus, expected }) => it(desc, async () => { // Add survey. mockFirestore.doc(`surveys/${surveyId}`).set(survey); // Build mock request and response. const req = await createPostRequestSpy( - {url: '/importGeoJson'}, + { url: '/importGeoJson' }, createPostData(surveyId, jobId, input) ); const res = createResponseSpy(); diff --git a/functions/src/import-geojson.ts b/functions/src/import-geojson.ts index 042757455..d73c93cda 100644 --- a/functions/src/import-geojson.ts +++ b/functions/src/import-geojson.ts @@ -16,15 +16,15 @@ import functions from 'firebase-functions'; import HttpStatus from 'http-status-codes'; -import {getDatastore} from './common/context'; +import { getDatastore } from './common/context'; import Busboy from 'busboy'; import JSONStream from 'jsonstream-ts'; -import {canImport} from './common/auth'; -import {DecodedIdToken} from 'firebase-admin/auth'; -import {GroundProtos} from '@ground/proto'; -import {toDocumentData, toGeometryPb, isGeometryValid} from '@ground/lib'; -import {Feature, GeoJsonProperties} from 'geojson'; -import {ErrorHandler} from './handlers'; +import { canImport } from './common/auth'; +import { DecodedIdToken } from 'firebase-admin/auth'; +import { GroundProtos } from '@ground/proto'; +import { toDocumentData, toGeometryPb, isGeometryValid } from '@ground/lib'; +import { Feature, GeoJsonProperties } from 'geojson'; +import { ErrorHandler } from './handlers'; import Pb = GroundProtos.ground.v1beta1; @@ -50,12 +50,12 @@ export function importGeoJsonCallback( ); } - const busboy = Busboy({headers: req.headers}); + const busboy = Busboy({ headers: req.headers }); let hasError = false; // Dictionary used to accumulate task step values, keyed by step name. - const params: {[name: string]: string} = {}; + const params: { [name: string]: string } = {}; // Accumulate Promises for insert operations, so we don't finalize the res // stream before operations are complete. @@ -67,7 +67,7 @@ export function importGeoJsonCallback( // This code will process each file uploaded. busboy.on('file', async (_fieldname, fileStream) => { - const {survey: surveyId, job: jobId} = params; + const { survey: surveyId, job: jobId } = params; if (!surveyId || !jobId) { return error(HttpStatus.BAD_REQUEST, 'Missing survey and/or job ID'); } @@ -117,7 +117,7 @@ export function importGeoJsonCallback( await Promise.all(inserts); const count = inserts.length; console.debug(`${count} LOIs imported`); - res.send(JSON.stringify({count})); + res.send(JSON.stringify({ count })); done(); } catch (err) { console.debug(err); @@ -158,11 +158,11 @@ export function importGeoJsonCallback( * data uses the 'CRS84' coordinate reference system. */ function onGeoJsonCrs( - geoJsonCrs: {type: string; properties: {name?: string}} | undefined + geoJsonCrs: { type: string; properties: { name?: string } } | undefined ) { let crs = 'CRS84'; if (geoJsonCrs) { - const {type, properties} = geoJsonCrs; + const { type, properties } = geoJsonCrs; switch (type) { case 'name': crs = properties?.name ?? 'CRS84'; @@ -222,7 +222,7 @@ function toLoiPb( ownerId: string ): Pb.LocationOfInterest { // TODO: Add created/modified metadata. - const {id, geometry, properties} = feature; + const { id, geometry, properties } = feature; const geometryPb = toGeometryPb(geometry); return new Pb.LocationOfInterest({ jobId, @@ -245,7 +245,7 @@ export function toLoiPbProperties(properties: GeoJsonProperties): { function toLoiPbProperty(value: any): Pb.LocationOfInterest.Property { return new Pb.LocationOfInterest.Property( typeof value === 'number' - ? {numericValue: value} - : {stringValue: value?.toString() || ''} + ? { numericValue: value } + : { stringValue: value?.toString() || '' } ); } diff --git a/functions/src/index.ts b/functions/src/index.ts index 794bd3352..a6f471ca0 100644 --- a/functions/src/index.ts +++ b/functions/src/index.ts @@ -16,21 +16,27 @@ import 'module-alias/register'; import * as functions from 'firebase-functions'; -import {onHttpsRequest, onHttpsRequestAsync} from './handlers'; -import {handleProfileRefresh} from './profile-refresh'; -import {sessionLoginHandler} from './session-login'; -import {importGeoJsonCallback} from './import-geojson'; -import {exportCsvHandler} from './export-csv'; -import {exportGeojsonHandler} from './export-geojson'; -import {onCall} from 'firebase-functions/v2/https'; -import {onCreateLoiHandler} from './on-create-loi'; -import {onCreatePasslistEntryHandler} from './on-create-passlist-entry'; -import {onWriteJobHandler} from './on-write-job'; -import {onWriteLoiHandler} from './on-write-loi'; -import {onWriteSubmissionHandler} from './on-write-submission'; -import {onWriteSurveyHandler} from './on-write-survey'; -import {job, loi, passlistEntry, submission, survey} from './common/datastore'; -import {initializeFirebaseApp} from './common/context'; +import { onHttpsRequest, onHttpsRequestAsync } from './handlers'; +import { handleProfileRefresh } from './profile-refresh'; +import { sessionLoginHandler } from './session-login'; +import { importGeoJsonCallback } from './import-geojson'; +import { exportCsvHandler } from './export-csv'; +import { exportGeojsonHandler } from './export-geojson'; +import { onCall } from 'firebase-functions/v2/https'; +import { onCreateLoiHandler } from './on-create-loi'; +import { onCreatePasslistEntryHandler } from './on-create-passlist-entry'; +import { onWriteJobHandler } from './on-write-job'; +import { onWriteLoiHandler } from './on-write-loi'; +import { onWriteSubmissionHandler } from './on-write-submission'; +import { onWriteSurveyHandler } from './on-write-survey'; +import { + job, + loi, + passlistEntry, + submission, + survey, +} from './common/datastore'; +import { initializeFirebaseApp } from './common/context'; // Ensure Firebase is initialized. initializeFirebaseApp(); diff --git a/functions/src/on-create-loi.ts b/functions/src/on-create-loi.ts index 77107379d..eb12040fe 100644 --- a/functions/src/on-create-loi.ts +++ b/functions/src/on-create-loi.ts @@ -14,23 +14,23 @@ * limitations under the License. */ -import {EventContext} from 'firebase-functions'; -import {QueryDocumentSnapshot} from 'firebase-functions/v1/firestore'; -import {getDatastore} from './common/context'; -import {Datastore} from './common/datastore'; -import {broadcastSurveyUpdate} from './common/broadcast-survey-update'; -import {GroundProtos} from '@ground/proto'; -import {toDocumentData, toGeoJsonGeometry, toMessage} from '@ground/lib'; -import {geojsonToWKT} from '@terraformer/wkt'; -import {toLoiPbProperties} from './import-geojson'; +import { EventContext } from 'firebase-functions'; +import { QueryDocumentSnapshot } from 'firebase-functions/v1/firestore'; +import { getDatastore } from './common/context'; +import { Datastore } from './common/datastore'; +import { broadcastSurveyUpdate } from './common/broadcast-survey-update'; +import { GroundProtos } from '@ground/proto'; +import { toDocumentData, toGeoJsonGeometry, toMessage } from '@ground/lib'; +import { geojsonToWKT } from '@terraformer/wkt'; +import { toLoiPbProperties } from './import-geojson'; import Pb = GroundProtos.ground.v1beta1; -type Properties = {[key: string]: string | number}; +type Properties = { [key: string]: string | number }; -type Headers = {[key: string]: string}; +type Headers = { [key: string]: string }; -type Body = {[key: string]: any}; +type Body = { [key: string]: any }; type PropertyGenerator = { headers?: Headers; @@ -40,7 +40,7 @@ type PropertyGenerator = { url: string; }; -const defaultHeaders = {'Content-Type': 'application/json'}; +const defaultHeaders = { 'Content-Type': 'application/json' }; /** * Handles the creation of a Location of Interest (LOI) document in Firestore. @@ -73,14 +73,14 @@ export async function onCreateLoiHandler( const propertyGenerator = propertyGeneratorDoc.data() as PropertyGenerator; if (propertyGeneratorDoc.id === 'whisp') { - const {body, headers, prefix, url} = propertyGenerator; + const { body, headers, prefix, url } = propertyGenerator; const wkt = geojsonToWKT(Datastore.fromFirestoreMap(geometry)); const newProperties = await fetchWhispProperties( url, - {...defaultHeaders, ...headers}, - {wkt, ...body} + { ...defaultHeaders, ...headers }, + { wkt, ...body } ); properties = await updateProperties(properties, newProperties, prefix); @@ -95,7 +95,7 @@ export async function onCreateLoiHandler( surveyId, loiId, toDocumentData( - new Pb.LocationOfInterest({properties: toLoiPbProperties(properties)}) + new Pb.LocationOfInterest({ properties: toLoiPbProperties(properties) }) ) ); @@ -158,7 +158,7 @@ function removePrefixedKeys(obj: Properties, prefix: string): Properties { function propertiesPbToObject(pb: { [k: string]: Pb.LocationOfInterest.IProperty; }): Properties { - const properties: {[k: string]: string | number} = {}; + const properties: { [k: string]: string | number } = {}; for (const k of Object.keys(pb)) { const v = pb[k].stringValue || pb[k].numericValue; if (v !== null && v !== undefined) { diff --git a/functions/src/on-create-passlist-entry.spec.ts b/functions/src/on-create-passlist-entry.spec.ts index 5ad238c0f..6a0d04cc7 100644 --- a/functions/src/on-create-passlist-entry.spec.ts +++ b/functions/src/on-create-passlist-entry.spec.ts @@ -20,11 +20,11 @@ import { newEventContext, stubAdminApi, } from '@ground/lib/dist/testing/firestore'; -import {resetDatastore} from './common/context'; -import {Firestore} from 'firebase-admin/firestore'; +import { resetDatastore } from './common/context'; +import { Firestore } from 'firebase-admin/firestore'; import * as functions from './index'; import * as context from './common/context'; -import {MailService} from './common/mail-service'; +import { MailService } from './common/mail-service'; const test = require('firebase-functions-test')(); @@ -71,21 +71,21 @@ describe('onCreatePasslistEntry()', () => { it('mail server config exists', async () => { const docRef = mockFirestore.doc('config/mail'); - docRef.set({server: serverConfig}); + docRef.set({ server: serverConfig }); const docSnapshot = await docRef.get(); const data = docSnapshot.data(); - expect(data).toEqual({server: serverConfig}); + expect(data).toEqual({ server: serverConfig }); expect(docSnapshot.exists).toBe(true); expect(docSnapshot.id).toBe('mail'); }); it('sends email notification', async () => { - mockFirestore.doc('config/mail').set({server: serverConfig}); + mockFirestore.doc('config/mail').set({ server: serverConfig }); mockFirestore.doc('config/mail/templates/passlisted').set(mail); mockFirestore.doc(`passlists/${mail.to}`).set({}); await test.wrap(functions.onCreatePasslistEntry)( newDocumentSnapshot({}), - newEventContext({entryId: mail.to}) + newEventContext({ entryId: mail.to }) ); expect(getMailServiceMock).toHaveBeenCalled(); expect(mailServiceMock.sendMail).toHaveBeenCalled(); diff --git a/functions/src/on-create-passlist-entry.ts b/functions/src/on-create-passlist-entry.ts index d68f7fb4c..63cf3bd0c 100644 --- a/functions/src/on-create-passlist-entry.ts +++ b/functions/src/on-create-passlist-entry.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import {EventContext} from 'firebase-functions'; -import {QueryDocumentSnapshot} from 'firebase-functions/v1/firestore'; -import {getDatastore, getMailService} from './common/context'; -import {MailServiceEmail} from './common/mail-service'; -import {stringFormat} from './common/utils'; +import { EventContext } from 'firebase-functions'; +import { QueryDocumentSnapshot } from 'firebase-functions/v1/firestore'; +import { getDatastore, getMailService } from './common/context'; +import { MailServiceEmail } from './common/mail-service'; +import { stringFormat } from './common/utils'; /** * Handles the creation of a passlist entry. @@ -44,7 +44,7 @@ export async function onCreatePasslistEntryHandler( return; } - const {subject, html: htmlBody} = template; + const { subject, html: htmlBody } = template; const mail = { to: entryId, diff --git a/functions/src/on-write-job.ts b/functions/src/on-write-job.ts index 8ddfa956b..19a0b7036 100644 --- a/functions/src/on-write-job.ts +++ b/functions/src/on-write-job.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import {Change, EventContext} from 'firebase-functions'; -import {DocumentSnapshot} from 'firebase-functions/v1/firestore'; -import {broadcastSurveyUpdate} from './common/broadcast-survey-update'; +import { Change, EventContext } from 'firebase-functions'; +import { DocumentSnapshot } from 'firebase-functions/v1/firestore'; +import { broadcastSurveyUpdate } from './common/broadcast-survey-update'; export async function onWriteJobHandler( _: Change, diff --git a/functions/src/on-write-loi.ts b/functions/src/on-write-loi.ts index 3db754c36..662404386 100644 --- a/functions/src/on-write-loi.ts +++ b/functions/src/on-write-loi.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import {Change, EventContext} from 'firebase-functions'; -import {DocumentSnapshot} from 'firebase-functions/v1/firestore'; -import {broadcastSurveyUpdate} from './common/broadcast-survey-update'; +import { Change, EventContext } from 'firebase-functions'; +import { DocumentSnapshot } from 'firebase-functions/v1/firestore'; +import { broadcastSurveyUpdate } from './common/broadcast-survey-update'; export async function onWriteLoiHandler( _: Change, diff --git a/functions/src/on-write-submission.spec.ts b/functions/src/on-write-submission.spec.ts index 7cccc913f..647950de8 100644 --- a/functions/src/on-write-submission.spec.ts +++ b/functions/src/on-write-submission.spec.ts @@ -22,11 +22,11 @@ import { createMockFirestore, } from '@ground/lib/dist/testing/firestore'; import * as functions from './index'; -import {loi} from './common/datastore'; -import {Firestore} from 'firebase-admin/firestore'; -import {resetDatastore} from './common/context'; -import {registry} from '@ground/lib'; -import {GroundProtos} from '@ground/proto'; +import { loi } from './common/datastore'; +import { Firestore } from 'firebase-admin/firestore'; +import { resetDatastore } from './common/context'; +import { registry } from '@ground/lib'; +import { GroundProtos } from '@ground/proto'; const test = require('firebase-functions-test')(); @@ -37,8 +37,8 @@ const sb = registry.getFieldIds(Pb.Submission); describe('onWriteSubmission()', () => { let mockFirestore: Firestore; const SURVEY_ID = 'survey1'; - const SUBMISSION = newDocumentSnapshot({loiId: 'loi1', [sb.loiId]: 'loi1'}); - const CONTEXT = newEventContext({surveyId: SURVEY_ID}); + const SUBMISSION = newDocumentSnapshot({ loiId: 'loi1', [sb.loiId]: 'loi1' }); + const CONTEXT = newEventContext({ surveyId: SURVEY_ID }); const SURVEY_PATH = `surveys/${SURVEY_ID}`; const SUBMISSIONS_PATH = `${SURVEY_PATH}/submissions`; const LOI_ID = 'loi1'; @@ -77,31 +77,31 @@ describe('onWriteSubmission()', () => { installSubmissionCountSpy(SUBMISSIONS_PATH, LOI_ID, 2); await test.wrap(functions.onWriteSubmission)( - {before: undefined, after: SUBMISSION}, + { before: undefined, after: SUBMISSION }, CONTEXT ); const loi = await mockFirestore.doc(LOI_PATH).get(); - expect(loi.data()).toEqual({[l.submissionCount]: 2}); + expect(loi.data()).toEqual({ [l.submissionCount]: 2 }); }); it('update submission count on delete', async () => { installSubmissionCountSpy(SUBMISSIONS_PATH, LOI_ID, 1); await test.wrap(functions.onWriteSubmission)( - {before: SUBMISSION, after: undefined}, + { before: SUBMISSION, after: undefined }, CONTEXT ); const loi = await mockFirestore.doc(LOI_PATH).get(); - expect(loi.data()).toEqual({[l.submissionCount]: 1}); + expect(loi.data()).toEqual({ [l.submissionCount]: 1 }); }); it('do nothing on invalid change', async () => { installSubmissionCountSpy(SUBMISSIONS_PATH, LOI_ID, 1); await test.wrap(functions.onWriteSubmission)( - {before: undefined, after: undefined}, + { before: undefined, after: undefined }, CONTEXT ); @@ -119,7 +119,7 @@ describe('onWriteSubmission()', () => { await expectAsync( test.wrap(functions.onWriteSubmission)( - {before: undefined, after: SUBMISSION}, + { before: undefined, after: SUBMISSION }, CONTEXT ) ).toBeRejected(); diff --git a/functions/src/on-write-submission.ts b/functions/src/on-write-submission.ts index 10aea46ec..6acd18d95 100644 --- a/functions/src/on-write-submission.ts +++ b/functions/src/on-write-submission.ts @@ -15,11 +15,11 @@ */ // import * as admin from 'firebase-admin'; -import {Change, EventContext} from 'firebase-functions'; -import {DocumentSnapshot} from 'firebase-functions/v1/firestore'; -import {getDatastore} from './common/context'; -import {registry} from '@ground/lib'; -import {GroundProtos} from '@ground/proto'; +import { Change, EventContext } from 'firebase-functions'; +import { DocumentSnapshot } from 'firebase-functions/v1/firestore'; +import { getDatastore } from './common/context'; +import { registry } from '@ground/lib'; +import { GroundProtos } from '@ground/proto'; import Pb = GroundProtos.ground.v1beta1; const sb = registry.getFieldIds(Pb.Submission); diff --git a/functions/src/on-write-survey.ts b/functions/src/on-write-survey.ts index 1fc695c1b..7a03498f1 100644 --- a/functions/src/on-write-survey.ts +++ b/functions/src/on-write-survey.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import {Change, EventContext} from 'firebase-functions'; -import {DocumentSnapshot} from 'firebase-functions/v1/firestore'; -import {broadcastSurveyUpdate} from './common/broadcast-survey-update'; +import { Change, EventContext } from 'firebase-functions'; +import { DocumentSnapshot } from 'firebase-functions/v1/firestore'; +import { broadcastSurveyUpdate } from './common/broadcast-survey-update'; export function onWriteSurveyHandler( _: Change, diff --git a/functions/src/profile-refresh.ts b/functions/src/profile-refresh.ts index 1a5a822d6..2a1cd8f97 100644 --- a/functions/src/profile-refresh.ts +++ b/functions/src/profile-refresh.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import {getDatastore} from './common/context'; -import {CallableRequest, HttpsError} from 'firebase-functions/v2/https'; -import {getAuth} from 'firebase-admin/auth'; +import { getDatastore } from './common/context'; +import { CallableRequest, HttpsError } from 'firebase-functions/v2/https'; +import { getAuth } from 'firebase-admin/auth'; type ProfileRefreshResponse = String | HttpsError; type ProfileRefreshRequest = CallableRequest; diff --git a/functions/src/session-login.ts b/functions/src/session-login.ts index aa39fd3d3..831bf326a 100644 --- a/functions/src/session-login.ts +++ b/functions/src/session-login.ts @@ -15,8 +15,8 @@ */ import * as functions from 'firebase-functions'; -import {setSessionCookie} from './common/auth'; -import {UNAUTHORIZED} from 'http-status-codes'; +import { setSessionCookie } from './common/auth'; +import { UNAUTHORIZED } from 'http-status-codes'; /** * Generates and sets a session cookie for the current user. diff --git a/functions/src/testing/http-test-helpers.ts b/functions/src/testing/http-test-helpers.ts index 0581287af..8bab09339 100644 --- a/functions/src/testing/http-test-helpers.ts +++ b/functions/src/testing/http-test-helpers.ts @@ -15,9 +15,9 @@ */ import functions from 'firebase-functions'; -import {buffer} from 'node:stream/consumers'; -import {FormDataEncoder} from 'form-data-encoder'; -import {FormData} from 'formdata-node'; +import { buffer } from 'node:stream/consumers'; +import { FormDataEncoder } from 'form-data-encoder'; +import { FormData } from 'formdata-node'; export async function createPostRequestSpy( args: object, diff --git a/lib/.eslintrc.json b/lib/.eslintrc.json index 0cd977114..3effc992a 100644 --- a/lib/.eslintrc.json +++ b/lib/.eslintrc.json @@ -1,14 +1,15 @@ { - "extends": "./node_modules/gts", + "extends": "../node_modules/gts", "env": { "jasmine": true }, "parser": "@typescript-eslint/parser", - "plugins": [ - "eslint-plugin-absolute-imports" - ], "root": true, "rules": { - "eqeqeq": ["error", "always", {"null": "ignore"}] + "eqeqeq": ["error", "always", {"null": "ignore"}], + "object-curly-spacing": ["error", "always"], + "n/no-extraneous-require": ["error", { + "allowModules": ["firebase-admin"] + }] } } diff --git a/lib/.prettierrc.js b/lib/.prettierrc.js index ff1548339..eab241e52 100644 --- a/lib/.prettierrc.js +++ b/lib/.prettierrc.js @@ -1,3 +1,4 @@ module.exports = { - ...require('gts/.prettierrc.json') + ...require('gts/.prettierrc.json'), + bracketSpacing: true } diff --git a/lib/package.json b/lib/package.json index 07ad27d45..2b1bd3810 100644 --- a/lib/package.json +++ b/lib/package.json @@ -35,7 +35,6 @@ "@types/source-map-support": "^0.5.10", "@typescript-eslint/eslint-plugin": "^5.39.0", "@typescript-eslint/parser": "^5.39.0", - "colors": "^1.4.0", "diff": "^5.2.0", "eslint": "^8.26.0", "eslint-config-prettier": "^8.5.0", @@ -45,6 +44,7 @@ "jasmine": "^5.1.0", "jasmine-spec-reporter": "^7.0.0", "mock-cloud-firestore": "^0.12.0", + "picocolors": "^1.1.1", "prettier": "^2.8.1", "source-map-support": "^0.5.21", "ts-mocha": "^10.0.0", diff --git a/lib/src/date-util.ts b/lib/src/date-util.ts index 497e64a31..73cce68a6 100644 --- a/lib/src/date-util.ts +++ b/lib/src/date-util.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {GroundProtos} from '@ground/proto'; +import { GroundProtos } from '@ground/proto'; import Long from 'long'; export function timestampToInt( diff --git a/lib/src/firestore-to-proto.spec.ts b/lib/src/firestore-to-proto.spec.ts index 26d6198a9..45d392009 100644 --- a/lib/src/firestore-to-proto.spec.ts +++ b/lib/src/firestore-to-proto.spec.ts @@ -14,12 +14,20 @@ * limitations under the License. */ -import {GroundProtos} from '@ground/proto'; -import {toMessage} from './firestore-to-proto'; -import {Constructor} from 'protobufjs'; +import { GroundProtos } from '@ground/proto'; +import { toMessage } from './firestore-to-proto'; +import { Constructor } from 'protobufjs'; -const {Coordinates, Job, LinearRing, Role, Style, Survey, Task, LocationOfInterest} = - GroundProtos.ground.v1beta1; +const { + Coordinates, + Job, + LinearRing, + Role, + Style, + Survey, + Task, + LocationOfInterest, +} = GroundProtos.ground.v1beta1; describe('toMessage()', () => { [ @@ -37,26 +45,26 @@ describe('toMessage()', () => { { desc: 'converts nested message', input: { - '4': {'1': '#112233'}, + '4': { '1': '#112233' }, }, expected: new Job({ - style: new Style({color: '#112233'}), + style: new Style({ color: '#112233' }), }), }, { desc: 'converts repeated message', input: { '1': [ - {'1': 5, '2': 7}, - {'1': 12, '2': 23}, - {'1': 9, '2': 2}, + { '1': 5, '2': 7 }, + { '1': 12, '2': 23 }, + { '1': 9, '2': 2 }, ], }, expected: new LinearRing({ coordinates: [ - new Coordinates({latitude: 5, longitude: 7}), - new Coordinates({latitude: 12, longitude: 23}), - new Coordinates({latitude: 9, longitude: 2}), + new Coordinates({ latitude: 5, longitude: 7 }), + new Coordinates({ latitude: 12, longitude: 23 }), + new Coordinates({ latitude: 9, longitude: 2 }), ], }), }, @@ -79,18 +87,26 @@ describe('toMessage()', () => { desc: 'converts map', input: { '10': { - 'stringProperty': {'1': 'non-empty string'}, - 'emptyStringProperty': {'1': ''}, - 'numberProperty': {'2': 123.4}, - 'valueZeroProperty': {'2': 0}, + stringProperty: { '1': 'non-empty string' }, + emptyStringProperty: { '1': '' }, + numberProperty: { '2': 123.4 }, + valueZeroProperty: { '2': 0 }, }, }, expected: new LocationOfInterest({ properties: { - 'stringProperty': new LocationOfInterest.Property({stringValue: 'non-empty string'}), - 'emptyStringProperty': new LocationOfInterest.Property({stringValue: ''}), - 'numberProperty': new LocationOfInterest.Property({numericValue: 123.4}), - 'valueZeroProperty': new LocationOfInterest.Property({numericValue: 0}), + stringProperty: new LocationOfInterest.Property({ + stringValue: 'non-empty string', + }), + emptyStringProperty: new LocationOfInterest.Property({ + stringValue: '', + }), + numberProperty: new LocationOfInterest.Property({ + numericValue: 123.4, + }), + valueZeroProperty: new LocationOfInterest.Property({ + numericValue: 0, + }), }, }), }, @@ -112,20 +128,20 @@ describe('toMessage()', () => { desc: 'converts repeated message', input: { '1': [ - {'1': 5, '2': 7}, - {'1': 12, '2': 23}, - {'1': 9, '2': 2}, + { '1': 5, '2': 7 }, + { '1': 12, '2': 23 }, + { '1': 9, '2': 2 }, ], }, expected: new LinearRing({ coordinates: [ - new Coordinates({latitude: 5, longitude: 7}), - new Coordinates({latitude: 12, longitude: 23}), - new Coordinates({latitude: 9, longitude: 2}), + new Coordinates({ latitude: 5, longitude: 7 }), + new Coordinates({ latitude: 12, longitude: 23 }), + new Coordinates({ latitude: 9, longitude: 2 }), ], }), }, - ].forEach(({desc, input, expected}) => + ].forEach(({ desc, input, expected }) => it(desc, () => { const output = toMessage(input, expected.constructor as Constructor); expect(output).toEqual(expected); diff --git a/lib/src/firestore-to-proto.ts b/lib/src/firestore-to-proto.ts index 37c511b3f..cc8309e14 100644 --- a/lib/src/firestore-to-proto.ts +++ b/lib/src/firestore-to-proto.ts @@ -14,9 +14,13 @@ * limitations under the License. */ -import {Constructor} from 'protobufjs'; -import {MessageDescriptor, MessageTypePath, registry} from './message-registry'; -import {DocumentData} from '@google-cloud/firestore'; +import { Constructor } from 'protobufjs'; +import { + MessageDescriptor, + MessageTypePath, + registry, +} from './message-registry'; +import { DocumentData } from '@google-cloud/firestore'; export function toMessage( data: DocumentData, @@ -92,7 +96,7 @@ function toMapValue( valueType: string, nestedObject: [key: string] ): any | null { - const messageMap: {[key: string]: any} = {}; + const messageMap: { [key: string]: any } = {}; for (const key in nestedObject) { const firestoreValue = nestedObject[key]; messageMap[key.toString()] = toFieldValue( diff --git a/lib/src/geo-json.ts b/lib/src/geo-json.ts index 2a62b1c5b..cf2c10bf3 100644 --- a/lib/src/geo-json.ts +++ b/lib/src/geo-json.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import {GroundProtos} from '@ground/proto'; -import {Geometry, MultiPolygon, Point, Polygon, Position} from 'geojson'; +import { GroundProtos } from '@ground/proto'; +import { Geometry, MultiPolygon, Point, Polygon, Position } from 'geojson'; import Pb = GroundProtos.ground.v1beta1; @@ -93,15 +93,15 @@ export function toGeometryPb(geometry: Geometry): Pb.Geometry { function toPointGeometryPb(position: Position): Pb.Geometry { const coordinates = toCoordinatesPb(position); - const point = new Pb.Point({coordinates}); - return new Pb.Geometry({point}); + const point = new Pb.Point({ coordinates }); + return new Pb.Geometry({ point }); } function toCoordinatesPb(position: Position): Pb.Coordinates { const [longitude, latitude] = position; if (longitude === undefined || latitude === undefined) throw new Error('Missing coordinate(s)'); - return new Pb.Coordinates({longitude, latitude}); + return new Pb.Coordinates({ longitude, latitude }); } function toPolygonPb(positions: Position[][]): Pb.Polygon { @@ -111,25 +111,25 @@ function toPolygonPb(positions: Position[][]): Pb.Polygon { throw new Error('Missing required polygon shell coordinates'); const shell = toLinearRingPb(shellCoords); const holes = holeCoords?.map(h => toLinearRingPb(h)); - return new Pb.Polygon({shell, holes}); + return new Pb.Polygon({ shell, holes }); } function toPolygonGeometryPb(positions: Position[][]): Pb.Geometry { const polygon = toPolygonPb(positions); - return new Pb.Geometry({polygon}); + return new Pb.Geometry({ polygon }); } function toLinearRingPb(positions: Position[]): Pb.LinearRing { const coordinates = positions.map(p => toCoordinatesPb(p)); - return new Pb.LinearRing({coordinates}); + return new Pb.LinearRing({ coordinates }); } function toMultiPolygonGeometryPb(positions: Position[][][]): Pb.Geometry { // Skip invalid polygons. const polygons = positions.map(p => toPolygonPb(p)); if (polygons.length === 0) throw new Error('Empty multi-polygon'); - const multiPolygon = new Pb.MultiPolygon({polygons}); - return new Pb.Geometry({multiPolygon}); + const multiPolygon = new Pb.MultiPolygon({ polygons }); + return new Pb.Geometry({ multiPolygon }); } export function isGeometryValid(geometry: Geometry): boolean { diff --git a/lib/src/index.ts b/lib/src/index.ts index dfd5ec4ab..348c8095f 100644 --- a/lib/src/index.ts +++ b/lib/src/index.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -export {toDocumentData} from './proto-to-firestore'; -export {toMessage} from './firestore-to-proto'; -export {timestampToInt} from './date-util'; -export {deleteEmpty, isEmpty} from './obj-util'; -export {toGeoJsonGeometry, toGeometryPb, isGeometryValid} from './geo-json'; -export {registry} from './message-registry'; +export { toDocumentData } from './proto-to-firestore'; +export { toMessage } from './firestore-to-proto'; +export { timestampToInt } from './date-util'; +export { deleteEmpty, isEmpty } from './obj-util'; +export { toGeoJsonGeometry, toGeometryPb, isGeometryValid } from './geo-json'; +export { registry } from './message-registry'; diff --git a/lib/src/message-registry.ts b/lib/src/message-registry.ts index 5998f04c9..6086d1d0a 100644 --- a/lib/src/message-registry.ts +++ b/lib/src/message-registry.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import {GroundProtos, registryJson} from '@ground/proto'; -import {Constructor} from 'protobufjs'; +import { GroundProtos, registryJson } from '@ground/proto'; +import { Constructor } from 'protobufjs'; /** Path of message or enum type declaration in definition files and registry. */ export type MessageTypePath = string[]; @@ -35,13 +35,13 @@ export interface FieldDescriptor { export interface MessageDescriptor { // Normal proto fields. - fields?: {[fieldName: string]: FieldDescriptor}; + fields?: { [fieldName: string]: FieldDescriptor }; // Possible oneof selector values. - oneofs?: {[oneofName: string]: OneOfDescriptor}; + oneofs?: { [oneofName: string]: OneOfDescriptor }; // Nested message type definition. - nested?: {[nestedMessageName: string]: MessageDescriptor}; + nested?: { [nestedMessageName: string]: MessageDescriptor }; // Enum definitions, including valid values. - values?: {[enumValueName: string]: number}; + values?: { [enumValueName: string]: number }; } export interface OneOfDescriptor { @@ -50,7 +50,7 @@ export interface OneOfDescriptor { export interface MessageRegistryJson { options?: ProtoOptions; - nested: {[messageName: string]: MessageDescriptor}; + nested: { [messageName: string]: MessageDescriptor }; } export class MessageRegistry { @@ -77,10 +77,10 @@ export class MessageRegistry { * Returns a dictionary containing the numbers of all fields in a * message definition, keyed by field name. Throws an error if not found. */ - getFieldIds(constructor: any): {[key: string]: string} { + getFieldIds(constructor: any): { [key: string]: string } { const desc = this.getMessageDescriptor(constructor); if (!desc) throw new Error(`Unknown constructor ${constructor.name}`); - const map: {[key: string]: string} = {}; + const map: { [key: string]: string } = {}; if (desc.fields) { Object.keys(desc.fields).forEach( name => (map[name] = desc.fields![name].id?.toString()) diff --git a/lib/src/proto-to-firestore.spec.ts b/lib/src/proto-to-firestore.spec.ts index 8c16e7ac6..f7c8c0a96 100644 --- a/lib/src/proto-to-firestore.spec.ts +++ b/lib/src/proto-to-firestore.spec.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import {registry} from './message-registry'; -import {GroundProtos} from '@ground/proto'; -import {toDocumentData} from './proto-to-firestore'; +import { registry } from './message-registry'; +import { GroundProtos } from '@ground/proto'; +import { toDocumentData } from './proto-to-firestore'; import Pb = GroundProtos.ground.v1beta1; const s = registry.getFieldIds(Pb.Survey); @@ -27,7 +27,7 @@ const t = registry.getFieldIds(Pb.Task); const st = registry.getFieldIds(Pb.Style); const dtq = registry.getFieldIds(Pb.Task.DateTimeQuestion); -const {Job, Role, Style, Survey, Task, LinearRing, Coordinates} = +const { Job, Role, Style, Survey, Task, LinearRing, Coordinates } = GroundProtos.ground.v1beta1; describe('toDocumentData()', () => { @@ -43,34 +43,34 @@ describe('toDocumentData()', () => { [s.description]: 'Survey desc', [s.state]: Survey.State.STATE_UNSPECIFIED, [s.generalAccess]: Survey.GeneralAccess.GENERAL_ACCESS_UNSPECIFIED, - [s.dataVisibility]: Survey.DataVisibility.DATA_VISIBILITY_UNSPECIFIED + [s.dataVisibility]: Survey.DataVisibility.DATA_VISIBILITY_UNSPECIFIED, }, }, { desc: 'converts repeated message', input: new LinearRing({ coordinates: [ - new Coordinates({latitude: 5, longitude: 7}), - new Coordinates({latitude: 12, longitude: 23}), - new Coordinates({latitude: 9, longitude: 2}), + new Coordinates({ latitude: 5, longitude: 7 }), + new Coordinates({ latitude: 12, longitude: 23 }), + new Coordinates({ latitude: 9, longitude: 2 }), ], }), expected: { [lr.coordinates]: [ - {[c.latitude]: 5, [c.longitude]: 7}, - {[c.latitude]: 12, [c.longitude]: 23}, - {[c.latitude]: 9, [c.longitude]: 2}, + { [c.latitude]: 5, [c.longitude]: 7 }, + { [c.latitude]: 12, [c.longitude]: 23 }, + { [c.latitude]: 9, [c.longitude]: 2 }, ], }, }, { desc: 'converts nested message', input: new Job({ - style: new Style({color: '#112233'}), + style: new Style({ color: '#112233' }), }), expected: { [j.index]: 0, - [j.style]: {[st.color]: '#112233'}, + [j.style]: { [st.color]: '#112233' }, }, }, { @@ -88,7 +88,7 @@ describe('toDocumentData()', () => { }, [s.state]: Survey.State.STATE_UNSPECIFIED, [s.generalAccess]: Survey.GeneralAccess.GENERAL_ACCESS_UNSPECIFIED, - [s.dataVisibility]: Survey.DataVisibility.DATA_VISIBILITY_UNSPECIFIED + [s.dataVisibility]: Survey.DataVisibility.DATA_VISIBILITY_UNSPECIFIED, }, }, { @@ -113,16 +113,16 @@ describe('toDocumentData()', () => { desc: 'converts repeated message', input: new LinearRing({ coordinates: [ - new Coordinates({latitude: 5, longitude: 7}), - new Coordinates({latitude: 12, longitude: 23}), - new Coordinates({latitude: 9, longitude: 2}), + new Coordinates({ latitude: 5, longitude: 7 }), + new Coordinates({ latitude: 12, longitude: 23 }), + new Coordinates({ latitude: 9, longitude: 2 }), ], }), expected: { [lr.coordinates]: [ - {[c.latitude]: 5, [c.longitude]: 7}, - {[c.latitude]: 12, [c.longitude]: 23}, - {[c.latitude]: 9, [c.longitude]: 2}, + { [c.latitude]: 5, [c.longitude]: 7 }, + { [c.latitude]: 12, [c.longitude]: 23 }, + { [c.latitude]: 9, [c.longitude]: 2 }, ], }, }, @@ -137,10 +137,10 @@ describe('toDocumentData()', () => { [t.index]: 0, [t.required]: false, [t.level]: 0, - [t.textQuestion]: {'1': 1}, + [t.textQuestion]: { '1': 1 }, }, }, - ].forEach(({desc, input, expected}) => + ].forEach(({ desc, input, expected }) => it(desc, () => { const output = toDocumentData(input); expect(output).toEqual(expected); diff --git a/lib/src/proto-to-firestore.ts b/lib/src/proto-to-firestore.ts index 805853fe5..0f1d12e39 100644 --- a/lib/src/proto-to-firestore.ts +++ b/lib/src/proto-to-firestore.ts @@ -14,9 +14,13 @@ * limitations under the License. */ -import {FieldDescriptor, MessageDescriptor, registry} from './message-registry'; -import {isEmpty} from './obj-util'; -import {DocumentData, DocumentFieldValue} from '@google-cloud/firestore'; +import { + FieldDescriptor, + MessageDescriptor, + registry, +} from './message-registry'; +import { isEmpty } from './obj-util'; +import { DocumentData, DocumentFieldValue } from '@google-cloud/firestore'; /** * Returns the map representation of the provided message ready for serialization in Firestore. @@ -96,7 +100,6 @@ function toValue( // TODO(#1758): Coerce values to type specified in `fieldType`.Fix switch (typeof value) { switch (typeof value) { case 'string': - case 'boolean': case 'number': // This handles proto enums as well. case 'boolean': return value; diff --git a/lib/src/testing/diff.js b/lib/src/testing/diff.js index 16b95d445..1f31da9d6 100644 --- a/lib/src/testing/diff.js +++ b/lib/src/testing/diff.js @@ -14,8 +14,8 @@ * limitations under the License. */ -import colors from 'colors/safe'; -import {diffLines} from 'diff'; +import colors from 'picocolors'; +import { diffLines } from 'diff'; /** * Decorates a Jasmine matcher with ability to pretty-print differences in @@ -52,8 +52,8 @@ function formatDiffs(actual, expected) { * @return {string} Diff line with markers and color codes. */ function formatDiff(diff) { - const {green, red, reset} = colors; - const {added, removed, value} = diff; + const { green, red, reset } = colors; + const { added, removed, value } = diff; if (added) { return green(`+${value}`); } else if (removed) { diff --git a/lib/src/testing/firestore/document-snapshot.ts b/lib/src/testing/firestore/document-snapshot.ts index df51557a8..b02077312 100644 --- a/lib/src/testing/firestore/document-snapshot.ts +++ b/lib/src/testing/firestore/document-snapshot.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {DocumentData, DocumentSnapshot} from '@google-cloud/firestore'; +import { DocumentData, DocumentSnapshot } from '@google-cloud/firestore'; export class TestDocumentSnapshot { constructor(private readonly testData: DocumentData) {} diff --git a/lib/src/testing/firestore/event-context.ts b/lib/src/testing/firestore/event-context.ts index 37a6c5882..78f5d53aa 100644 --- a/lib/src/testing/firestore/event-context.ts +++ b/lib/src/testing/firestore/event-context.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {EventContext} from 'firebase-functions'; +import { EventContext } from 'firebase-functions'; export class TestEventContext { constructor(public readonly params: Record) {} diff --git a/lib/src/testing/firestore/firestore.ts b/lib/src/testing/firestore/firestore.ts index 9ebec663e..06ff4fcc5 100644 --- a/lib/src/testing/firestore/firestore.ts +++ b/lib/src/testing/firestore/firestore.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {Firestore} from '@google-cloud/firestore'; +import { Firestore } from '@google-cloud/firestore'; const MockFirebase = require('mock-cloud-firestore'); diff --git a/lib/src/testing/firestore/setup.ts b/lib/src/testing/firestore/setup.ts index 7a616808e..ca2c52cd9 100644 --- a/lib/src/testing/firestore/setup.ts +++ b/lib/src/testing/firestore/setup.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {Firestore} from '@google-cloud/firestore'; +import { Firestore } from '@google-cloud/firestore'; export function stubAdminApi(mockFirestore: Firestore) { spyOn(require('firebase-admin'), 'initializeApp').and.returnValue({ diff --git a/lib/src/testing/reporter.js b/lib/src/testing/reporter.js index fe23d086e..4fc52e25c 100644 --- a/lib/src/testing/reporter.js +++ b/lib/src/testing/reporter.js @@ -14,7 +14,7 @@ * limitations under the License. */ -import {SpecReporter, StacktraceOption} from 'jasmine-spec-reporter'; +import { SpecReporter, StacktraceOption } from 'jasmine-spec-reporter'; // Show references to TypeScript code in stacktraces. require('source-map-support').install(); diff --git a/package-lock.json b/package-lock.json index 54246b60d..7b8c54a86 100644 --- a/package-lock.json +++ b/package-lock.json @@ -98,7 +98,6 @@ "@types/source-map-support": "^0.5.10", "@typescript-eslint/eslint-plugin": "^5.39.0", "@typescript-eslint/parser": "^5.39.0", - "colors": "^1.4.0", "diff": "^5.2.0", "eslint": "^8.26.0", "eslint-config-prettier": "^8.5.0", @@ -108,6 +107,7 @@ "jasmine": "^5.1.0", "jasmine-spec-reporter": "^7.0.0", "mock-cloud-firestore": "^0.12.0", + "picocolors": "^1.1.1", "prettier": "^2.8.1", "source-map-support": "^0.5.21", "ts-mocha": "^10.0.0", diff --git a/web/.prettierrc.js b/web/.prettierrc.js index ff1548339..eab241e52 100644 --- a/web/.prettierrc.js +++ b/web/.prettierrc.js @@ -1,3 +1,4 @@ module.exports = { - ...require('gts/.prettierrc.json') + ...require('gts/.prettierrc.json'), + bracketSpacing: true } diff --git a/web/src/app/app.component.ts b/web/src/app/app.component.ts index f0460ea22..21794f2ea 100644 --- a/web/src/app/app.component.ts +++ b/web/src/app/app.component.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import {DOCUMENT} from '@angular/common'; -import {Component, Inject} from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; -import {environment} from 'environments/environment'; -import {Env} from 'environments/environment-enums'; +import { environment } from 'environments/environment'; +import { Env } from 'environments/environment-enums'; /** * Top-level component. Delegates routing of sub-components to paths defined diff --git a/web/src/app/app.module.ts b/web/src/app/app.module.ts index a5801a107..7021fa706 100644 --- a/web/src/app/app.module.ts +++ b/web/src/app/app.module.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import {HttpClientModule} from '@angular/common/http'; -import {NgModule} from '@angular/core'; -import {AngularFireModule} from '@angular/fire/compat'; -import {AngularFireAuthModule} from '@angular/fire/compat/auth'; -import {USE_EMULATOR as USE_DATABASE_EMULATOR} from '@angular/fire/compat/database'; +import { HttpClientModule } from '@angular/common/http'; +import { NgModule } from '@angular/core'; +import { AngularFireModule } from '@angular/fire/compat'; +import { AngularFireAuthModule } from '@angular/fire/compat/auth'; +import { USE_EMULATOR as USE_DATABASE_EMULATOR } from '@angular/fire/compat/database'; import { AngularFirestoreModule, SETTINGS as FIRESTORE_SETTINGS, @@ -33,17 +33,17 @@ import { DEFAULTS as RC_DEFAULTS, SETTINGS as RC_SETTINGS, } from '@angular/fire/compat/remote-config'; -import {AngularFireStorageModule} from '@angular/fire/compat/storage'; -import {BrowserModule} from '@angular/platform-browser'; -import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; -import {initializeApp} from 'firebase/app'; -import {GoogleAuthProvider} from 'firebase/auth'; -import {FirebaseUIModule, firebaseui} from 'firebaseui-angular'; +import { AngularFireStorageModule } from '@angular/fire/compat/storage'; +import { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { initializeApp } from 'firebase/app'; +import { GoogleAuthProvider } from 'firebase/auth'; +import { FirebaseUIModule, firebaseui } from 'firebaseui-angular'; -import {AppComponent} from 'app/app.component'; -import {MainPageContainerModule} from 'app/components/main-page-container/main-page-container.module'; -import {AppRoutingModule} from 'app/routing.module'; -import {environment} from 'environments/environment'; +import { AppComponent } from 'app/app.component'; +import { MainPageContainerModule } from 'app/components/main-page-container/main-page-container.module'; +import { AppRoutingModule } from 'app/routing.module'; +import { environment } from 'environments/environment'; const firebaseUiAuthConfig: firebaseui.auth.Config = { // Popup is required to prevent some browsers and Chrome incognito for getting @@ -62,15 +62,15 @@ initializeApp(environment.firebase); providers: [ { provide: FIRESTORE_SETTINGS, - useValue: {ignoreUndefinedProperties: true}, + useValue: { ignoreUndefinedProperties: true }, }, { provide: RC_SETTINGS, - useValue: {minimumFetchIntervalMillis: 3600000}, + useValue: { minimumFetchIntervalMillis: 3600000 }, }, { provide: RC_DEFAULTS, - useValue: {google_play_id: ''}, + useValue: { google_play_id: '' }, }, // Emulator ports defined in ../firebase.local.json // TODO(#979): Set up auth emulator and enable rules. diff --git a/web/src/app/app.spec.ts b/web/src/app/app.spec.ts index 52036811d..d501ab8ff 100644 --- a/web/src/app/app.spec.ts +++ b/web/src/app/app.spec.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import {TestBed, waitForAsync} from '@angular/core/testing'; -import {RouterTestingModule} from '@angular/router/testing'; +import { TestBed, waitForAsync } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; -import {AppComponent} from 'app/app.component'; +import { AppComponent } from 'app/app.component'; describe('AppComponent', () => { beforeEach(waitForAsync(() => { diff --git a/web/src/app/components/about/about.component.ts b/web/src/app/components/about/about.component.ts index 660940d34..adfd7cfc4 100644 --- a/web/src/app/components/about/about.component.ts +++ b/web/src/app/components/about/about.component.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import {Location} from '@angular/common'; -import {Component} from '@angular/core'; +import { Location } from '@angular/common'; +import { Component } from '@angular/core'; @Component({ selector: 'ground-about-page', diff --git a/web/src/app/components/about/about.module.ts b/web/src/app/components/about/about.module.ts index efbc03b4e..60898c9a0 100644 --- a/web/src/app/components/about/about.module.ts +++ b/web/src/app/components/about/about.module.ts @@ -14,14 +14,14 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {MatButton} from '@angular/material/button'; -import {MatIcon} from '@angular/material/icon'; -import {RouterModule} from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButton } from '@angular/material/button'; +import { MatIcon } from '@angular/material/icon'; +import { RouterModule } from '@angular/router'; -import {AboutComponent} from 'app/components/about/about.component'; -import {HeaderModule} from 'app/components/shared/header/header.module'; +import { AboutComponent } from 'app/components/about/about.component'; +import { HeaderModule } from 'app/components/shared/header/header.module'; @NgModule({ declarations: [AboutComponent], diff --git a/web/src/app/components/android-intent-landing-page/android-intent-landing-page.component.ts b/web/src/app/components/android-intent-landing-page/android-intent-landing-page.component.ts index 3357b25d6..9e70ef89c 100644 --- a/web/src/app/components/android-intent-landing-page/android-intent-landing-page.component.ts +++ b/web/src/app/components/android-intent-landing-page/android-intent-landing-page.component.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import {Component, Inject, LOCALE_ID, OnInit} from '@angular/core'; -import {Router} from '@angular/router'; -import {firstValueFrom} from 'rxjs'; +import { Component, Inject, LOCALE_ID, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { firstValueFrom } from 'rxjs'; -import {AppConfigService} from 'app/services/app-config/app-config.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; +import { AppConfigService } from 'app/services/app-config/app-config.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; @Component({ selector: 'ground-android-landing-page', diff --git a/web/src/app/components/android-intent-landing-page/android-intent-landing-page.module.ts b/web/src/app/components/android-intent-landing-page/android-intent-landing-page.module.ts index bae278eb2..acd1c1e5f 100644 --- a/web/src/app/components/android-intent-landing-page/android-intent-landing-page.module.ts +++ b/web/src/app/components/android-intent-landing-page/android-intent-landing-page.module.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {RouterModule} from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; -import {AndroidIntentLandingPageComponent} from './android-intent-landing-page.component'; +import { AndroidIntentLandingPageComponent } from './android-intent-landing-page.component'; @NgModule({ declarations: [AndroidIntentLandingPageComponent], diff --git a/web/src/app/components/create-survey/create-survey.component.spec.ts b/web/src/app/components/create-survey/create-survey.component.spec.ts index 451369817..7a7d8dce6 100644 --- a/web/src/app/components/create-survey/create-survey.component.spec.ts +++ b/web/src/app/components/create-survey/create-survey.component.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {NO_ERRORS_SCHEMA} from '@angular/core'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, @@ -23,33 +23,33 @@ import { tick, waitForAsync, } from '@angular/core/testing'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; -import {By} from '@angular/platform-browser'; -import {ActivatedRoute} from '@angular/router'; -import {List, Map} from 'immutable'; -import {Observable, Subject} from 'rxjs'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { By } from '@angular/platform-browser'; +import { ActivatedRoute } from '@angular/router'; +import { List, Map } from 'immutable'; +import { Observable, Subject } from 'rxjs'; import { CreateSurveyComponent, CreateSurveyPhase, } from 'app/components/create-survey/create-survey.component'; -import {DataSharingTermsComponent} from 'app/components/create-survey/data-sharing-terms/data-sharing-terms.component'; -import {JobDetailsComponent} from 'app/components/create-survey/job-details/job-details.component'; -import {SurveyDetailsComponent} from 'app/components/create-survey/survey-details/survey-details.component'; -import {ShareSurveyComponent} from 'app/components/shared/share-survey/share-survey.component'; -import {Job} from 'app/models/job.model'; -import {LocationOfInterest} from 'app/models/loi.model'; -import {DataSharingType, Survey, SurveyState} from 'app/models/survey.model'; -import {Task, TaskType} from 'app/models/task/task.model'; -import {DraftSurveyService} from 'app/services/draft-survey/draft-survey.service'; -import {JobService} from 'app/services/job/job.service'; -import {LocationOfInterestService} from 'app/services/loi/loi.service'; -import {SURVEY_ID_NEW} from 'app/services/navigation/navigation.constants'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SurveyService} from 'app/services/survey/survey.service'; -import {TaskService} from 'app/services/task/task.service'; -import {ActivatedRouteStub} from 'testing/activated-route-stub'; +import { DataSharingTermsComponent } from 'app/components/create-survey/data-sharing-terms/data-sharing-terms.component'; +import { JobDetailsComponent } from 'app/components/create-survey/job-details/job-details.component'; +import { SurveyDetailsComponent } from 'app/components/create-survey/survey-details/survey-details.component'; +import { ShareSurveyComponent } from 'app/components/shared/share-survey/share-survey.component'; +import { Job } from 'app/models/job.model'; +import { LocationOfInterest } from 'app/models/loi.model'; +import { DataSharingType, Survey, SurveyState } from 'app/models/survey.model'; +import { Task, TaskType } from 'app/models/task/task.model'; +import { DraftSurveyService } from 'app/services/draft-survey/draft-survey.service'; +import { JobService } from 'app/services/job/job.service'; +import { LocationOfInterestService } from 'app/services/loi/loi.service'; +import { SURVEY_ID_NEW } from 'app/services/navigation/navigation.constants'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SurveyService } from 'app/services/survey/survey.service'; +import { TaskService } from 'app/services/task/task.service'; +import { ActivatedRouteStub } from 'testing/activated-route-stub'; describe('CreateSurveyComponent', () => { let component: CreateSurveyComponent; @@ -79,7 +79,7 @@ describe('CreateSurveyComponent', () => { /* jobs= */ Map(), /* acl= */ Map(), /* ownerId= */ '', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ); const surveyWithoutJob = new Survey( surveyId, @@ -88,7 +88,7 @@ describe('CreateSurveyComponent', () => { /* jobs= */ Map(), /* acl= */ Map(), /* ownerId= */ '', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ); const job = new Job(jobId, /* index */ 0, 'red', name, /* tasks= */ Map()); const newJob = new Job(jobId, -1); @@ -101,7 +101,7 @@ describe('CreateSurveyComponent', () => { }), /* acl= */ Map(), /* ownerId= */ '', - {type: DataSharingType.CUSTOM, customText: 'Good day, sir'} + { type: DataSharingType.CUSTOM, customText: 'Good day, sir' } ); const jobWithTask = new Job( jobId, @@ -127,7 +127,7 @@ describe('CreateSurveyComponent', () => { }), /* acl= */ Map(), /* ownerId= */ '', - {type: DataSharingType.PRIVATE}, + { type: DataSharingType.PRIVATE }, SurveyState.READY ); beforeEach(waitForAsync(() => { @@ -211,13 +211,13 @@ describe('CreateSurveyComponent', () => { ], schemas: [NO_ERRORS_SCHEMA], providers: [ - {provide: NavigationService, useValue: navigationServiceSpy}, - {provide: SurveyService, useValue: surveyServiceSpy}, - {provide: DraftSurveyService, useValue: draftSurveyServiceSpy}, - {provide: JobService, useValue: jobServiceSpy}, - {provide: LocationOfInterestService, useValue: loiServiceSpy}, - {provide: ActivatedRoute, useValue: route}, - {provide: TaskService, useValue: taskServiceSpy}, + { provide: NavigationService, useValue: navigationServiceSpy }, + { provide: SurveyService, useValue: surveyServiceSpy }, + { provide: DraftSurveyService, useValue: draftSurveyServiceSpy }, + { provide: JobService, useValue: jobServiceSpy }, + { provide: LocationOfInterestService, useValue: loiServiceSpy }, + { provide: ActivatedRoute, useValue: route }, + { provide: TaskService, useValue: taskServiceSpy }, ], }).compileComponents(); })); @@ -404,7 +404,7 @@ describe('CreateSurveyComponent', () => { expect(jobServiceSpy.addOrUpdateJob).toHaveBeenCalledOnceWith( surveyId, - newJob.copyWith({name}) + newJob.copyWith({ name }) ); })); }); @@ -433,7 +433,7 @@ describe('CreateSurveyComponent', () => { expect(jobServiceSpy.addOrUpdateJob).toHaveBeenCalledOnceWith( surveyId, - job.copyWith({name}) + job.copyWith({ name }) ); })); diff --git a/web/src/app/components/create-survey/create-survey.component.ts b/web/src/app/components/create-survey/create-survey.component.ts index 17d5729ab..25b1ee736 100644 --- a/web/src/app/components/create-survey/create-survey.component.ts +++ b/web/src/app/components/create-survey/create-survey.component.ts @@ -16,27 +16,27 @@ import '@angular/localize/init'; -import {ChangeDetectorRef, Component, OnInit, ViewChild} from '@angular/core'; -import {ActivatedRoute} from '@angular/router'; -import {List} from 'immutable'; -import {Subscription, combineLatest, filter} from 'rxjs'; - -import {DataSharingTermsComponent} from 'app/components/create-survey/data-sharing-terms/data-sharing-terms.component'; -import {JobDetailsComponent} from 'app/components/create-survey/job-details/job-details.component'; -import {SurveyDetailsComponent} from 'app/components/create-survey/survey-details/survey-details.component'; -import {TaskDetailsComponent} from 'app/components/create-survey/task-details/task-details.component'; -import {DataCollectionStrategy, Job} from 'app/models/job.model'; -import {LocationOfInterest} from 'app/models/loi.model'; -import {Survey, SurveyState} from 'app/models/survey.model'; -import {DraftSurveyService} from 'app/services/draft-survey/draft-survey.service'; -import {JobService} from 'app/services/job/job.service'; -import {LocationOfInterestService} from 'app/services/loi/loi.service'; -import {SURVEY_ID_NEW} from 'app/services/navigation/navigation.constants'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SurveyService} from 'app/services/survey/survey.service'; -import {TaskService} from 'app/services/task/task.service'; - -import {SurveyLoiComponent} from './survey-loi/survey-loi.component'; +import { ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { List } from 'immutable'; +import { Subscription, combineLatest, filter } from 'rxjs'; + +import { DataSharingTermsComponent } from 'app/components/create-survey/data-sharing-terms/data-sharing-terms.component'; +import { JobDetailsComponent } from 'app/components/create-survey/job-details/job-details.component'; +import { SurveyDetailsComponent } from 'app/components/create-survey/survey-details/survey-details.component'; +import { TaskDetailsComponent } from 'app/components/create-survey/task-details/task-details.component'; +import { DataCollectionStrategy, Job } from 'app/models/job.model'; +import { LocationOfInterest } from 'app/models/loi.model'; +import { Survey, SurveyState } from 'app/models/survey.model'; +import { DraftSurveyService } from 'app/services/draft-survey/draft-survey.service'; +import { JobService } from 'app/services/job/job.service'; +import { LocationOfInterestService } from 'app/services/loi/loi.service'; +import { SURVEY_ID_NEW } from 'app/services/navigation/navigation.constants'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SurveyService } from 'app/services/survey/survey.service'; +import { TaskService } from 'app/services/task/task.service'; + +import { SurveyLoiComponent } from './survey-loi/survey-loi.component'; export enum CreateSurveyPhase { LOADING, diff --git a/web/src/app/components/create-survey/create-survey.module.ts b/web/src/app/components/create-survey/create-survey.module.ts index 313a6f51d..948edebb3 100644 --- a/web/src/app/components/create-survey/create-survey.module.ts +++ b/web/src/app/components/create-survey/create-survey.module.ts @@ -14,24 +14,24 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {MatInputModule} from '@angular/material/input'; -import {MatProgressBarModule} from '@angular/material/progress-bar'; -import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import {CreateSurveyComponent} from 'app/components/create-survey/create-survey.component'; -import {DataSharingTermsModule} from 'app/components/create-survey/data-sharing-terms/data-sharing-terms.module'; -import {TaskDetailsModule} from 'app/components/create-survey/task-details/task-details.module'; -import {CopySurveyControlsModule} from 'app/components/shared/copy-survey-controls/copy-survey-controls.module'; -import {HeaderModule} from 'app/components/shared/header/header.module'; -import {ShareSurveyModule} from 'app/components/shared/share-survey/share-survey.module'; +import { CreateSurveyComponent } from 'app/components/create-survey/create-survey.component'; +import { DataSharingTermsModule } from 'app/components/create-survey/data-sharing-terms/data-sharing-terms.module'; +import { TaskDetailsModule } from 'app/components/create-survey/task-details/task-details.module'; +import { CopySurveyControlsModule } from 'app/components/shared/copy-survey-controls/copy-survey-controls.module'; +import { HeaderModule } from 'app/components/shared/header/header.module'; +import { ShareSurveyModule } from 'app/components/shared/share-survey/share-survey.module'; -import {JobDetailsModule} from './job-details/job-details.module'; -import {StepCardModule} from './step-card/step-card.module'; -import {SurveyDetailsModule} from './survey-details/survey-details.module'; -import {SurveyLoiModule} from './survey-loi/survey-loi.module'; +import { JobDetailsModule } from './job-details/job-details.module'; +import { StepCardModule } from './step-card/step-card.module'; +import { SurveyDetailsModule } from './survey-details/survey-details.module'; +import { SurveyLoiModule } from './survey-loi/survey-loi.module'; @NgModule({ declarations: [CreateSurveyComponent], diff --git a/web/src/app/components/create-survey/data-sharing-terms/data-sharing-terms.component.spec.ts b/web/src/app/components/create-survey/data-sharing-terms/data-sharing-terms.component.spec.ts index 951e0fda4..661e4ca6c 100644 --- a/web/src/app/components/create-survey/data-sharing-terms/data-sharing-terms.component.spec.ts +++ b/web/src/app/components/create-survey/data-sharing-terms/data-sharing-terms.component.spec.ts @@ -14,14 +14,14 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NO_ERRORS_SCHEMA} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {ReactiveFormsModule} from '@angular/forms'; -import {MatCardModule} from '@angular/material/card'; -import {MatRadioModule} from '@angular/material/radio'; +import { CommonModule } from '@angular/common'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MatCardModule } from '@angular/material/card'; +import { MatRadioModule } from '@angular/material/radio'; -import {DataSharingTermsComponent} from 'app/components/create-survey/data-sharing-terms/data-sharing-terms.component'; +import { DataSharingTermsComponent } from 'app/components/create-survey/data-sharing-terms/data-sharing-terms.component'; import { DATA_SHARING_TYPE_DESCRIPTION, DataSharingType, diff --git a/web/src/app/components/create-survey/data-sharing-terms/data-sharing-terms.component.ts b/web/src/app/components/create-survey/data-sharing-terms/data-sharing-terms.component.ts index 6d95dcb6c..2dd5016cc 100644 --- a/web/src/app/components/create-survey/data-sharing-terms/data-sharing-terms.component.ts +++ b/web/src/app/components/create-survey/data-sharing-terms/data-sharing-terms.component.ts @@ -16,8 +16,8 @@ import '@angular/localize/init'; -import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; -import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { DATA_SHARING_TYPE_DESCRIPTION, @@ -67,7 +67,7 @@ export class DataSharingTermsComponent implements OnInit { this.formGroup = this.formBuilder.group({ [this.typeControlKey]: DataSharingType.PRIVATE, [this.customTextControlKey]: [ - {value: '', disabled: true}, + { value: '', disabled: true }, Validators.required, ], }); diff --git a/web/src/app/components/create-survey/data-sharing-terms/data-sharing-terms.module.ts b/web/src/app/components/create-survey/data-sharing-terms/data-sharing-terms.module.ts index 7fe4e52fe..8e09ef0cb 100644 --- a/web/src/app/components/create-survey/data-sharing-terms/data-sharing-terms.module.ts +++ b/web/src/app/components/create-survey/data-sharing-terms/data-sharing-terms.module.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {FormsModule, ReactiveFormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatCardModule} from '@angular/material/card'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatInputModule} from '@angular/material/input'; -import {MatRadioModule} from '@angular/material/radio'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatRadioModule } from '@angular/material/radio'; -import {DataSharingTermsComponent} from 'app/components/create-survey/data-sharing-terms/data-sharing-terms.component'; +import { DataSharingTermsComponent } from 'app/components/create-survey/data-sharing-terms/data-sharing-terms.component'; @NgModule({ declarations: [DataSharingTermsComponent], diff --git a/web/src/app/components/create-survey/job-details/job-details.component.spec.ts b/web/src/app/components/create-survey/job-details/job-details.component.spec.ts index 508e66a13..5b70de466 100644 --- a/web/src/app/components/create-survey/job-details/job-details.component.spec.ts +++ b/web/src/app/components/create-survey/job-details/job-details.component.spec.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import {ComponentFixture, TestBed} from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; -import {JobDetailsComponent} from 'app/components/create-survey/job-details/job-details.component'; +import { JobDetailsComponent } from 'app/components/create-survey/job-details/job-details.component'; describe('JobDetailsComponent', () => { let component: JobDetailsComponent; diff --git a/web/src/app/components/create-survey/job-details/job-details.component.ts b/web/src/app/components/create-survey/job-details/job-details.component.ts index 3bbc48991..349f65472 100644 --- a/web/src/app/components/create-survey/job-details/job-details.component.ts +++ b/web/src/app/components/create-survey/job-details/job-details.component.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; -import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; @Component({ selector: 'job-details', diff --git a/web/src/app/components/create-survey/job-details/job-details.module.ts b/web/src/app/components/create-survey/job-details/job-details.module.ts index 15179e6d5..6a54a4b37 100644 --- a/web/src/app/components/create-survey/job-details/job-details.module.ts +++ b/web/src/app/components/create-survey/job-details/job-details.module.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {FormsModule, ReactiveFormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatInputModule} from '@angular/material/input'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatInputModule } from '@angular/material/input'; -import {JobDetailsComponent} from 'app/components/create-survey/job-details/job-details.component'; +import { JobDetailsComponent } from 'app/components/create-survey/job-details/job-details.component'; @NgModule({ declarations: [JobDetailsComponent], diff --git a/web/src/app/components/create-survey/step-card/step-card.component.spec.ts b/web/src/app/components/create-survey/step-card/step-card.component.spec.ts index 004a1c90f..cf086c7b7 100644 --- a/web/src/app/components/create-survey/step-card/step-card.component.spec.ts +++ b/web/src/app/components/create-survey/step-card/step-card.component.spec.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {BrowserModule} from '@angular/platform-browser'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { BrowserModule } from '@angular/platform-browser'; -import {StepCardComponent} from './step-card.component'; +import { StepCardComponent } from './step-card.component'; describe('StepCardComponent', () => { let component: StepCardComponent; diff --git a/web/src/app/components/create-survey/step-card/step-card.component.ts b/web/src/app/components/create-survey/step-card/step-card.component.ts index c1030872d..c8199988d 100644 --- a/web/src/app/components/create-survey/step-card/step-card.component.ts +++ b/web/src/app/components/create-survey/step-card/step-card.component.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {Component, Input} from '@angular/core'; +import { Component, Input } from '@angular/core'; @Component({ selector: 'ground-step-card', diff --git a/web/src/app/components/create-survey/step-card/step-card.module.ts b/web/src/app/components/create-survey/step-card/step-card.module.ts index 5d14867fe..e8c93171a 100644 --- a/web/src/app/components/create-survey/step-card/step-card.module.ts +++ b/web/src/app/components/create-survey/step-card/step-card.module.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; -import {StepCardComponent} from 'app/components/create-survey/step-card/step-card.component'; +import { StepCardComponent } from 'app/components/create-survey/step-card/step-card.component'; @NgModule({ declarations: [StepCardComponent], diff --git a/web/src/app/components/create-survey/survey-details/survey-details.component.spec.ts b/web/src/app/components/create-survey/survey-details/survey-details.component.spec.ts index e336397b6..3ade13176 100644 --- a/web/src/app/components/create-survey/survey-details/survey-details.component.spec.ts +++ b/web/src/app/components/create-survey/survey-details/survey-details.component.spec.ts @@ -14,14 +14,14 @@ * limitations under the License. */ -import {NO_ERRORS_SCHEMA} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {ReactiveFormsModule} from '@angular/forms'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatInputModule} from '@angular/material/input'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import {SurveyDetailsComponent} from 'app/components/create-survey/survey-details/survey-details.component'; +import { SurveyDetailsComponent } from 'app/components/create-survey/survey-details/survey-details.component'; describe('SurveyDetailsComponent', () => { let component: SurveyDetailsComponent; diff --git a/web/src/app/components/create-survey/survey-details/survey-details.component.ts b/web/src/app/components/create-survey/survey-details/survey-details.component.ts index 4783f3473..8158ff8a9 100644 --- a/web/src/app/components/create-survey/survey-details/survey-details.component.ts +++ b/web/src/app/components/create-survey/survey-details/survey-details.component.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; -import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; @Component({ selector: 'survey-details', diff --git a/web/src/app/components/create-survey/survey-details/survey-details.module.ts b/web/src/app/components/create-survey/survey-details/survey-details.module.ts index 8544f235f..b78a31f90 100644 --- a/web/src/app/components/create-survey/survey-details/survey-details.module.ts +++ b/web/src/app/components/create-survey/survey-details/survey-details.module.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {FormsModule, ReactiveFormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatInputModule} from '@angular/material/input'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatInputModule } from '@angular/material/input'; -import {SurveyDetailsComponent} from 'app/components/create-survey/survey-details/survey-details.component'; +import { SurveyDetailsComponent } from 'app/components/create-survey/survey-details/survey-details.component'; @NgModule({ declarations: [SurveyDetailsComponent], diff --git a/web/src/app/components/create-survey/survey-loi/survey-loi.component.spec.ts b/web/src/app/components/create-survey/survey-loi/survey-loi.component.spec.ts index ae491661d..29f7e3324 100644 --- a/web/src/app/components/create-survey/survey-loi/survey-loi.component.spec.ts +++ b/web/src/app/components/create-survey/survey-loi/survey-loi.component.spec.ts @@ -14,29 +14,29 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NO_ERRORS_SCHEMA} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, fakeAsync, waitForAsync, } from '@angular/core/testing'; -import {AngularFireAuth} from '@angular/fire/compat/auth'; -import {AngularFirestore} from '@angular/fire/compat/firestore'; -import {MatDialog} from '@angular/material/dialog'; -import {List, Map} from 'immutable'; -import {BehaviorSubject, of} from 'rxjs'; +import { AngularFireAuth } from '@angular/fire/compat/auth'; +import { AngularFirestore } from '@angular/fire/compat/firestore'; +import { MatDialog } from '@angular/material/dialog'; +import { List, Map } from 'immutable'; +import { BehaviorSubject, of } from 'rxjs'; -import {LoiSelectionModule} from 'app/components/shared/loi-selection/loi-selection.module'; -import {LocationOfInterest} from 'app/models/loi.model'; -import {DataSharingType, Survey} from 'app/models/survey.model'; -import {AuthService} from 'app/services/auth/auth.service'; -import {LocationOfInterestService} from 'app/services/loi/loi.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SurveyService} from 'app/services/survey/survey.service'; +import { LoiSelectionModule } from 'app/components/shared/loi-selection/loi-selection.module'; +import { LocationOfInterest } from 'app/models/loi.model'; +import { DataSharingType, Survey } from 'app/models/survey.model'; +import { AuthService } from 'app/services/auth/auth.service'; +import { LocationOfInterestService } from 'app/services/loi/loi.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SurveyService } from 'app/services/survey/survey.service'; -import {SurveyLoiComponent} from './survey-loi.component'; +import { SurveyLoiComponent } from './survey-loi.component'; describe('SurveyLoiComponent', () => { let fixture: ComponentFixture; @@ -48,7 +48,7 @@ describe('SurveyLoiComponent', () => { const mockLois$ = new BehaviorSubject>( List([ - {id: 'id1', jobId: 'jobId1'} as LocationOfInterest, + { id: 'id1', jobId: 'jobId1' } as LocationOfInterest, ]) ); @@ -59,7 +59,7 @@ describe('SurveyLoiComponent', () => { Map(), Map(), '', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ); const mockSurvey$ = of(mockSurvey); @@ -88,13 +88,13 @@ describe('SurveyLoiComponent', () => { declarations: [SurveyLoiComponent], imports: [LoiSelectionModule, CommonModule], providers: [ - {provide: AngularFirestore, useValue: {}}, - {provide: AngularFireAuth, useValue: {}}, - {provide: AuthService, useValue: {}}, - {provide: LocationOfInterestService, useValue: loiServiceSpy}, - {provide: NavigationService, useValue: navigationServiceSpy}, - {provide: SurveyService, useValue: surveyServiceSpy}, - {provide: MatDialog, useValue: {}}, + { provide: AngularFirestore, useValue: {} }, + { provide: AngularFireAuth, useValue: {} }, + { provide: AuthService, useValue: {} }, + { provide: LocationOfInterestService, useValue: loiServiceSpy }, + { provide: NavigationService, useValue: navigationServiceSpy }, + { provide: SurveyService, useValue: surveyServiceSpy }, + { provide: MatDialog, useValue: {} }, ], schemas: [NO_ERRORS_SCHEMA], }).compileComponents(); diff --git a/web/src/app/components/create-survey/survey-loi/survey-loi.component.ts b/web/src/app/components/create-survey/survey-loi/survey-loi.component.ts index d34ecf888..bf8af7415 100644 --- a/web/src/app/components/create-survey/survey-loi/survey-loi.component.ts +++ b/web/src/app/components/create-survey/survey-loi/survey-loi.component.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import {Component} from '@angular/core'; -import {List} from 'immutable'; +import { Component } from '@angular/core'; +import { List } from 'immutable'; -import {DataCollectionStrategy, Job} from 'app/models/job.model'; -import {LocationOfInterest} from 'app/models/loi.model'; -import {JobService} from 'app/services/job/job.service'; -import {LocationOfInterestService} from 'app/services/loi/loi.service'; -import {SurveyService} from 'app/services/survey/survey.service'; -import {TaskService} from 'app/services/task/task.service'; +import { DataCollectionStrategy, Job } from 'app/models/job.model'; +import { LocationOfInterest } from 'app/models/loi.model'; +import { JobService } from 'app/services/job/job.service'; +import { LocationOfInterestService } from 'app/services/loi/loi.service'; +import { SurveyService } from 'app/services/survey/survey.service'; +import { TaskService } from 'app/services/task/task.service'; @Component({ selector: 'survey-loi', @@ -55,7 +55,7 @@ export class SurveyLoiComponent { await this.jobService.addOrUpdateJob( this.surveyService.getActiveSurvey().id, - this.job.copyWith({tasks, strategy}) + this.job.copyWith({ tasks, strategy }) ); } } diff --git a/web/src/app/components/create-survey/survey-loi/survey-loi.module.ts b/web/src/app/components/create-survey/survey-loi/survey-loi.module.ts index b6b5e0adf..11b1cf002 100644 --- a/web/src/app/components/create-survey/survey-loi/survey-loi.module.ts +++ b/web/src/app/components/create-survey/survey-loi/survey-loi.module.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; -import {LoiEditorModule} from 'app/components/shared/loi-editor/loi-editor.module'; +import { LoiEditorModule } from 'app/components/shared/loi-editor/loi-editor.module'; -import {SurveyLoiComponent} from './survey-loi.component'; +import { SurveyLoiComponent } from './survey-loi.component'; @NgModule({ declarations: [SurveyLoiComponent], diff --git a/web/src/app/components/create-survey/task-details/task-details.component.spec.ts b/web/src/app/components/create-survey/task-details/task-details.component.spec.ts index d42f4f5b0..2ce919c1d 100644 --- a/web/src/app/components/create-survey/task-details/task-details.component.spec.ts +++ b/web/src/app/components/create-survey/task-details/task-details.component.spec.ts @@ -14,20 +14,20 @@ * limitations under the License. */ -import {NO_ERRORS_SCHEMA} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatDialogModule} from '@angular/material/dialog'; -import {Map} from 'immutable'; -import {of} from 'rxjs'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatDialogModule } from '@angular/material/dialog'; +import { Map } from 'immutable'; +import { of } from 'rxjs'; -import {Job} from 'app/models/job.model'; -import {Role} from 'app/models/role.model'; -import {DataSharingType, Survey} from 'app/models/survey.model'; -import {DataStoreService} from 'app/services/data-store/data-store.service'; -import {DialogService} from 'app/services/dialog/dialog.service'; -import {SurveyService} from 'app/services/survey/survey.service'; +import { Job } from 'app/models/job.model'; +import { Role } from 'app/models/role.model'; +import { DataSharingType, Survey } from 'app/models/survey.model'; +import { DataStoreService } from 'app/services/data-store/data-store.service'; +import { DialogService } from 'app/services/dialog/dialog.service'; +import { SurveyService } from 'app/services/survey/survey.service'; -import {TaskDetailsComponent} from './task-details.component'; +import { TaskDetailsComponent } from './task-details.component'; describe('TaskDetailsComponent', () => { let component: TaskDetailsComponent; @@ -39,7 +39,7 @@ describe('TaskDetailsComponent', () => { Map(), Map(), '', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ); beforeEach(async () => { @@ -47,8 +47,8 @@ describe('TaskDetailsComponent', () => { declarations: [TaskDetailsComponent], imports: [MatDialogModule], providers: [ - {provide: DataStoreService, useValue: {generateId: () => '123'}}, - {provide: DialogService, useValue: {}}, + { provide: DataStoreService, useValue: { generateId: () => '123' } }, + { provide: DialogService, useValue: {} }, { provide: SurveyService, useValue: { diff --git a/web/src/app/components/create-survey/task-details/task-details.component.ts b/web/src/app/components/create-survey/task-details/task-details.component.ts index b298d471f..83ef4a4ad 100644 --- a/web/src/app/components/create-survey/task-details/task-details.component.ts +++ b/web/src/app/components/create-survey/task-details/task-details.component.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import {Component, EventEmitter, Output, ViewChild} from '@angular/core'; -import {List} from 'immutable'; -import {Subscription} from 'rxjs'; +import { Component, EventEmitter, Output, ViewChild } from '@angular/core'; +import { List } from 'immutable'; +import { Subscription } from 'rxjs'; -import {TasksEditorComponent} from 'app/components/shared/tasks-editor/tasks-editor.component'; -import {Task} from 'app/models/task/task.model'; -import {TaskService} from 'app/services/task/task.service'; +import { TasksEditorComponent } from 'app/components/shared/tasks-editor/tasks-editor.component'; +import { Task } from 'app/models/task/task.model'; +import { TaskService } from 'app/services/task/task.service'; @Component({ selector: 'task-details', diff --git a/web/src/app/components/create-survey/task-details/task-details.module.ts b/web/src/app/components/create-survey/task-details/task-details.module.ts index dff34ef37..675a61803 100644 --- a/web/src/app/components/create-survey/task-details/task-details.module.ts +++ b/web/src/app/components/create-survey/task-details/task-details.module.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; -import {TasksEditorModule} from 'app/components/shared/tasks-editor/tasks-editor.module'; +import { TasksEditorModule } from 'app/components/shared/tasks-editor/tasks-editor.module'; -import {TaskDetailsComponent} from './task-details.component'; +import { TaskDetailsComponent } from './task-details.component'; @NgModule({ declarations: [TaskDetailsComponent], diff --git a/web/src/app/components/edit-survey/edit-details/edit-details.component.spec.ts b/web/src/app/components/edit-survey/edit-details/edit-details.component.spec.ts index ed35fd630..54db46f14 100644 --- a/web/src/app/components/edit-survey/edit-details/edit-details.component.spec.ts +++ b/web/src/app/components/edit-survey/edit-details/edit-details.component.spec.ts @@ -14,32 +14,32 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NO_ERRORS_SCHEMA} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, fakeAsync, flushMicrotasks, } from '@angular/core/testing'; -import {MatCardModule} from '@angular/material/card'; +import { MatCardModule } from '@angular/material/card'; import { MatDialog, MatDialogModule, MatDialogRef, } from '@angular/material/dialog'; -import {MatIconModule} from '@angular/material/icon'; -import {By} from '@angular/platform-browser'; -import {Map} from 'immutable'; -import {of} from 'rxjs'; - -import {EditDetailsComponent} from 'app/components/edit-survey/edit-details/edit-details.component'; -import {Job} from 'app/models/job.model'; -import {Role} from 'app/models/role.model'; -import {DataSharingType, Survey} from 'app/models/survey.model'; -import {DraftSurveyService} from 'app/services/draft-survey/draft-survey.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SurveyService} from 'app/services/survey/survey.service'; +import { MatIconModule } from '@angular/material/icon'; +import { By } from '@angular/platform-browser'; +import { Map } from 'immutable'; +import { of } from 'rxjs'; + +import { EditDetailsComponent } from 'app/components/edit-survey/edit-details/edit-details.component'; +import { Job } from 'app/models/job.model'; +import { Role } from 'app/models/role.model'; +import { DataSharingType, Survey } from 'app/models/survey.model'; +import { DraftSurveyService } from 'app/services/draft-survey/draft-survey.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SurveyService } from 'app/services/survey/survey.service'; import { DialogData, @@ -57,7 +57,7 @@ describe('EditDetailsComponent', () => { Map(), Map(), '', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ); const newSurveyId = 'newSurveyId'; let dialogRefSpy: jasmine.SpyObj< @@ -88,23 +88,23 @@ describe('EditDetailsComponent', () => { imports: [CommonModule, MatDialogModule, MatCardModule, MatIconModule], schemas: [NO_ERRORS_SCHEMA], providers: [ - {provide: MatDialog, useValue: dialogSpy}, + { provide: MatDialog, useValue: dialogSpy }, { provide: DraftSurveyService, - useValue: {getSurvey$: () => of(survey)}, + useValue: { getSurvey$: () => of(survey) }, }, { provide: NavigationService, useValue: navigationServiceSpy, }, - {provide: SurveyService, useValue: surveyServiceSpy}, + { provide: SurveyService, useValue: surveyServiceSpy }, ], }).compileComponents(); }); beforeEach(() => { dialogRefSpy.afterClosed.and.returnValue( - of({dialogType: DialogType.CopySurvey} as DialogData) + of({ dialogType: DialogType.CopySurvey } as DialogData) ); fixture = TestBed.createComponent(EditDetailsComponent); diff --git a/web/src/app/components/edit-survey/edit-details/edit-details.component.ts b/web/src/app/components/edit-survey/edit-details/edit-details.component.ts index bcd0e92b6..9ade3914d 100644 --- a/web/src/app/components/edit-survey/edit-details/edit-details.component.ts +++ b/web/src/app/components/edit-survey/edit-details/edit-details.component.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import {Component, OnInit, ViewChild} from '@angular/core'; -import {MatDialog} from '@angular/material/dialog'; -import {Subscription} from 'rxjs'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { Subscription } from 'rxjs'; -import {SurveyDetailsComponent} from 'app/components/create-survey/survey-details/survey-details.component'; -import {DATA_SHARING_TYPE_DESCRIPTION, Survey} from 'app/models/survey.model'; -import {DraftSurveyService} from 'app/services/draft-survey/draft-survey.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SurveyService} from 'app/services/survey/survey.service'; +import { SurveyDetailsComponent } from 'app/components/create-survey/survey-details/survey-details.component'; +import { DATA_SHARING_TYPE_DESCRIPTION, Survey } from 'app/models/survey.model'; +import { DraftSurveyService } from 'app/services/draft-survey/draft-survey.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SurveyService } from 'app/services/survey/survey.service'; import { DialogData, @@ -62,7 +62,7 @@ export class EditDetailsComponent implements OnInit { this.draftSurveyService.getSurvey$().subscribe(survey => { this.survey = survey; if (this.survey.dataSharingTerms) { - const {type, customText} = this.survey.dataSharingTerms; + const { type, customText } = this.survey.dataSharingTerms; this.dataSharingTermsDetails = { description: DATA_SHARING_TYPE_DESCRIPTION.get(type)!, customText, @@ -87,7 +87,7 @@ export class EditDetailsComponent implements OnInit { openDeleteSurveyDialog() { this.dialog .open(JobDialogComponent, { - data: {dialogType: DialogType.DeleteSurvey}, + data: { dialogType: DialogType.DeleteSurvey }, panelClass: 'small-width-dialog', }) .afterClosed() @@ -103,13 +103,13 @@ export class EditDetailsComponent implements OnInit { openCopySurveyDialog() { this.dialog .open(JobDialogComponent, { - data: {dialogType: DialogType.CopySurvey}, + data: { dialogType: DialogType.CopySurvey }, panelClass: 'small-width-dialog', }) .afterClosed() .subscribe(async (result: DialogData) => { if (result?.dialogType === DialogType.CopySurvey) { - const {id: surveyId} = this.survey!; + const { id: surveyId } = this.survey!; const newSurveyId = await this.surveyService.copySurvey(surveyId); diff --git a/web/src/app/components/edit-survey/edit-details/edit-details.module.ts b/web/src/app/components/edit-survey/edit-details/edit-details.module.ts index bbbb6d01c..985613b36 100644 --- a/web/src/app/components/edit-survey/edit-details/edit-details.module.ts +++ b/web/src/app/components/edit-survey/edit-details/edit-details.module.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {MatCardModule} from '@angular/material/card'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; -import {SurveyDetailsModule} from 'app/components/create-survey/survey-details/survey-details.module'; -import {EditDetailsComponent} from 'app/components/edit-survey/edit-details/edit-details.component'; +import { SurveyDetailsModule } from 'app/components/create-survey/survey-details/survey-details.module'; +import { EditDetailsComponent } from 'app/components/edit-survey/edit-details/edit-details.component'; @NgModule({ declarations: [EditDetailsComponent], diff --git a/web/src/app/components/edit-survey/edit-job/edit-job.component.spec.ts b/web/src/app/components/edit-survey/edit-job/edit-job.component.spec.ts index d25f5bd06..65c36b348 100644 --- a/web/src/app/components/edit-survey/edit-job/edit-job.component.spec.ts +++ b/web/src/app/components/edit-survey/edit-job/edit-job.component.spec.ts @@ -14,33 +14,33 @@ * limitations under the License. */ -import {Component, Input} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; +import { Component, Input } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatButtonToggle, MatButtonToggleGroup, } from '@angular/material/button-toggle'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatIconModule} from '@angular/material/icon'; -import {By} from '@angular/platform-browser'; -import {ActivatedRoute} from '@angular/router'; -import {User} from 'firebase/auth'; -import {List, Map} from 'immutable'; -import {Subject, from, of} from 'rxjs'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatIconModule } from '@angular/material/icon'; +import { By } from '@angular/platform-browser'; +import { ActivatedRoute } from '@angular/router'; +import { User } from 'firebase/auth'; +import { List, Map } from 'immutable'; +import { Subject, from, of } from 'rxjs'; -import {EditJobComponent} from 'app/components/edit-survey/edit-job/edit-job.component'; -import {LoiEditorComponent} from 'app/components/shared/loi-editor/loi-editor.component'; -import {TasksEditorModule} from 'app/components/shared/tasks-editor/tasks-editor.module'; -import {DataCollectionStrategy, Job} from 'app/models/job.model'; -import {LocationOfInterest} from 'app/models/loi.model'; -import {Role} from 'app/models/role.model'; -import {DataSharingType, Survey} from 'app/models/survey.model'; -import {AuthService} from 'app/services/auth/auth.service'; -import {DataStoreService} from 'app/services/data-store/data-store.service'; -import {DialogService} from 'app/services/dialog/dialog.service'; -import {DraftSurveyService} from 'app/services/draft-survey/draft-survey.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SurveyService} from 'app/services/survey/survey.service'; +import { EditJobComponent } from 'app/components/edit-survey/edit-job/edit-job.component'; +import { LoiEditorComponent } from 'app/components/shared/loi-editor/loi-editor.component'; +import { TasksEditorModule } from 'app/components/shared/tasks-editor/tasks-editor.module'; +import { DataCollectionStrategy, Job } from 'app/models/job.model'; +import { LocationOfInterest } from 'app/models/loi.model'; +import { Role } from 'app/models/role.model'; +import { DataSharingType, Survey } from 'app/models/survey.model'; +import { AuthService } from 'app/services/auth/auth.service'; +import { DataStoreService } from 'app/services/data-store/data-store.service'; +import { DialogService } from 'app/services/dialog/dialog.service'; +import { DraftSurveyService } from 'app/services/draft-survey/draft-survey.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SurveyService } from 'app/services/survey/survey.service'; @Component({ selector: 'loi-editor', @@ -69,7 +69,7 @@ describe('EditJobComponent', () => { Map(), Map(), '', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ); const jobId = 'job-123'; const user$ = new Subject(); @@ -85,9 +85,9 @@ describe('EditJobComponent', () => { TasksEditorModule, ], providers: [ - {provide: AuthService, useValue: {getUser$: () => user$}}, - {provide: DataStoreService, useValue: {generateId: () => '123'}}, - {provide: DialogService, useValue: {}}, + { provide: AuthService, useValue: { getUser$: () => user$ } }, + { provide: DataStoreService, useValue: { generateId: () => '123' } }, + { provide: DialogService, useValue: {} }, { provide: SurveyService, useValue: { @@ -104,7 +104,7 @@ describe('EditJobComponent', () => { { provide: ActivatedRoute, useValue: { - params: from([{id: jobId}]), + params: from([{ id: jobId }]), }, }, { diff --git a/web/src/app/components/edit-survey/edit-job/edit-job.component.ts b/web/src/app/components/edit-survey/edit-job/edit-job.component.ts index 732570962..c9c98cd91 100644 --- a/web/src/app/components/edit-survey/edit-job/edit-job.component.ts +++ b/web/src/app/components/edit-survey/edit-job/edit-job.component.ts @@ -14,21 +14,21 @@ * limitations under the License. */ -import {Component, ViewChild} from '@angular/core'; -import {ActivatedRoute, Params} from '@angular/router'; -import {List} from 'immutable'; -import {Subscription} from 'rxjs'; - -import {LoiEditorComponent} from 'app/components/shared/loi-editor/loi-editor.component'; -import {TasksEditorComponent} from 'app/components/shared/tasks-editor/tasks-editor.component'; -import {DataCollectionStrategy, Job} from 'app/models/job.model'; -import {LocationOfInterest} from 'app/models/loi.model'; -import {Task} from 'app/models/task/task.model'; -import {DraftSurveyService} from 'app/services/draft-survey/draft-survey.service'; -import {LocationOfInterestService} from 'app/services/loi/loi.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SurveyService} from 'app/services/survey/survey.service'; -import {TaskService} from 'app/services/task/task.service'; +import { Component, ViewChild } from '@angular/core'; +import { ActivatedRoute, Params } from '@angular/router'; +import { List } from 'immutable'; +import { Subscription } from 'rxjs'; + +import { LoiEditorComponent } from 'app/components/shared/loi-editor/loi-editor.component'; +import { TasksEditorComponent } from 'app/components/shared/tasks-editor/tasks-editor.component'; +import { DataCollectionStrategy, Job } from 'app/models/job.model'; +import { LocationOfInterest } from 'app/models/loi.model'; +import { Task } from 'app/models/task/task.model'; +import { DraftSurveyService } from 'app/services/draft-survey/draft-survey.service'; +import { LocationOfInterestService } from 'app/services/loi/loi.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SurveyService } from 'app/services/survey/survey.service'; +import { TaskService } from 'app/services/task/task.service'; enum EditJobSection { TASKS, @@ -134,7 +134,7 @@ export class EditJobComponent { ); this.draftSurveyService.addOrUpdateJob( - this.job!.copyWith({tasks, strategy}) + this.job!.copyWith({ tasks, strategy }) ); this.job = this.draftSurveyService.getSurvey().getJob(this.jobId!); diff --git a/web/src/app/components/edit-survey/edit-job/edit-job.module.ts b/web/src/app/components/edit-survey/edit-job/edit-job.module.ts index c200fa13b..15fe84497 100644 --- a/web/src/app/components/edit-survey/edit-job/edit-job.module.ts +++ b/web/src/app/components/edit-survey/edit-job/edit-job.module.ts @@ -14,17 +14,17 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { MatButtonToggle, MatButtonToggleGroup, } from '@angular/material/button-toggle'; -import {MatIconModule} from '@angular/material/icon'; +import { MatIconModule } from '@angular/material/icon'; -import {EditJobComponent} from 'app/components/edit-survey/edit-job/edit-job.component'; -import {LoiEditorModule} from 'app/components/shared/loi-editor/loi-editor.module'; -import {TasksEditorModule} from 'app/components/shared/tasks-editor/tasks-editor.module'; +import { EditJobComponent } from 'app/components/edit-survey/edit-job/edit-job.component'; +import { LoiEditorModule } from 'app/components/shared/loi-editor/loi-editor.module'; +import { TasksEditorModule } from 'app/components/shared/tasks-editor/tasks-editor.module'; @NgModule({ declarations: [EditJobComponent], diff --git a/web/src/app/components/edit-survey/edit-survey.component.spec.ts b/web/src/app/components/edit-survey/edit-survey.component.spec.ts index 0b31dffaa..fcdb0dcac 100644 --- a/web/src/app/components/edit-survey/edit-survey.component.spec.ts +++ b/web/src/app/components/edit-survey/edit-survey.component.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {NO_ERRORS_SCHEMA, WritableSignal, signal} from '@angular/core'; +import { NO_ERRORS_SCHEMA, WritableSignal, signal } from '@angular/core'; import { ComponentFixture, TestBed, @@ -24,26 +24,26 @@ import { tick, waitForAsync, } from '@angular/core/testing'; -import {MatDialog, MatDialogRef} from '@angular/material/dialog'; -import {MatDividerModule} from '@angular/material/divider'; -import {MatMenuModule} from '@angular/material/menu'; -import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; -import {By} from '@angular/platform-browser'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {ActivatedRoute} from '@angular/router'; -import {RouterTestingModule} from '@angular/router/testing'; -import {Map} from 'immutable'; -import {BehaviorSubject, Subject, of} from 'rxjs'; - -import {EditSurveyComponent} from 'app/components/edit-survey/edit-survey.component'; -import {Job} from 'app/models/job.model'; -import {DataSharingType, Survey} from 'app/models/survey.model'; -import {DataStoreService} from 'app/services/data-store/data-store.service'; -import {DraftSurveyService} from 'app/services/draft-survey/draft-survey.service'; -import {JobService} from 'app/services/job/job.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SurveyService} from 'app/services/survey/survey.service'; -import {ActivatedRouteStub} from 'testing/activated-route-stub'; +import { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { By } from '@angular/platform-browser'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { ActivatedRoute } from '@angular/router'; +import { RouterTestingModule } from '@angular/router/testing'; +import { Map } from 'immutable'; +import { BehaviorSubject, Subject, of } from 'rxjs'; + +import { EditSurveyComponent } from 'app/components/edit-survey/edit-survey.component'; +import { Job } from 'app/models/job.model'; +import { DataSharingType, Survey } from 'app/models/survey.model'; +import { DataStoreService } from 'app/services/data-store/data-store.service'; +import { DraftSurveyService } from 'app/services/draft-survey/draft-survey.service'; +import { JobService } from 'app/services/job/job.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SurveyService } from 'app/services/survey/survey.service'; +import { ActivatedRouteStub } from 'testing/activated-route-stub'; import { DialogData, @@ -98,7 +98,7 @@ describe('EditSurveyComponent', () => { ]), /* acl= */ Map(), /* ownerId= */ '', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ); beforeEach(waitForAsync(() => { @@ -169,13 +169,13 @@ describe('EditSurveyComponent', () => { declarations: [EditSurveyComponent], schemas: [NO_ERRORS_SCHEMA], providers: [ - {provide: NavigationService, useValue: navigationServiceSpy}, - {provide: SurveyService, useValue: surveyServiceSpy}, - {provide: DraftSurveyService, useValue: draftSurveyServiceSpy}, - {provide: JobService, useValue: jobServiceSpy}, - {provide: DataStoreService, useValue: dataStoreServiceSpy}, - {provide: ActivatedRoute, useValue: route}, - {provide: MatDialog, useValue: dialogSpy}, + { provide: NavigationService, useValue: navigationServiceSpy }, + { provide: SurveyService, useValue: surveyServiceSpy }, + { provide: DraftSurveyService, useValue: draftSurveyServiceSpy }, + { provide: JobService, useValue: jobServiceSpy }, + { provide: DataStoreService, useValue: dataStoreServiceSpy }, + { provide: ActivatedRoute, useValue: route }, + { provide: MatDialog, useValue: dialogSpy }, ], }).compileComponents(); })); @@ -240,7 +240,7 @@ describe('EditSurveyComponent', () => { expectedLabel: jobName2, expectedRouterLink: `./job/${jobId2}`, }, - ].forEach(({buttonSelector, expectedLabel, expectedRouterLink}) => { + ].forEach(({ buttonSelector, expectedLabel, expectedRouterLink }) => { it('displays button with correct label and router link', () => { const button = fixture.debugElement.query(By.css(buttonSelector)) .nativeElement as HTMLElement; @@ -259,13 +259,13 @@ describe('EditSurveyComponent', () => { .nativeElement as HTMLElement; const newJobName = 'new job name'; dialogRefSpy.afterClosed.and.returnValue( - of({dialogType: DialogType.AddJob, jobName: newJobName}) + of({ dialogType: DialogType.AddJob, jobName: newJobName }) ); addButton.click(); expect(draftSurveyServiceSpy.addOrUpdateJob).toHaveBeenCalledOnceWith( - newJob.copyWith({name: newJobName}) + newJob.copyWith({ name: newJobName }) ); flush(); discardPeriodicTasks(); @@ -276,7 +276,7 @@ describe('EditSurveyComponent', () => { .nativeElement as HTMLElement; const newJobName = 'new job name'; dialogRefSpy.afterClosed.and.returnValue( - of({dialogType: DialogType.RenameJob, jobName: newJobName}) + of({ dialogType: DialogType.RenameJob, jobName: newJobName }) ); menuButton.click(); @@ -289,7 +289,7 @@ describe('EditSurveyComponent', () => { renameButton.click(); expect(draftSurveyServiceSpy.addOrUpdateJob).toHaveBeenCalledOnceWith( - job1.copyWith({name: newJobName}) + job1.copyWith({ name: newJobName }) ); flush(); discardPeriodicTasks(); @@ -323,7 +323,7 @@ describe('EditSurveyComponent', () => { const menuButton = fixture.debugElement.query(By.css('#menu-button-0')) .nativeElement as HTMLElement; dialogRefSpy.afterClosed.and.returnValue( - of({dialogType: DialogType.DeleteJob, jobName: ''}) + of({ dialogType: DialogType.DeleteJob, jobName: '' }) ); menuButton.click(); diff --git a/web/src/app/components/edit-survey/edit-survey.component.ts b/web/src/app/components/edit-survey/edit-survey.component.ts index 0266c951e..f6476a9cb 100644 --- a/web/src/app/components/edit-survey/edit-survey.component.ts +++ b/web/src/app/components/edit-survey/edit-survey.component.ts @@ -16,21 +16,21 @@ import '@angular/localize/init'; -import {Component, effect} from '@angular/core'; -import {MatDialog} from '@angular/material/dialog'; -import {List} from 'immutable'; - -import {Job} from 'app/models/job.model'; -import {Survey} from 'app/models/survey.model'; -import {DraftSurveyService} from 'app/services/draft-survey/draft-survey.service'; -import {JobService} from 'app/services/job/job.service'; +import { Component, effect } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { List } from 'immutable'; + +import { Job } from 'app/models/job.model'; +import { Survey } from 'app/models/survey.model'; +import { DraftSurveyService } from 'app/services/draft-survey/draft-survey.service'; +import { JobService } from 'app/services/job/job.service'; import { SURVEYS_SHARE, SURVEY_SEGMENT, } from 'app/services/navigation/navigation.constants'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SurveyService} from 'app/services/survey/survey.service'; -import {environment} from 'environments/environment'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SurveyService } from 'app/services/survey/survey.service'; +import { environment } from 'environments/environment'; import { DialogData, @@ -135,7 +135,7 @@ export class EditSurveyComponent { autoFocus: [DialogType.AddJob, DialogType.RenameJob].includes(dialogType) ? `#${JobDialogComponent.JOB_NAME_FIELD_ID}` : 'first-tabbable', - data: {dialogType, jobName: job.name ?? ''}, + data: { dialogType, jobName: job.name ?? '' }, panelClass: 'small-width-dialog', }); diff --git a/web/src/app/components/edit-survey/edit-survey.module.ts b/web/src/app/components/edit-survey/edit-survey.module.ts index 3a0b2fbd5..ef9b02b5c 100644 --- a/web/src/app/components/edit-survey/edit-survey.module.ts +++ b/web/src/app/components/edit-survey/edit-survey.module.ts @@ -14,21 +14,21 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatDividerModule} from '@angular/material/divider'; -import {MatIconModule} from '@angular/material/icon'; -import {MatListModule} from '@angular/material/list'; -import {MatMenuModule} from '@angular/material/menu'; -import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; -import {RouterModule} from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { RouterModule } from '@angular/router'; -import {EditSurveyComponent} from 'app/components/edit-survey/edit-survey.component'; -import {CopySurveyControlsModule} from 'app/components/shared/copy-survey-controls/copy-survey-controls.module'; +import { EditSurveyComponent } from 'app/components/edit-survey/edit-survey.component'; +import { CopySurveyControlsModule } from 'app/components/shared/copy-survey-controls/copy-survey-controls.module'; -import {SurveyHeaderModule} from '../main-page-container/main-page/survey-header/survey-header.module'; +import { SurveyHeaderModule } from '../main-page-container/main-page/survey-header/survey-header.module'; @NgModule({ declarations: [EditSurveyComponent], diff --git a/web/src/app/components/edit-survey/job-dialog/job-dialog.component.spec.ts b/web/src/app/components/edit-survey/job-dialog/job-dialog.component.spec.ts index 398f25de5..2f338be89 100644 --- a/web/src/app/components/edit-survey/job-dialog/job-dialog.component.spec.ts +++ b/web/src/app/components/edit-survey/job-dialog/job-dialog.component.spec.ts @@ -25,7 +25,7 @@ import { MatDialogModule, MatDialogRef, } from '@angular/material/dialog'; -import {By} from '@angular/platform-browser'; +import { By } from '@angular/platform-browser'; import { DialogData, @@ -50,8 +50,8 @@ describe('JobDialogComponent', () => { declarations: [JobDialogComponent], imports: [MatDialogModule], providers: [ - {provide: MatDialogRef, useValue: dialogRefSpy}, - {provide: MAT_DIALOG_DATA, useValue: mockDialogData}, + { provide: MatDialogRef, useValue: dialogRefSpy }, + { provide: MAT_DIALOG_DATA, useValue: mockDialogData }, ], }).compileComponents(); }); diff --git a/web/src/app/components/edit-survey/job-dialog/job-dialog.component.ts b/web/src/app/components/edit-survey/job-dialog/job-dialog.component.ts index 01b00c7a3..f8bdd477b 100644 --- a/web/src/app/components/edit-survey/job-dialog/job-dialog.component.ts +++ b/web/src/app/components/edit-survey/job-dialog/job-dialog.component.ts @@ -16,8 +16,8 @@ import '@angular/localize/init'; -import {Component, Inject} from '@angular/core'; -import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; +import { Component, Inject } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; export enum DialogType { AddJob, diff --git a/web/src/app/components/edit-survey/job-dialog/job-dialog.module.ts b/web/src/app/components/edit-survey/job-dialog/job-dialog.module.ts index 16fbe8bd0..1a05034ec 100644 --- a/web/src/app/components/edit-survey/job-dialog/job-dialog.module.ts +++ b/web/src/app/components/edit-survey/job-dialog/job-dialog.module.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {FormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatInputModule} from '@angular/material/input'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; -import {JobDialogComponent} from 'app/components/edit-survey/job-dialog/job-dialog.component'; +import { JobDialogComponent } from 'app/components/edit-survey/job-dialog/job-dialog.component'; @NgModule({ declarations: [JobDialogComponent], diff --git a/web/src/app/components/edit-survey/survey-json/survey-json.component.ts b/web/src/app/components/edit-survey/survey-json/survey-json.component.ts index 63bb6f4e6..a51f164a6 100644 --- a/web/src/app/components/edit-survey/survey-json/survey-json.component.ts +++ b/web/src/app/components/edit-survey/survey-json/survey-json.component.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import {Component} from '@angular/core'; +import { Component } from '@angular/core'; -import {DataStoreService} from 'app/services/data-store/data-store.service'; -import {SurveyService} from 'app/services/survey/survey.service'; +import { DataStoreService } from 'app/services/data-store/data-store.service'; +import { SurveyService } from 'app/services/survey/survey.service'; @Component({ selector: 'survey-json', diff --git a/web/src/app/components/edit-survey/survey-json/survey-json.module.ts b/web/src/app/components/edit-survey/survey-json/survey-json.module.ts index 4d363bb86..336234923 100644 --- a/web/src/app/components/edit-survey/survey-json/survey-json.module.ts +++ b/web/src/app/components/edit-survey/survey-json/survey-json.module.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {FormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatInputModule} from '@angular/material/input'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; -import {SurveyJsonComponent} from './survey-json.component'; +import { SurveyJsonComponent } from './survey-json.component'; @NgModule({ declarations: [SurveyJsonComponent], diff --git a/web/src/app/components/error/error.component.ts b/web/src/app/components/error/error.component.ts index 9c6a2960a..23106853f 100644 --- a/web/src/app/components/error/error.component.ts +++ b/web/src/app/components/error/error.component.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import {Component, OnInit} from '@angular/core'; -import {ActivatedRoute} from '@angular/router'; +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; -import {DataStoreService} from 'app/services/data-store/data-store.service'; +import { DataStoreService } from 'app/services/data-store/data-store.service'; enum ErrorType { GENERIC, diff --git a/web/src/app/components/error/error.module.ts b/web/src/app/components/error/error.module.ts index 1581d761d..7a1e1ab06 100644 --- a/web/src/app/components/error/error.module.ts +++ b/web/src/app/components/error/error.module.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {RouterModule} from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; -import {ErrorComponent} from 'app/components/error/error.component'; -import {HeaderModule} from 'app/components/shared/header/header.module'; +import { ErrorComponent } from 'app/components/error/error.component'; +import { HeaderModule } from 'app/components/shared/header/header.module'; @NgModule({ declarations: [ErrorComponent], diff --git a/web/src/app/components/main-page-container/main-page-container.component.spec.ts b/web/src/app/components/main-page-container/main-page-container.component.spec.ts index 221e10f9d..f85b12905 100644 --- a/web/src/app/components/main-page-container/main-page-container.component.spec.ts +++ b/web/src/app/components/main-page-container/main-page-container.component.spec.ts @@ -14,17 +14,17 @@ * limitations under the License. */ -import {NO_ERRORS_SCHEMA} from '@angular/core'; -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import {ActivatedRoute} from '@angular/router'; -import {NEVER} from 'rxjs'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { NEVER } from 'rxjs'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SurveyService} from 'app/services/survey/survey.service'; -import {ActivatedRouteStub} from 'testing/activated-route-stub'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SurveyService } from 'app/services/survey/survey.service'; +import { ActivatedRouteStub } from 'testing/activated-route-stub'; -import {MainPageComponent} from './main-page/main-page.component'; -import {MainPageContainerComponent} from './main-page-container.component'; +import { MainPageComponent } from './main-page/main-page.component'; +import { MainPageContainerComponent } from './main-page-container.component'; const navigationService = { init: () => {}, @@ -47,9 +47,9 @@ describe('MainPageContainerComponent', () => { TestBed.configureTestingModule({ declarations: [MainPageContainerComponent, MainPageComponent], providers: [ - {provide: ActivatedRoute, useValue: route}, - {provide: NavigationService, useValue: navigationService}, - {provide: SurveyService, useValue: surveyService}, + { provide: ActivatedRoute, useValue: route }, + { provide: NavigationService, useValue: navigationService }, + { provide: SurveyService, useValue: surveyService }, ], schemas: [NO_ERRORS_SCHEMA], }).compileComponents(); diff --git a/web/src/app/components/main-page-container/main-page-container.component.ts b/web/src/app/components/main-page-container/main-page-container.component.ts index b65156a1b..46d00022d 100644 --- a/web/src/app/components/main-page-container/main-page-container.component.ts +++ b/web/src/app/components/main-page-container/main-page-container.component.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import {Component, effect, input} from '@angular/core'; -import {toObservable, toSignal} from '@angular/core/rxjs-interop'; -import {switchMap} from 'rxjs/operators'; +import { Component, effect, input } from '@angular/core'; +import { toObservable, toSignal } from '@angular/core/rxjs-interop'; +import { switchMap } from 'rxjs/operators'; -import {SurveyService} from 'app/services/survey/survey.service'; +import { SurveyService } from 'app/services/survey/survey.service'; @Component({ selector: 'ground-main-page-container', diff --git a/web/src/app/components/main-page-container/main-page-container.module.ts b/web/src/app/components/main-page-container/main-page-container.module.ts index 8d97e2c25..5cd25a1fa 100644 --- a/web/src/app/components/main-page-container/main-page-container.module.ts +++ b/web/src/app/components/main-page-container/main-page-container.module.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; -import {RouterModule} from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { RouterModule } from '@angular/router'; -import {MainPageModule} from './main-page/main-page.module'; -import {MainPageContainerComponent} from './main-page-container.component'; +import { MainPageModule } from './main-page/main-page.module'; +import { MainPageContainerComponent } from './main-page-container.component'; @NgModule({ declarations: [MainPageContainerComponent], diff --git a/web/src/app/components/main-page-container/main-page/drawing-tools/drawing-tools.component.spec.ts b/web/src/app/components/main-page-container/main-page/drawing-tools/drawing-tools.component.spec.ts index d1d634b3f..bcfa1c623 100644 --- a/web/src/app/components/main-page-container/main-page/drawing-tools/drawing-tools.component.spec.ts +++ b/web/src/app/components/main-page-container/main-page/drawing-tools/drawing-tools.component.spec.ts @@ -22,23 +22,23 @@ import { tick, waitForAsync, } from '@angular/core/testing'; -import {By} from '@angular/platform-browser'; -import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; -import {Map} from 'immutable'; -import {BehaviorSubject, of} from 'rxjs'; - -import {Job} from 'app/models/job.model'; -import {DataSharingType, Survey} from 'app/models/survey.model'; -import {AuthService} from 'app/services/auth/auth.service'; +import { By } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { Map } from 'immutable'; +import { BehaviorSubject, of } from 'rxjs'; + +import { Job } from 'app/models/job.model'; +import { DataSharingType, Survey } from 'app/models/survey.model'; +import { AuthService } from 'app/services/auth/auth.service'; import { DrawingToolsService, EditMode, } from 'app/services/drawing-tools/drawing-tools.service'; -import {GroundPinService} from 'app/services/ground-pin/ground-pin.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; +import { GroundPinService } from 'app/services/ground-pin/ground-pin.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; -import {DrawingToolsComponent} from './drawing-tools.component'; -import {DrawingToolsModule} from './drawing-tools.module'; +import { DrawingToolsComponent } from './drawing-tools.component'; +import { DrawingToolsModule } from './drawing-tools.module'; describe('DrawingToolsComponent', () => { let fixture: ComponentFixture; @@ -78,7 +78,7 @@ describe('DrawingToolsComponent', () => { }), /* acl= */ Map(), /* ownerId= */ '', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ); beforeEach(waitForAsync(() => { @@ -107,9 +107,9 @@ describe('DrawingToolsComponent', () => { imports: [DrawingToolsModule, BrowserAnimationsModule], declarations: [DrawingToolsComponent], providers: [ - {provide: AuthService, useValue: authServiceSpy}, - {provide: DrawingToolsService, useValue: drawingToolsServiceSpy}, - {provide: NavigationService, useValue: navigationServiceSpy}, + { provide: AuthService, useValue: authServiceSpy }, + { provide: DrawingToolsService, useValue: drawingToolsServiceSpy }, + { provide: NavigationService, useValue: navigationServiceSpy }, ], }).compileComponents(); })); diff --git a/web/src/app/components/main-page-container/main-page/drawing-tools/drawing-tools.component.ts b/web/src/app/components/main-page-container/main-page/drawing-tools/drawing-tools.component.ts index cfab9c26a..cb8e3ecbe 100644 --- a/web/src/app/components/main-page-container/main-page/drawing-tools/drawing-tools.component.ts +++ b/web/src/app/components/main-page-container/main-page/drawing-tools/drawing-tools.component.ts @@ -24,20 +24,20 @@ import { effect, input, } from '@angular/core'; -import {DomSanitizer, SafeUrl} from '@angular/platform-browser'; -import {List} from 'immutable'; -import {Observable, Subscription} from 'rxjs'; -import {map} from 'rxjs/operators'; +import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; +import { List } from 'immutable'; +import { Observable, Subscription } from 'rxjs'; +import { map } from 'rxjs/operators'; -import {Job} from 'app/models/job.model'; -import {Survey} from 'app/models/survey.model'; -import {AuthService} from 'app/services/auth/auth.service'; +import { Job } from 'app/models/job.model'; +import { Survey } from 'app/models/survey.model'; +import { AuthService } from 'app/services/auth/auth.service'; import { DrawingToolsService, EditMode, } from 'app/services/drawing-tools/drawing-tools.service'; -import {GroundPinService} from 'app/services/ground-pin/ground-pin.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; +import { GroundPinService } from 'app/services/ground-pin/ground-pin.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; @Component({ selector: 'ground-drawing-tools', diff --git a/web/src/app/components/main-page-container/main-page/drawing-tools/drawing-tools.module.ts b/web/src/app/components/main-page-container/main-page/drawing-tools/drawing-tools.module.ts index e8088f76a..eaaf1da4d 100644 --- a/web/src/app/components/main-page-container/main-page/drawing-tools/drawing-tools.module.ts +++ b/web/src/app/components/main-page-container/main-page/drawing-tools/drawing-tools.module.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; // ? -import {MatButtonToggleModule} from '@angular/material/button-toggle'; -import {MatExpansionModule} from '@angular/material/expansion'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatIconModule} from '@angular/material/icon'; -import {MatSelectModule} from '@angular/material/select'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; // ? +import { MatButtonToggleModule } from '@angular/material/button-toggle'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatSelectModule } from '@angular/material/select'; -import {DrawingToolsComponent} from './drawing-tools.component'; +import { DrawingToolsComponent } from './drawing-tools.component'; @NgModule({ imports: [ diff --git a/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/color-picker/color-picker.component.spec.ts b/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/color-picker/color-picker.component.spec.ts index 890b7cc5f..0f602617d 100644 --- a/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/color-picker/color-picker.component.spec.ts +++ b/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/color-picker/color-picker.component.spec.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import {NO_ERRORS_SCHEMA} from '@angular/core'; -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef, } from '@angular/material/dialog'; -import {ColorPickerComponent} from './color-picker.component'; +import { ColorPickerComponent } from './color-picker.component'; describe('ColorPickerComponent', () => { let component: ColorPickerComponent; @@ -34,8 +34,8 @@ describe('ColorPickerComponent', () => { declarations: [ColorPickerComponent], imports: [MatDialogModule], providers: [ - {provide: MAT_DIALOG_DATA, useValue: {}}, - {provide: MatDialogRef, useValue: dialogRef}, + { provide: MAT_DIALOG_DATA, useValue: {} }, + { provide: MatDialogRef, useValue: dialogRef }, ], schemas: [NO_ERRORS_SCHEMA], }).compileComponents(); diff --git a/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/color-picker/color-picker.component.ts b/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/color-picker/color-picker.component.ts index a542eea48..5861c5681 100644 --- a/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/color-picker/color-picker.component.ts +++ b/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/color-picker/color-picker.component.ts @@ -28,9 +28,9 @@ import { MatDialogConfig, MatDialogRef, } from '@angular/material/dialog'; -import {ColorEvent} from 'ngx-color'; +import { ColorEvent } from 'ngx-color'; -import {Job} from 'app/models/job.model'; +import { Job } from 'app/models/job.model'; @Component({ selector: 'ground-color-picker', @@ -48,7 +48,7 @@ export class ColorPickerComponent implements OnInit { constructor( private dialog: MatDialog, matDialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) data: {trigger: ElementRef} + @Inject(MAT_DIALOG_DATA) data: { trigger: ElementRef } ) { this.matDialogRef = matDialogRef; this.triggerElementRef = data.trigger; diff --git a/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/color-picker/color-picker.module.ts b/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/color-picker/color-picker.module.ts index 242953bf9..dfb99db63 100644 --- a/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/color-picker/color-picker.module.ts +++ b/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/color-picker/color-picker.module.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {FormsModule, ReactiveFormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatIconModule} from '@angular/material/icon'; -import {ColorCircleModule} from 'ngx-color/circle'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { ColorCircleModule } from 'ngx-color/circle'; -import {ColorPickerComponent} from './color-picker.component'; +import { ColorPickerComponent } from './color-picker.component'; @NgModule({ declarations: [ColorPickerComponent], diff --git a/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/edit-style-button.component.spec.ts b/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/edit-style-button.component.spec.ts index f468165f2..99b557726 100644 --- a/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/edit-style-button.component.spec.ts +++ b/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/edit-style-button.component.spec.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import {NO_ERRORS_SCHEMA} from '@angular/core'; -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import {MatDialogModule} from '@angular/material/dialog'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatDialogModule } from '@angular/material/dialog'; -import {EditStyleButtonComponent} from './edit-style-button.component'; +import { EditStyleButtonComponent } from './edit-style-button.component'; describe('EditStyleButtonComponent', () => { let component: EditStyleButtonComponent; diff --git a/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/edit-style-button.component.ts b/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/edit-style-button.component.ts index 484c0cd1d..a21b7da77 100644 --- a/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/edit-style-button.component.ts +++ b/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/edit-style-button.component.ts @@ -22,12 +22,12 @@ import { OnInit, Output, } from '@angular/core'; -import {MatDialog} from '@angular/material/dialog'; -import {DomSanitizer, SafeUrl} from '@angular/platform-browser'; +import { MatDialog } from '@angular/material/dialog'; +import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; -import {GroundPinService} from 'app/services/ground-pin/ground-pin.service'; +import { GroundPinService } from 'app/services/ground-pin/ground-pin.service'; -import {ColorPickerComponent} from './color-picker/color-picker.component'; +import { ColorPickerComponent } from './color-picker/color-picker.component'; @Component({ selector: 'ground-edit-style-button', @@ -58,7 +58,7 @@ export class EditStyleButtonComponent implements OnInit { const target = new ElementRef(evt.currentTarget); this.dialog .open(ColorPickerComponent, { - data: {trigger: target}, + data: { trigger: target }, }) .componentInstance.onColorPicked.subscribe((color: string) => { this.markerColor = color; diff --git a/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/edit-style-button.module.ts b/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/edit-style-button.module.ts index 5c160822f..6a51befaa 100644 --- a/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/edit-style-button.module.ts +++ b/web/src/app/components/main-page-container/main-page/job-dialog/edit-style-button/edit-style-button.module.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatIconModule} from '@angular/material/icon'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatIconModule } from '@angular/material/icon'; -import {EditStyleButtonComponent} from './edit-style-button.component'; +import { EditStyleButtonComponent } from './edit-style-button.component'; @NgModule({ declarations: [EditStyleButtonComponent], diff --git a/web/src/app/components/main-page-container/main-page/job-dialog/job-dialog.component.spec.ts b/web/src/app/components/main-page-container/main-page/job-dialog/job-dialog.component.spec.ts index 09bca0018..4d5f5f805 100644 --- a/web/src/app/components/main-page-container/main-page/job-dialog/job-dialog.component.spec.ts +++ b/web/src/app/components/main-page-container/main-page/job-dialog/job-dialog.component.spec.ts @@ -14,34 +14,34 @@ * limitations under the License. */ -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import {FormsModule, ReactiveFormsModule} from '@angular/forms'; -import {MatCheckboxModule} from '@angular/material/checkbox'; +import { Component } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatCheckboxModule } from '@angular/material/checkbox'; import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef, } from '@angular/material/dialog'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatIconModule} from '@angular/material/icon'; -import {MatInputModule} from '@angular/material/input'; -import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; -import {Router} from '@angular/router'; -import {NEVER, of} from 'rxjs'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { Router } from '@angular/router'; +import { NEVER, of } from 'rxjs'; -import {InlineEditorModule} from 'app/components/shared/inline-editor/inline-editor.module'; -import {AuthService} from 'app/services/auth/auth.service'; -import {DataStoreService} from 'app/services/data-store/data-store.service'; +import { InlineEditorModule } from 'app/components/shared/inline-editor/inline-editor.module'; +import { AuthService } from 'app/services/auth/auth.service'; +import { DataStoreService } from 'app/services/data-store/data-store.service'; -import {EditStyleButtonModule} from './edit-style-button/edit-style-button.module'; -import {JobDialogComponent} from './job-dialog.component'; -import {TaskEditorModule} from './task-editor/task-editor.module'; +import { EditStyleButtonModule } from './edit-style-button/edit-style-button.module'; +import { JobDialogComponent } from './job-dialog.component'; +import { TaskEditorModule } from './task-editor/task-editor.module'; -@Component({selector: 'mat-dialog-content', template: ''}) +@Component({ selector: 'mat-dialog-content', template: '' }) class MatDialogContent {} -@Component({selector: 'mat-dialog-actions', template: ''}) +@Component({ selector: 'mat-dialog-actions', template: '' }) class MatDialogActions {} describe('JobDialogComponent', () => { @@ -69,13 +69,13 @@ describe('JobDialogComponent', () => { MatCheckboxModule, ], providers: [ - {provide: DataStoreService, useValue: {generateId: () => '123'}}, - {provide: MAT_DIALOG_DATA, useValue: {createJob: true}}, - {provide: MatDialogRef, useValue: dialogRef}, - {provide: Router, useValue: routerSpy}, + { provide: DataStoreService, useValue: { generateId: () => '123' } }, + { provide: MAT_DIALOG_DATA, useValue: { createJob: true } }, + { provide: MatDialogRef, useValue: dialogRef }, + { provide: Router, useValue: routerSpy }, { provide: AuthService, - useValue: {getUser$: () => NEVER}, + useValue: { getUser$: () => NEVER }, }, ], }).compileComponents(); @@ -93,5 +93,5 @@ describe('JobDialogComponent', () => { }); function createRouterSpy() { - return jasmine.createSpyObj('Router', ['navigate'], {events: of()}); + return jasmine.createSpyObj('Router', ['navigate'], { events: of() }); } diff --git a/web/src/app/components/main-page-container/main-page/job-dialog/job-dialog.component.ts b/web/src/app/components/main-page-container/main-page/job-dialog/job-dialog.component.ts index c0d2a8d5e..0872ef3b7 100644 --- a/web/src/app/components/main-page-container/main-page/job-dialog/job-dialog.component.ts +++ b/web/src/app/components/main-page-container/main-page/job-dialog/job-dialog.component.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {CdkDragDrop} from '@angular/cdk/drag-drop'; +import { CdkDragDrop } from '@angular/cdk/drag-drop'; import { ChangeDetectorRef, Component, @@ -23,19 +23,19 @@ import { QueryList, ViewChildren, } from '@angular/core'; -import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; -import {List} from 'immutable'; -import {Subscription} from 'rxjs'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { List } from 'immutable'; +import { Subscription } from 'rxjs'; -import {DataCollectionStrategy, Job} from 'app/models/job.model'; -import {Task, TaskType} from 'app/models/task/task.model'; -import {DataStoreService} from 'app/services/data-store/data-store.service'; -import {DialogService} from 'app/services/dialog/dialog.service'; -import {JobService} from 'app/services/job/job.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; +import { DataCollectionStrategy, Job } from 'app/models/job.model'; +import { Task, TaskType } from 'app/models/task/task.model'; +import { DataStoreService } from 'app/services/data-store/data-store.service'; +import { DialogService } from 'app/services/dialog/dialog.service'; +import { JobService } from 'app/services/job/job.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; -import {MarkerColorEvent} from './edit-style-button/edit-style-button.component'; -import {TaskEditorComponent} from './task-editor/task-editor.component'; +import { MarkerColorEvent } from './edit-style-button/edit-style-button.component'; +import { TaskEditorComponent } from './task-editor/task-editor.component'; // To make ESLint happy: /*global alert*/ diff --git a/web/src/app/components/main-page-container/main-page/job-dialog/job-dialog.module.ts b/web/src/app/components/main-page-container/main-page/job-dialog/job-dialog.module.ts index 4754faa23..ac2678866 100644 --- a/web/src/app/components/main-page-container/main-page/job-dialog/job-dialog.module.ts +++ b/web/src/app/components/main-page-container/main-page/job-dialog/job-dialog.module.ts @@ -14,22 +14,22 @@ * limitations under the License. */ -import {DragDropModule} from '@angular/cdk/drag-drop'; -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {FormsModule, ReactiveFormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatCheckboxModule} from '@angular/material/checkbox'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatIconModule} from '@angular/material/icon'; -import {MatInputModule} from '@angular/material/input'; +import { DragDropModule } from '@angular/cdk/drag-drop'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; -import {InlineEditorModule} from 'app/components/shared/inline-editor/inline-editor.module'; +import { InlineEditorModule } from 'app/components/shared/inline-editor/inline-editor.module'; -import {EditStyleButtonModule} from './edit-style-button/edit-style-button.module'; -import {JobDialogComponent} from './job-dialog.component'; -import {TaskEditorModule} from './task-editor/task-editor.module'; +import { EditStyleButtonModule } from './edit-style-button/edit-style-button.module'; +import { JobDialogComponent } from './job-dialog.component'; +import { TaskEditorModule } from './task-editor/task-editor.module'; @NgModule({ declarations: [JobDialogComponent], diff --git a/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/option-editor/option-editor.component.spec.ts b/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/option-editor/option-editor.component.spec.ts index f3d4fdb24..9d3aab856 100644 --- a/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/option-editor/option-editor.component.spec.ts +++ b/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/option-editor/option-editor.component.spec.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import {FormsModule, ReactiveFormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatIconModule} from '@angular/material/icon'; -import {MatInputModule} from '@angular/material/input'; -import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; +import { CommonModule } from '@angular/common'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import {OptionEditorComponent} from './option-editor.component'; +import { OptionEditorComponent } from './option-editor.component'; describe('OptionEditorComponent', () => { let component: OptionEditorComponent; diff --git a/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/option-editor/option-editor.component.ts b/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/option-editor/option-editor.component.ts index c185b94ed..7bd1b9388 100644 --- a/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/option-editor/option-editor.component.ts +++ b/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/option-editor/option-editor.component.ts @@ -42,7 +42,7 @@ export class OptionEditorComponent implements OnInit, OnChanges { @Input() index?: number; @Output() update = new EventEmitter(); @Output() delete = new EventEmitter(); - @ViewChild('optionInput', {static: true}) optionInput?: ElementRef; + @ViewChild('optionInput', { static: true }) optionInput?: ElementRef; optionGroup: FormGroup; diff --git a/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/option-editor/option-editor.module.ts b/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/option-editor/option-editor.module.ts index 35192a11a..4238056cb 100644 --- a/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/option-editor/option-editor.module.ts +++ b/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/option-editor/option-editor.module.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {FormsModule, ReactiveFormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatIconModule} from '@angular/material/icon'; -import {MatInputModule} from '@angular/material/input'; -import {MatTooltipModule} from '@angular/material/tooltip'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatTooltipModule } from '@angular/material/tooltip'; -import {OptionEditorComponent} from './option-editor.component'; +import { OptionEditorComponent } from './option-editor.component'; @NgModule({ declarations: [OptionEditorComponent], diff --git a/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/task-editor.component.spec.ts b/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/task-editor.component.spec.ts index 48b513025..f560ab727 100644 --- a/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/task-editor.component.spec.ts +++ b/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/task-editor.component.spec.ts @@ -14,22 +14,22 @@ * limitations under the License. */ -import {NO_ERRORS_SCHEMA} from '@angular/core'; -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import {FormsModule, ReactiveFormsModule} from '@angular/forms'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatIconModule} from '@angular/material/icon'; -import {MatInputModule} from '@angular/material/input'; -import {MatSelectModule} from '@angular/material/select'; -import {MatSlideToggleModule} from '@angular/material/slide-toggle'; -import {BrowserModule} from '@angular/platform-browser'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {Router} from '@angular/router'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { BrowserModule } from '@angular/platform-browser'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { Router } from '@angular/router'; -import {JobService} from 'app/services/job/job.service'; +import { JobService } from 'app/services/job/job.service'; -import {TaskEditorComponent} from './task-editor.component'; +import { TaskEditorComponent } from './task-editor.component'; describe('TaskFieldEditorComponent', () => { let component: TaskEditorComponent; @@ -51,8 +51,8 @@ describe('TaskFieldEditorComponent', () => { NoopAnimationsModule, ], providers: [ - {provide: Router, useValue: {}}, - {provide: JobService, useValue: {}}, + { provide: Router, useValue: {} }, + { provide: JobService, useValue: {} }, ], schemas: [NO_ERRORS_SCHEMA], }).compileComponents(); diff --git a/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/task-editor.component.ts b/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/task-editor.component.ts index 2e6235884..5291737f4 100644 --- a/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/task-editor.component.ts +++ b/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/task-editor.component.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {CdkDragDrop} from '@angular/cdk/drag-drop'; +import { CdkDragDrop } from '@angular/cdk/drag-drop'; import { ChangeDetectorRef, Component, @@ -39,19 +39,19 @@ import { ValidationErrors, Validators, } from '@angular/forms'; -import {List} from 'immutable'; -import {Subscription, firstValueFrom} from 'rxjs'; +import { List } from 'immutable'; +import { Subscription, firstValueFrom } from 'rxjs'; import { Cardinality, MultipleChoice, } from 'app/models/task/multiple-choice.model'; -import {Option} from 'app/models/task/option.model'; -import {TaskType} from 'app/models/task/task.model'; -import {DialogService} from 'app/services/dialog/dialog.service'; -import {JobService} from 'app/services/job/job.service'; +import { Option } from 'app/models/task/option.model'; +import { TaskType } from 'app/models/task/task.model'; +import { DialogService } from 'app/services/dialog/dialog.service'; +import { JobService } from 'app/services/job/job.service'; -import {OptionEditorComponent} from './option-editor/option-editor.component'; +import { OptionEditorComponent } from './option-editor/option-editor.component'; export interface TaskTypeSelectOption { icon: string; @@ -86,7 +86,7 @@ export class TaskEditorComponent implements OnInit, OnChanges, OnDestroy { subscription: Subscription = new Subscription(); taskGroup: FormGroup; - @ViewChild('questionInput', {static: true}) questionInput?: ElementRef; + @ViewChild('questionInput', { static: true }) questionInput?: ElementRef; @HostListener('click') onTaskFocus() { @@ -242,7 +242,7 @@ export class TaskEditorComponent implements OnInit, OnChanges, OnDestroy { this.taskOptions.options ); } - this.taskGroup.patchValue({selectTaskOption: event}); + this.taskGroup.patchValue({ selectTaskOption: event }); if (event.type === TaskType.MULTIPLE_CHOICE) { if (!this.taskOptions?.options?.size) { this.onAddOption(); @@ -266,7 +266,7 @@ export class TaskEditorComponent implements OnInit, OnChanges, OnDestroy { * @param index: index of the option to be updated. * @returns void */ - onOptionUpdate(event: {label: string; code: string}, index: number): void { + onOptionUpdate(event: { label: string; code: string }, index: number): void { const option = this.jobService.createOption(event.code, event.label, index); const options = this.setTaskOptions(index, option); this.emitTaskOptions(options); diff --git a/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/task-editor.module.ts b/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/task-editor.module.ts index 15dec0794..1a92e4a19 100644 --- a/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/task-editor.module.ts +++ b/web/src/app/components/main-page-container/main-page/job-dialog/task-editor/task-editor.module.ts @@ -14,19 +14,19 @@ * limitations under the License. */ -import {DragDropModule} from '@angular/cdk/drag-drop'; -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {FormsModule, ReactiveFormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatIconModule} from '@angular/material/icon'; -import {MatInputModule} from '@angular/material/input'; -import {MatSelectModule} from '@angular/material/select'; -import {MatSlideToggleModule} from '@angular/material/slide-toggle'; +import { DragDropModule } from '@angular/cdk/drag-drop'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; -import {OptionEditorModule} from './option-editor/option-editor.module'; -import {TaskEditorComponent} from './task-editor.component'; +import { OptionEditorModule } from './option-editor/option-editor.module'; +import { TaskEditorComponent } from './task-editor.component'; @NgModule({ declarations: [TaskEditorComponent], diff --git a/web/src/app/components/main-page-container/main-page/main-page.component.spec.ts b/web/src/app/components/main-page-container/main-page/main-page.component.spec.ts index 413fb0bc2..f1c14d535 100644 --- a/web/src/app/components/main-page-container/main-page/main-page.component.spec.ts +++ b/web/src/app/components/main-page-container/main-page/main-page.component.spec.ts @@ -14,27 +14,28 @@ * limitations under the License. */ -import {Component, NO_ERRORS_SCHEMA, signal} from '@angular/core'; -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import {AngularFireAuth} from '@angular/fire/compat/auth'; -import {AngularFirestore} from '@angular/fire/compat/firestore'; -import {MatDialog} from '@angular/material/dialog'; -import {ActivatedRoute, Router} from '@angular/router'; -import {NEVER, of} from 'rxjs'; - -import {AuthService} from 'app/services/auth/auth.service'; -import {LocationOfInterestService} from 'app/services/loi/loi.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SubmissionService} from 'app/services/submission/submission.service'; -import {SurveyService} from 'app/services/survey/survey.service'; -import {ActivatedRouteStub} from 'testing/activated-route-stub'; - -import {MainPageComponent} from './main-page.component'; - -@Component({selector: 'ground-map', template: ''}) +import { Component, NO_ERRORS_SCHEMA, signal } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { AngularFireAuth } from '@angular/fire/compat/auth'; +import { AngularFirestore } from '@angular/fire/compat/firestore'; +import { MatDialog } from '@angular/material/dialog'; +import { ActivatedRoute, Router } from '@angular/router'; +import { NEVER, of } from 'rxjs'; + +import { Survey } from 'app/models/survey.model'; +import { AuthService } from 'app/services/auth/auth.service'; +import { LocationOfInterestService } from 'app/services/loi/loi.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SubmissionService } from 'app/services/submission/submission.service'; +import { SurveyService } from 'app/services/survey/survey.service'; +import { ActivatedRouteStub } from 'testing/activated-route-stub'; + +import { MainPageComponent } from './main-page.component'; + +@Component({ selector: 'ground-map', template: '' }) class MapComponent {} -@Component({selector: 'mat-sidenav', template: ''}) +@Component({ selector: 'mat-sidenav', template: '' }) class MatSideNavComponent { opened = false; } @@ -72,21 +73,21 @@ describe('MainPageComponent', () => { TestBed.configureTestingModule({ declarations: [MainPageComponent, MapComponent, MatSideNavComponent], providers: [ - {provide: ActivatedRoute, useValue: route}, - {provide: MatDialog, useValue: dialog}, + { provide: ActivatedRoute, useValue: route }, + { provide: MatDialog, useValue: dialog }, { provide: LocationOfInterestService, useValue: loiService, }, - {provide: SubmissionService, useValue: submissionService}, - {provide: SurveyService, useValue: surveyService}, - {provide: NavigationService, useValue: navigationService}, - {provide: AngularFirestore, useValue: {}}, - {provide: AngularFireAuth, useValue: {}}, - {provide: Router, useValue: {}}, + { provide: SubmissionService, useValue: submissionService }, + { provide: SurveyService, useValue: surveyService }, + { provide: NavigationService, useValue: navigationService }, + { provide: AngularFirestore, useValue: {} }, + { provide: AngularFireAuth, useValue: {} }, + { provide: Router, useValue: {} }, { provide: AuthService, - useValue: {getUser$: () => NEVER, isAuthenticated$: () => NEVER}, + useValue: { getUser$: () => NEVER, isAuthenticated$: () => NEVER }, }, ], schemas: [NO_ERRORS_SCHEMA], @@ -103,7 +104,7 @@ describe('MainPageComponent', () => { acl: {}, ownerId: 'owner1', dataSharingTerms: {}, - } as any; + } as Survey; fixture.componentRef.setInput('activeSurvey', mockSurvey); component = fixture.componentInstance; diff --git a/web/src/app/components/main-page-container/main-page/main-page.component.ts b/web/src/app/components/main-page-container/main-page/main-page.component.ts index 3facbe06c..9a05b9ea2 100644 --- a/web/src/app/components/main-page-container/main-page/main-page.component.ts +++ b/web/src/app/components/main-page-container/main-page/main-page.component.ts @@ -14,20 +14,20 @@ * limitations under the License. */ -import {Component, OnInit, effect, input} from '@angular/core'; -import {MatDialog} from '@angular/material/dialog'; -import {Subscription} from 'rxjs'; +import { Component, OnInit, effect, input } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { Subscription } from 'rxjs'; -import {Survey} from 'app/models/survey.model'; -import {AuthService} from 'app/services/auth/auth.service'; -import {LocationOfInterestService} from 'app/services/loi/loi.service'; -import {JOB_ID_NEW} from 'app/services/navigation/navigation.constants'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SubmissionService} from 'app/services/submission/submission.service'; -import {SurveyService} from 'app/services/survey/survey.service'; -import {environment} from 'environments/environment'; +import { Survey } from 'app/models/survey.model'; +import { AuthService } from 'app/services/auth/auth.service'; +import { LocationOfInterestService } from 'app/services/loi/loi.service'; +import { JOB_ID_NEW } from 'app/services/navigation/navigation.constants'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SubmissionService } from 'app/services/submission/submission.service'; +import { SurveyService } from 'app/services/survey/survey.service'; +import { environment } from 'environments/environment'; -import {TitleDialogComponent} from './title-dialog/title-dialog.component'; +import { TitleDialogComponent } from './title-dialog/title-dialog.component'; /** * Root component for main application page showing map, jobs list, and @@ -55,7 +55,7 @@ export class MainPageComponent implements OnInit { private dialog: MatDialog ) { effect(() => { - const {loiId, submissionId} = this.urlParamsSignal(); + const { loiId, submissionId } = this.urlParamsSignal(); if (loiId) this.loiService.selectLocationOfInterest(loiId); if (submissionId) this.submissionService.selectSubmission(submissionId); }); diff --git a/web/src/app/components/main-page-container/main-page/main-page.module.ts b/web/src/app/components/main-page-container/main-page/main-page.module.ts index fd30ed3dc..2d3164ba8 100644 --- a/web/src/app/components/main-page-container/main-page/main-page.module.ts +++ b/web/src/app/components/main-page-container/main-page/main-page.module.ts @@ -14,21 +14,21 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatIconModule} from '@angular/material/icon'; -import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; -import {MatSidenavModule} from '@angular/material/sidenav'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatIconModule } from '@angular/material/icon'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSidenavModule } from '@angular/material/sidenav'; -import {DrawingToolsModule} from './drawing-tools/drawing-tools.module'; -import {JobDialogModule} from './job-dialog/job-dialog.module'; -import {MainPageComponent} from './main-page.component'; -import {MapModule} from './map/map.module'; -import {SecondarySidePanelModule} from './secondary-side-panel/secondary-side-panel.module'; -import {SidePanelModule} from './side-panel/side-panel.module'; -import {SurveyHeaderModule} from './survey-header/survey-header.module'; +import { DrawingToolsModule } from './drawing-tools/drawing-tools.module'; +import { JobDialogModule } from './job-dialog/job-dialog.module'; +import { MainPageComponent } from './main-page.component'; +import { MapModule } from './map/map.module'; +import { SecondarySidePanelModule } from './secondary-side-panel/secondary-side-panel.module'; +import { SidePanelModule } from './side-panel/side-panel.module'; +import { SurveyHeaderModule } from './survey-header/survey-header.module'; @NgModule({ declarations: [MainPageComponent], diff --git a/web/src/app/components/main-page-container/main-page/map/map.component.spec.ts b/web/src/app/components/main-page-container/main-page/map/map.component.spec.ts index 1f54bc2fe..c6420ec29 100644 --- a/web/src/app/components/main-page-container/main-page/map/map.component.spec.ts +++ b/web/src/app/components/main-page-container/main-page/map/map.component.spec.ts @@ -21,29 +21,29 @@ import { tick, waitForAsync, } from '@angular/core/testing'; -import {AngularFireAuth} from '@angular/fire/compat/auth'; -import {AngularFirestore} from '@angular/fire/compat/firestore'; -import {GoogleMapsModule} from '@angular/google-maps'; -import {List, Map} from 'immutable'; -import {BehaviorSubject, of} from 'rxjs'; - -import {Coordinate} from 'app/models/geometry/coordinate'; -import {MultiPolygon} from 'app/models/geometry/multi-polygon'; -import {Point} from 'app/models/geometry/point'; -import {Job} from 'app/models/job.model'; -import {LocationOfInterest} from 'app/models/loi.model'; -import {DataSharingType, Survey} from 'app/models/survey.model'; -import {AuthService} from 'app/services/auth/auth.service'; +import { AngularFireAuth } from '@angular/fire/compat/auth'; +import { AngularFirestore } from '@angular/fire/compat/firestore'; +import { GoogleMapsModule } from '@angular/google-maps'; +import { List, Map } from 'immutable'; +import { BehaviorSubject, of } from 'rxjs'; + +import { Coordinate } from 'app/models/geometry/coordinate'; +import { MultiPolygon } from 'app/models/geometry/multi-polygon'; +import { Point } from 'app/models/geometry/point'; +import { Job } from 'app/models/job.model'; +import { LocationOfInterest } from 'app/models/loi.model'; +import { DataSharingType, Survey } from 'app/models/survey.model'; +import { AuthService } from 'app/services/auth/auth.service'; import { DrawingToolsService, EditMode, } from 'app/services/drawing-tools/drawing-tools.service'; -import {LocationOfInterestService} from 'app/services/loi/loi.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SubmissionService} from 'app/services/submission/submission.service'; -import {polygonShellCoordsToPolygon} from 'testing/helpers'; +import { LocationOfInterestService } from 'app/services/loi/loi.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SubmissionService } from 'app/services/submission/submission.service'; +import { polygonShellCoordsToPolygon } from 'testing/helpers'; -import {MapComponent} from './map.component'; +import { MapComponent } from './map.component'; describe('MapComponent', () => { let component: MapComponent; @@ -92,7 +92,7 @@ describe('MapComponent', () => { }), /* acl= */ Map(), /* ownerId= */ '', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ); const poi1 = new LocationOfInterest( poiId1, @@ -209,10 +209,10 @@ describe('MapComponent', () => { provide: LocationOfInterestService, useValue: loiServiceSpy, }, - {provide: NavigationService, useValue: navigationServiceSpy}, - {provide: SubmissionService, useValue: submissionServiceSpy}, - {provide: DrawingToolsService, useValue: drawingToolsServiceSpy}, - {provide: AuthService, useValue: {}}, + { provide: NavigationService, useValue: navigationServiceSpy }, + { provide: SubmissionService, useValue: submissionServiceSpy }, + { provide: DrawingToolsService, useValue: drawingToolsServiceSpy }, + { provide: AuthService, useValue: {} }, { provide: AngularFireAuth, useValue: { @@ -223,7 +223,7 @@ describe('MapComponent', () => { }), }, }, - {provide: AngularFirestore, useValue: {}}, + { provide: AngularFirestore, useValue: {} }, ], }).compileComponents(); })); diff --git a/web/src/app/components/main-page-container/main-page/map/map.component.ts b/web/src/app/components/main-page-container/main-page/map/map.component.ts index f8d0ecd9b..f3655c1ea 100644 --- a/web/src/app/components/main-page-container/main-page/map/map.component.ts +++ b/web/src/app/components/main-page-container/main-page/map/map.component.ts @@ -25,30 +25,30 @@ import { ViewChild, input, } from '@angular/core'; -import {toObservable} from '@angular/core/rxjs-interop'; -import {GoogleMap} from '@angular/google-maps'; -import {Map as ImmutableMap, List} from 'immutable'; -import {BehaviorSubject, Observable, Subscription, combineLatest} from 'rxjs'; -import {filter, map} from 'rxjs/operators'; - -import {Coordinate} from 'app/models/geometry/coordinate'; -import {Geometry, GeometryType} from 'app/models/geometry/geometry'; -import {MultiPolygon} from 'app/models/geometry/multi-polygon'; -import {Point} from 'app/models/geometry/point'; -import {Polygon} from 'app/models/geometry/polygon'; -import {Job} from 'app/models/job.model'; -import {LocationOfInterest} from 'app/models/loi.model'; -import {Submission} from 'app/models/submission/submission.model'; -import {Survey} from 'app/models/survey.model'; -import {TaskType} from 'app/models/task/task.model'; +import { toObservable } from '@angular/core/rxjs-interop'; +import { GoogleMap } from '@angular/google-maps'; +import { Map as ImmutableMap, List } from 'immutable'; +import { BehaviorSubject, Observable, Subscription, combineLatest } from 'rxjs'; +import { filter, map } from 'rxjs/operators'; + +import { Coordinate } from 'app/models/geometry/coordinate'; +import { Geometry, GeometryType } from 'app/models/geometry/geometry'; +import { MultiPolygon } from 'app/models/geometry/multi-polygon'; +import { Point } from 'app/models/geometry/point'; +import { Polygon } from 'app/models/geometry/polygon'; +import { Job } from 'app/models/job.model'; +import { LocationOfInterest } from 'app/models/loi.model'; +import { Submission } from 'app/models/submission/submission.model'; +import { Survey } from 'app/models/survey.model'; +import { TaskType } from 'app/models/task/task.model'; import { DrawingToolsService, EditMode, } from 'app/services/drawing-tools/drawing-tools.service'; -import {GroundPinService} from 'app/services/ground-pin/ground-pin.service'; -import {LocationOfInterestService} from 'app/services/loi/loi.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SubmissionService} from 'app/services/submission/submission.service'; +import { GroundPinService } from 'app/services/ground-pin/ground-pin.service'; +import { LocationOfInterestService } from 'app/services/loi/loi.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SubmissionService } from 'app/services/submission/submission.service'; // To make ESLint happy: /*global google*/ @@ -407,7 +407,7 @@ export class MapComponent implements AfterViewInit, OnChanges, OnDestroy { : survey.getJob(loi.jobId)?.name; if (loi.geometry instanceof Point) { - const {id, jobId, geometry} = loi; + const { id, jobId, geometry } = loi; const marker = this.addLocationOfInterestMarkerToMap( id, jobId, @@ -461,7 +461,7 @@ export class MapComponent implements AfterViewInit, OnChanges, OnDestroy { color: string | undefined = this.DEFAULT_MARKER_COLOR, markerText?: string | undefined ): google.maps.marker.AdvancedMarkerElement { - const {y: latitude, x: longitude} = geometry.coord; + const { y: latitude, x: longitude } = geometry.coord; const options: google.maps.marker.AdvancedMarkerElementOptions = { map: this.map.googleMap, @@ -668,7 +668,7 @@ export class MapComponent implements AfterViewInit, OnChanges, OnDestroy { const polygons = this.polygons.get(locationOfInterestId); polygons?.forEach(polygon => - polygon.setOptions({strokeWeight: enlargedPolygonStrokeWeight}) + polygon.setOptions({ strokeWeight: enlargedPolygonStrokeWeight }) ); this.fitMapToLocationsOfInterest( @@ -700,7 +700,9 @@ export class MapComponent implements AfterViewInit, OnChanges, OnDestroy { const linearRings = [polygonModel.shell, ...polygonModel.holes]; const paths = linearRings.map(linearRing => linearRing.points - .map(({x, y}: {x: number; y: number}) => new google.maps.LatLng(y, x)) + .map( + ({ x, y }: { x: number; y: number }) => new google.maps.LatLng(y, x) + ) .toJS() ); return new google.maps.Polygon({ diff --git a/web/src/app/components/main-page-container/main-page/map/map.module.ts b/web/src/app/components/main-page-container/main-page/map/map.module.ts index 1fc4134e4..b58cf0d6c 100644 --- a/web/src/app/components/main-page-container/main-page/map/map.module.ts +++ b/web/src/app/components/main-page-container/main-page/map/map.module.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import {NgModule} from '@angular/core'; -import {GoogleMapsModule} from '@angular/google-maps'; -import {MatButtonModule} from '@angular/material/button'; -import {BrowserModule} from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { GoogleMapsModule } from '@angular/google-maps'; +import { MatButtonModule } from '@angular/material/button'; +import { BrowserModule } from '@angular/platform-browser'; -import {MapComponent} from './map.component'; +import { MapComponent } from './map.component'; @NgModule({ imports: [BrowserModule, GoogleMapsModule, MatButtonModule], diff --git a/web/src/app/components/main-page-container/main-page/secondary-side-panel/loi-panel/loi-panel.component.spec.ts b/web/src/app/components/main-page-container/main-page/secondary-side-panel/loi-panel/loi-panel.component.spec.ts index 6ee296248..5b5979b24 100644 --- a/web/src/app/components/main-page-container/main-page/secondary-side-panel/loi-panel/loi-panel.component.spec.ts +++ b/web/src/app/components/main-page-container/main-page/secondary-side-panel/loi-panel/loi-panel.component.spec.ts @@ -14,19 +14,20 @@ * limitations under the License. */ -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import {MatDialog} from '@angular/material/dialog'; -import {List, Map} from 'immutable'; -import {of} from 'rxjs'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatDialog } from '@angular/material/dialog'; +import { List, Map } from 'immutable'; +import { of } from 'rxjs'; -import {LocationOfInterest} from 'app/models/loi.model'; -import {Submission} from 'app/models/submission/submission.model'; -import {DataSharingType, Survey} from 'app/models/survey.model'; -import {LocationOfInterestService} from 'app/services/loi/loi.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SubmissionService} from 'app/services/submission/submission.service'; +import { Geometry } from 'app/models/geometry/geometry'; +import { LocationOfInterest } from 'app/models/loi.model'; +import { Submission } from 'app/models/submission/submission.model'; +import { DataSharingType, Survey } from 'app/models/survey.model'; +import { LocationOfInterestService } from 'app/services/loi/loi.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SubmissionService } from 'app/services/submission/submission.service'; -import {LocationOfInterestPanelComponent} from './loi-panel.component'; +import { LocationOfInterestPanelComponent } from './loi-panel.component'; describe('LocationOfInterestPanelComponent', () => { let component: LocationOfInterestPanelComponent; @@ -43,13 +44,13 @@ describe('LocationOfInterestPanelComponent', () => { Map(), Map(), 'owner1', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ); const mockLoi = new LocationOfInterest( 'loi1', 'job1', - {chainId: 'point1'} as any, + { chainId: 'point1' } as unknown as Geometry, Map() ); @@ -74,10 +75,10 @@ describe('LocationOfInterestPanelComponent', () => { TestBed.configureTestingModule({ declarations: [LocationOfInterestPanelComponent], providers: [ - {provide: LocationOfInterestService, useValue: loiServiceSpy}, - {provide: SubmissionService, useValue: submissionServiceSpy}, - {provide: NavigationService, useValue: navigationServiceSpy}, - {provide: MatDialog, useValue: dialogSpy}, + { provide: LocationOfInterestService, useValue: loiServiceSpy }, + { provide: SubmissionService, useValue: submissionServiceSpy }, + { provide: NavigationService, useValue: navigationServiceSpy }, + { provide: MatDialog, useValue: dialogSpy }, ], }).compileComponents(); })); diff --git a/web/src/app/components/main-page-container/main-page/secondary-side-panel/loi-panel/loi-panel.component.ts b/web/src/app/components/main-page-container/main-page/secondary-side-panel/loi-panel/loi-panel.component.ts index f1ca2c894..3f35f9998 100644 --- a/web/src/app/components/main-page-container/main-page/secondary-side-panel/loi-panel/loi-panel.component.ts +++ b/web/src/app/components/main-page-container/main-page/secondary-side-panel/loi-panel/loi-panel.component.ts @@ -14,20 +14,20 @@ * limitations under the License. */ -import {Component, OnDestroy, OnInit, input} from '@angular/core'; -import {toObservable} from '@angular/core/rxjs-interop'; -import {MatDialog} from '@angular/material/dialog'; -import {List} from 'immutable'; -import {Subscription, combineLatest, switchMap} from 'rxjs'; +import { Component, OnDestroy, OnInit, input } from '@angular/core'; +import { toObservable } from '@angular/core/rxjs-interop'; +import { MatDialog } from '@angular/material/dialog'; +import { List } from 'immutable'; +import { Subscription, combineLatest, switchMap } from 'rxjs'; -import {LoiPropertiesDialogComponent} from 'app/components/shared/loi-properties-dialog/loi-properties-dialog.component'; -import {LocationOfInterest} from 'app/models/loi.model'; -import {Submission} from 'app/models/submission/submission.model'; -import {Survey} from 'app/models/survey.model'; -import {LocationOfInterestService} from 'app/services/loi/loi.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SubmissionService} from 'app/services/submission/submission.service'; -import {getLoiIcon} from 'app/utils/utils'; +import { LoiPropertiesDialogComponent } from 'app/components/shared/loi-properties-dialog/loi-properties-dialog.component'; +import { LocationOfInterest } from 'app/models/loi.model'; +import { Submission } from 'app/models/submission/submission.model'; +import { Survey } from 'app/models/survey.model'; +import { LocationOfInterestService } from 'app/services/loi/loi.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SubmissionService } from 'app/services/submission/submission.service'; +import { getLoiIcon } from 'app/utils/utils'; @Component({ selector: 'ground-loi-panel', diff --git a/web/src/app/components/main-page-container/main-page/secondary-side-panel/loi-panel/loi-panel.module.ts b/web/src/app/components/main-page-container/main-page/secondary-side-panel/loi-panel/loi-panel.module.ts index ec4ddd881..78852f8fc 100644 --- a/web/src/app/components/main-page-container/main-page/secondary-side-panel/loi-panel/loi-panel.module.ts +++ b/web/src/app/components/main-page-container/main-page/secondary-side-panel/loi-panel/loi-panel.module.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {MatCardModule} from '@angular/material/card'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatIconModule} from '@angular/material/icon'; -import {MatListModule} from '@angular/material/list'; -import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; -import {BrowserModule} from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { BrowserModule } from '@angular/platform-browser'; -import {LocationOfInterestPanelComponent} from './loi-panel.component'; +import { LocationOfInterestPanelComponent } from './loi-panel.component'; @NgModule({ imports: [ diff --git a/web/src/app/components/main-page-container/main-page/secondary-side-panel/secondary-side-panel.component.spec.ts b/web/src/app/components/main-page-container/main-page/secondary-side-panel/secondary-side-panel.component.spec.ts index 061302c24..6635c472e 100644 --- a/web/src/app/components/main-page-container/main-page/secondary-side-panel/secondary-side-panel.component.spec.ts +++ b/web/src/app/components/main-page-container/main-page/secondary-side-panel/secondary-side-panel.component.spec.ts @@ -14,18 +14,16 @@ * limitations under the License. */ -import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import {Map} from 'immutable'; -import {of} from 'rxjs'; +import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { Map } from 'immutable'; +import { of } from 'rxjs'; -import {DataSharingType, Survey} from 'app/models/survey.model'; -import { - NavigationService, - SideNavMode, -} from 'app/services/navigation/navigation.service'; +import { DataSharingType, Survey } from 'app/models/survey.model'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SideNavMode } from 'app/services/navigation/url-params'; -import {SecondarySidePanelComponent} from './secondary-side-panel.component'; +import { SecondarySidePanelComponent } from './secondary-side-panel.component'; describe('SecondarySidePanelComponent', () => { let component: SecondarySidePanelComponent; @@ -39,7 +37,7 @@ describe('SecondarySidePanelComponent', () => { Map(), Map(), 'owner1', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ); beforeEach(waitForAsync(() => { @@ -64,7 +62,9 @@ describe('SecondarySidePanelComponent', () => { TestBed.configureTestingModule({ declarations: [SecondarySidePanelComponent], - providers: [{provide: NavigationService, useValue: navigationServiceSpy}], + providers: [ + { provide: NavigationService, useValue: navigationServiceSpy }, + ], schemas: [CUSTOM_ELEMENTS_SCHEMA], }).compileComponents(); })); diff --git a/web/src/app/components/main-page-container/main-page/secondary-side-panel/secondary-side-panel.component.ts b/web/src/app/components/main-page-container/main-page/secondary-side-panel/secondary-side-panel.component.ts index 391673bb0..49447515c 100644 --- a/web/src/app/components/main-page-container/main-page/secondary-side-panel/secondary-side-panel.component.ts +++ b/web/src/app/components/main-page-container/main-page/secondary-side-panel/secondary-side-panel.component.ts @@ -14,13 +14,11 @@ * limitations under the License. */ -import {Component, input} from '@angular/core'; +import { Component, input } from '@angular/core'; -import {Survey} from 'app/models/survey.model'; -import { - NavigationService, - SideNavMode, -} from 'app/services/navigation/navigation.service'; +import { Survey } from 'app/models/survey.model'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SideNavMode } from 'app/services/navigation/url-params'; @Component({ selector: 'ground-secondary-side-panel', diff --git a/web/src/app/components/main-page-container/main-page/secondary-side-panel/secondary-side-panel.module.ts b/web/src/app/components/main-page-container/main-page/secondary-side-panel/secondary-side-panel.module.ts index 8fe03b036..37b00a458 100644 --- a/web/src/app/components/main-page-container/main-page/secondary-side-panel/secondary-side-panel.module.ts +++ b/web/src/app/components/main-page-container/main-page/secondary-side-panel/secondary-side-panel.module.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {MatCardModule} from '@angular/material/card'; -import {MatDividerModule} from '@angular/material/divider'; -import {MatIconModule} from '@angular/material/icon'; -import {BrowserModule} from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { BrowserModule } from '@angular/platform-browser'; -import {LocationOfInterestPanelModule} from './loi-panel/loi-panel.module'; -import {SecondarySidePanelComponent} from './secondary-side-panel.component'; -import {SubmissionPanelModule} from './submission-panel/submission-panel.module'; +import { LocationOfInterestPanelModule } from './loi-panel/loi-panel.module'; +import { SecondarySidePanelComponent } from './secondary-side-panel.component'; +import { SubmissionPanelModule } from './submission-panel/submission-panel.module'; @NgModule({ imports: [ diff --git a/web/src/app/components/main-page-container/main-page/secondary-side-panel/submission-panel/submission-panel.component.spec.ts b/web/src/app/components/main-page-container/main-page/secondary-side-panel/submission-panel/submission-panel.component.spec.ts index 1557f9450..f240006c1 100644 --- a/web/src/app/components/main-page-container/main-page/secondary-side-panel/submission-panel/submission-panel.component.spec.ts +++ b/web/src/app/components/main-page-container/main-page/secondary-side-panel/submission-panel/submission-panel.component.spec.ts @@ -14,20 +14,21 @@ * limitations under the License. */ -import {NO_ERRORS_SCHEMA} from '@angular/core'; -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import {AngularFireStorage} from '@angular/fire/compat/storage'; -import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; -import {Map} from 'immutable'; -import {of} from 'rxjs'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { AngularFireStorage } from '@angular/fire/compat/storage'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { Map } from 'immutable'; +import { of } from 'rxjs'; -import {AuditInfo} from 'app/models/audit-info.model'; -import {Submission} from 'app/models/submission/submission.model'; -import {DataSharingType, Survey} from 'app/models/survey.model'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SubmissionService} from 'app/services/submission/submission.service'; +import { AuditInfo } from 'app/models/audit-info.model'; +import { Job } from 'app/models/job.model'; +import { Submission } from 'app/models/submission/submission.model'; +import { DataSharingType, Survey } from 'app/models/survey.model'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SubmissionService } from 'app/services/submission/submission.service'; -import {SubmissionPanelComponent} from './submission-panel.component'; +import { SubmissionPanelComponent } from './submission-panel.component'; describe('SubmissionPanelComponent', () => { let component: SubmissionPanelComponent; @@ -43,7 +44,7 @@ describe('SubmissionPanelComponent', () => { Map(), Map(), 'owner1', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ); const mockUser = { @@ -58,7 +59,7 @@ describe('SubmissionPanelComponent', () => { const mockSubmission = new Submission( 'sub1', 'loi1', - {id: 'job1'} as any, + { id: 'job1' } as Job, mockAuditInfo, mockAuditInfo, Map() @@ -84,9 +85,9 @@ describe('SubmissionPanelComponent', () => { declarations: [SubmissionPanelComponent], imports: [MatProgressSpinnerModule], providers: [ - {provide: SubmissionService, useValue: submissionServiceSpy}, - {provide: NavigationService, useValue: navigationServiceSpy}, - {provide: AngularFireStorage, useValue: storageSpy}, + { provide: SubmissionService, useValue: submissionServiceSpy }, + { provide: NavigationService, useValue: navigationServiceSpy }, + { provide: AngularFireStorage, useValue: storageSpy }, ], schemas: [NO_ERRORS_SCHEMA], }).compileComponents(); diff --git a/web/src/app/components/main-page-container/main-page/secondary-side-panel/submission-panel/submission-panel.component.ts b/web/src/app/components/main-page-container/main-page/secondary-side-panel/submission-panel/submission-panel.component.ts index c0f3af01d..2020a1853 100644 --- a/web/src/app/components/main-page-container/main-page/secondary-side-panel/submission-panel/submission-panel.component.ts +++ b/web/src/app/components/main-page-container/main-page/secondary-side-panel/submission-panel/submission-panel.component.ts @@ -14,20 +14,20 @@ * limitations under the License. */ -import {Component, Input, OnDestroy, OnInit, input} from '@angular/core'; -import {AngularFireStorage} from '@angular/fire/compat/storage'; -import {List} from 'immutable'; -import {Subscription, firstValueFrom} from 'rxjs'; - -import {Point} from 'app/models/geometry/point'; -import {MultipleSelection} from 'app/models/submission/multiple-selection'; -import {Result} from 'app/models/submission/result.model'; -import {Submission} from 'app/models/submission/submission.model'; -import {Survey} from 'app/models/survey.model'; -import {Option} from 'app/models/task/option.model'; -import {Task, TaskType} from 'app/models/task/task.model'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SubmissionService} from 'app/services/submission/submission.service'; +import { Component, Input, OnDestroy, OnInit, input } from '@angular/core'; +import { AngularFireStorage } from '@angular/fire/compat/storage'; +import { List } from 'immutable'; +import { Subscription, firstValueFrom } from 'rxjs'; + +import { Point } from 'app/models/geometry/point'; +import { MultipleSelection } from 'app/models/submission/multiple-selection'; +import { Result } from 'app/models/submission/result.model'; +import { Submission } from 'app/models/submission/submission.model'; +import { Survey } from 'app/models/survey.model'; +import { Option } from 'app/models/task/option.model'; +import { Task, TaskType } from 'app/models/task/task.model'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SubmissionService } from 'app/services/submission/submission.service'; @Component({ selector: 'submission-panel', @@ -119,12 +119,14 @@ export class SubmissionPanelComponent implements OnInit, OnDestroy { ); } - getTaskSubmissionResult({id: taskId}: Task): Result | undefined { + getTaskSubmissionResult({ id: taskId }: Task): Result | undefined { return this.submission?.data.get(taskId); } getMultipleChoiceOption(task: Task, optionId: string) { - return task.multipleChoice?.options.find(({id}: Option) => id === optionId); + return task.multipleChoice?.options.find( + ({ id }: Option) => id === optionId + ); } getTaskMultipleChoiceSelections(task: Task): MultipleSelection { @@ -147,9 +149,9 @@ export class SubmissionPanelComponent implements OnInit, OnDestroy { getCaptureLocationCoord(task: Task): string { // x represents longitude, y represents latitude - const {coord, accuracy, altitude} = this.getTaskSubmissionResult(task)! + const { coord, accuracy, altitude } = this.getTaskSubmissionResult(task)! .value as Point; - const {x, y} = coord; + const { x, y } = coord; const lng = Math.abs(x).toString() + (x > 0 ? '° E' : '° W'); const lat = Math.abs(y).toString() + (y > 0 ? '° N' : '° S'); const result = [`${lat}, ${lng}`]; @@ -167,7 +169,7 @@ export class SubmissionPanelComponent implements OnInit, OnDestroy { getTime(task: Task): string { return ( this.getTaskSubmissionResult(task)?.value as Date - ).toLocaleTimeString([], {hour: 'numeric', minute: 'numeric'}); + ).toLocaleTimeString([], { hour: 'numeric', minute: 'numeric' }); } selectGeometry(task: Task): void { diff --git a/web/src/app/components/main-page-container/main-page/secondary-side-panel/submission-panel/submission-panel.module.ts b/web/src/app/components/main-page-container/main-page/secondary-side-panel/submission-panel/submission-panel.module.ts index 481405462..ce6c3d73a 100644 --- a/web/src/app/components/main-page-container/main-page/secondary-side-panel/submission-panel/submission-panel.module.ts +++ b/web/src/app/components/main-page-container/main-page/secondary-side-panel/submission-panel/submission-panel.module.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {MatCardModule} from '@angular/material/card'; -import {MatCheckboxModule} from '@angular/material/checkbox'; -import {MatIconModule} from '@angular/material/icon'; -import {MatListModule} from '@angular/material/list'; -import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; -import {BrowserModule} from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { BrowserModule } from '@angular/platform-browser'; -import {SubmissionPanelComponent} from './submission-panel.component'; +import { SubmissionPanelComponent } from './submission-panel.component'; @NgModule({ imports: [ diff --git a/web/src/app/components/main-page-container/main-page/side-panel/job-list/job-list.component.spec.ts b/web/src/app/components/main-page-container/main-page/side-panel/job-list/job-list.component.spec.ts index 5464d6431..1e916fd46 100644 --- a/web/src/app/components/main-page-container/main-page/side-panel/job-list/job-list.component.spec.ts +++ b/web/src/app/components/main-page-container/main-page/side-panel/job-list/job-list.component.spec.ts @@ -14,22 +14,22 @@ * limitations under the License. */ -import {NO_ERRORS_SCHEMA} from '@angular/core'; -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import {AngularFireAuth} from '@angular/fire/compat/auth'; -import {AngularFirestore} from '@angular/fire/compat/firestore'; -import {MatListModule} from '@angular/material/list'; -import {Router} from '@angular/router'; -import {Map} from 'immutable'; -import {of} from 'rxjs'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { AngularFireAuth } from '@angular/fire/compat/auth'; +import { AngularFirestore } from '@angular/fire/compat/firestore'; +import { MatListModule } from '@angular/material/list'; +import { Router } from '@angular/router'; +import { Map } from 'immutable'; +import { of } from 'rxjs'; -import {Job} from 'app/models/job.model'; -import {DataSharingType, Survey} from 'app/models/survey.model'; -import {DataStoreService} from 'app/services/data-store/data-store.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SurveyService} from 'app/services/survey/survey.service'; +import { Job } from 'app/models/job.model'; +import { DataSharingType, Survey } from 'app/models/survey.model'; +import { DataStoreService } from 'app/services/data-store/data-store.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SurveyService } from 'app/services/survey/survey.service'; -import {JobListComponent} from './job-list.component'; +import { JobListComponent } from './job-list.component'; const mockSurvey = new Survey( 'survey001', @@ -46,7 +46,7 @@ const mockSurvey = new Survey( }), /* acl= */ Map(), /* ownerId= */ '', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ); const authState = { @@ -78,13 +78,13 @@ describe('JobListComponent', () => { provide: Router, useValue: routerSpy, }, - {provide: NavigationService, useValue: navigationService}, - {provide: AngularFirestore, useValue: {}}, + { provide: NavigationService, useValue: navigationService }, + { provide: AngularFirestore, useValue: {} }, { provide: AngularFireAuth, useValue: mockAngularFireAuth, }, - {provide: DataStoreService, useValue: {user$: () => of()}}, + { provide: DataStoreService, useValue: { user$: () => of() } }, ], schemas: [NO_ERRORS_SCHEMA], }).compileComponents(); diff --git a/web/src/app/components/main-page-container/main-page/side-panel/job-list/job-list.component.ts b/web/src/app/components/main-page-container/main-page/side-panel/job-list/job-list.component.ts index c165cfd55..6c7407ef4 100644 --- a/web/src/app/components/main-page-container/main-page/side-panel/job-list/job-list.component.ts +++ b/web/src/app/components/main-page-container/main-page/side-panel/job-list/job-list.component.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import {Component, computed, input} from '@angular/core'; -import {List} from 'immutable'; +import { Component, computed, input } from '@angular/core'; +import { List } from 'immutable'; -import {Job} from 'app/models/job.model'; -import {Survey} from 'app/models/survey.model'; -import {NavigationService} from 'app/services/navigation/navigation.service'; +import { Job } from 'app/models/job.model'; +import { Survey } from 'app/models/survey.model'; +import { NavigationService } from 'app/services/navigation/navigation.service'; @Component({ selector: 'ground-job-list', diff --git a/web/src/app/components/main-page-container/main-page/side-panel/job-list/job-list.module.ts b/web/src/app/components/main-page-container/main-page/side-panel/job-list/job-list.module.ts index 11346a7b4..b05c5d738 100644 --- a/web/src/app/components/main-page-container/main-page/side-panel/job-list/job-list.module.ts +++ b/web/src/app/components/main-page-container/main-page/side-panel/job-list/job-list.module.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {MatListModule} from '@angular/material/list'; -import {BrowserModule} from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatListModule } from '@angular/material/list'; +import { BrowserModule } from '@angular/platform-browser'; -import {JobListItemModule} from 'app/components/shared/job-list-item/job-list-item.module'; -import {GroundIconModule} from 'app/modules/ground-icon.module'; +import { JobListItemModule } from 'app/components/shared/job-list-item/job-list-item.module'; +import { GroundIconModule } from 'app/modules/ground-icon.module'; -import {JobListComponent} from './job-list.component'; +import { JobListComponent } from './job-list.component'; @NgModule({ imports: [ diff --git a/web/src/app/components/main-page-container/main-page/side-panel/side-panel.component.ts b/web/src/app/components/main-page-container/main-page/side-panel/side-panel.component.ts index 44943b021..ac99db823 100644 --- a/web/src/app/components/main-page-container/main-page/side-panel/side-panel.component.ts +++ b/web/src/app/components/main-page-container/main-page/side-panel/side-panel.component.ts @@ -14,14 +14,12 @@ * limitations under the License. */ -import {Component, input} from '@angular/core'; -import {Observable} from 'rxjs'; +import { Component, input } from '@angular/core'; +import { Observable } from 'rxjs'; -import {Survey} from 'app/models/survey.model'; -import { - NavigationService, - SideNavMode, -} from 'app/services/navigation/navigation.service'; +import { Survey } from 'app/models/survey.model'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SideNavMode } from 'app/services/navigation/url-params'; @Component({ selector: 'ground-side-panel', diff --git a/web/src/app/components/main-page-container/main-page/side-panel/side-panel.module.ts b/web/src/app/components/main-page-container/main-page/side-panel/side-panel.module.ts index 595d7271a..0ede2244d 100644 --- a/web/src/app/components/main-page-container/main-page/side-panel/side-panel.module.ts +++ b/web/src/app/components/main-page-container/main-page/side-panel/side-panel.module.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {MatCardModule} from '@angular/material/card'; -import {MatDividerModule} from '@angular/material/divider'; -import {MatIconModule} from '@angular/material/icon'; -import {BrowserModule} from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { BrowserModule } from '@angular/platform-browser'; -import {JobListModule} from './job-list/job-list.module'; -import {SidePanelComponent} from './side-panel.component'; -import {SubmissionFormModule} from './submission-form/submission-form.module'; +import { JobListModule } from './job-list/job-list.module'; +import { SidePanelComponent } from './side-panel.component'; +import { SubmissionFormModule } from './submission-form/submission-form.module'; @NgModule({ imports: [ diff --git a/web/src/app/components/main-page-container/main-page/side-panel/submission-form/submission-form.component.spec.ts b/web/src/app/components/main-page-container/main-page/side-panel/submission-form/submission-form.component.spec.ts index 07603fb9d..3e7c3e2d5 100644 --- a/web/src/app/components/main-page-container/main-page/side-panel/submission-form/submission-form.component.spec.ts +++ b/web/src/app/components/main-page-container/main-page/side-panel/submission-form/submission-form.component.spec.ts @@ -14,47 +14,47 @@ * limitations under the License. */ -import {NO_ERRORS_SCHEMA, signal} from '@angular/core'; -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import {FormsModule, ReactiveFormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatCheckboxModule} from '@angular/material/checkbox'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatIconModule} from '@angular/material/icon'; -import {MatInputModule} from '@angular/material/input'; -import {MatListModule} from '@angular/material/list'; -import {MatRadioModule} from '@angular/material/radio'; -import {By} from '@angular/platform-browser'; -import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; -import {Router} from '@angular/router'; -import {List, Map} from 'immutable'; -import {NEVER, of} from 'rxjs'; - -import {JobListItemModule} from 'app/components/shared/job-list-item/job-list-item.module'; -import {AuditInfo} from 'app/models/audit-info.model'; -import {Coordinate} from 'app/models/geometry/coordinate'; -import {Point} from 'app/models/geometry/point'; -import {Job} from 'app/models/job.model'; -import {LocationOfInterest} from 'app/models/loi.model'; -import {MultipleSelection} from 'app/models/submission/multiple-selection'; -import {Result} from 'app/models/submission/result.model'; -import {Submission} from 'app/models/submission/submission.model'; -import {DataSharingType, Survey} from 'app/models/survey.model'; +import { NO_ERRORS_SCHEMA, signal } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatRadioModule } from '@angular/material/radio'; +import { By } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { Router } from '@angular/router'; +import { List, Map } from 'immutable'; +import { NEVER, of } from 'rxjs'; + +import { JobListItemModule } from 'app/components/shared/job-list-item/job-list-item.module'; +import { AuditInfo } from 'app/models/audit-info.model'; +import { Coordinate } from 'app/models/geometry/coordinate'; +import { Point } from 'app/models/geometry/point'; +import { Job } from 'app/models/job.model'; +import { LocationOfInterest } from 'app/models/loi.model'; +import { MultipleSelection } from 'app/models/submission/multiple-selection'; +import { Result } from 'app/models/submission/result.model'; +import { Submission } from 'app/models/submission/submission.model'; +import { DataSharingType, Survey } from 'app/models/survey.model'; import { Cardinality, MultipleChoice, } from 'app/models/task/multiple-choice.model'; -import {Option} from 'app/models/task/option.model'; -import {Task, TaskType} from 'app/models/task/task.model'; -import {AuthService} from 'app/services/auth/auth.service'; -import {DataStoreService} from 'app/services/data-store/data-store.service'; -import {LocationOfInterestService} from 'app/services/loi/loi.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {UrlParams} from 'app/services/navigation/url-params'; -import {SubmissionService} from 'app/services/submission/submission.service'; -import {SurveyService} from 'app/services/survey/survey.service'; - -import {SubmissionFormComponent} from './submission-form.component'; +import { Option } from 'app/models/task/option.model'; +import { Task, TaskType } from 'app/models/task/task.model'; +import { AuthService } from 'app/services/auth/auth.service'; +import { DataStoreService } from 'app/services/data-store/data-store.service'; +import { LocationOfInterestService } from 'app/services/loi/loi.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { UrlParams } from 'app/services/navigation/url-params'; +import { SubmissionService } from 'app/services/submission/submission.service'; +import { SurveyService } from 'app/services/survey/survey.service'; + +import { SubmissionFormComponent } from './submission-form.component'; class MockModel { static task001: Task = new Task( @@ -105,10 +105,10 @@ class MockModel { 'survey001', 'title', 'description', - Map({job001: MockModel.job001}), + Map({ job001: MockModel.job001 }), /*acl=*/ Map({}), /* ownerId= */ '', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ); static loi001 = new LocationOfInterest( @@ -195,16 +195,16 @@ describe('SubmissionFormComponent', () => { JobListItemModule, ], providers: [ - {provide: DataStoreService, useValue: {}}, + { provide: DataStoreService, useValue: {} }, { provide: LocationOfInterestService, useValue: loiService, }, - {provide: SurveyService, useValue: surveyService}, - {provide: SubmissionService, useValue: submissionService}, - {provide: Router, useValue: routerSpy}, - {provide: NavigationService, useValue: navigationService}, - {provide: AuthService, useValue: {getUser$: () => NEVER}}, + { provide: SurveyService, useValue: surveyService }, + { provide: SubmissionService, useValue: submissionService }, + { provide: Router, useValue: routerSpy }, + { provide: NavigationService, useValue: navigationService }, + { provide: AuthService, useValue: { getUser$: () => NEVER } }, ], schemas: [NO_ERRORS_SCHEMA], }).compileComponents(); diff --git a/web/src/app/components/main-page-container/main-page/side-panel/submission-form/submission-form.component.ts b/web/src/app/components/main-page-container/main-page/side-panel/submission-form/submission-form.component.ts index 51ba7c254..f51c55800 100644 --- a/web/src/app/components/main-page-container/main-page/side-panel/submission-form/submission-form.component.ts +++ b/web/src/app/components/main-page-container/main-page/side-panel/submission-form/submission-form.component.ts @@ -14,32 +14,37 @@ * limitations under the License. */ -import {Component} from '@angular/core'; -import {FormBuilder, FormControl, FormGroup, Validators} from '@angular/forms'; -import {List, Map} from 'immutable'; -import {Observable} from 'rxjs'; -import {first, map, switchMap} from 'rxjs/operators'; +import { Component } from '@angular/core'; +import { + FormBuilder, + FormControl, + FormGroup, + Validators, +} from '@angular/forms'; +import { List, Map } from 'immutable'; +import { Observable } from 'rxjs'; +import { first, map, switchMap } from 'rxjs/operators'; -import {JobListItemActionsType} from 'app/components/shared/job-list-item/job-list-item.component'; -import {AuditInfo} from 'app/models/audit-info.model'; -import {Job} from 'app/models/job.model'; -import {MultipleSelection} from 'app/models/submission/multiple-selection'; -import {Result} from 'app/models/submission/result.model'; +import { JobListItemActionsType } from 'app/components/shared/job-list-item/job-list-item.component'; +import { AuditInfo } from 'app/models/audit-info.model'; +import { Job } from 'app/models/job.model'; +import { MultipleSelection } from 'app/models/submission/multiple-selection'; +import { Result } from 'app/models/submission/result.model'; import { Submission, SubmissionData, } from 'app/models/submission/submission.model'; -import {Survey} from 'app/models/survey.model'; -import {Cardinality} from 'app/models/task/multiple-choice.model'; -import {Option} from 'app/models/task/option.model'; -import {Task, TaskType} from 'app/models/task/task.model'; -import {AuthService} from 'app/services/auth/auth.service'; -import {DataStoreService} from 'app/services/data-store/data-store.service'; -import {LoadingState} from 'app/services/loading-state.model'; -import {LocationOfInterestService} from 'app/services/loi/loi.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SubmissionService} from 'app/services/submission/submission.service'; -import {SurveyService} from 'app/services/survey/survey.service'; +import { Survey } from 'app/models/survey.model'; +import { Cardinality } from 'app/models/task/multiple-choice.model'; +import { Option } from 'app/models/task/option.model'; +import { Task, TaskType } from 'app/models/task/task.model'; +import { AuthService } from 'app/services/auth/auth.service'; +import { DataStoreService } from 'app/services/data-store/data-store.service'; +import { LoadingState } from 'app/services/loading-state.model'; +import { LocationOfInterestService } from 'app/services/loi/loi.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SubmissionService } from 'app/services/submission/submission.service'; +import { SurveyService } from 'app/services/survey/survey.service'; // To make ESLint happy: /*global alert*/ @@ -155,7 +160,7 @@ export class SubmissionFormComponent { } private convertSubmissionToFormGroup(submission: Submission): FormGroup { - const group: {[taskId: string]: FormControl} = {}; + const group: { [taskId: string]: FormControl } = {}; for (const [taskId, task] of submission.job!.tasks!) { const result = submission!.data?.get(taskId); switch (task.type) { @@ -199,7 +204,7 @@ export class SubmissionFormComponent { } private addControlsForTextTask( - group: {[taskId: string]: FormControl}, + group: { [taskId: string]: FormControl }, task: Task, result?: Result ): void { @@ -210,7 +215,7 @@ export class SubmissionFormComponent { } private addControlsForNumberTask( - group: {[taskId: string]: FormControl}, + group: { [taskId: string]: FormControl }, task: Task, result?: Result ): void { @@ -229,7 +234,7 @@ export class SubmissionFormComponent { } private addControlsForMultipleChoiceTask( - group: {[taskId: string]: FormControl}, + group: { [taskId: string]: FormControl }, task: Task, result?: Result ): void { @@ -263,7 +268,7 @@ export class SubmissionFormComponent { } private addControlsForSelectOneTask( - group: {[taskId: string]: FormControl}, + group: { [taskId: string]: FormControl }, task: Task, result?: Result ): void { @@ -283,11 +288,11 @@ export class SubmissionFormComponent { } private addControlsForSelectMultipleTask( - group: {[taskId: string]: FormControl}, + group: { [taskId: string]: FormControl }, task: Task, result?: Result ): void { - const {values: selectedOptions} = result?.value as MultipleSelection; + const { values: selectedOptions } = result?.value as MultipleSelection; for (const option of task.multipleChoice!.options) { group[option.id] = new FormControl(selectedOptions?.contains(option.id)); } diff --git a/web/src/app/components/main-page-container/main-page/side-panel/submission-form/submission-form.module.ts b/web/src/app/components/main-page-container/main-page/side-panel/submission-form/submission-form.module.ts index 9b7b7952b..bfaccf2bf 100644 --- a/web/src/app/components/main-page-container/main-page/side-panel/submission-form/submission-form.module.ts +++ b/web/src/app/components/main-page-container/main-page/side-panel/submission-form/submission-form.module.ts @@ -14,20 +14,20 @@ * limitations under the License. */ -import {NgModule} from '@angular/core'; -import {ReactiveFormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatCheckboxModule} from '@angular/material/checkbox'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatIconModule} from '@angular/material/icon'; -import {MatInputModule} from '@angular/material/input'; -import {MatListModule} from '@angular/material/list'; -import {MatRadioModule} from '@angular/material/radio'; -import {BrowserModule} from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatRadioModule } from '@angular/material/radio'; +import { BrowserModule } from '@angular/platform-browser'; -import {JobListItemModule} from 'app/components/shared/job-list-item/job-list-item.module'; +import { JobListItemModule } from 'app/components/shared/job-list-item/job-list-item.module'; -import {SubmissionFormComponent} from './submission-form.component'; +import { SubmissionFormComponent } from './submission-form.component'; @NgModule({ imports: [ diff --git a/web/src/app/components/main-page-container/main-page/survey-header/survey-header.component.spec.ts b/web/src/app/components/main-page-container/main-page/survey-header/survey-header.component.spec.ts index 83c52a6ac..9e5628f55 100644 --- a/web/src/app/components/main-page-container/main-page/survey-header/survey-header.component.spec.ts +++ b/web/src/app/components/main-page-container/main-page/survey-header/survey-header.component.spec.ts @@ -14,17 +14,17 @@ * limitations under the License. */ -import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatIconModule} from '@angular/material/icon'; -import {Router} from '@angular/router'; -import {NEVER, of} from 'rxjs'; +import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatIconModule } from '@angular/material/icon'; +import { Router } from '@angular/router'; +import { NEVER, of } from 'rxjs'; -import {DataStoreService} from 'app/services/data-store/data-store.service'; -import {SurveyService} from 'app/services/survey/survey.service'; +import { DataStoreService } from 'app/services/data-store/data-store.service'; +import { SurveyService } from 'app/services/survey/survey.service'; -import {SurveyHeaderComponent} from './survey-header.component'; +import { SurveyHeaderComponent } from './survey-header.component'; describe('SurveyHeaderComponent', () => { let component: SurveyHeaderComponent; @@ -37,7 +37,7 @@ describe('SurveyHeaderComponent', () => { providers: [ { provide: DataStoreService, - useValue: {getAccessDeniedMessage: () => ''}, + useValue: { getAccessDeniedMessage: () => '' }, }, { provide: SurveyService, diff --git a/web/src/app/components/main-page-container/main-page/survey-header/survey-header.component.ts b/web/src/app/components/main-page-container/main-page/survey-header/survey-header.component.ts index 95c665670..1a9a9ca50 100644 --- a/web/src/app/components/main-page-container/main-page/survey-header/survey-header.component.ts +++ b/web/src/app/components/main-page-container/main-page/survey-header/survey-header.component.ts @@ -14,14 +14,14 @@ * limitations under the License. */ -import {Component, input} from '@angular/core'; -import {MatDialog} from '@angular/material/dialog'; -import {Subscription} from 'rxjs'; +import { Component, input } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { Subscription } from 'rxjs'; -import {ShareDialogComponent} from 'app/components/shared/share-dialog/share-dialog.component'; -import {Survey} from 'app/models/survey.model'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SurveyService} from 'app/services/survey/survey.service'; +import { ShareDialogComponent } from 'app/components/shared/share-dialog/share-dialog.component'; +import { Survey } from 'app/models/survey.model'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SurveyService } from 'app/services/survey/survey.service'; @Component({ selector: 'ground-survey-header', diff --git a/web/src/app/components/main-page-container/main-page/survey-header/survey-header.module.ts b/web/src/app/components/main-page-container/main-page/survey-header/survey-header.module.ts index 450d304e5..fea88079b 100644 --- a/web/src/app/components/main-page-container/main-page/survey-header/survey-header.module.ts +++ b/web/src/app/components/main-page-container/main-page/survey-header/survey-header.module.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatIconModule} from '@angular/material/icon'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatIconModule } from '@angular/material/icon'; -import {HeaderModule} from 'app/components/shared/header/header.module'; -import {ShareDialogModule} from 'app/components/shared/share-dialog/share-dialog.module'; +import { HeaderModule } from 'app/components/shared/header/header.module'; +import { ShareDialogModule } from 'app/components/shared/share-dialog/share-dialog.module'; -import {SurveyHeaderComponent} from './survey-header.component'; +import { SurveyHeaderComponent } from './survey-header.component'; @NgModule({ declarations: [SurveyHeaderComponent], diff --git a/web/src/app/components/main-page-container/main-page/title-dialog/title-dialog.component.spec.ts b/web/src/app/components/main-page-container/main-page/title-dialog/title-dialog.component.spec.ts index f63ee52ed..cf4ddb537 100644 --- a/web/src/app/components/main-page-container/main-page/title-dialog/title-dialog.component.spec.ts +++ b/web/src/app/components/main-page-container/main-page/title-dialog/title-dialog.component.spec.ts @@ -14,14 +14,14 @@ * limitations under the License. */ -import {NO_ERRORS_SCHEMA} from '@angular/core'; -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import {MatDialogModule, MatDialogRef} from '@angular/material/dialog'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatDialogModule, MatDialogRef } from '@angular/material/dialog'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SurveyService} from 'app/services/survey/survey.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SurveyService } from 'app/services/survey/survey.service'; -import {TitleDialogComponent} from './title-dialog.component'; +import { TitleDialogComponent } from './title-dialog.component'; describe('TitleDialogComponent', () => { let component: TitleDialogComponent; @@ -37,9 +37,9 @@ describe('TitleDialogComponent', () => { declarations: [TitleDialogComponent], imports: [MatDialogModule], providers: [ - {provide: MatDialogRef, useValue: dialogRef}, - {provide: SurveyService, useValue: surveyService}, - {provide: NavigationService, useValue: navigationService}, + { provide: MatDialogRef, useValue: dialogRef }, + { provide: SurveyService, useValue: surveyService }, + { provide: NavigationService, useValue: navigationService }, ], schemas: [NO_ERRORS_SCHEMA], }).compileComponents(); diff --git a/web/src/app/components/main-page-container/main-page/title-dialog/title-dialog.component.ts b/web/src/app/components/main-page-container/main-page/title-dialog/title-dialog.component.ts index 21f13299f..690803e76 100644 --- a/web/src/app/components/main-page-container/main-page/title-dialog/title-dialog.component.ts +++ b/web/src/app/components/main-page-container/main-page/title-dialog/title-dialog.component.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import {Component} from '@angular/core'; -import {FormControl, FormGroup} from '@angular/forms'; -import {MatDialogRef} from '@angular/material/dialog'; +import { Component } from '@angular/core'; +import { FormControl, FormGroup } from '@angular/forms'; +import { MatDialogRef } from '@angular/material/dialog'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SurveyService} from 'app/services/survey/survey.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SurveyService } from 'app/services/survey/survey.service'; @Component({ selector: 'ground-title-dialog', @@ -34,7 +34,7 @@ export class TitleDialogComponent { private navigationService: NavigationService, private surveyService: SurveyService ) { - this.surveyTitleForm = new FormGroup({title: new FormControl()}); + this.surveyTitleForm = new FormGroup({ title: new FormControl() }); } async onCreateSurvey() { diff --git a/web/src/app/components/main-page-container/main-page/title-dialog/title-dialog.module.ts b/web/src/app/components/main-page-container/main-page/title-dialog/title-dialog.module.ts index 4107858ea..580c98d87 100644 --- a/web/src/app/components/main-page-container/main-page/title-dialog/title-dialog.module.ts +++ b/web/src/app/components/main-page-container/main-page/title-dialog/title-dialog.module.ts @@ -14,14 +14,14 @@ * limitations under the License. */ -import {NgModule} from '@angular/core'; -import {FormsModule, ReactiveFormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatInputModule} from '@angular/material/input'; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; -import {TitleDialogComponent} from './title-dialog.component'; +import { TitleDialogComponent } from './title-dialog.component'; @NgModule({ declarations: [TitleDialogComponent], diff --git a/web/src/app/components/shared/copy-survey-controls/copy-survey-controls.component.spec.ts b/web/src/app/components/shared/copy-survey-controls/copy-survey-controls.component.spec.ts index ca72eeb6b..d0722a9e3 100644 --- a/web/src/app/components/shared/copy-survey-controls/copy-survey-controls.component.spec.ts +++ b/web/src/app/components/shared/copy-survey-controls/copy-survey-controls.component.spec.ts @@ -20,13 +20,13 @@ import { fakeAsync, tick, } from '@angular/core/testing'; -import {MatButtonModule} from '@angular/material/button'; -import {MatIconModule} from '@angular/material/icon'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {NotificationService} from 'app/services/notification/notification.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { NotificationService } from 'app/services/notification/notification.service'; -import {CopySurveyControlsComponent} from './copy-survey-controls.component'; +import { CopySurveyControlsComponent } from './copy-survey-controls.component'; describe('ShareButtonsComponent', () => { let component: CopySurveyControlsComponent; @@ -49,8 +49,8 @@ describe('ShareButtonsComponent', () => { declarations: [CopySurveyControlsComponent], imports: [MatIconModule, MatButtonModule], providers: [ - {provide: NavigationService, useValue: navigationService}, - {provide: NotificationService, useValue: notificationService}, + { provide: NavigationService, useValue: navigationService }, + { provide: NotificationService, useValue: notificationService }, ], }).compileComponents(); diff --git a/web/src/app/components/shared/copy-survey-controls/copy-survey-controls.component.ts b/web/src/app/components/shared/copy-survey-controls/copy-survey-controls.component.ts index a847ea41f..4dda2bfd5 100644 --- a/web/src/app/components/shared/copy-survey-controls/copy-survey-controls.component.ts +++ b/web/src/app/components/shared/copy-survey-controls/copy-survey-controls.component.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import {Component, ElementRef, Input, OnInit, ViewChild} from '@angular/core'; +import { Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {NotificationService} from 'app/services/notification/notification.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { NotificationService } from 'app/services/notification/notification.service'; /** * Implements the controls for copying the survey link and QR code @@ -33,7 +33,7 @@ import {NotificationService} from 'app/services/notification/notification.servic export class CopySurveyControlsComponent implements OnInit { @Input() surveyId = ''; - @ViewChild('qrCodeElement', {read: ElementRef}) + @ViewChild('qrCodeElement', { read: ElementRef }) qrCodeElement!: ElementRef; surveyAppLink = ''; @@ -74,7 +74,7 @@ export class CopySurveyControlsComponent implements OnInit { return; } - const data = [new ClipboardItem({[blob.type]: blob})]; + const data = [new ClipboardItem({ [blob.type]: blob })]; navigator.clipboard.write(data).then( () => { this.notificationService.success( diff --git a/web/src/app/components/shared/copy-survey-controls/copy-survey-controls.module.ts b/web/src/app/components/shared/copy-survey-controls/copy-survey-controls.module.ts index 4b1d071ca..28ba583b6 100644 --- a/web/src/app/components/shared/copy-survey-controls/copy-survey-controls.module.ts +++ b/web/src/app/components/shared/copy-survey-controls/copy-survey-controls.module.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {MatIconModule} from '@angular/material/icon'; -import {QRCodeModule} from 'angularx-qrcode'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { QRCodeModule } from 'angularx-qrcode'; -import {CopySurveyControlsComponent} from './copy-survey-controls.component'; +import { CopySurveyControlsComponent } from './copy-survey-controls.component'; @NgModule({ declarations: [CopySurveyControlsComponent], diff --git a/web/src/app/components/shared/data-visibility-control/data-visibility-control.component.ts b/web/src/app/components/shared/data-visibility-control/data-visibility-control.component.ts index 5cd9017ff..54a07b865 100644 --- a/web/src/app/components/shared/data-visibility-control/data-visibility-control.component.ts +++ b/web/src/app/components/shared/data-visibility-control/data-visibility-control.component.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import {Component} from '@angular/core'; -import {MatSlideToggleChange} from '@angular/material/slide-toggle'; -import {Subscription} from 'rxjs'; +import { Component } from '@angular/core'; +import { MatSlideToggleChange } from '@angular/material/slide-toggle'; +import { Subscription } from 'rxjs'; -import {Survey, SurveyDataVisibility} from 'app/models/survey.model'; -import {AuthService} from 'app/services/auth/auth.service'; -import {DraftSurveyService} from 'app/services/draft-survey/draft-survey.service'; +import { Survey, SurveyDataVisibility } from 'app/models/survey.model'; +import { AuthService } from 'app/services/auth/auth.service'; +import { DraftSurveyService } from 'app/services/draft-survey/draft-survey.service'; @Component({ selector: 'ground-data-visibility-control', diff --git a/web/src/app/components/shared/data-visibility-control/data-visibility-control.module.ts b/web/src/app/components/shared/data-visibility-control/data-visibility-control.module.ts index e853a7144..6e1531dce 100644 --- a/web/src/app/components/shared/data-visibility-control/data-visibility-control.module.ts +++ b/web/src/app/components/shared/data-visibility-control/data-visibility-control.module.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {MatSlideToggleModule} from '@angular/material/slide-toggle'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; -import {DataVisibilityControlComponent} from './data-visibility-control.component'; +import { DataVisibilityControlComponent } from './data-visibility-control.component'; @NgModule({ declarations: [DataVisibilityControlComponent], diff --git a/web/src/app/components/shared/general-access-control/general-access-control.component.ts b/web/src/app/components/shared/general-access-control/general-access-control.component.ts index 22e8ccaeb..a0ff86a35 100644 --- a/web/src/app/components/shared/general-access-control/general-access-control.component.ts +++ b/web/src/app/components/shared/general-access-control/general-access-control.component.ts @@ -16,17 +16,17 @@ import '@angular/localize/init'; -import {Component} from '@angular/core'; -import {Map} from 'immutable'; -import {Subscription} from 'rxjs'; +import { Component } from '@angular/core'; +import { Map } from 'immutable'; +import { Subscription } from 'rxjs'; -import {Survey, SurveyGeneralAccess} from 'app/models/survey.model'; -import {AuthService} from 'app/services/auth/auth.service'; -import {DraftSurveyService} from 'app/services/draft-survey/draft-survey.service'; +import { Survey, SurveyGeneralAccess } from 'app/models/survey.model'; +import { AuthService } from 'app/services/auth/auth.service'; +import { DraftSurveyService } from 'app/services/draft-survey/draft-survey.service'; const generalAccessLabels = Map< SurveyGeneralAccess, - {description: string; icon: string; label: string} + { description: string; icon: string; label: string } >([ [ SurveyGeneralAccess.RESTRICTED, diff --git a/web/src/app/components/shared/general-access-control/general-access-control.module.ts b/web/src/app/components/shared/general-access-control/general-access-control.module.ts index 1165d007c..c46a25359 100644 --- a/web/src/app/components/shared/general-access-control/general-access-control.module.ts +++ b/web/src/app/components/shared/general-access-control/general-access-control.module.ts @@ -14,18 +14,18 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {FormsModule, ReactiveFormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatIconModule} from '@angular/material/icon'; -import {MatInputModule} from '@angular/material/input'; -import {MatListModule} from '@angular/material/list'; -import {MatSelectModule} from '@angular/material/select'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatSelectModule } from '@angular/material/select'; -import {GeneralAccessControlComponent} from './general-access-control.component'; +import { GeneralAccessControlComponent } from './general-access-control.component'; @NgModule({ declarations: [GeneralAccessControlComponent], diff --git a/web/src/app/components/shared/header/current-user-widget/account-popup/account-popup.component.spec.ts b/web/src/app/components/shared/header/current-user-widget/account-popup/account-popup.component.spec.ts index 80a9fab85..e7f893d0f 100644 --- a/web/src/app/components/shared/header/current-user-widget/account-popup/account-popup.component.spec.ts +++ b/web/src/app/components/shared/header/current-user-widget/account-popup/account-popup.component.spec.ts @@ -14,17 +14,17 @@ * limitations under the License. */ -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef, } from '@angular/material/dialog'; -import {Router} from '@angular/router'; -import {of} from 'rxjs'; +import { Router } from '@angular/router'; +import { of } from 'rxjs'; -import {AccountPopupComponent} from 'app/components/shared/header/current-user-widget/account-popup/account-popup.component'; -import {AuthService} from 'app/services/auth/auth.service'; +import { AccountPopupComponent } from 'app/components/shared/header/current-user-widget/account-popup/account-popup.component'; +import { AuthService } from 'app/services/auth/auth.service'; describe('AccountPopupComponent', () => { let component: AccountPopupComponent; @@ -37,10 +37,10 @@ describe('AccountPopupComponent', () => { declarations: [AccountPopupComponent], imports: [MatDialogModule], providers: [ - {provide: AuthService, useValue: {getUser$: () => of()}}, - {provide: MAT_DIALOG_DATA, useValue: {}}, - {provide: MatDialogRef, useValue: dialogRef}, - {provide: Router, useValue: routerSpy}, + { provide: AuthService, useValue: { getUser$: () => of() } }, + { provide: MAT_DIALOG_DATA, useValue: {} }, + { provide: MatDialogRef, useValue: dialogRef }, + { provide: Router, useValue: routerSpy }, ], }).compileComponents(); })); diff --git a/web/src/app/components/shared/header/current-user-widget/account-popup/account-popup.component.ts b/web/src/app/components/shared/header/current-user-widget/account-popup/account-popup.component.ts index b73be5711..3d218cb29 100644 --- a/web/src/app/components/shared/header/current-user-widget/account-popup/account-popup.component.ts +++ b/web/src/app/components/shared/header/current-user-widget/account-popup/account-popup.component.ts @@ -14,14 +14,14 @@ * limitations under the License. */ -import {Component, ElementRef, Inject, OnInit} from '@angular/core'; +import { Component, ElementRef, Inject, OnInit } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogConfig, MatDialogRef, } from '@angular/material/dialog'; -import {AuthService} from 'app/services/auth/auth.service'; +import { AuthService } from 'app/services/auth/auth.service'; @Component({ selector: 'ground-account-popup', @@ -35,7 +35,7 @@ export class AccountPopupComponent implements OnInit { constructor( matDialogRef: MatDialogRef, public auth: AuthService, - @Inject(MAT_DIALOG_DATA) data: {trigger: ElementRef} + @Inject(MAT_DIALOG_DATA) data: { trigger: ElementRef } ) { this.matDialogRef = matDialogRef; this.triggerElementRef = data.trigger; diff --git a/web/src/app/components/shared/header/current-user-widget/account-popup/account-popup.module.ts b/web/src/app/components/shared/header/current-user-widget/account-popup/account-popup.module.ts index 19d89bea1..e25a72380 100644 --- a/web/src/app/components/shared/header/current-user-widget/account-popup/account-popup.module.ts +++ b/web/src/app/components/shared/header/current-user-widget/account-popup/account-popup.module.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {MatDialogModule} from '@angular/material/dialog'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; -import {AccountPopupComponent} from 'app/components/shared/header/current-user-widget/account-popup/account-popup.component'; -import {UserAvatarModule} from 'app/components/shared/user-avatar/user-avatar.module'; +import { AccountPopupComponent } from 'app/components/shared/header/current-user-widget/account-popup/account-popup.component'; +import { UserAvatarModule } from 'app/components/shared/user-avatar/user-avatar.module'; @NgModule({ declarations: [AccountPopupComponent], diff --git a/web/src/app/components/shared/header/current-user-widget/current-user-widget.component.spec.ts b/web/src/app/components/shared/header/current-user-widget/current-user-widget.component.spec.ts index 5f3461b39..9bdc421d6 100644 --- a/web/src/app/components/shared/header/current-user-widget/current-user-widget.component.spec.ts +++ b/web/src/app/components/shared/header/current-user-widget/current-user-widget.component.spec.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatDialog} from '@angular/material/dialog'; -import {Subject} from 'rxjs'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatDialog } from '@angular/material/dialog'; +import { Subject } from 'rxjs'; -import {CurrentUserWidgetComponent} from 'app/components/shared/header/current-user-widget/current-user-widget.component'; -import {User} from 'app/models/user.model'; -import {AuthService} from 'app/services/auth/auth.service'; +import { CurrentUserWidgetComponent } from 'app/components/shared/header/current-user-widget/current-user-widget.component'; +import { User } from 'app/models/user.model'; +import { AuthService } from 'app/services/auth/auth.service'; describe('CurrentUserWidgetComponent', () => { let component: CurrentUserWidgetComponent; @@ -30,8 +30,8 @@ describe('CurrentUserWidgetComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ providers: [ - {provide: AuthService, useValue: {user$, getUser$: () => user$}}, - {provide: MatDialog, useValue: {}}, + { provide: AuthService, useValue: { user$, getUser$: () => user$ } }, + { provide: MatDialog, useValue: {} }, ], declarations: [CurrentUserWidgetComponent], }).compileComponents(); diff --git a/web/src/app/components/shared/header/current-user-widget/current-user-widget.component.ts b/web/src/app/components/shared/header/current-user-widget/current-user-widget.component.ts index 3cc54faec..b43305e56 100644 --- a/web/src/app/components/shared/header/current-user-widget/current-user-widget.component.ts +++ b/web/src/app/components/shared/header/current-user-widget/current-user-widget.component.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import {Component, ElementRef} from '@angular/core'; -import {MatDialog} from '@angular/material/dialog'; +import { Component, ElementRef } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; -import {AccountPopupComponent} from 'app/components/shared/header/current-user-widget/account-popup/account-popup.component'; -import {AuthService} from 'app/services/auth/auth.service'; +import { AccountPopupComponent } from 'app/components/shared/header/current-user-widget/account-popup/account-popup.component'; +import { AuthService } from 'app/services/auth/auth.service'; @Component({ selector: 'ground-current-user-widget', @@ -31,7 +31,7 @@ export class CurrentUserWidgetComponent { openProfileDialog(evt: MouseEvent): void { const target = new ElementRef(evt.currentTarget); this.dialog.open(AccountPopupComponent, { - data: {trigger: target}, + data: { trigger: target }, }); } } diff --git a/web/src/app/components/shared/header/current-user-widget/current-user-widget.module.ts b/web/src/app/components/shared/header/current-user-widget/current-user-widget.module.ts index 2c5d015ba..324e7e820 100644 --- a/web/src/app/components/shared/header/current-user-widget/current-user-widget.module.ts +++ b/web/src/app/components/shared/header/current-user-widget/current-user-widget.module.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; -import {CurrentUserWidgetComponent} from 'app/components/shared/header/current-user-widget/current-user-widget.component'; -import {UserAvatarModule} from 'app/components/shared/user-avatar/user-avatar.module'; +import { CurrentUserWidgetComponent } from 'app/components/shared/header/current-user-widget/current-user-widget.component'; +import { UserAvatarModule } from 'app/components/shared/user-avatar/user-avatar.module'; @NgModule({ declarations: [CurrentUserWidgetComponent], diff --git a/web/src/app/components/shared/header/header.component.spec.ts b/web/src/app/components/shared/header/header.component.spec.ts index 9701842cc..2e6752e53 100644 --- a/web/src/app/components/shared/header/header.component.spec.ts +++ b/web/src/app/components/shared/header/header.component.spec.ts @@ -14,19 +14,19 @@ * limitations under the License. */ -import {NO_ERRORS_SCHEMA} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatDialog} from '@angular/material/dialog'; -import {MatMenuModule} from '@angular/material/menu'; -import {Router} from '@angular/router'; -import {of} from 'rxjs'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatDialog } from '@angular/material/dialog'; +import { MatMenuModule } from '@angular/material/menu'; +import { Router } from '@angular/router'; +import { of } from 'rxjs'; -import {AuthService} from 'app/services/auth/auth.service'; -import {DataStoreService} from 'app/services/data-store/data-store.service'; -import {DraftSurveyService} from 'app/services/draft-survey/draft-survey.service'; -import {SurveyService} from 'app/services/survey/survey.service'; +import { AuthService } from 'app/services/auth/auth.service'; +import { DataStoreService } from 'app/services/data-store/data-store.service'; +import { DraftSurveyService } from 'app/services/draft-survey/draft-survey.service'; +import { SurveyService } from 'app/services/survey/survey.service'; -import {HeaderComponent} from './header.component'; +import { HeaderComponent } from './header.component'; describe('HeaderComponent', () => { let component: HeaderComponent; @@ -39,13 +39,13 @@ describe('HeaderComponent', () => { providers: [ { provide: DataStoreService, - useValue: {getAccessDeniedMessage: () => ''}, + useValue: { getAccessDeniedMessage: () => '' }, }, - {provide: MatDialog, useValue: {}}, - {provide: AuthService, useValue: {getUser$: () => of()}}, - {provide: DraftSurveyService, useValue: {}}, - {provide: Router, useValue: {events: of()}}, - {provide: SurveyService, useValue: {canManageSurvey: () => false}}, + { provide: MatDialog, useValue: {} }, + { provide: AuthService, useValue: { getUser$: () => of() } }, + { provide: DraftSurveyService, useValue: {} }, + { provide: Router, useValue: { events: of() } }, + { provide: SurveyService, useValue: { canManageSurvey: () => false } }, ], schemas: [NO_ERRORS_SCHEMA], }).compileComponents(); diff --git a/web/src/app/components/shared/header/header.component.ts b/web/src/app/components/shared/header/header.component.ts index 8e666f48c..25d11967c 100644 --- a/web/src/app/components/shared/header/header.component.ts +++ b/web/src/app/components/shared/header/header.component.ts @@ -14,18 +14,18 @@ * limitations under the License. */ -import {Component, OnInit} from '@angular/core'; -import {MatDialog} from '@angular/material/dialog'; +import { Component, OnInit } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; import { DialogData, DialogType, JobDialogComponent, } from 'app/components/edit-survey/job-dialog/job-dialog.component'; -import {AuthService} from 'app/services/auth/auth.service'; -import {DraftSurveyService} from 'app/services/draft-survey/draft-survey.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SurveyService} from 'app/services/survey/survey.service'; +import { AuthService } from 'app/services/auth/auth.service'; +import { DraftSurveyService } from 'app/services/draft-survey/draft-survey.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SurveyService } from 'app/services/survey/survey.service'; export enum HeaderState { DEFAULT = 1, @@ -55,7 +55,7 @@ export class HeaderComponent implements OnInit { async ngOnInit(): Promise { this.surveyService.getActiveSurvey$().subscribe(survey => { - const {id: surveyId} = survey; + const { id: surveyId } = survey; this.surveyId = surveyId; @@ -92,7 +92,7 @@ export class HeaderComponent implements OnInit { } const dialogRef = this.dialog.open(JobDialogComponent, { - data: {dialogType: DialogType.UndoJobs}, + data: { dialogType: DialogType.UndoJobs }, panelClass: 'small-width-dialog', }); @@ -112,7 +112,7 @@ export class HeaderComponent implements OnInit { } this.dialog.open(JobDialogComponent, { - data: {dialogType: DialogType.InvalidSurvey}, + data: { dialogType: DialogType.InvalidSurvey }, panelClass: 'small-width-dialog', }); } diff --git a/web/src/app/components/shared/header/header.module.ts b/web/src/app/components/shared/header/header.module.ts index 9d0a7dc17..c72e72005 100644 --- a/web/src/app/components/shared/header/header.module.ts +++ b/web/src/app/components/shared/header/header.module.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {MatIconModule} from '@angular/material/icon'; -import {MatMenuModule} from '@angular/material/menu'; -import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import {CurrentUserWidgetModule} from './current-user-widget/current-user-widget.module'; -import {HeaderComponent} from './header.component'; +import { CurrentUserWidgetModule } from './current-user-widget/current-user-widget.module'; +import { HeaderComponent } from './header.component'; @NgModule({ declarations: [HeaderComponent], diff --git a/web/src/app/components/shared/import-dialog/import-dialog.component.spec.ts b/web/src/app/components/shared/import-dialog/import-dialog.component.spec.ts index 71b65a0c6..d50b804a7 100644 --- a/web/src/app/components/shared/import-dialog/import-dialog.component.spec.ts +++ b/web/src/app/components/shared/import-dialog/import-dialog.component.spec.ts @@ -14,20 +14,20 @@ * limitations under the License. */ -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import {ReactiveFormsModule} from '@angular/forms'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ReactiveFormsModule } from '@angular/forms'; import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef, } from '@angular/material/dialog'; -import {MatSnackBarModule} from '@angular/material/snack-bar'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {FileUploadModule} from '@iplab/ngx-file-upload'; -import {NEVER} from 'rxjs'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { FileUploadModule } from '@iplab/ngx-file-upload'; +import { NEVER } from 'rxjs'; -import {ImportDialogComponent} from 'app/components/shared/import-dialog/import-dialog.component'; -import {DataImportService} from 'app/services/data-import/data-import.service'; +import { ImportDialogComponent } from 'app/components/shared/import-dialog/import-dialog.component'; +import { DataImportService } from 'app/services/data-import/data-import.service'; describe('ImportDialogComponent', () => { let component: ImportDialogComponent; @@ -44,9 +44,9 @@ describe('ImportDialogComponent', () => { MatSnackBarModule, ], providers: [ - {provide: DataImportService, useValue: {}}, - {provide: MatDialogRef, useValue: {afterClosed: () => NEVER}}, - {provide: MAT_DIALOG_DATA, useValue: {}}, + { provide: DataImportService, useValue: {} }, + { provide: MatDialogRef, useValue: { afterClosed: () => NEVER } }, + { provide: MAT_DIALOG_DATA, useValue: {} }, ], }).compileComponents(); })); diff --git a/web/src/app/components/shared/import-dialog/import-dialog.component.ts b/web/src/app/components/shared/import-dialog/import-dialog.component.ts index 560085bc6..84d7c941f 100644 --- a/web/src/app/components/shared/import-dialog/import-dialog.component.ts +++ b/web/src/app/components/shared/import-dialog/import-dialog.component.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import {HttpErrorResponse} from '@angular/common/http'; -import {Component, Inject, NgZone} from '@angular/core'; -import {FormBuilder, FormControl, FormGroup} from '@angular/forms'; -import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; +import { HttpErrorResponse } from '@angular/common/http'; +import { Component, Inject, NgZone } from '@angular/core'; +import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import {DataImportService} from 'app/services/data-import/data-import.service'; -import {NotificationService} from 'app/services/notification/notification.service'; +import { DataImportService } from 'app/services/data-import/data-import.service'; +import { NotificationService } from 'app/services/notification/notification.service'; @Component({ selector: 'ground-import-dialog', @@ -37,7 +37,7 @@ export class ImportDialogComponent { constructor( @Inject(MAT_DIALOG_DATA) - public data: {surveyId: string; jobId: string}, + public data: { surveyId: string; jobId: string }, private formBuilder: FormBuilder, private dataImportService: DataImportService, private readonly dialogRef: MatDialogRef, diff --git a/web/src/app/components/shared/import-dialog/import-dialog.module.ts b/web/src/app/components/shared/import-dialog/import-dialog.module.ts index 9a0150e0b..84b0e21e1 100644 --- a/web/src/app/components/shared/import-dialog/import-dialog.module.ts +++ b/web/src/app/components/shared/import-dialog/import-dialog.module.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {ReactiveFormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; -import {FileUploadModule} from '@iplab/ngx-file-upload'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { FileUploadModule } from '@iplab/ngx-file-upload'; -import {ImportDialogComponent} from './import-dialog.component'; +import { ImportDialogComponent } from './import-dialog.component'; @NgModule({ declarations: [ImportDialogComponent], diff --git a/web/src/app/components/shared/inline-editor/inline-editor.component.ts b/web/src/app/components/shared/inline-editor/inline-editor.component.ts index ffbcd882e..07df3c6f5 100644 --- a/web/src/app/components/shared/inline-editor/inline-editor.component.ts +++ b/web/src/app/components/shared/inline-editor/inline-editor.component.ts @@ -39,13 +39,13 @@ export class InlineEditorComponent { constructor() {} onFocusOut(event: FocusEvent) { - const {target} = event; + const { target } = event; if (!target || !(target instanceof HTMLInputElement)) return; this.focusOut.emit(target.value); } handleKeyPress(event: KeyboardEvent) { - const {key, target} = event; + const { key, target } = event; if (!target || !(target instanceof HTMLInputElement)) return; switch (key) { case 'Enter': diff --git a/web/src/app/components/shared/inline-editor/inline-editor.module.ts b/web/src/app/components/shared/inline-editor/inline-editor.module.ts index 5be856260..dc33cc8d5 100644 --- a/web/src/app/components/shared/inline-editor/inline-editor.module.ts +++ b/web/src/app/components/shared/inline-editor/inline-editor.module.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {AutoSizeInputModule} from 'ngx-autosize-input'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { AutoSizeInputModule } from 'ngx-autosize-input'; -import {InlineEditorComponent} from './inline-editor.component'; +import { InlineEditorComponent } from './inline-editor.component'; @NgModule({ declarations: [InlineEditorComponent], diff --git a/web/src/app/components/shared/job-list-item/job-list-item.component.spec.ts b/web/src/app/components/shared/job-list-item/job-list-item.component.spec.ts index 7e7028c58..353381c8e 100644 --- a/web/src/app/components/shared/job-list-item/job-list-item.component.spec.ts +++ b/web/src/app/components/shared/job-list-item/job-list-item.component.spec.ts @@ -14,40 +14,40 @@ * limitations under the License. */ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {CdkTreeModule} from '@angular/cdk/tree'; -import {Signal, WritableSignal, signal} from '@angular/core'; -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import {AngularFireAuth} from '@angular/fire/compat/auth'; -import {AngularFirestore} from '@angular/fire/compat/firestore'; -import {MatButtonHarness} from '@angular/material/button/testing'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatListModule} from '@angular/material/list'; -import {MatMenuModule} from '@angular/material/menu'; -import {MatTreeModule} from '@angular/material/tree'; -import {MatTreeHarness} from '@angular/material/tree/testing'; -import {Router} from '@angular/router'; -import {List, Map} from 'immutable'; -import {Subject, of} from 'rxjs'; - -import {AuditInfo} from 'app/models/audit-info.model'; -import {Coordinate} from 'app/models/geometry/coordinate'; -import {Point} from 'app/models/geometry/point'; -import {Job} from 'app/models/job.model'; -import {LocationOfInterest} from 'app/models/loi.model'; -import {Submission} from 'app/models/submission/submission.model'; -import {DataSharingType, Survey} from 'app/models/survey.model'; -import {GroundIconModule} from 'app/modules/ground-icon.module'; -import {AuthService} from 'app/services/auth/auth.service'; -import {DataStoreService} from 'app/services/data-store/data-store.service'; -import {LocationOfInterestService} from 'app/services/loi/loi.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {UrlParams} from 'app/services/navigation/url-params'; -import {SubmissionService} from 'app/services/submission/submission.service'; -import {SurveyService} from 'app/services/survey/survey.service'; - -import {JobListItemComponent} from './job-list-item.component'; +import { HarnessLoader } from '@angular/cdk/testing'; +import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; +import { CdkTreeModule } from '@angular/cdk/tree'; +import { Signal, WritableSignal, signal } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { AngularFireAuth } from '@angular/fire/compat/auth'; +import { AngularFirestore } from '@angular/fire/compat/firestore'; +import { MatButtonHarness } from '@angular/material/button/testing'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatListModule } from '@angular/material/list'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatTreeModule } from '@angular/material/tree'; +import { MatTreeHarness } from '@angular/material/tree/testing'; +import { Router } from '@angular/router'; +import { List, Map } from 'immutable'; +import { Subject, of } from 'rxjs'; + +import { AuditInfo } from 'app/models/audit-info.model'; +import { Coordinate } from 'app/models/geometry/coordinate'; +import { Point } from 'app/models/geometry/point'; +import { Job } from 'app/models/job.model'; +import { LocationOfInterest } from 'app/models/loi.model'; +import { Submission } from 'app/models/submission/submission.model'; +import { DataSharingType, Survey } from 'app/models/survey.model'; +import { GroundIconModule } from 'app/modules/ground-icon.module'; +import { AuthService } from 'app/services/auth/auth.service'; +import { DataStoreService } from 'app/services/data-store/data-store.service'; +import { LocationOfInterestService } from 'app/services/loi/loi.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { UrlParams } from 'app/services/navigation/url-params'; +import { SubmissionService } from 'app/services/submission/submission.service'; +import { SurveyService } from 'app/services/survey/survey.service'; + +import { JobListItemComponent } from './job-list-item.component'; const authState = { displayName: null, @@ -96,7 +96,7 @@ describe('JobListItemComponent', () => { }), /* acl= */ Map(), /* ownerId= */ '', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ); function createLois(count: number): List { @@ -191,14 +191,14 @@ describe('JobListItemComponent', () => { CdkTreeModule, ], providers: [ - {provide: DataStoreService, useValue: {user$: () => of()}}, - {provide: NavigationService, useValue: navigationServiceSpy}, - {provide: Router, useValue: {}}, - {provide: SurveyService, useValue: surveyServiceSpy}, - {provide: LocationOfInterestService, useValue: loiServiceSpy}, - {provide: SubmissionService, useValue: submissionServiceSpy}, - {provide: AngularFirestore, useValue: {}}, - {provide: AuthService, useValue: {}}, + { provide: DataStoreService, useValue: { user$: () => of() } }, + { provide: NavigationService, useValue: navigationServiceSpy }, + { provide: Router, useValue: {} }, + { provide: SurveyService, useValue: surveyServiceSpy }, + { provide: LocationOfInterestService, useValue: loiServiceSpy }, + { provide: SubmissionService, useValue: submissionServiceSpy }, + { provide: AngularFirestore, useValue: {} }, + { provide: AuthService, useValue: {} }, { provide: AngularFireAuth, useValue: mockAngularFireAuth, @@ -261,7 +261,7 @@ describe('JobListItemComponent', () => { const loiId = lois.first()!.id; const selectLoiButton = await loader.getHarness( - MatButtonHarness.with({selector: '.loi-tree-node'}) + MatButtonHarness.with({ selector: '.loi-tree-node' }) ); await selectLoiButton.click(); diff --git a/web/src/app/components/shared/job-list-item/job-list-item.component.ts b/web/src/app/components/shared/job-list-item/job-list-item.component.ts index f10694d17..e4a5a8180 100644 --- a/web/src/app/components/shared/job-list-item/job-list-item.component.ts +++ b/web/src/app/components/shared/job-list-item/job-list-item.component.ts @@ -14,21 +14,21 @@ * limitations under the License. */ -import {FlatTreeControl} from '@angular/cdk/tree'; -import {Component, Input, OnDestroy, OnInit, effect} from '@angular/core'; -import {DomSanitizer, SafeUrl} from '@angular/platform-browser'; -import {List} from 'immutable'; -import {Subscription} from 'rxjs'; - -import {Job} from 'app/models/job.model'; -import {LocationOfInterest} from 'app/models/loi.model'; -import {AuthService} from 'app/services/auth/auth.service'; -import {GroundPinService} from 'app/services/ground-pin/ground-pin.service'; -import {LocationOfInterestService} from 'app/services/loi/loi.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {environment} from 'environments/environment'; - -import {DynamicDataSource, DynamicFlatNode} from './tree-data-source'; +import { FlatTreeControl } from '@angular/cdk/tree'; +import { Component, Input, OnDestroy, OnInit, effect } from '@angular/core'; +import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; +import { List } from 'immutable'; +import { Subscription } from 'rxjs'; + +import { Job } from 'app/models/job.model'; +import { LocationOfInterest } from 'app/models/loi.model'; +import { AuthService } from 'app/services/auth/auth.service'; +import { GroundPinService } from 'app/services/ground-pin/ground-pin.service'; +import { LocationOfInterestService } from 'app/services/loi/loi.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { environment } from 'environments/environment'; + +import { DynamicDataSource, DynamicFlatNode } from './tree-data-source'; @Component({ selector: 'ground-job-list-item', @@ -71,7 +71,7 @@ export class JobListItemComponent implements OnInit, OnDestroy { this.dataSource = new DynamicDataSource(this.treeControl, this.loiService); effect(() => { - const {surveyId, loiId} = this.urlParamsSignal(); + const { surveyId, loiId } = this.urlParamsSignal(); this.surveyId = surveyId; this.loiId = loiId; }); diff --git a/web/src/app/components/shared/job-list-item/job-list-item.module.ts b/web/src/app/components/shared/job-list-item/job-list-item.module.ts index b7a6d7518..2f9262a27 100644 --- a/web/src/app/components/shared/job-list-item/job-list-item.module.ts +++ b/web/src/app/components/shared/job-list-item/job-list-item.module.ts @@ -14,17 +14,17 @@ * limitations under the License. */ -import {CdkTreeModule} from '@angular/cdk/tree'; -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {MatIconModule} from '@angular/material/icon'; -import {MatListModule} from '@angular/material/list'; -import {MatMenuModule} from '@angular/material/menu'; -import {MatSnackBarModule} from '@angular/material/snack-bar'; -import {MatTreeModule} from '@angular/material/tree'; -import {BrowserModule} from '@angular/platform-browser'; +import { CdkTreeModule } from '@angular/cdk/tree'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatTreeModule } from '@angular/material/tree'; +import { BrowserModule } from '@angular/platform-browser'; -import {JobListItemComponent} from './job-list-item.component'; +import { JobListItemComponent } from './job-list-item.component'; @NgModule({ imports: [ diff --git a/web/src/app/components/shared/job-list-item/tree-data-source.ts b/web/src/app/components/shared/job-list-item/tree-data-source.ts index 2cc46cc4b..909384e69 100644 --- a/web/src/app/components/shared/job-list-item/tree-data-source.ts +++ b/web/src/app/components/shared/job-list-item/tree-data-source.ts @@ -19,14 +19,14 @@ import { DataSource, SelectionChange, } from '@angular/cdk/collections'; -import {FlatTreeControl} from '@angular/cdk/tree'; -import {List} from 'immutable'; -import {BehaviorSubject, Observable, Subscription, merge} from 'rxjs'; -import {map, shareReplay} from 'rxjs/operators'; - -import {LocationOfInterest} from 'app/models/loi.model'; -import {LocationOfInterestService} from 'app/services/loi/loi.service'; -import {getLoiIcon} from 'app/utils/utils'; +import { FlatTreeControl } from '@angular/cdk/tree'; +import { List } from 'immutable'; +import { BehaviorSubject, Observable, Subscription, merge } from 'rxjs'; +import { map, shareReplay } from 'rxjs/operators'; + +import { LocationOfInterest } from 'app/models/loi.model'; +import { LocationOfInterestService } from 'app/services/loi/loi.service'; +import { getLoiIcon } from 'app/utils/utils'; /** Flat node with with information on name, level, and if it is expandable. * Loi specific nodes have additional fields for loi info and number of diff --git a/web/src/app/components/shared/loi-editor/loi-editor.component.spec.ts b/web/src/app/components/shared/loi-editor/loi-editor.component.spec.ts index e20963cb4..78586195d 100644 --- a/web/src/app/components/shared/loi-editor/loi-editor.component.spec.ts +++ b/web/src/app/components/shared/loi-editor/loi-editor.component.spec.ts @@ -14,23 +14,23 @@ * limitations under the License. */ -import {NO_ERRORS_SCHEMA} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {GoogleMapsModule} from '@angular/google-maps'; -import {MatDialog} from '@angular/material/dialog'; -import {MatIconModule} from '@angular/material/icon'; -import {MatSlideToggleModule} from '@angular/material/slide-toggle'; -import {List, Map} from 'immutable'; - -import {ImportDialogComponent} from 'app/components/shared/import-dialog/import-dialog.component'; -import {Coordinate} from 'app/models/geometry/coordinate'; -import {Point} from 'app/models/geometry/point'; -import {Job} from 'app/models/job.model'; -import {LocationOfInterest} from 'app/models/loi.model'; -import {DataSharingType, Survey} from 'app/models/survey.model'; -import {DataStoreService} from 'app/services/data-store/data-store.service'; - -import {LoiEditorComponent} from './loi-editor.component'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { GoogleMapsModule } from '@angular/google-maps'; +import { MatDialog } from '@angular/material/dialog'; +import { MatIconModule } from '@angular/material/icon'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { List, Map } from 'immutable'; + +import { ImportDialogComponent } from 'app/components/shared/import-dialog/import-dialog.component'; +import { Coordinate } from 'app/models/geometry/coordinate'; +import { Point } from 'app/models/geometry/point'; +import { Job } from 'app/models/job.model'; +import { LocationOfInterest } from 'app/models/loi.model'; +import { DataSharingType, Survey } from 'app/models/survey.model'; +import { DataStoreService } from 'app/services/data-store/data-store.service'; + +import { LoiEditorComponent } from './loi-editor.component'; describe('LoiEditorComponent', () => { let component: LoiEditorComponent; @@ -71,7 +71,7 @@ describe('LoiEditorComponent', () => { }), /* acl= */ Map(), /* ownerId= */ '', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ); beforeEach(() => { @@ -125,7 +125,7 @@ describe('LoiEditorComponent', () => { importButton.click(); expect(matDialogSpy.open).toHaveBeenCalledWith(ImportDialogComponent, { - data: {surveyId: survey.id, jobId: jobId2}, + data: { surveyId: survey.id, jobId: jobId2 }, width: '350px', maxHeight: '800px', }); diff --git a/web/src/app/components/shared/loi-editor/loi-editor.component.ts b/web/src/app/components/shared/loi-editor/loi-editor.component.ts index 2cd7fdfc0..1fede6fb4 100644 --- a/web/src/app/components/shared/loi-editor/loi-editor.component.ts +++ b/web/src/app/components/shared/loi-editor/loi-editor.component.ts @@ -14,22 +14,22 @@ * limitations under the License. */ -import {Component, EventEmitter, Input, Output} from '@angular/core'; -import {MatDialog} from '@angular/material/dialog'; -import {MatSlideToggleChange} from '@angular/material/slide-toggle'; -import {List} from 'immutable'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { MatSlideToggleChange } from '@angular/material/slide-toggle'; +import { List } from 'immutable'; import { DialogData, DialogType, JobDialogComponent, } from 'app/components/edit-survey/job-dialog/job-dialog.component'; -import {DataCollectionStrategy, Job} from 'app/models/job.model'; -import {LocationOfInterest} from 'app/models/loi.model'; -import {Survey} from 'app/models/survey.model'; -import {DataStoreService} from 'app/services/data-store/data-store.service'; +import { DataCollectionStrategy, Job } from 'app/models/job.model'; +import { LocationOfInterest } from 'app/models/loi.model'; +import { Survey } from 'app/models/survey.model'; +import { DataStoreService } from 'app/services/data-store/data-store.service'; -import {ImportDialogComponent} from '../import-dialog/import-dialog.component'; +import { ImportDialogComponent } from '../import-dialog/import-dialog.component'; @Component({ selector: 'loi-editor', @@ -54,7 +54,7 @@ export class LoiEditorComponent { importLois() { this.dialog.open(ImportDialogComponent, { - data: {surveyId: this.survey.id, jobId: this.job.id}, + data: { surveyId: this.survey.id, jobId: this.job.id }, width: '350px', maxHeight: '800px', }); diff --git a/web/src/app/components/shared/loi-editor/loi-editor.module.ts b/web/src/app/components/shared/loi-editor/loi-editor.module.ts index 1ae0f4033..7c16ca312 100644 --- a/web/src/app/components/shared/loi-editor/loi-editor.module.ts +++ b/web/src/app/components/shared/loi-editor/loi-editor.module.ts @@ -14,14 +14,14 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {MatIconModule} from '@angular/material/icon'; -import {MatSlideToggleModule} from '@angular/material/slide-toggle'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; -import {LoiEditorComponent} from './loi-editor.component'; -import {LoiSelectionModule} from '../loi-selection/loi-selection.module'; +import { LoiEditorComponent } from './loi-editor.component'; +import { LoiSelectionModule } from '../loi-selection/loi-selection.module'; @NgModule({ declarations: [LoiEditorComponent], diff --git a/web/src/app/components/shared/loi-properties-dialog/loi-properties-dialog.component.ts b/web/src/app/components/shared/loi-properties-dialog/loi-properties-dialog.component.ts index 914c86d90..5c9a4faee 100644 --- a/web/src/app/components/shared/loi-properties-dialog/loi-properties-dialog.component.ts +++ b/web/src/app/components/shared/loi-properties-dialog/loi-properties-dialog.component.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import {Component, Inject} from '@angular/core'; -import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; +import { Component, Inject } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; @Component({ selector: 'ground-loi-properties-dialog', @@ -26,7 +26,7 @@ export class LoiPropertiesDialogComponent { iconColor: string; iconName: string; loiDisplayName: string; - properties: {[key: string]: string | number}; + properties: { [key: string]: string | number }; constructor( private dialogRef: MatDialogRef, diff --git a/web/src/app/components/shared/loi-properties-dialog/loi-properties-dialog.module.ts b/web/src/app/components/shared/loi-properties-dialog/loi-properties-dialog.module.ts index 084e398f7..e6192f2b8 100644 --- a/web/src/app/components/shared/loi-properties-dialog/loi-properties-dialog.module.ts +++ b/web/src/app/components/shared/loi-properties-dialog/loi-properties-dialog.module.ts @@ -14,18 +14,18 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {FormsModule, ReactiveFormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatIconModule} from '@angular/material/icon'; -import {MatInputModule} from '@angular/material/input'; -import {MatListModule} from '@angular/material/list'; -import {MatSelectModule} from '@angular/material/select'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatSelectModule } from '@angular/material/select'; -import {LoiPropertiesDialogComponent} from './loi-properties-dialog.component'; +import { LoiPropertiesDialogComponent } from './loi-properties-dialog.component'; @NgModule({ declarations: [LoiPropertiesDialogComponent], diff --git a/web/src/app/components/shared/loi-selection/loi-selection.component.spec.ts b/web/src/app/components/shared/loi-selection/loi-selection.component.spec.ts index 00b4679ea..51df57ff9 100644 --- a/web/src/app/components/shared/loi-selection/loi-selection.component.spec.ts +++ b/web/src/app/components/shared/loi-selection/loi-selection.component.spec.ts @@ -14,23 +14,23 @@ * limitations under the License. */ -import {NO_ERRORS_SCHEMA} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {GoogleMapsModule} from '@angular/google-maps'; -import {MatDialog} from '@angular/material/dialog'; -import {MatIconModule} from '@angular/material/icon'; -import {MatListModule} from '@angular/material/list'; -import {List, Map} from 'immutable'; - -import {Coordinate} from 'app/models/geometry/coordinate'; -import {Point} from 'app/models/geometry/point'; -import {Job} from 'app/models/job.model'; -import {LocationOfInterest} from 'app/models/loi.model'; -import {DataSharingType, Survey} from 'app/models/survey.model'; -import {GroundIconModule} from 'app/modules/ground-icon.module'; -import {DataStoreService} from 'app/services/data-store/data-store.service'; - -import {LoiSelectionComponent} from './loi-selection.component'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { GoogleMapsModule } from '@angular/google-maps'; +import { MatDialog } from '@angular/material/dialog'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import { List, Map } from 'immutable'; + +import { Coordinate } from 'app/models/geometry/coordinate'; +import { Point } from 'app/models/geometry/point'; +import { Job } from 'app/models/job.model'; +import { LocationOfInterest } from 'app/models/loi.model'; +import { DataSharingType, Survey } from 'app/models/survey.model'; +import { GroundIconModule } from 'app/modules/ground-icon.module'; +import { DataStoreService } from 'app/services/data-store/data-store.service'; + +import { LoiSelectionComponent } from './loi-selection.component'; describe('LoiSelectionComponent', () => { let component: LoiSelectionComponent; @@ -67,7 +67,7 @@ describe('LoiSelectionComponent', () => { }), /* acl= */ Map(), /* ownerId= */ '', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ); beforeEach(() => { @@ -138,7 +138,7 @@ describe('LoiSelectionComponent', () => { it('shows updated list of LOIs', () => { fixture.componentInstance.lois = List([ - {...poi1, properties: Map({name: 'Test 1'})}, + { ...poi1, properties: Map({ name: 'Test 1' }) }, poi2, ]); fixture.detectChanges(); diff --git a/web/src/app/components/shared/loi-selection/loi-selection.component.ts b/web/src/app/components/shared/loi-selection/loi-selection.component.ts index 5c071938d..02ce7adb7 100644 --- a/web/src/app/components/shared/loi-selection/loi-selection.component.ts +++ b/web/src/app/components/shared/loi-selection/loi-selection.component.ts @@ -14,14 +14,14 @@ * limitations under the License. */ -import {Component, EventEmitter, Input, Output} from '@angular/core'; -import {List} from 'immutable'; - -import {DataCollectionStrategy, Job} from 'app/models/job.model'; -import {LocationOfInterest} from 'app/models/loi.model'; -import {Survey} from 'app/models/survey.model'; -import {LocationOfInterestService} from 'app/services/loi/loi.service'; -import {getLoiIcon} from 'app/utils/utils'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { List } from 'immutable'; + +import { DataCollectionStrategy, Job } from 'app/models/job.model'; +import { LocationOfInterest } from 'app/models/loi.model'; +import { Survey } from 'app/models/survey.model'; +import { LocationOfInterestService } from 'app/services/loi/loi.service'; +import { getLoiIcon } from 'app/utils/utils'; @Component({ selector: 'loi-selection', diff --git a/web/src/app/components/shared/loi-selection/loi-selection.module.ts b/web/src/app/components/shared/loi-selection/loi-selection.module.ts index 68cd47450..6ab6f7e9c 100644 --- a/web/src/app/components/shared/loi-selection/loi-selection.module.ts +++ b/web/src/app/components/shared/loi-selection/loi-selection.module.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {MatListModule} from '@angular/material/list'; -import {BrowserModule} from '@angular/platform-browser'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatListModule } from '@angular/material/list'; +import { BrowserModule } from '@angular/platform-browser'; -import {MapModule} from 'app/components/main-page-container/main-page/map/map.module'; -import {GroundIconModule} from 'app/modules/ground-icon.module'; +import { MapModule } from 'app/components/main-page-container/main-page/map/map.module'; +import { GroundIconModule } from 'app/modules/ground-icon.module'; -import {LoiSelectionComponent} from './loi-selection.component'; +import { LoiSelectionComponent } from './loi-selection.component'; @NgModule({ declarations: [LoiSelectionComponent], diff --git a/web/src/app/components/shared/share-dialog/share-dialog.component.spec.ts b/web/src/app/components/shared/share-dialog/share-dialog.component.spec.ts index ba1407622..f56ac82fa 100644 --- a/web/src/app/components/shared/share-dialog/share-dialog.component.spec.ts +++ b/web/src/app/components/shared/share-dialog/share-dialog.component.spec.ts @@ -14,21 +14,21 @@ * limitations under the License. */ -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import {FormsModule, ReactiveFormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatDialogModule, MatDialogRef} from '@angular/material/dialog'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatInputModule} from '@angular/material/input'; -import {MatListModule} from '@angular/material/list'; -import {MatSelectModule} from '@angular/material/select'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {Map} from 'immutable'; -import {of} from 'rxjs'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule, MatDialogRef } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatSelectModule } from '@angular/material/select'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { Map } from 'immutable'; +import { of } from 'rxjs'; -import {DraftSurveyService} from 'app/services/draft-survey/draft-survey.service'; +import { DraftSurveyService } from 'app/services/draft-survey/draft-survey.service'; -import {ShareDialogComponent} from './share-dialog.component'; +import { ShareDialogComponent } from './share-dialog.component'; describe('ShareDialogComponent', () => { let component: ShareDialogComponent; @@ -49,11 +49,11 @@ describe('ShareDialogComponent', () => { ReactiveFormsModule, ], providers: [ - {provide: MatDialogRef, useValue: {}}, + { provide: MatDialogRef, useValue: {} }, { provide: DraftSurveyService, useValue: { - getSurvey$: () => of({acl: Map()}), + getSurvey$: () => of({ acl: Map() }), updateAcl: () => null, }, }, diff --git a/web/src/app/components/shared/share-dialog/share-dialog.component.ts b/web/src/app/components/shared/share-dialog/share-dialog.component.ts index 312531710..c52000134 100644 --- a/web/src/app/components/shared/share-dialog/share-dialog.component.ts +++ b/web/src/app/components/shared/share-dialog/share-dialog.component.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {Component} from '@angular/core'; +import { Component } from '@angular/core'; import { AbstractControl, FormControl, @@ -22,16 +22,16 @@ import { ValidatorFn, Validators, } from '@angular/forms'; -import {MatDialogRef} from '@angular/material/dialog'; -import {MatSelectChange} from '@angular/material/select'; -import {Map} from 'immutable'; -import {Subscription} from 'rxjs'; +import { MatDialogRef } from '@angular/material/dialog'; +import { MatSelectChange } from '@angular/material/select'; +import { Map } from 'immutable'; +import { Subscription } from 'rxjs'; -import {AclEntry} from 'app/models/acl-entry.model'; -import {Role} from 'app/models/role.model'; -import {Survey} from 'app/models/survey.model'; -import {ROLE_OPTIONS} from 'app/services/auth/auth.service'; -import {DraftSurveyService} from 'app/services/draft-survey/draft-survey.service'; +import { AclEntry } from 'app/models/acl-entry.model'; +import { Role } from 'app/models/role.model'; +import { Survey } from 'app/models/survey.model'; +import { ROLE_OPTIONS } from 'app/services/auth/auth.service'; +import { DraftSurveyService } from 'app/services/draft-survey/draft-survey.service'; @Component({ selector: 'ground-share-dialog', @@ -85,7 +85,7 @@ export class ShareDialogComponent { if (!this.survey || !this.acl) { return; } - const {email, role} = this.addUserForm.value; + const { email, role } = this.addUserForm.value; // Add new email/role and update change state. Validation rules prevent // the same email from being added twice. @@ -93,7 +93,7 @@ export class ShareDialogComponent { this.updateChangeState(); // Clear "Add data collector" field. - this.addUserForm.setValue({email: '', role: Role.DATA_COLLECTOR}); + this.addUserForm.setValue({ email: '', role: Role.DATA_COLLECTOR }); this.onSaveClicked(); } @@ -163,11 +163,11 @@ export class ShareDialogComponent { private notInListValidator(): ValidatorFn { // eslint-disable-next-line @typescript-eslint/no-explicit-any - return (control: AbstractControl): {[key: string]: any} | null => { + return (control: AbstractControl): { [key: string]: any } | null => { const emailsInAcl = this.acl?.map(entry => entry.email) || []; const newEmail = control.value; return emailsInAcl.includes(newEmail) - ? {forbiddenName: {value: control.value}} + ? { forbiddenName: { value: control.value } } : null; }; } diff --git a/web/src/app/components/shared/share-dialog/share-dialog.module.ts b/web/src/app/components/shared/share-dialog/share-dialog.module.ts index 6f015bd83..49597f86f 100644 --- a/web/src/app/components/shared/share-dialog/share-dialog.module.ts +++ b/web/src/app/components/shared/share-dialog/share-dialog.module.ts @@ -14,17 +14,17 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {FormsModule, ReactiveFormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatInputModule} from '@angular/material/input'; -import {MatListModule} from '@angular/material/list'; -import {MatSelectModule} from '@angular/material/select'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatSelectModule } from '@angular/material/select'; -import {ShareDialogComponent} from './share-dialog.component'; +import { ShareDialogComponent } from './share-dialog.component'; @NgModule({ declarations: [ShareDialogComponent], diff --git a/web/src/app/components/shared/share-list/share-list.component.spec.ts b/web/src/app/components/shared/share-list/share-list.component.spec.ts index 7fcd021f8..a7158a3aa 100644 --- a/web/src/app/components/shared/share-list/share-list.component.spec.ts +++ b/web/src/app/components/shared/share-list/share-list.component.spec.ts @@ -14,22 +14,22 @@ * limitations under the License. */ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import {MatListModule} from '@angular/material/list'; -import {MatListHarness} from '@angular/material/list/testing'; -import {MatSelectModule} from '@angular/material/select'; -import {Map} from 'immutable'; -import {Subject, firstValueFrom, of} from 'rxjs'; - -import {Role} from 'app/models/role.model'; -import {DataSharingType, Survey} from 'app/models/survey.model'; -import {User} from 'app/models/user.model'; -import {AuthService} from 'app/services/auth/auth.service'; -import {DraftSurveyService} from 'app/services/draft-survey/draft-survey.service'; - -import {ShareListComponent} from './share-list.component'; +import { HarnessLoader } from '@angular/cdk/testing'; +import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatListModule } from '@angular/material/list'; +import { MatListHarness } from '@angular/material/list/testing'; +import { MatSelectModule } from '@angular/material/select'; +import { Map } from 'immutable'; +import { Subject, firstValueFrom, of } from 'rxjs'; + +import { Role } from 'app/models/role.model'; +import { DataSharingType, Survey } from 'app/models/survey.model'; +import { User } from 'app/models/user.model'; +import { AuthService } from 'app/services/auth/auth.service'; +import { DraftSurveyService } from 'app/services/draft-survey/draft-survey.service'; + +import { ShareListComponent } from './share-list.component'; describe('ShareListComponent', () => { let component: ShareListComponent; @@ -53,7 +53,7 @@ describe('ShareListComponent', () => { /* jobs= */ Map(), /* acl= */ Map(), /* ownerId= */ '', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ); const user = new User('user1', 'user1@gmail.com', true); @@ -77,8 +77,8 @@ describe('ShareListComponent', () => { declarations: [ShareListComponent], imports: [MatListModule, MatSelectModule], providers: [ - {provide: DraftSurveyService, useValue: draftSurveyServiceSpy}, - {provide: AuthService, useValue: authServiceSpy}, + { provide: DraftSurveyService, useValue: draftSurveyServiceSpy }, + { provide: AuthService, useValue: authServiceSpy }, ], }).compileComponents(); })); @@ -107,9 +107,9 @@ describe('ShareListComponent', () => { surveyTitle, surveyDescription, /* jobs= */ Map(), - /* acl= */ Map({a: Role.OWNER, b: Role.OWNER}), + /* acl= */ Map({ a: Role.OWNER, b: Role.OWNER }), /* ownerId= */ 'user1', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ) ); fixture.detectChanges(); diff --git a/web/src/app/components/shared/share-list/share-list.component.ts b/web/src/app/components/shared/share-list/share-list.component.ts index c9b3f1406..41e6e140d 100644 --- a/web/src/app/components/shared/share-list/share-list.component.ts +++ b/web/src/app/components/shared/share-list/share-list.component.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import {Component} from '@angular/core'; -import {MatSelectChange} from '@angular/material/select'; -import {Map} from 'immutable'; -import {Subscription} from 'rxjs'; +import { Component } from '@angular/core'; +import { MatSelectChange } from '@angular/material/select'; +import { Map } from 'immutable'; +import { Subscription } from 'rxjs'; -import {AclEntry} from 'app/models/acl-entry.model'; -import {Role} from 'app/models/role.model'; -import {Survey} from 'app/models/survey.model'; -import {AuthService, ROLE_OPTIONS} from 'app/services/auth/auth.service'; -import {DraftSurveyService} from 'app/services/draft-survey/draft-survey.service'; +import { AclEntry } from 'app/models/acl-entry.model'; +import { Role } from 'app/models/role.model'; +import { Survey } from 'app/models/survey.model'; +import { AuthService, ROLE_OPTIONS } from 'app/services/auth/auth.service'; +import { DraftSurveyService } from 'app/services/draft-survey/draft-survey.service'; @Component({ selector: 'ground-share-list', diff --git a/web/src/app/components/shared/share-list/share-list.module.ts b/web/src/app/components/shared/share-list/share-list.module.ts index 29e3c2e03..44aa77605 100644 --- a/web/src/app/components/shared/share-list/share-list.module.ts +++ b/web/src/app/components/shared/share-list/share-list.module.ts @@ -14,17 +14,17 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {FormsModule, ReactiveFormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatInputModule} from '@angular/material/input'; -import {MatListModule} from '@angular/material/list'; -import {MatSelectModule} from '@angular/material/select'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatSelectModule } from '@angular/material/select'; -import {ShareListComponent} from './share-list.component'; +import { ShareListComponent } from './share-list.component'; @NgModule({ declarations: [ShareListComponent], diff --git a/web/src/app/components/shared/share-survey/share-survey.component.spec.ts b/web/src/app/components/shared/share-survey/share-survey.component.spec.ts index e45cefcda..17bc61152 100644 --- a/web/src/app/components/shared/share-survey/share-survey.component.spec.ts +++ b/web/src/app/components/shared/share-survey/share-survey.component.spec.ts @@ -1,10 +1,10 @@ -import {NO_ERRORS_SCHEMA} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatCardModule} from '@angular/material/card'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatIconModule} from '@angular/material/icon'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatCardModule } from '@angular/material/card'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatIconModule } from '@angular/material/icon'; -import {ShareSurveyComponent} from './share-survey.component'; +import { ShareSurveyComponent } from './share-survey.component'; describe('ShareSurveyComponent', () => { let component: ShareSurveyComponent; diff --git a/web/src/app/components/shared/share-survey/share-survey.component.ts b/web/src/app/components/shared/share-survey/share-survey.component.ts index b2d694b9f..8586a0529 100644 --- a/web/src/app/components/shared/share-survey/share-survey.component.ts +++ b/web/src/app/components/shared/share-survey/share-survey.component.ts @@ -1,7 +1,7 @@ -import {Component} from '@angular/core'; -import {MatDialog} from '@angular/material/dialog'; +import { Component } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; -import {ShareDialogComponent} from 'app/components/shared/share-dialog/share-dialog.component'; +import { ShareDialogComponent } from 'app/components/shared/share-dialog/share-dialog.component'; @Component({ selector: 'share-survey', diff --git a/web/src/app/components/shared/share-survey/share-survey.module.ts b/web/src/app/components/shared/share-survey/share-survey.module.ts index dd8cc28d9..143b20847 100644 --- a/web/src/app/components/shared/share-survey/share-survey.module.ts +++ b/web/src/app/components/shared/share-survey/share-survey.module.ts @@ -14,21 +14,21 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {FormsModule, ReactiveFormsModule} from '@angular/forms'; -import {MatButtonModule} from '@angular/material/button'; -import {MatCardModule} from '@angular/material/card'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatIconModule} from '@angular/material/icon'; -import {MatInputModule} from '@angular/material/input'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; -import {ShareDialogModule} from 'app/components/shared/share-dialog/share-dialog.module'; -import {ShareListModule} from 'app/components/shared/share-list/share-list.module'; +import { ShareDialogModule } from 'app/components/shared/share-dialog/share-dialog.module'; +import { ShareListModule } from 'app/components/shared/share-list/share-list.module'; -import {ShareSurveyComponent} from './share-survey.component'; -import {DataVisibilityControlModule} from '../data-visibility-control/data-visibility-control.module'; -import {GeneralAccessControlModule} from '../general-access-control/general-access-control.module'; +import { ShareSurveyComponent } from './share-survey.component'; +import { DataVisibilityControlModule } from '../data-visibility-control/data-visibility-control.module'; +import { GeneralAccessControlModule } from '../general-access-control/general-access-control.module'; @NgModule({ declarations: [ShareSurveyComponent], diff --git a/web/src/app/components/shared/sign-in-page/sign-in-page.component.spec.ts b/web/src/app/components/shared/sign-in-page/sign-in-page.component.spec.ts index 521fc5220..66b6f8c6d 100644 --- a/web/src/app/components/shared/sign-in-page/sign-in-page.component.spec.ts +++ b/web/src/app/components/shared/sign-in-page/sign-in-page.component.spec.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import {NO_ERRORS_SCHEMA} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {NavigationEnd, Router} from '@angular/router'; -import {BehaviorSubject, NEVER, of} from 'rxjs'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { NavigationEnd, Router } from '@angular/router'; +import { BehaviorSubject, NEVER, of } from 'rxjs'; -import {AuthService} from 'app/services/auth/auth.service'; -import {DataStoreService} from 'app/services/data-store/data-store.service'; +import { AuthService } from 'app/services/auth/auth.service'; +import { DataStoreService } from 'app/services/data-store/data-store.service'; -import {SignInPageComponent} from './sign-in-page.component'; +import { SignInPageComponent } from './sign-in-page.component'; describe('SignInPageComponent', () => { let component: SignInPageComponent; @@ -34,12 +34,12 @@ describe('SignInPageComponent', () => { providers: [ { provide: DataStoreService, - useValue: {getAccessDeniedMessage: () => ''}, + useValue: { getAccessDeniedMessage: () => '' }, }, - {provide: Router, useValue: {events: of()}}, + { provide: Router, useValue: { events: of() } }, { provide: AuthService, - useValue: {getUser$: () => NEVER, isAuthenticated$: () => NEVER}, + useValue: { getUser$: () => NEVER, isAuthenticated$: () => NEVER }, }, ], schemas: [NO_ERRORS_SCHEMA], diff --git a/web/src/app/components/shared/sign-in-page/sign-in-page.component.ts b/web/src/app/components/shared/sign-in-page/sign-in-page.component.ts index 2d2f62c03..83deab76e 100644 --- a/web/src/app/components/shared/sign-in-page/sign-in-page.component.ts +++ b/web/src/app/components/shared/sign-in-page/sign-in-page.component.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import {Component, OnDestroy, OnInit} from '@angular/core'; -import {FirebaseUISignInFailure} from 'firebaseui-angular'; -import {Observable, Subscription, filter} from 'rxjs'; +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { FirebaseUISignInFailure } from 'firebaseui-angular'; +import { Observable, Subscription, filter } from 'rxjs'; -import {AuthService} from 'app/services/auth/auth.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {environment} from 'environments/environment'; +import { AuthService } from 'app/services/auth/auth.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { environment } from 'environments/environment'; @Component({ templateUrl: './sign-in-page.component.html', diff --git a/web/src/app/components/shared/sign-in-page/sign-in-page.module.ts b/web/src/app/components/shared/sign-in-page/sign-in-page.module.ts index 8be3705cf..a30a8230b 100644 --- a/web/src/app/components/shared/sign-in-page/sign-in-page.module.ts +++ b/web/src/app/components/shared/sign-in-page/sign-in-page.module.ts @@ -14,17 +14,17 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {MatCardModule} from '@angular/material/card'; -import {MatIconModule} from '@angular/material/icon'; -import {BrowserModule} from '@angular/platform-browser'; -import {FirebaseUIModule} from 'firebaseui-angular'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatIconModule } from '@angular/material/icon'; +import { BrowserModule } from '@angular/platform-browser'; +import { FirebaseUIModule } from 'firebaseui-angular'; -import {HeaderModule} from 'app/components/shared/header/header.module'; +import { HeaderModule } from 'app/components/shared/header/header.module'; -import {SignInPageComponent} from './sign-in-page.component'; +import { SignInPageComponent } from './sign-in-page.component'; @NgModule({ declarations: [SignInPageComponent], diff --git a/web/src/app/components/shared/survey-list/survey-list.component.spec.ts b/web/src/app/components/shared/survey-list/survey-list.component.spec.ts index 4e418188d..ac990319b 100644 --- a/web/src/app/components/shared/survey-list/survey-list.component.spec.ts +++ b/web/src/app/components/shared/survey-list/survey-list.component.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {Component} from '@angular/core'; +import { Component } from '@angular/core'; import { ComponentFixture, TestBed, @@ -22,40 +22,40 @@ import { tick, waitForAsync, } from '@angular/core/testing'; -import {AngularFireAuth} from '@angular/fire/compat/auth'; -import {AngularFirestore} from '@angular/fire/compat/firestore'; -import {MatButtonModule} from '@angular/material/button'; -import {MatCardModule} from '@angular/material/card'; -import {MatChipsModule} from '@angular/material/chips'; -import {MatDialog, MatDialogRef} from '@angular/material/dialog'; -import {MatGridListModule} from '@angular/material/grid-list'; -import {MatIconModule} from '@angular/material/icon'; -import {By} from '@angular/platform-browser'; -import {List, Map} from 'immutable'; -import {of} from 'rxjs'; +import { AngularFireAuth } from '@angular/fire/compat/auth'; +import { AngularFirestore } from '@angular/fire/compat/firestore'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatChipsModule } from '@angular/material/chips'; +import { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { MatGridListModule } from '@angular/material/grid-list'; +import { MatIconModule } from '@angular/material/icon'; +import { By } from '@angular/platform-browser'; +import { List, Map } from 'immutable'; +import { of } from 'rxjs'; import { DialogData, DialogType, JobDialogComponent, } from 'app/components/edit-survey/job-dialog/job-dialog.component'; -import {AclEntry} from 'app/models/acl-entry.model'; -import {Job} from 'app/models/job.model'; -import {Role} from 'app/models/role.model'; +import { AclEntry } from 'app/models/acl-entry.model'; +import { Job } from 'app/models/job.model'; +import { Role } from 'app/models/role.model'; import { DataSharingType, Survey, SurveyGeneralAccess, SurveyState, } from 'app/models/survey.model'; -import {Task, TaskType} from 'app/models/task/task.model'; -import {AuthService} from 'app/services/auth/auth.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SurveyService} from 'app/services/survey/survey.service'; +import { Task, TaskType } from 'app/models/task/task.model'; +import { AuthService } from 'app/services/auth/auth.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SurveyService } from 'app/services/survey/survey.service'; -import {SurveyListComponent} from './survey-list.component'; +import { SurveyListComponent } from './survey-list.component'; -@Component({selector: 'ground-header', template: ''}) +@Component({ selector: 'ground-header', template: '' }) class HeaderComponent {} describe('SurveyListComponent', () => { @@ -84,7 +84,7 @@ describe('SurveyListComponent', () => { }), /* acl= */ Map(), /* ownerId= */ '', - {type: DataSharingType.PRIVATE} + { type: DataSharingType.PRIVATE } ); // A survey that has gone through creation flow @@ -111,7 +111,7 @@ describe('SurveyListComponent', () => { }), /* acl= */ Map(), /* ownerId= */ '', - {type: DataSharingType.PRIVATE}, + { type: DataSharingType.PRIVATE }, SurveyState.READY ); @@ -139,7 +139,7 @@ describe('SurveyListComponent', () => { }), /* acl= */ Map(), /* ownerId= */ '', - {type: DataSharingType.PRIVATE}, + { type: DataSharingType.PRIVATE }, SurveyState.READY, SurveyGeneralAccess.PUBLIC ); @@ -181,12 +181,12 @@ describe('SurveyListComponent', () => { ], declarations: [SurveyListComponent, HeaderComponent], providers: [ - {provide: MatDialog, useValue: dialogSpy}, - {provide: SurveyService, useValue: surveyServiceSpy}, - {provide: NavigationService, useValue: navigationServiceSpy}, - {provide: AngularFirestore, useValue: {}}, - {provide: AngularFireAuth, useValue: {}}, - {provide: AuthService, useValue: authServiceSpy}, + { provide: MatDialog, useValue: dialogSpy }, + { provide: SurveyService, useValue: surveyServiceSpy }, + { provide: NavigationService, useValue: navigationServiceSpy }, + { provide: AngularFirestore, useValue: {} }, + { provide: AngularFireAuth, useValue: {} }, + { provide: AuthService, useValue: authServiceSpy }, ], }).compileComponents(); })); @@ -201,7 +201,7 @@ describe('SurveyListComponent', () => { authServiceSpy.canManageSurvey.and.returnValue(true); authServiceSpy.isPasslisted.and.returnValue(Promise.resolve(true)); dialogRefSpy.afterClosed.and.returnValue( - of({dialogType: DialogType.SurveyCreationDenied} as DialogData) + of({ dialogType: DialogType.SurveyCreationDenied } as DialogData) ); fixture = TestBed.createComponent(SurveyListComponent); component = fixture.componentInstance; diff --git a/web/src/app/components/shared/survey-list/survey-list.component.ts b/web/src/app/components/shared/survey-list/survey-list.component.ts index 82f1d621a..ad96c1bb7 100644 --- a/web/src/app/components/shared/survey-list/survey-list.component.ts +++ b/web/src/app/components/shared/survey-list/survey-list.component.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import {Component, OnDestroy, OnInit} from '@angular/core'; -import {MatDialog} from '@angular/material/dialog'; -import {List, Map} from 'immutable'; -import {Subscription} from 'rxjs'; +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { List, Map } from 'immutable'; +import { Subscription } from 'rxjs'; import { DialogData, @@ -29,9 +29,9 @@ import { SurveyGeneralAccess, SurveyState, } from 'app/models/survey.model'; -import {AuthService} from 'app/services/auth/auth.service'; -import {NavigationService} from 'app/services/navigation/navigation.service'; -import {SurveyService} from 'app/services/survey/survey.service'; +import { AuthService } from 'app/services/auth/auth.service'; +import { NavigationService } from 'app/services/navigation/navigation.service'; +import { SurveyService } from 'app/services/survey/survey.service'; export enum SurveyListFilter { ALL, @@ -125,7 +125,7 @@ export class SurveyListComponent implements OnInit, OnDestroy { if (!isPasslisted) { this.dialog .open(JobDialogComponent, { - data: {dialogType: DialogType.SurveyCreationDenied}, + data: { dialogType: DialogType.SurveyCreationDenied }, panelClass: 'small-width-dialog', }) .afterClosed() diff --git a/web/src/app/components/shared/survey-list/survey-list.module.ts b/web/src/app/components/shared/survey-list/survey-list.module.ts index ffe6f968d..2db1af290 100644 --- a/web/src/app/components/shared/survey-list/survey-list.module.ts +++ b/web/src/app/components/shared/survey-list/survey-list.module.ts @@ -14,18 +14,18 @@ * limitations under the License. */ -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {MatButtonModule} from '@angular/material/button'; -import {MatCardModule} from '@angular/material/card'; -import {MatChipsModule} from '@angular/material/chips'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatGridListModule} from '@angular/material/grid-list'; -import {MatIconModule} from '@angular/material/icon'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatChipsModule } from '@angular/material/chips'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatGridListModule } from '@angular/material/grid-list'; +import { MatIconModule } from '@angular/material/icon'; -import {HeaderModule} from 'app/components/shared/header/header.module'; +import { HeaderModule } from 'app/components/shared/header/header.module'; -import {SurveyListComponent} from './survey-list.component'; +import { SurveyListComponent } from './survey-list.component'; @NgModule({ declarations: [SurveyListComponent], diff --git a/web/src/app/components/shared/tasks-editor/add-task-button/add-task-button.component.spec.ts b/web/src/app/components/shared/tasks-editor/add-task-button/add-task-button.component.spec.ts index 8a4869160..3069ba0f5 100644 --- a/web/src/app/components/shared/tasks-editor/add-task-button/add-task-button.component.spec.ts +++ b/web/src/app/components/shared/tasks-editor/add-task-button/add-task-button.component.spec.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatIconModule} from '@angular/material/icon'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatIconModule } from '@angular/material/icon'; -import {AddTaskButtonComponent} from './add-task-button.component'; +import { AddTaskButtonComponent } from './add-task-button.component'; describe('TaskButtonComponent', () => { let component: AddTaskButtonComponent; diff --git a/web/src/app/components/shared/tasks-editor/add-task-button/add-task-button.component.ts b/web/src/app/components/shared/tasks-editor/add-task-button/add-task-button.component.ts index 4a9a9bb39..b2717a8e5 100644 --- a/web/src/app/components/shared/tasks-editor/add-task-button/add-task-button.component.ts +++ b/web/src/app/components/shared/tasks-editor/add-task-button/add-task-button.component.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import {Component, Input} from '@angular/core'; +import { Component, Input } from '@angular/core'; -import {Tasks} from '../task-form/task-form.component'; -import {TaskGroup} from '../tasks-editor.component'; +import { Tasks } from '../task-form/task-form.component'; +import { TaskGroup } from '../tasks-editor.component'; @Component({ selector: 'add-task-button', @@ -31,7 +31,7 @@ export class AddTaskButtonComponent { icon = 'question_mark'; ngOnInit(): void { - const {icon, label} = Tasks[this.taskGroup ?? TaskGroup.QUESTION]; + const { icon, label } = Tasks[this.taskGroup ?? TaskGroup.QUESTION]; this.text = label; diff --git a/web/src/app/components/shared/tasks-editor/add-task-button/add-task-button.module.ts b/web/src/app/components/shared/tasks-editor/add-task-button/add-task-button.module.ts index e1dbefa32..56757c1b6 100644 --- a/web/src/app/components/shared/tasks-editor/add-task-button/add-task-button.module.ts +++ b/web/src/app/components/shared/tasks-editor/add-task-button/add-task-button.module.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import {NgModule} from '@angular/core'; -import {MatIconModule} from '@angular/material/icon'; +import { NgModule } from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; -import {AddTaskButtonComponent} from './add-task-button.component'; +import { AddTaskButtonComponent } from './add-task-button.component'; @NgModule({ declarations: [AddTaskButtonComponent], diff --git a/web/src/app/components/shared/tasks-editor/task-condition-form/task-condition-form.component.ts b/web/src/app/components/shared/tasks-editor/task-condition-form/task-condition-form.component.ts index b204ea526..0dfa0e08a 100644 --- a/web/src/app/components/shared/tasks-editor/task-condition-form/task-condition-form.component.ts +++ b/web/src/app/components/shared/tasks-editor/task-condition-form/task-condition-form.component.ts @@ -14,14 +14,14 @@ * limitations under the License. */ -import {Component, Input, Pipe, PipeTransform} from '@angular/core'; -import {AbstractControl, FormArray, FormGroup} from '@angular/forms'; -import {List} from 'immutable'; +import { Component, Input, Pipe, PipeTransform } from '@angular/core'; +import { AbstractControl, FormArray, FormGroup } from '@angular/forms'; +import { List } from 'immutable'; -import {Option} from 'app/models/task/option.model'; -import {Task} from 'app/models/task/task.model'; +import { Option } from 'app/models/task/option.model'; +import { Task } from 'app/models/task/task.model'; -@Pipe({name: 'getTaskOptions', pure: false}) +@Pipe({ name: 'getTaskOptions', pure: false }) export class TaskOptionsPipe implements PipeTransform { transform(tasks: List, filter: string): List