diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..4e76e9b --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,49 @@ +{ + "root": true, + "ignorePatterns": [ + "projects/**/*" + ], + "overrides": [ + { + "files": [ + "*.ts" + ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@angular-eslint/recommended", + "plugin:@angular-eslint/template/process-inline-templates", + "plugin:prettier/recommended" + ], + "rules": { + "@angular-eslint/directive-selector": [ + "error", + { + "type": "attribute", + "prefix": "app", + "style": "camelCase" + } + ], + "@angular-eslint/component-selector": [ + "error", + { + "type": "element", + "prefix": "app", + "style": "kebab-case" + } + ], + "@typescript-eslint/semi": ["error", "always"] + } + }, + { + "files": [ + "*.html" + ], + "extends": [ + "plugin:@angular-eslint/template/recommended", + "plugin:@angular-eslint/template/accessibility" + ], + "rules": {} + } + ] +} diff --git a/.gitignore b/.gitignore index 0711527..c6429da 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,6 @@ testem.log # System files .DS_Store Thumbs.db + +.nx/cache +.nx/workspace-data diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..3b9bf0f --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "semi": true, + "bracketSameLine": false, + "printWidth": 80, + "endOfLine": "lf" +} \ No newline at end of file diff --git a/angular.json b/angular.json index 3ceada5..8f867d8 100644 --- a/angular.json +++ b/angular.json @@ -35,8 +35,8 @@ "budgets": [ { "type": "initial", - "maximumWarning": "500kb", - "maximumError": "1mb" + "maximumWarning": "1mb", + "maximumError": "2mb" }, { "type": "anyComponentStyle", @@ -90,11 +90,23 @@ ], "scripts": [] } + }, + "lint": { + "builder": "@angular-eslint/builder:lint", + "options": { + "lintFilePatterns": [ + "src/**/*.ts", + "src/**/*.html" + ] + } } } } }, "cli": { - "analytics": false + "analytics": false, + "schematicCollections": [ + "@angular-eslint/schematics" + ] } } diff --git a/package-lock.json b/package-lock.json index 69c8faf..5617b05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,15 +28,27 @@ }, "devDependencies": { "@angular-devkit/build-angular": "^17.3.0", + "@angular-eslint/builder": "17.5.3", + "@angular-eslint/eslint-plugin": "17.5.3", + "@angular-eslint/eslint-plugin-template": "17.5.3", + "@angular-eslint/schematics": "17.5.3", + "@angular-eslint/template-parser": "17.5.3", "@angular/cli": "^17.3.0", "@angular/compiler-cli": "^17.3.0", "@types/jasmine": "~5.1.0", + "@typescript-eslint/eslint-plugin": "7.11.0", + "@typescript-eslint/parser": "7.11.0", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", "jasmine-core": "~5.1.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.2.0", "karma-coverage": "~2.2.0", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.1.0", + "prettier": "^3.3.3", + "prettier-eslint": "^16.3.0", "typescript": "~5.4.2" } }, @@ -267,6 +279,142 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular-eslint/builder": { + "version": "17.5.3", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.5.3.tgz", + "integrity": "sha512-DoPCwt8qp5oMkfxY8V3wygf6/E7zzgXkPCwTRhIelklfpB3nYwLnbRSD8G5hueAU4eyASKiIuhR79E996AuUSw==", + "dev": true, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "17.5.3", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.5.3.tgz", + "integrity": "sha512-x9jZ6mME9wxumErPGonWERXX/9TJ7mzEkQhOKt3BxBFm0sy9XQqLMAenp1PBSg3RF3rH7EEVdB2+jb75RtHp0g==", + "dev": true + }, + "node_modules/@angular-eslint/eslint-plugin": { + "version": "17.5.3", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.5.3.tgz", + "integrity": "sha512-2gMRZ+SkiygrPDtCJwMfjmwIFOcvxxC4NRX/MqRo6udsa0gtqPrc8acRbwrmAXlullmhzmaeUfkHpGDSzW8pFw==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "17.5.3", + "@angular-eslint/utils": "17.5.3", + "@typescript-eslint/utils": "7.11.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template": { + "version": "17.5.3", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.5.3.tgz", + "integrity": "sha512-RkRFagxqBPV2xdNyeQQROUm6I1Izto1Z3Wy73lCk2zq1RhVgbznniH/epmOIE8PMkHmMKmZ765FV++J/90p4Ig==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "17.5.3", + "@angular-eslint/utils": "17.5.3", + "@typescript-eslint/type-utils": "7.11.0", + "@typescript-eslint/utils": "7.11.0", + "aria-query": "5.3.0", + "axobject-query": "4.0.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/schematics": { + "version": "17.5.3", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.5.3.tgz", + "integrity": "sha512-a0MlOjNLIM18l/66S+CzhANQR3QH3jDUa1MC50E4KBf1mwjQyfqd6RdfbOTMDjgFlPrfB+5JvoWOHHGj7FFM1A==", + "dev": true, + "dependencies": { + "@angular-eslint/eslint-plugin": "17.5.3", + "@angular-eslint/eslint-plugin-template": "17.5.3", + "ignore": "5.3.1", + "strip-json-comments": "3.1.1", + "tmp": "0.2.3" + }, + "peerDependencies": { + "@angular/cli": ">= 17.0.0 < 18.0.0" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@angular-eslint/template-parser": { + "version": "17.5.3", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.5.3.tgz", + "integrity": "sha512-NYybOsMkJUtFOW2JWALicipq0kK5+jGwA1MYyRoXjdbDlXltHUb9qkXj7p0fE6uRutBGXDl4288s8g/fZCnAIA==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "17.5.3", + "eslint-scope": "^8.0.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/template-parser/node_modules/eslint-scope": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@angular-eslint/template-parser/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, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@angular-eslint/utils": { + "version": "17.5.3", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.5.3.tgz", + "integrity": "sha512-0nNm1FUOLhVHrdK2PP5dZCYYVmTIkEJ4CmlwpuC4JtCLbD5XAHQpY/ZW5Ff5n1b7KfJt1Zy//jlhkkIaw3LaBQ==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "17.5.3", + "@typescript-eslint/utils": "7.11.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, "node_modules/@angular/animations": { "version": "17.3.12", "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.12.tgz", @@ -2756,6 +2904,129 @@ "node": ">=12" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "dev": true, + "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, + "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/eslintrc/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, + "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/@eslint/eslintrc/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 + }, + "node_modules/@eslint/eslintrc/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, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/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 + }, + "node_modules/@eslint/eslintrc/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@fortawesome/angular-fontawesome": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.14.1.tgz", @@ -2809,6 +3080,41 @@ "node": ">=6" } }, + "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, + "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, + "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 + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -2930,6 +3236,18 @@ "node": ">=8" } }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -4102,6 +4420,18 @@ "node": ">=14" } }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", @@ -4409,6 +4739,12 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", @@ -4673,67 +5009,311 @@ "@types/node": "*" } }, - "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.11.0.tgz", + "integrity": "sha512-P+qEahbgeHW4JQ/87FuItjBj8O3MYv5gELDzr8QaQ7fsll1gSMTYb6j87MYyxwf3DtD7uGFB9ShwgmCJB5KmaQ==", "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.11.0", + "@typescript-eslint/type-utils": "7.11.0", + "@typescript-eslint/utils": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, "engines": { - "node": ">=14.6.0" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "node_modules/@typescript-eslint/parser": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.11.0.tgz", + "integrity": "sha512-yimw99teuaXVWsBcPO1Ais02kwJ1jmNA1KxE7ng0aT7ndr1pT1wqj0OJnsYVGKKlc4QJai86l/025L6z8CljOg==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@typescript-eslint/scope-manager": "7.11.0", + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/typescript-estree": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.11.0.tgz", + "integrity": "sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "node_modules/@typescript-eslint/type-utils": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.11.0.tgz", + "integrity": "sha512-WmppUEgYy+y1NTseNMJ6mCFxt03/7jTOy08bcg7bxJJdsM4nuhnchyBbE8vryveaJUf62noH7LodPSo5Z0WUCg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.11.0", + "@typescript-eslint/utils": "7.11.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.11.0.tgz", + "integrity": "sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.11.0.tgz", + "integrity": "sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "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/@typescript-eslint/typescript-estree/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, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.11.0.tgz", + "integrity": "sha512-xlAWwPleNRHwF37AhrZurOxA1wyXowW4PqVXZVUNCLjB48CqdPJoJWkrpH2nij9Q3Lb7rtWindtoXwxjxlKKCA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.11.0", + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/typescript-estree": "7.11.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.11.0.tgz", + "integrity": "sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.11.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", + "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "dev": true, + "engines": { + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -4901,6 +5481,15 @@ "acorn": "^8" } }, + "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, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", @@ -5089,12 +5678,30 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, + "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, + "engines": { + "node": ">=8" + } + }, "node_modules/autoprefixer": { "version": "10.4.18", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", @@ -5132,6 +5739,15 @@ "postcss": "^8.1.0" } }, + "node_modules/axobject-query": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", + "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, "node_modules/babel-loader": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", @@ -5820,6 +6436,15 @@ "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -6312,6 +6937,12 @@ } } }, + "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 + }, "node_modules/default-gateway": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", @@ -6371,6 +7002,15 @@ "node": ">= 0.8" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -6405,6 +7045,12 @@ "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -6417,6 +7063,18 @@ "node": ">=6" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", @@ -6653,119 +7311,505 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.1.tgz", + "integrity": "sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.1", + "@esbuild/android-arm": "0.20.1", + "@esbuild/android-arm64": "0.20.1", + "@esbuild/android-x64": "0.20.1", + "@esbuild/darwin-arm64": "0.20.1", + "@esbuild/darwin-x64": "0.20.1", + "@esbuild/freebsd-arm64": "0.20.1", + "@esbuild/freebsd-x64": "0.20.1", + "@esbuild/linux-arm": "0.20.1", + "@esbuild/linux-arm64": "0.20.1", + "@esbuild/linux-ia32": "0.20.1", + "@esbuild/linux-loong64": "0.20.1", + "@esbuild/linux-mips64el": "0.20.1", + "@esbuild/linux-ppc64": "0.20.1", + "@esbuild/linux-riscv64": "0.20.1", + "@esbuild/linux-s390x": "0.20.1", + "@esbuild/linux-x64": "0.20.1", + "@esbuild/netbsd-x64": "0.20.1", + "@esbuild/openbsd-x64": "0.20.1", + "@esbuild/sunos-x64": "0.20.1", + "@esbuild/win32-arm64": "0.20.1", + "@esbuild/win32-ia32": "0.20.1", + "@esbuild/win32-x64": "0.20.1" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.20.1.tgz", + "integrity": "sha512-6v/WJubRsjxBbQdz6izgvx7LsVFvVaGmSdwrFHmEzoVgfXL89hkKPoQHsnVI2ngOkcBUQT9kmAM1hVL1k/Av4A==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "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, + "engines": { + "node": ">=0.8.0" + } + }, + "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, + "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": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "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, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "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, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/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, + "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/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/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 + }, + "node_modules/eslint/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, + "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/eslint/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, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/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 + }, + "node_modules/eslint/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "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, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/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, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/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, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/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 + }, + "node_modules/eslint/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, "dependencies": { - "get-intrinsic": "^1.2.4" + "p-locate": "^5.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/eslint/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, + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.1.tgz", - "integrity": "sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==", + "node_modules/eslint/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, - "hasInstallScript": true, - "optional": true, - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "p-limit": "^3.0.2" }, "engines": { - "node": ">=12" + "node": ">=10" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.1", - "@esbuild/android-arm": "0.20.1", - "@esbuild/android-arm64": "0.20.1", - "@esbuild/android-x64": "0.20.1", - "@esbuild/darwin-arm64": "0.20.1", - "@esbuild/darwin-x64": "0.20.1", - "@esbuild/freebsd-arm64": "0.20.1", - "@esbuild/freebsd-x64": "0.20.1", - "@esbuild/linux-arm": "0.20.1", - "@esbuild/linux-arm64": "0.20.1", - "@esbuild/linux-ia32": "0.20.1", - "@esbuild/linux-loong64": "0.20.1", - "@esbuild/linux-mips64el": "0.20.1", - "@esbuild/linux-ppc64": "0.20.1", - "@esbuild/linux-riscv64": "0.20.1", - "@esbuild/linux-s390x": "0.20.1", - "@esbuild/linux-x64": "0.20.1", - "@esbuild/netbsd-x64": "0.20.1", - "@esbuild/openbsd-x64": "0.20.1", - "@esbuild/sunos-x64": "0.20.1", - "@esbuild/win32-arm64": "0.20.1", - "@esbuild/win32-ia32": "0.20.1", - "@esbuild/win32-x64": "0.20.1" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esbuild-wasm": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.20.1.tgz", - "integrity": "sha512-6v/WJubRsjxBbQdz6izgvx7LsVFvVaGmSdwrFHmEzoVgfXL89hkKPoQHsnVI2ngOkcBUQT9kmAM1hVL1k/Av4A==", + "node_modules/eslint/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, - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "has-flag": "^4.0.0" }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/eslint/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, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "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==", + "node_modules/eslint/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, "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">=8.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -6781,6 +7825,27 @@ "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, + "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, + "engines": { + "node": ">=4.0" + } + }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -7001,6 +8066,12 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "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 + }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -7023,6 +8094,12 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "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 + }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -7059,6 +8136,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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, + "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", @@ -7154,6 +8243,20 @@ "flat": "cli.js" } }, + "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, + "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.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", @@ -7443,12 +8546,39 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -8068,6 +9198,15 @@ "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, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", @@ -8377,6 +9516,12 @@ "node": ">=4" } }, + "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 + }, "node_modules/json-parse-even-better-errors": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", @@ -8392,6 +9537,12 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "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 + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -8639,6 +9790,15 @@ "node": ">=10" } }, + "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, + "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", @@ -8760,6 +9920,19 @@ "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, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/license-webpack-plugin": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", @@ -8825,6 +9998,12 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "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 + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -8896,35 +10075,113 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/loglevel": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/loglevel-colored-level-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", + "integrity": "sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "loglevel": "^1.4.1" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/log-symbols/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==", + "node_modules/loglevel-colored-level-prefix/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/log4js": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", - "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "node_modules/loglevel-colored-level-prefix/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true, - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.5" - }, "engines": { - "node": ">=8.0" + "node": ">=0.8.0" } }, "node_modules/lru-cache": { @@ -9417,6 +10674,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "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 + }, "node_modules/needle": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", @@ -9875,6 +11138,23 @@ "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, + "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/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -10515,6 +11795,259 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "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, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-eslint": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.3.0.tgz", + "integrity": "sha512-Lh102TIFCr11PJKUMQ2kwNmxGhTsv/KzUg9QYF2Gkw259g/kPgndZDWavk7/ycbRvj2oz4BPZ1gCU8bhfZH/Xg==", + "dev": true, + "dependencies": { + "@typescript-eslint/parser": "^6.7.5", + "common-tags": "^1.4.0", + "dlv": "^1.1.0", + "eslint": "^8.7.0", + "indent-string": "^4.0.0", + "lodash.merge": "^4.6.0", + "loglevel-colored-level-prefix": "^1.0.0", + "prettier": "^3.0.1", + "pretty-format": "^29.7.0", + "require-relative": "^0.8.7", + "typescript": "^5.2.2", + "vue-eslint-parser": "^9.1.0" + }, + "engines": { + "node": ">=16.10.0" + }, + "peerDependencies": { + "prettier-plugin-svelte": "^3.0.0", + "svelte-eslint-parser": "*" + }, + "peerDependenciesMeta": { + "prettier-plugin-svelte": { + "optional": true + }, + "svelte-eslint-parser": { + "optional": true + } + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/prettier-eslint/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/prettier-eslint/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "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/prettier-eslint/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/prettier-eslint/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/proc-log": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", @@ -10661,6 +12194,12 @@ "node": ">= 0.8" } }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, "node_modules/read-package-json": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.1.tgz", @@ -10882,6 +12421,12 @@ "node": ">=0.10.0" } }, + "node_modules/require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==", + "dev": true + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -11862,6 +13407,18 @@ "node": ">=6" } }, + "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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -11895,6 +13452,22 @@ "node": ">=0.10" } }, + "node_modules/synckit": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -12087,6 +13660,12 @@ "node": ">=8" } }, + "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 + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -12144,6 +13723,18 @@ "tree-kill": "cli.js" } }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/tslib": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", @@ -12163,6 +13754,18 @@ "node": "^16.14.0 || >=18.0.0" } }, + "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, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -12900,6 +14503,55 @@ "node": ">=0.10.0" } }, + "node_modules/vue-eslint-parser": { + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", + "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/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, + "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/vue-eslint-parser/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, + "engines": { + "node": ">=4.0" + } + }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -13240,6 +14892,15 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", diff --git a/package.json b/package.json index 8ed4bfb..34f4bcb 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,9 @@ "start": "ng serve", "build": "ng build", "watch": "ng build --watch --configuration development", - "test": "ng test" + "test": "ng test", + "lint": "ng lint", + "format": "prettier --write \"src/**/*.+(ts|jsx|tsx|css)\"" }, "private": true, "dependencies": { @@ -30,15 +32,27 @@ }, "devDependencies": { "@angular-devkit/build-angular": "^17.3.0", + "@angular-eslint/builder": "17.5.3", + "@angular-eslint/eslint-plugin": "17.5.3", + "@angular-eslint/eslint-plugin-template": "17.5.3", + "@angular-eslint/schematics": "17.5.3", + "@angular-eslint/template-parser": "17.5.3", "@angular/cli": "^17.3.0", "@angular/compiler-cli": "^17.3.0", "@types/jasmine": "~5.1.0", + "@typescript-eslint/eslint-plugin": "7.11.0", + "@typescript-eslint/parser": "7.11.0", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", "jasmine-core": "~5.1.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.2.0", "karma-coverage": "~2.2.0", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.1.0", + "prettier": "^3.3.3", + "prettier-eslint": "^16.3.0", "typescript": "~5.4.2" } -} \ No newline at end of file +} diff --git a/src/app/animation.ts b/src/app/animation.ts index e181aa9..e659724 100644 --- a/src/app/animation.ts +++ b/src/app/animation.ts @@ -1,10 +1,8 @@ import { animate, style, transition, trigger } from '@angular/animations'; - -export const slideInAnimation = - trigger('routeAnimations', [ - transition('* <=> *', [ - style({ opacity: 0, transform: 'translateY(20px)'}), - animate('500ms ease-in', style({ opacity: 1, transform: 'translateY(0)' })) - ]) - ]); \ No newline at end of file +export const slideInAnimation = trigger('routeAnimations', [ + transition('* <=> *', [ + style({ opacity: 0, transform: 'translateY(20px)' }), + animate('500ms ease-in', style({ opacity: 1, transform: 'translateY(0)' })), + ]), +]); diff --git a/src/app/app.component.css b/src/app/app.component.css index fca27b5..c75700a 100644 --- a/src/app/app.component.css +++ b/src/app/app.component.css @@ -1,209 +1,208 @@ mat-toolbar { - display: inline-flex; - position: fixed; - z-index: 10; - top: 0px; - left: 0px; + display: inline-flex; + position: fixed; + z-index: 10; + top: 0px; + left: 0px; } mat-drawer { - position: fixed; - z-index: 11; - top: 0px; - left: 0px; - width: 250px; - padding: 20px 10px; + position: fixed; + z-index: 11; + top: 0px; + left: 0px; + width: 250px; + padding: 20px 10px; } mat-drawer mat-nav-list { - padding-top: var(--mat-toolbar-standard-height); + padding-top: var(--mat-toolbar-standard-height); } mat-drawer-container { - padding-top: var(--mat-toolbar-standard-height); - box-sizing: border-box; - width: 100%; - background-color: transparent; + padding-top: var(--mat-toolbar-standard-height); + box-sizing: border-box; + width: 100%; + background-color: transparent; } @media (max-width: 599px) { - mat-drawer-container { - padding-top: var(--mat-toolbar-mobile-height); - } + mat-drawer-container { + padding-top: var(--mat-toolbar-mobile-height); + } - mat-drawer mat-nav-list { - padding-top: var(--mat-toolbar-mobile-height); - } + mat-drawer mat-nav-list { + padding-top: var(--mat-toolbar-mobile-height); + } } .toolbar-spacer { - flex: 1 1 auto; + flex: 1 1 auto; } a.logo-button { - display: block; - height: 25px; + display: block; + height: 25px; } a.logo-button img { - height: 100%; + height: 100%; } .highlight-tab-link { - border-radius: 5px; - background-color: var(--blue-500); - transition: background-color 750ms var(--default-transition-timing-function); - margin-left: 10px; + border-radius: 5px; + background-color: var(--blue-500); + transition: background-color 750ms var(--default-transition-timing-function); + margin-left: 10px; } .highlight-tab-link:hover { - background-color: #7caeff; + background-color: #7caeff; } ::ng-deep .highlight-tab-link .mdc-tab__text-label { - color: #fff !important; - font-weight: bold; + color: #fff !important; + font-weight: bold; } @keyframes colorful-border { + 0%, + 100% { + border-color: var(--blue-500); + } - 0%, - 100% { - border-color: var(--blue-500); - } - - 25% { - border-color: var(--green-500); - } + 25% { + border-color: var(--green-500); + } - 50% { - border-color: var(--yellow-600); - } + 50% { + border-color: var(--yellow-600); + } - 75% { - border-color: var(--red-500); - } + 75% { + border-color: var(--red-500); + } } .highlight-list-item { - border: 2px solid; - border-radius: 5px; - animation: colorful-border 4000ms linear 0s infinite; + border: 2px solid; + border-radius: 5px; + animation: colorful-border 4000ms linear 0s infinite; } main { - margin: 0 auto; - width: 100%; - padding: 10px 0px; - box-sizing: border-box; + margin: 0 auto; + width: 100%; + padding: 10px 0px; + box-sizing: border-box; } footer { - width: 100%; - margin: 0 auto; - box-sizing: border-box; - background-color: #e0e0e0; + width: 100%; + margin: 0 auto; + box-sizing: border-box; + background-color: #e0e0e0; } .footer-container { - padding: 20px 10px 5px; - margin: 0px auto; - width: 100%; - box-sizing: border-box; + padding: 20px 10px 5px; + margin: 0px auto; + width: 100%; + box-sizing: border-box; } .footer-box-group { - display: flex; - flex-wrap: wrap; - justify-content: space-between; - align-items: flex-start; - align-content: flex-start; - margin: 10px 0px; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: flex-start; + align-content: flex-start; + margin: 10px 0px; } .footer-box-title { - font-size: 1.2rem; + font-size: 1.2rem; } .footer-box { - width: 300px; + width: 300px; } .footer-box ul { - padding: 0; - margin: 0; - list-style: none; + padding: 0; + margin: 0; + list-style: none; } .footer-box ul li { - padding: 0; - margin: 5px 0px; + padding: 0; + margin: 5px 0px; } .footer-box ul li a, .footer-box ul li a:visited { - line-height: 1.2rem; - color: var(--black-02); + line-height: 1.2rem; + color: var(--black-02); } .footer-box ul li a:hover { - color: var(--green-500); - transition: color 750ms var(--default-transition-timing-function); + color: var(--green-500); + transition: color 750ms var(--default-transition-timing-function); } .footer-box-last { - display: flex; - align-items: center; - margin-top: 10px; + display: flex; + align-items: center; + margin-top: 10px; } .footer-box-last-spacer { - flex: 1 1 auto; + flex: 1 1 auto; } @media screen and (max-width: 550px) { - .footer-box-last { - flex-flow: row wrap; - justify-content: center; - } + .footer-box-last { + flex-flow: row wrap; + justify-content: center; + } - .footer-box-last-spacer { - width: 100%; - } + .footer-box-last-spacer { + width: 100%; + } } .show-when-screen-smaller-than-900px { - display: none; + display: none; } .menu-button { - margin-right: 10px; + margin-right: 10px; } .footer-button-group { - display: flex; - justify-content: flex-start; - gap: 5px; + display: flex; + justify-content: flex-start; + gap: 5px; } .footer-button svg { - width: 25px; - height: 25px; - fill: var(--black-02); - margin-right: 5px; + width: 25px; + height: 25px; + fill: var(--black-02); + margin-right: 5px; } .footer-button:hover svg { - fill: var(--green-500); - transition: fill 750ms var(--default-transition-timing-function); + fill: var(--green-500); + transition: fill 750ms var(--default-transition-timing-function); } @media screen and (max-width: 900px) { - .hide-when-screen-smaller-than-900px { - display: none; - } - - .show-when-screen-smaller-than-900px { - display: block; - } -} \ No newline at end of file + .hide-when-screen-smaller-than-900px { + display: none; + } + + .show-when-screen-smaller-than-900px { + display: block; + } +} diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index b1e05a2..96eafc4 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -24,6 +24,8 @@ describe('AppComponent', () => { const fixture = TestBed.createComponent(AppComponent); fixture.detectChanges(); const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('h1')?.textContent).toContain('Hello, dev-fest-2024'); + expect(compiled.querySelector('h1')?.textContent).toContain( + 'Hello, dev-fest-2024', + ); }); }); diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 544be0c..a547e98 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,5 +1,9 @@ import { Component } from '@angular/core'; -import { ChildrenOutletContexts, RouterModule, RouterOutlet } from '@angular/router'; +import { + ChildrenOutletContexts, + RouterModule, + RouterOutlet, +} from '@angular/router'; import { MatIconModule } from '@angular/material/icon'; import { MatButtonModule } from '@angular/material/button'; import { MatToolbarModule } from '@angular/material/toolbar'; @@ -12,15 +16,27 @@ import { CommonModule } from '@angular/common'; @Component({ selector: 'app-root', standalone: true, - imports: [RouterOutlet, RouterModule, MatToolbarModule, MatButtonModule, MatIconModule, MatTabsModule, MatSidenavModule, MatListModule, CommonModule], + imports: [ + RouterOutlet, + RouterModule, + MatToolbarModule, + MatButtonModule, + MatIconModule, + MatTabsModule, + MatSidenavModule, + MatListModule, + CommonModule, + ], templateUrl: './app.component.html', styleUrl: './app.component.css', animations: [slideInAnimation], }) export class AppComponent { - constructor(private contexts: ChildrenOutletContexts) { } + constructor(private contexts: ChildrenOutletContexts) {} getRouteAnimationData() { - return this.contexts.getContext('primary')?.route?.snapshot?.data?.['animations']; + return this.contexts.getContext('primary')?.route?.snapshot?.data?.[ + 'animations' + ]; } title = 'dev-fest-2024'; @@ -29,11 +45,15 @@ export class AppComponent { new Link('講者', '/speakers', false, '🎤'), new Link('議程', '/schedule', false, '🗓️'), new Link('團隊', '/team', false, '👨‍👩‍👧‍👦'), - new Link('部落格', '/blog', false, '📝') + new Link('部落格', '/blog', false, '📝'), ]; } class Link { - constructor(public name: string, public link: string, public exact: boolean, public emoji: string) { - } -} \ No newline at end of file + constructor( + public name: string, + public link: string, + public exact: boolean, + public emoji: string, + ) {} +} diff --git a/src/app/app.config.ts b/src/app/app.config.ts index c06624f..0562d17 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -8,15 +8,22 @@ import { LoadSpeakersService } from './load-speakers.service'; import { LoadScheduleService } from './load-schedule.service'; export const appConfig: ApplicationConfig = { - providers: [provideRouter(routes), provideClientHydration(), provideAnimationsAsync(), provideHttpClient(withFetch()), { - provide: APP_INITIALIZER, - useFactory: (service: LoadSpeakersService) => () => service.load(), - deps: [LoadSpeakersService], - multi: true - }, { - provide: APP_INITIALIZER, - useFactory: (service: LoadScheduleService) => () => service.load(), - deps: [LoadScheduleService], - multi: true - }] + providers: [ + provideRouter(routes), + provideClientHydration(), + provideAnimationsAsync(), + provideHttpClient(withFetch()), + { + provide: APP_INITIALIZER, + useFactory: (service: LoadSpeakersService) => () => service.load(), + deps: [LoadSpeakersService], + multi: true, + }, + { + provide: APP_INITIALIZER, + useFactory: (service: LoadScheduleService) => () => service.load(), + deps: [LoadScheduleService], + multi: true, + }, + ], }; diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index 4ad9e09..3f1595a 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -10,26 +10,52 @@ import { CodComponent } from './cod/cod.component'; const titleSuffix = 'GDG DevFest Taipei 2024'; export const routes: Routes = [ - { path: '', component: HomeComponent, data: { animations: 'homePage' }, title: titleSuffix }, - { - path: 'speakers', component: SpeakersComponent, data: { animations: 'speakersPage' }, children: [ - { - path: ':id', - component: SpeakerDialogEntryComponent, - } - ], - title: `講者 | ${titleSuffix}` - }, - { - path: 'schedule', component: ScheduleComponent, data: { animations: 'schedulePage' }, children: [ - { - path: ':id', - component: ScheduleDialogEntryComponent, - } - ], - title: `議程 | ${titleSuffix}` - }, - { path: 'team', component: TeamComponent, data: { animations: 'teamPage' }, title: `團隊 | ${titleSuffix}` }, - { path: 'blog', component: BlogComponent, data: { animations: 'blogPage' }, title: `部落格 | ${titleSuffix}` }, - { path: 'cod', component: CodComponent, data: { animations: 'codePage' }, title: `社群活動指引 | ${titleSuffix}` } + { + path: '', + component: HomeComponent, + data: { animations: 'homePage' }, + title: titleSuffix, + }, + { + path: 'speakers', + component: SpeakersComponent, + data: { animations: 'speakersPage' }, + children: [ + { + path: ':id', + component: SpeakerDialogEntryComponent, + }, + ], + title: `講者 | ${titleSuffix}`, + }, + { + path: 'schedule', + component: ScheduleComponent, + data: { animations: 'schedulePage' }, + children: [ + { + path: ':id', + component: ScheduleDialogEntryComponent, + }, + ], + title: `議程 | ${titleSuffix}`, + }, + { + path: 'team', + component: TeamComponent, + data: { animations: 'teamPage' }, + title: `團隊 | ${titleSuffix}`, + }, + { + path: 'blog', + component: BlogComponent, + data: { animations: 'blogPage' }, + title: `部落格 | ${titleSuffix}`, + }, + { + path: 'cod', + component: CodComponent, + data: { animations: 'codePage' }, + title: `社群活動指引 | ${titleSuffix}`, + }, ]; diff --git a/src/app/blog/blog.component.spec.ts b/src/app/blog/blog.component.spec.ts index 7f867e8..0a73b5c 100644 --- a/src/app/blog/blog.component.spec.ts +++ b/src/app/blog/blog.component.spec.ts @@ -8,10 +8,9 @@ describe('BlogComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [BlogComponent] - }) - .compileComponents(); - + imports: [BlogComponent], + }).compileComponents(); + fixture = TestBed.createComponent(BlogComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/src/app/blog/blog.component.ts b/src/app/blog/blog.component.ts index b512241..69a0813 100644 --- a/src/app/blog/blog.component.ts +++ b/src/app/blog/blog.component.ts @@ -5,8 +5,6 @@ import { Component } from '@angular/core'; standalone: true, imports: [], templateUrl: './blog.component.html', - styleUrl: './blog.component.css' + styleUrl: './blog.component.css', }) -export class BlogComponent { - -} +export class BlogComponent {} diff --git a/src/app/cod/cod.component.spec.ts b/src/app/cod/cod.component.spec.ts index 0bbd3ef..2e2a218 100644 --- a/src/app/cod/cod.component.spec.ts +++ b/src/app/cod/cod.component.spec.ts @@ -8,10 +8,9 @@ describe('CodComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [CodComponent] - }) - .compileComponents(); - + imports: [CodComponent], + }).compileComponents(); + fixture = TestBed.createComponent(CodComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/src/app/cod/cod.component.ts b/src/app/cod/cod.component.ts index 29ebef3..493d043 100644 --- a/src/app/cod/cod.component.ts +++ b/src/app/cod/cod.component.ts @@ -5,8 +5,6 @@ import { Component } from '@angular/core'; standalone: true, imports: [], templateUrl: './cod.component.html', - styleUrl: './cod.component.css' + styleUrl: './cod.component.css', }) -export class CodComponent { - -} +export class CodComponent {} diff --git a/src/app/home/home.component.css b/src/app/home/home.component.css index ee79f4d..d91a220 100644 --- a/src/app/home/home.component.css +++ b/src/app/home/home.component.css @@ -1,85 +1,84 @@ -.cover{ - width: 100%; - height: calc(100dvh - var(--mat-toolbar-standard-height)); - background-size: cover; - background-position: center; - background-attachment: fixed; - margin-top: -10px; +.cover { + width: 100%; + height: calc(100dvh - var(--mat-toolbar-standard-height)); + background-size: cover; + background-position: center; + background-attachment: fixed; + margin-top: -10px; } @media (max-width: 599px) { - .cover { - padding-bottom: calc(100dvh - var(--mat-toolbar-mobile-height)); - } + .cover { + padding-bottom: calc(100dvh - var(--mat-toolbar-mobile-height)); + } } .two-columns { - display: flex; - width: 100%; + display: flex; + width: 100%; } -.two-columns div { - padding: 10px; +.two-columns div { + padding: 10px; } -.two-columns-texts h1{ - display: block; - font-size: 2rem; - font-weight: bold; - margin: 0.67rem 0rem; +.two-columns-texts h1 { + display: block; + font-size: 2rem; + font-weight: bold; + margin: 0.67rem 0rem; } .two-columns-texts p { - font-size: 1.5rem; - line-height: 2rem; + font-size: 1.5rem; + line-height: 2rem; } -.two-columns-texts{ - flex: 1 1 50%; +.two-columns-texts { + flex: 1 1 50%; } -.two-columns-image{ - max-width: 450px; +.two-columns-image { + max-width: 450px; } .two-columns-image img { - width: 100%; + width: 100%; } @media (max-width: 899px) { - .two-columns { - flex-wrap: wrap; - justify-content: center; - } - .two-columns-texts p { - font-size: 1.3rem; - } + .two-columns { + flex-wrap: wrap; + justify-content: center; + } + .two-columns-texts p { + font-size: 1.3rem; + } } @media (max-width: 599px) { - .two-columns-texts p { - font-size: 1.1rem; - line-height: 1.6rem; - } + .two-columns-texts p { + font-size: 1.1rem; + line-height: 1.6rem; + } } .banner { - width: 100%; - background-color: var(--pastel-blue); - padding: 50px 0px; - margin: 10px 0px; + width: 100%; + background-color: var(--pastel-blue); + padding: 50px 0px; + margin: 10px 0px; } -.banner div{ - margin: 0 auto; - max-width: 1200px; - padding: 0px 25px; +.banner div { + margin: 0 auto; + max-width: 1200px; + padding: 0px 25px; } .banner img { - width: 100%; - display: block; - max-width: 600px; - margin: 0 auto; + width: 100%; + display: block; + max-width: 600px; + margin: 0 auto; } - diff --git a/src/app/home/home.component.spec.ts b/src/app/home/home.component.spec.ts index 60c47c4..7737f1c 100644 --- a/src/app/home/home.component.spec.ts +++ b/src/app/home/home.component.spec.ts @@ -8,10 +8,9 @@ describe('HomeComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [HomeComponent] - }) - .compileComponents(); - + imports: [HomeComponent], + }).compileComponents(); + fixture = TestBed.createComponent(HomeComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/src/app/home/home.component.ts b/src/app/home/home.component.ts index deaec52..14c5108 100644 --- a/src/app/home/home.component.ts +++ b/src/app/home/home.component.ts @@ -5,8 +5,6 @@ import { Component } from '@angular/core'; standalone: true, imports: [], templateUrl: './home.component.html', - styleUrl: './home.component.css' + styleUrl: './home.component.css', }) -export class HomeComponent { - -} +export class HomeComponent {} diff --git a/src/app/load-schedule.service.ts b/src/app/load-schedule.service.ts index 0814453..f87b76d 100644 --- a/src/app/load-schedule.service.ts +++ b/src/app/load-schedule.service.ts @@ -38,7 +38,7 @@ export interface Session { export interface Schedule { date: string; isDefault: boolean; - rooms: any; + // rooms: any; timeSlots: { slotStart: string; rooms: { @@ -51,23 +51,27 @@ export interface Schedule { } class GeneratedCategoryInfo { - constructor(public level: string, public language: string, public tags: string[]) { } + constructor( + public level: string, + public language: string, + public tags: string[], + ) {} static fromCategory(value: Category[]): GeneratedCategoryInfo { - let level: string = ""; - let lang: string = ""; + let level: string = ''; + let lang: string = ''; let tags: string[] = []; for (let i = 0; i < value.length; i++) { - let v = value[i]; + const v = value[i]; switch (v.name) { - case "Language": + case 'Language': for (let i = 0; i < v.categoryItems.length; i++) { lang += v.categoryItems[i].name; } break; - case "Level": - level = v.categoryItems.map((u) => u.name).join(""); + case 'Level': + level = v.categoryItems.map((u) => u.name).join(''); break; - case "Tags": + case 'Tags': tags = v.categoryItems.map((u) => u.name); break; } @@ -77,22 +81,24 @@ class GeneratedCategoryInfo { } @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class LoadScheduleService { public schedules: Schedule[] = []; public sessionsMap: Map = new Map(); - constructor(private http: HttpClient) { } + constructor(private http: HttpClient) {} async load(): Promise { - let schedule = this.http.get("./assets/schedules.json"); + const schedule = this.http.get('./assets/schedules.json'); this.schedules = await lastValueFrom(schedule); - for (let schedule of this.schedules) { - for (let slot of schedule.timeSlots) { - for (let room of slot.rooms) { - room.session.generatedCategories = GeneratedCategoryInfo.fromCategory(room.session.categories); - this.sessionsMap.set(room.session.id, room.session) + for (const schedule of this.schedules) { + for (const slot of schedule.timeSlots) { + for (const room of slot.rooms) { + room.session.generatedCategories = GeneratedCategoryInfo.fromCategory( + room.session.categories, + ); + this.sessionsMap.set(room.session.id, room.session); } } } diff --git a/src/app/load-speakers.service.ts b/src/app/load-speakers.service.ts index 8c950c0..5be19e6 100644 --- a/src/app/load-speakers.service.ts +++ b/src/app/load-speakers.service.ts @@ -37,16 +37,16 @@ export interface Speaker { } @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class LoadSpeakersService { public speakers: Speaker[] = []; public speakersMap: Map = new Map(); constructor(private http: HttpClient) {} async load(): Promise { - let speakers = this.http.get("./assets/speakers.json"); + const speakers = this.http.get('./assets/speakers.json'); this.speakers = await lastValueFrom(speakers); - for(let i = 0; i < this.speakers.length; i++) { + for (let i = 0; i < this.speakers.length; i++) { this.speakersMap.set(this.speakers[i].id, this.speakers[i]); } return this.speakers; diff --git a/src/app/navigation.service.ts b/src/app/navigation.service.ts index 6f2ed30..dba7bd6 100644 --- a/src/app/navigation.service.ts +++ b/src/app/navigation.service.ts @@ -3,7 +3,7 @@ import { Injectable } from '@angular/core'; import { NavigationEnd, Router } from '@angular/router'; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class NavigationService { private history: string[] = []; @@ -24,7 +24,7 @@ export class NavigationService { // Upon closing the dialog, navigate back to the previous page. dialogBack(url: string): void { - this.history.pop() + this.history.pop(); if (this.history.length > 0) { url = this.history[this.history.length - 1]; this.disablePush = true; diff --git a/src/app/pipes/to-social-link-icon.pipe.ts b/src/app/pipes/to-social-link-icon.pipe.ts index 62e1795..b423384 100644 --- a/src/app/pipes/to-social-link-icon.pipe.ts +++ b/src/app/pipes/to-social-link-icon.pipe.ts @@ -1,7 +1,13 @@ -import { Pipe, PipeTransform } from "@angular/core"; -import { IconDefinition } from "@fortawesome/fontawesome-svg-core"; -import { faFacebookSquare, faGithub, faInstagram, faLinkedinIn, faXTwitter } from "@fortawesome/free-brands-svg-icons"; -import { faBlog, faLink } from "@fortawesome/free-solid-svg-icons"; +import { Pipe, PipeTransform } from '@angular/core'; +import { IconDefinition } from '@fortawesome/fontawesome-svg-core'; +import { + faFacebookSquare, + faGithub, + faInstagram, + faLinkedinIn, + faXTwitter, +} from '@fortawesome/free-brands-svg-icons'; +import { faBlog, faLink } from '@fortawesome/free-solid-svg-icons'; @Pipe({ standalone: true, @@ -10,21 +16,21 @@ import { faBlog, faLink } from "@fortawesome/free-solid-svg-icons"; export class LinkTypeToIconPipe implements PipeTransform { transform(value: string): IconDefinition { switch (value) { - case "Twitter": + case 'Twitter': return faXTwitter; - case "LinkedIn": + case 'LinkedIn': return faLinkedinIn; - case "Instagram": + case 'Instagram': return faInstagram; - case "Blog": + case 'Blog': return faBlog; - case "Facebook": + case 'Facebook': return faFacebookSquare; - case "Company_Website": - case "Sessionize": - case "Other": + case 'Company_Website': + case 'Sessionize': + case 'Other': return faLink; - case "Github": + case 'Github': return faGithub; } return faLink; diff --git a/src/app/pipes/truncate.pipe.ts b/src/app/pipes/truncate.pipe.ts index 98d7b59..a015817 100644 --- a/src/app/pipes/truncate.pipe.ts +++ b/src/app/pipes/truncate.pipe.ts @@ -1,14 +1,14 @@ -import { Pipe, PipeTransform } from "@angular/core"; +import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ - standalone: true, - name: 'truncateString', + standalone: true, + name: 'truncateString', }) export class TruncateStringPipe implements PipeTransform { - transform(value: string, length: number): string { - if (value.length > length) { - return value.substring(0, length) + '...' - } - return value; + transform(value: string, length: number): string { + if (value.length > length) { + return value.substring(0, length) + '...'; } + return value; + } } diff --git a/src/app/schedule/schedule-dialog.css b/src/app/schedule/schedule-dialog.css index f5d7e14..4828f28 100644 --- a/src/app/schedule/schedule-dialog.css +++ b/src/app/schedule/schedule-dialog.css @@ -1,28 +1,28 @@ mat-dialog-content h1 { - line-height: 2.2rem; - font-size: 1.5rem; - font-weight: bold; - margin-bottom: 20px; + line-height: 2.2rem; + font-size: 1.5rem; + font-weight: bold; + margin-bottom: 20px; } mat-dialog-content p { - color: #717171; + color: #717171; } ul.speaker-list a.speaker-avatar-link { - height: 60px; + height: 60px; } ul.speaker-list img { - width: 60px; - height: 60px; + width: 60px; + height: 60px; } ul.speaker-list p { - margin: 10px; + margin: 10px; } -.speaker-name{ - color: var(--black-02); - font-weight: bold; -} \ No newline at end of file +.speaker-name { + color: var(--black-02); + font-weight: bold; +} diff --git a/src/app/schedule/schedule-dialog.ts b/src/app/schedule/schedule-dialog.ts index 3c2027d..48385aa 100644 --- a/src/app/schedule/schedule-dialog.ts +++ b/src/app/schedule/schedule-dialog.ts @@ -1,76 +1,105 @@ -import { ChangeDetectionStrategy, Component, Injectable, NgZone } from "@angular/core"; -import { MatButtonModule } from "@angular/material/button"; -import { MatDialog, MatDialogModule } from "@angular/material/dialog"; -import { ActivatedRoute, NavigationStart, Router, RouterModule } from "@angular/router"; -import { LoadScheduleService, Session } from "../load-schedule.service"; -import { CommonModule } from "@angular/common"; -import { FontAwesomeModule } from "@fortawesome/angular-fontawesome"; -import { LinkTypeToIconPipe } from "../pipes/to-social-link-icon.pipe"; -import { MatIconModule } from "@angular/material/icon"; -import { MatChipsModule } from "@angular/material/chips"; -import { LoadSpeakersService, Speaker } from "../load-speakers.service"; -import { NavigationService } from "../navigation.service"; +import { + ChangeDetectionStrategy, + Component, + Injectable, + NgZone, + OnInit, +} from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialog, MatDialogModule } from '@angular/material/dialog'; +import { + ActivatedRoute, + NavigationStart, + Router, + RouterModule, +} from '@angular/router'; +import { LoadScheduleService, Session } from '../load-schedule.service'; +import { CommonModule } from '@angular/common'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { LinkTypeToIconPipe } from '../pipes/to-social-link-icon.pipe'; +import { MatIconModule } from '@angular/material/icon'; +import { MatChipsModule } from '@angular/material/chips'; +import { LoadSpeakersService, Speaker } from '../load-speakers.service'; +import { NavigationService } from '../navigation.service'; @Injectable({ - providedIn: 'root', + providedIn: 'root', }) class SessionDataService { - sessionID: string = ""; + sessionID: string = ''; } @Component({ - selector: 'schedule-dialog-entry', - template: '' + selector: 'app-schedule-dialog-entry', + template: '', }) -export class ScheduleDialogEntryComponent { - constructor(public dialog: MatDialog, private route: ActivatedRoute, public dataService: SessionDataService, - private zone: NgZone, private navigation: NavigationService, private router: Router) { - this.openDialog(); - } - ngOnInit() { - this.dataService.sessionID = this.route.snapshot.paramMap.get('id') ?? ""; - } - openDialog(): void { - const ref = this.dialog.open(ScheduleDialogComponent, { - autoFocus: false, - maxWidth: '80vw', // 設定最大寬度為螢幕寬度的 80% - width: '1200px', // 設定最大寬度為 1200px - }); +export class ScheduleDialogEntryComponent implements OnInit { + constructor( + public dialog: MatDialog, + private route: ActivatedRoute, + public dataService: SessionDataService, + private zone: NgZone, + private navigation: NavigationService, + private router: Router, + ) { + this.openDialog(); + } + ngOnInit() { + this.dataService.sessionID = this.route.snapshot.paramMap.get('id') ?? ''; + } + openDialog(): void { + const ref = this.dialog.open(ScheduleDialogComponent, { + autoFocus: false, + maxWidth: '80vw', // 設定最大寬度為螢幕寬度的 80% + width: '1200px', // 設定最大寬度為 1200px + }); - let withoutNavigation: boolean = false; + let withoutNavigation: boolean = false; - this.zone.run(() => { - ref.afterClosed().subscribe(_ => { - if (!withoutNavigation) { - this.navigation.dialogBack('/schedule') - } - }); - }) + this.zone.run(() => { + ref.afterClosed().subscribe(() => { + if (!withoutNavigation) { + this.navigation.dialogBack('/schedule'); + } + }); + }); - this.router.events.subscribe(event => { - if (event instanceof NavigationStart) { - withoutNavigation = true; - ref.close(); - } - }); - } + this.router.events.subscribe((event) => { + if (event instanceof NavigationStart) { + withoutNavigation = true; + ref.close(); + } + }); + } } @Component({ - selector: 'schedule-dialog', - standalone: true, - imports: [MatDialogModule, MatButtonModule, CommonModule, RouterModule, FontAwesomeModule, LinkTypeToIconPipe, MatIconModule, MatChipsModule], - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './schedule-dialog.html', - styleUrls: ['./schedule.component.css', './schedule-dialog.css'] + selector: 'app-schedule-dialog', + standalone: true, + imports: [ + MatDialogModule, + MatButtonModule, + CommonModule, + RouterModule, + FontAwesomeModule, + LinkTypeToIconPipe, + MatIconModule, + MatChipsModule, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + templateUrl: './schedule-dialog.html', + styleUrls: ['./schedule.component.css', './schedule-dialog.css'], }) -class ScheduleDialogComponent { - public session?: Session; - public speakersMap: Map = new Map(); - constructor(private dataService: SessionDataService, private speakerService: LoadSpeakersService, private service: LoadScheduleService) { - } - ngOnInit() { - this.session = this.service.sessionsMap.get(this.dataService.sessionID); - this.speakersMap = this.speakerService.speakersMap; - } -} \ No newline at end of file +class ScheduleDialogComponent implements OnInit { + public session?: Session; + public speakersMap: Map = new Map(); + constructor( + private dataService: SessionDataService, + private speakerService: LoadSpeakersService, + private service: LoadScheduleService, + ) {} + ngOnInit() { + this.session = this.service.sessionsMap.get(this.dataService.sessionID); + this.speakersMap = this.speakerService.speakersMap; + } +} diff --git a/src/app/schedule/schedule.component.css b/src/app/schedule/schedule.component.css index e5aac89..a16d3af 100644 --- a/src/app/schedule/schedule.component.css +++ b/src/app/schedule/schedule.component.css @@ -1,119 +1,121 @@ .mat-card-group { - margin: 10px 0px; - display: grid; - grid-template-columns: repeat(4, 1fr); - grid-gap: 10px; + margin: 10px 0px; + display: grid; + grid-template-columns: repeat(4, 1fr); + grid-gap: 10px; } .language-box { - border: 1px solid; - padding: 1px 5px; - float: right; + border: 1px solid; + padding: 1px 5px; + float: right; } .schedule-date { - padding-bottom: 5px; - color: var(--black-02); - border-bottom: 3px solid var(--black-02); - letter-spacing: 2px; - transition: border-bottom-color 750ms var(--default-transition-timing-function), color 750ms var(--default-transition-timing-function); + padding-bottom: 5px; + color: var(--black-02); + border-bottom: 3px solid var(--black-02); + letter-spacing: 2px; + transition: + border-bottom-color 750ms var(--default-transition-timing-function), + color 750ms var(--default-transition-timing-function); } .schedule-date:hover { - color: var(--blue-500); - border-bottom-color: var(--blue-500); + color: var(--blue-500); + border-bottom-color: var(--blue-500); } .schedule-time { - color: var(--blue-500); - font-size: 1.3rem; - margin: 20px 0px 5px; - letter-spacing: 3px; + color: var(--blue-500); + font-size: 1.3rem; + margin: 20px 0px 5px; + letter-spacing: 3px; } mat-card-subtitle { - margin-top: 10px; + margin-top: 10px; } mat-card { - display: flex; + display: flex; } ul.speaker-list { - list-style-type: none; - padding: 0px; - margin: 0px; + list-style-type: none; + padding: 0px; + margin: 0px; } ul.speaker-list li { - display: flex; - align-items: center; - margin: 10px 0px; - justify-content: flex-start; + display: flex; + align-items: center; + margin: 10px 0px; + justify-content: flex-start; } ul.speaker-list a.speaker-avatar-link { - margin-right: 10px; - display: block; - height: 40px; + margin-right: 10px; + display: block; + height: 40px; } ul.speaker-list img { - width: 40px; - height: 40px; - border-radius: 50%; - transition: box-shadow 750ms var(--default-transition-timing-function); - background-color: var(--pastel-green); + width: 40px; + height: 40px; + border-radius: 50%; + transition: box-shadow 750ms var(--default-transition-timing-function); + background-color: var(--pastel-green); } ul.speaker-list img:hover { - box-shadow: 0px 0px 5px var(--green-500); + box-shadow: 0px 0px 5px var(--green-500); } ul.speaker-list p { - margin: 5px; - font-size: 1rem; - line-height: 1.2rem; + margin: 5px; + font-size: 1rem; + line-height: 1.2rem; } ul.speaker-list p.speaker-tag-line { - font-size: 0.9rem; - color: rgba(0, 0, 0, 0.54); + font-size: 0.9rem; + color: rgba(0, 0, 0, 0.54); } .card-spacing { - flex: 1; + flex: 1; } mat-card-title a, mat-card-title a:visited { - color: unset; - text-decoration: none; - transition: color 750ms var(--default-transition-timing-function); + color: unset; + text-decoration: none; + transition: color 750ms var(--default-transition-timing-function); } -mat-card-title a:hover{ - color: var(--blue-500); +mat-card-title a:hover { + color: var(--blue-500); } mat-card-footer { - padding: 16px; + padding: 16px; } @media screen and (max-width: 1200px) { - .mat-card-group { - grid-template-columns: repeat(3, 1fr); - } + .mat-card-group { + grid-template-columns: repeat(3, 1fr); + } } @media screen and (max-width: 900px) { - .mat-card-group { - grid-template-columns: repeat(2, 1fr); - } + .mat-card-group { + grid-template-columns: repeat(2, 1fr); + } } @media screen and (max-width: 650px) { - .mat-card-group { - grid-template-columns: repeat(1, 1fr); - } -} \ No newline at end of file + .mat-card-group { + grid-template-columns: repeat(1, 1fr); + } +} diff --git a/src/app/schedule/schedule.component.spec.ts b/src/app/schedule/schedule.component.spec.ts index fb711d2..274a88b 100644 --- a/src/app/schedule/schedule.component.spec.ts +++ b/src/app/schedule/schedule.component.spec.ts @@ -8,10 +8,9 @@ describe('ScheduleComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [ScheduleComponent] - }) - .compileComponents(); - + imports: [ScheduleComponent], + }).compileComponents(); + fixture = TestBed.createComponent(ScheduleComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/src/app/schedule/schedule.component.ts b/src/app/schedule/schedule.component.ts index 236fbc9..4c27d9d 100644 --- a/src/app/schedule/schedule.component.ts +++ b/src/app/schedule/schedule.component.ts @@ -11,17 +11,26 @@ import { RouterModule } from '@angular/router'; @Component({ selector: 'app-schedule', standalone: true, - imports: [MatGridListModule, CommonModule, MatCardModule, TruncateStringPipe, MatChipsModule, RouterModule], + imports: [ + MatGridListModule, + CommonModule, + MatCardModule, + TruncateStringPipe, + MatChipsModule, + RouterModule, + ], templateUrl: './schedule.component.html', - styleUrl: './schedule.component.css' + styleUrl: './schedule.component.css', }) export class ScheduleComponent { cols: number = 0; schedules: Schedule[] = []; speakersMap: Map = new Map(); - constructor(private service: LoadScheduleService, private speakerService: LoadSpeakersService) { + constructor( + private service: LoadScheduleService, + private speakerService: LoadSpeakersService, + ) { this.schedules = this.service.schedules; this.speakersMap = this.speakerService.speakersMap; } } - diff --git a/src/app/speakers/speaker-dialog.css b/src/app/speakers/speaker-dialog.css index d487eb6..de7886b 100644 --- a/src/app/speakers/speaker-dialog.css +++ b/src/app/speakers/speaker-dialog.css @@ -1,55 +1,55 @@ .avatar-name-group { - display: flex; - align-items: center; + display: flex; + align-items: center; } .avatar-name-group .avatar { - border: 5px solid var(--pastel-green); - width: 128px; - height: 128px; - border-radius: 25px; - background-color: var(--pastel-green); + border: 5px solid var(--pastel-green); + width: 128px; + height: 128px; + border-radius: 25px; + background-color: var(--pastel-green); } .avatar-name-group .name-box { - margin-left: 20px; + margin-left: 20px; } .avatar-name-group .name-box .full-name { - font-size: 2rem; - line-height: 2rem; - color: var(--black-02); - margin: 10px 0px; + font-size: 2rem; + line-height: 2rem; + color: var(--black-02); + margin: 10px 0px; } .avatar-name-group .name-box .tag-line { - font-size: 1rem; - margin: 10px 0px; + font-size: 1rem; + margin: 10px 0px; } @media screen and (max-width: 750px) { - .avatar-name-group { - flex-direction: column; - } - - .avatar-name-group .name-box { - width: 100%; - margin: 15px 0px 0px; - } - - .avatar-name-group .name-box .full-name { - font-size: 1.5rem; - line-height: 1.5rem; - } + .avatar-name-group { + flex-direction: column; + } + + .avatar-name-group .name-box { + width: 100%; + margin: 15px 0px 0px; + } + + .avatar-name-group .name-box .full-name { + font-size: 1.5rem; + line-height: 1.5rem; + } } a, a:visited { - color: var(--blue-500); - text-decoration: none; - transition: color 750ms var(--default-transition-timing-function); + color: var(--blue-500); + text-decoration: none; + transition: color 750ms var(--default-transition-timing-function); } a:hover { - color: var(--green-500); -} \ No newline at end of file + color: var(--green-500); +} diff --git a/src/app/speakers/speaker-dialog.ts b/src/app/speakers/speaker-dialog.ts index e5e9f90..e08e275 100644 --- a/src/app/speakers/speaker-dialog.ts +++ b/src/app/speakers/speaker-dialog.ts @@ -1,11 +1,20 @@ -import { CommonModule, Location } from '@angular/common'; -import { ChangeDetectionStrategy, Component, Injectable, NgZone } from '@angular/core'; -import { MatCardModule } from '@angular/material/card'; +import { CommonModule } from '@angular/common'; +import { + ChangeDetectionStrategy, + Component, + Injectable, + NgZone, + OnInit, +} from '@angular/core'; import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; import { LinkTypeToIconPipe } from '../pipes/to-social-link-icon.pipe'; -import { TruncateStringPipe } from '../pipes/truncate.pipe'; import { LoadSpeakersService, Speaker } from '../load-speakers.service'; -import { ActivatedRoute, NavigationStart, Router, RouterModule } from '@angular/router'; +import { + ActivatedRoute, + NavigationStart, + Router, + RouterModule, +} from '@angular/router'; import { MatDialog, MatDialogModule } from '@angular/material/dialog'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; @@ -15,57 +24,73 @@ import { NavigationService } from '../navigation.service'; providedIn: 'root', }) class SpeakerDataService { - userID: string = ""; + userID: string = ''; } @Component({ template: '', - selector: 'speaker-dialog-entry', + selector: 'app-speaker-dialog-entry', }) -export class SpeakerDialogEntryComponent { - constructor(public dialog: MatDialog, private route: ActivatedRoute, - public dataService: SpeakerDataService, private zone: NgZone, private navigation: NavigationService, private router: Router) { +export class SpeakerDialogEntryComponent implements OnInit { + constructor( + public dialog: MatDialog, + private route: ActivatedRoute, + public dataService: SpeakerDataService, + private zone: NgZone, + private navigation: NavigationService, + private router: Router, + ) { this.openDialog(); } ngOnInit() { - this.dataService.userID = this.route.snapshot.paramMap.get('id') ?? ""; + this.dataService.userID = this.route.snapshot.paramMap.get('id') ?? ''; } openDialog(): void { const ref = this.dialog.open(SpeakerDialogComponent, { autoFocus: false, - maxWidth: "1000px", + maxWidth: '1000px', }); let withoutNavigation: boolean = false; this.zone.run(() => { - ref.afterClosed().subscribe(_ => { - if (!withoutNavigation) { - this.navigation.dialogBack('/speakers') - } - }); - }) - - this.router.events.subscribe(event => { - if (event instanceof NavigationStart) { - withoutNavigation = true; - ref.close(); + ref.afterClosed().subscribe(() => { + if (!withoutNavigation) { + this.navigation.dialogBack('/speakers'); } + }); + }); + + this.router.events.subscribe((event) => { + if (event instanceof NavigationStart) { + withoutNavigation = true; + ref.close(); + } }); } } @Component({ - selector: 'speaker-dialog', + selector: 'app-speaker-dialog', standalone: true, - imports: [MatDialogModule, MatButtonModule, CommonModule, RouterModule, FontAwesomeModule, LinkTypeToIconPipe, MatIconModule], + imports: [ + MatDialogModule, + MatButtonModule, + CommonModule, + RouterModule, + FontAwesomeModule, + LinkTypeToIconPipe, + MatIconModule, + ], changeDetection: ChangeDetectionStrategy.OnPush, templateUrl: './speaker-dialog.html', - styleUrls: ['./speakers.component.css', './speaker-dialog.css'] + styleUrls: ['./speakers.component.css', './speaker-dialog.css'], }) -class SpeakerDialogComponent { +class SpeakerDialogComponent implements OnInit { public speaker?: Speaker; - constructor(private dataService: SpeakerDataService, private service: LoadSpeakersService) { - } + constructor( + private dataService: SpeakerDataService, + private service: LoadSpeakersService, + ) {} ngOnInit() { this.speaker = this.service.speakersMap.get(this.dataService.userID); } diff --git a/src/app/speakers/speakers.component.css b/src/app/speakers/speakers.component.css index 9e2c182..b688806 100644 --- a/src/app/speakers/speakers.component.css +++ b/src/app/speakers/speakers.component.css @@ -1,63 +1,63 @@ .mat-card-group { - display: grid; - grid-template-columns: repeat(3, 1fr); - margin: 10px 0px; - grid-gap: 10px; + display: grid; + grid-template-columns: repeat(3, 1fr); + margin: 10px 0px; + grid-gap: 10px; } mat-card-header { - flex-direction: column; - align-items: center; + flex-direction: column; + align-items: center; } mat-card-content p { - word-break: break-word; + word-break: break-word; } .mat-mdc-card-avatar { - background-color: var(--pastel-green); - border: 5px solid var(--pastel-green); - width: 128px; - height: 128px; + background-color: var(--pastel-green); + border: 5px solid var(--pastel-green); + width: 128px; + height: 128px; } a.avatar-link { - text-decoration: none; + text-decoration: none; } .mat-mdc-card-avatar { - transition: box-shadow 750ms var(--default-transition-timing-function); + transition: box-shadow 750ms var(--default-transition-timing-function); } .mat-mdc-card-avatar:hover { - box-shadow: 0px 0px 10px var(--green-500); + box-shadow: 0px 0px 10px var(--green-500); } @media screen and (max-width: 1200px) { - .mat-card-group { - grid-template-columns: repeat(2, 1fr); - } + .mat-card-group { + grid-template-columns: repeat(2, 1fr); + } } @media screen and (max-width: 750px) { - .mat-card-group { - grid-template-columns: repeat(1, 1fr); - } + .mat-card-group { + grid-template-columns: repeat(1, 1fr); + } } .social-link-list { - display: flex; - gap: 10px; - justify-content: center; + display: flex; + gap: 10px; + justify-content: center; } .social-link, .social-link:visited { - font-size: 1.2rem; - color: #6b6b6b; - transition: color 300ms; + font-size: 1.2rem; + color: #6b6b6b; + transition: color 300ms; } .social-link:hover { - color: var(--black-02); -} \ No newline at end of file + color: var(--black-02); +} diff --git a/src/app/speakers/speakers.component.spec.ts b/src/app/speakers/speakers.component.spec.ts index ec387da..c31900c 100644 --- a/src/app/speakers/speakers.component.spec.ts +++ b/src/app/speakers/speakers.component.spec.ts @@ -8,10 +8,9 @@ describe('SpeakersComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [SpeakersComponent] - }) - .compileComponents(); - + imports: [SpeakersComponent], + }).compileComponents(); + fixture = TestBed.createComponent(SpeakersComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/src/app/speakers/speakers.component.ts b/src/app/speakers/speakers.component.ts index 148f5a4..2a78fc6 100644 --- a/src/app/speakers/speakers.component.ts +++ b/src/app/speakers/speakers.component.ts @@ -11,13 +11,21 @@ import { MatButtonModule } from '@angular/material/button'; @Component({ selector: 'app-speakers', standalone: true, - imports: [MatCardModule, FontAwesomeModule, CommonModule, LinkTypeToIconPipe, TruncateStringPipe, RouterModule, MatButtonModule], + imports: [ + MatCardModule, + FontAwesomeModule, + CommonModule, + LinkTypeToIconPipe, + TruncateStringPipe, + RouterModule, + MatButtonModule, + ], templateUrl: './speakers.component.html', - styleUrl: './speakers.component.css' + styleUrl: './speakers.component.css', }) export class SpeakersComponent { speakers: Speaker[] = []; constructor(private service: LoadSpeakersService) { this.speakers = this.service.speakers; } -} \ No newline at end of file +} diff --git a/src/app/team/team.component.css b/src/app/team/team.component.css index 48b7b7d..d4a1b1d 100644 --- a/src/app/team/team.component.css +++ b/src/app/team/team.component.css @@ -1,41 +1,41 @@ .mat-card-group { - display: grid; - grid-template-columns: repeat(3, 1fr); - margin: 10px 0px; - gap: 10px; + display: grid; + grid-template-columns: repeat(3, 1fr); + margin: 10px 0px; + gap: 10px; } mat-card-title-group img { - border: 5px solid var(--pastel-blue); - border-radius: 50%; - width: 100px; - height: 100px; - margin-left: 8px; + border: 5px solid var(--pastel-blue); + border-radius: 50%; + width: 100px; + height: 100px; + margin-left: 8px; } @media screen and (max-width: 1200px) { - .mat-card-group { - grid-template-columns: repeat(2, 1fr); - } + .mat-card-group { + grid-template-columns: repeat(2, 1fr); + } } @media screen and (max-width: 750px) { - .mat-card-group { - grid-template-columns: repeat(1, 1fr); - } + .mat-card-group { + grid-template-columns: repeat(1, 1fr); + } } .social-link-list { - display: flex; - gap: 10px; + display: flex; + gap: 10px; } .social-link { - font-size: 1.2rem; - color: #6b6b6b; - transition: color 300ms; + font-size: 1.2rem; + color: #6b6b6b; + transition: color 300ms; } .social-link:hover { - color: var(--black-02); -} \ No newline at end of file + color: var(--black-02); +} diff --git a/src/app/team/team.component.spec.ts b/src/app/team/team.component.spec.ts index ea2410c..e9786eb 100644 --- a/src/app/team/team.component.spec.ts +++ b/src/app/team/team.component.spec.ts @@ -8,10 +8,9 @@ describe('TeamComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [TeamComponent] - }) - .compileComponents(); - + imports: [TeamComponent], + }).compileComponents(); + fixture = TestBed.createComponent(TeamComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/src/app/team/team.component.ts b/src/app/team/team.component.ts index 4efe9c9..f8662c7 100644 --- a/src/app/team/team.component.ts +++ b/src/app/team/team.component.ts @@ -23,8 +23,8 @@ interface Link { } interface TeamMember { - name: string - bio: string + name: string; + bio: string; profilePicture: string | null; links: Link[]; } @@ -34,15 +34,15 @@ interface TeamMember { standalone: true, imports: [MatCardModule, FontAwesomeModule, CommonModule, LinkTypeToIconPipe], templateUrl: './team.component.html', - styleUrl: './team.component.css' + styleUrl: './team.component.css', }) export class TeamComponent { members: TeamMember[] = [ { - name: "name", - bio: "bio", + name: 'name', + bio: 'bio', profilePicture: null, links: [], - } - ] + }, + ]; } diff --git a/src/main.ts b/src/main.ts index 35b00f3..8882c45 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,5 +2,6 @@ import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; import { AppComponent } from './app/app.component'; -bootstrapApplication(AppComponent, appConfig) - .catch((err) => console.error(err)); +bootstrapApplication(AppComponent, appConfig).catch((err) => + console.error(err), +); diff --git a/src/styles.css b/src/styles.css index 6e4d319..d67689e 100644 --- a/src/styles.css +++ b/src/styles.css @@ -58,4 +58,4 @@ a:visited { a:hover { color: var(--green-500); -} \ No newline at end of file +}