diff --git a/.pnp.cjs b/.pnp.cjs index d13663a7b8..566c4b3ff2 100644 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -1177,9 +1177,44 @@ const RAW_RUNTIME_STATE = "eslint"\ ],\ "linkType": "HARD"\ + }],\ + ["virtual:4426ae1de0661049bc052715eaf9325b772e558c5025903e98d5f4550c207f161e1482790d656b663f49554ade660b02b65482fa731cb8e8e59b800fe4b6ee6a#npm:4.4.0", {\ + "packageLocation": "./.yarn/__virtual__/@eslint-community-eslint-utils-virtual-81686b1819/0/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-7e559c4ce5.zip/node_modules/@eslint-community/eslint-utils/",\ + "packageDependencies": [\ + ["@eslint-community/eslint-utils", "virtual:4426ae1de0661049bc052715eaf9325b772e558c5025903e98d5f4550c207f161e1482790d656b663f49554ade660b02b65482fa731cb8e8e59b800fe4b6ee6a#npm:4.4.0"],\ + ["@types/eslint", null],\ + ["eslint", null],\ + ["eslint-visitor-keys", "npm:3.4.3"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:fcea177e867b5b8181dadc3400b3a32ec0535448efde91a7e45b96e8d913641595b267e9fdd77079746326e17ee2c75d3e2ed7e60e478e43628327df42b88cab#npm:4.4.0", {\ + "packageLocation": "./.yarn/__virtual__/@eslint-community-eslint-utils-virtual-8486d4fefa/0/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-7e559c4ce5.zip/node_modules/@eslint-community/eslint-utils/",\ + "packageDependencies": [\ + ["@eslint-community/eslint-utils", "virtual:fcea177e867b5b8181dadc3400b3a32ec0535448efde91a7e45b96e8d913641595b267e9fdd77079746326e17ee2c75d3e2ed7e60e478e43628327df42b88cab#npm:4.4.0"],\ + ["@types/eslint", null],\ + ["eslint", "virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:9.11.0"],\ + ["eslint-visitor-keys", "npm:3.4.3"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@eslint-community/regexpp", [\ + ["npm:4.11.1", {\ + "packageLocation": "./.yarn/cache/@eslint-community-regexpp-npm-4.11.1-37bbb67aaa-fbcc1cb65e.zip/node_modules/@eslint-community/regexpp/",\ + "packageDependencies": [\ + ["@eslint-community/regexpp", "npm:4.11.1"]\ + ],\ + "linkType": "HARD"\ + }],\ ["npm:4.9.0", {\ "packageLocation": "./.yarn/cache/@eslint-community-regexpp-npm-4.9.0-c2f3ed9480-2959ef8387.zip/node_modules/@eslint-community/regexpp/",\ "packageDependencies": [\ @@ -1188,6 +1223,18 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["@eslint/config-array", [\ + ["npm:0.18.0", {\ + "packageLocation": "./.yarn/cache/@eslint-config-array-npm-0.18.0-bb4bc4e301-0234aeb3e6.zip/node_modules/@eslint/config-array/",\ + "packageDependencies": [\ + ["@eslint/config-array", "npm:0.18.0"],\ + ["@eslint/object-schema", "npm:2.1.4"],\ + ["debug", "virtual:1ff4b5f90832ba0a9c93ba1223af226e44ba70c1126a3740d93562b97bc36544e896a5e95908196f7458713e6a6089a34bfc67362fc6df7fa093bd06c878be47#npm:4.3.5"],\ + ["minimatch", "npm:3.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@eslint/eslintrc", [\ ["npm:2.1.4", {\ "packageLocation": "./.yarn/cache/@eslint-eslintrc-npm-2.1.4-1ff4b5f908-32f67052b8.zip/node_modules/@eslint/eslintrc/",\ @@ -1204,6 +1251,22 @@ const RAW_RUNTIME_STATE = ["strip-json-comments", "npm:3.1.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:3.1.0", {\ + "packageLocation": "./.yarn/cache/@eslint-eslintrc-npm-3.1.0-3837a202e2-5b7332ed78.zip/node_modules/@eslint/eslintrc/",\ + "packageDependencies": [\ + ["@eslint/eslintrc", "npm:3.1.0"],\ + ["ajv", "npm:6.12.6"],\ + ["debug", "virtual:1ff4b5f90832ba0a9c93ba1223af226e44ba70c1126a3740d93562b97bc36544e896a5e95908196f7458713e6a6089a34bfc67362fc6df7fa093bd06c878be47#npm:4.3.5"],\ + ["espree", "npm:10.1.0"],\ + ["globals", "npm:14.0.0"],\ + ["ignore", "npm:5.2.4"],\ + ["import-fresh", "npm:3.3.0"],\ + ["js-yaml", "npm:4.1.0"],\ + ["minimatch", "npm:3.1.2"],\ + ["strip-json-comments", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@eslint/js", [\ @@ -1213,6 +1276,32 @@ const RAW_RUNTIME_STATE = ["@eslint/js", "npm:8.57.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:9.11.0", {\ + "packageLocation": "./.yarn/cache/@eslint-js-npm-9.11.0-5379f7136c-7403aeba28.zip/node_modules/@eslint/js/",\ + "packageDependencies": [\ + ["@eslint/js", "npm:9.11.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@eslint/object-schema", [\ + ["npm:2.1.4", {\ + "packageLocation": "./.yarn/cache/@eslint-object-schema-npm-2.1.4-0546250476-e9885532ea.zip/node_modules/@eslint/object-schema/",\ + "packageDependencies": [\ + ["@eslint/object-schema", "npm:2.1.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@eslint/plugin-kit", [\ + ["npm:0.2.0", {\ + "packageLocation": "./.yarn/cache/@eslint-plugin-kit-npm-0.2.0-8ef0139590-00b92bc52a.zip/node_modules/@eslint/plugin-kit/",\ + "packageDependencies": [\ + ["@eslint/plugin-kit", "npm:0.2.0"],\ + ["levn", "npm:0.4.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@floating-ui/core", [\ @@ -1279,12 +1368,9 @@ const RAW_RUNTIME_STATE = ["cookie-parser", "npm:1.4.6"],\ ["cross-env", "npm:7.0.3"],\ ["dockerfile-ast", "npm:0.6.1"],\ - ["eslint", "npm:8.57.0"],\ - ["eslint-config-standard", "virtual:feaa032e1ffbff8da5dad8429b8494744ade8373389ef8e26f3d1f1980ceff327ab996fdc7c1977df285edeb918372fa01d7c87d79c9d7218f8701c70203bfe5#npm:17.1.0"],\ - ["eslint-plugin-import", "virtual:feaa032e1ffbff8da5dad8429b8494744ade8373389ef8e26f3d1f1980ceff327ab996fdc7c1977df285edeb918372fa01d7c87d79c9d7218f8701c70203bfe5#npm:2.30.0"],\ - ["eslint-plugin-jest", "virtual:feaa032e1ffbff8da5dad8429b8494744ade8373389ef8e26f3d1f1980ceff327ab996fdc7c1977df285edeb918372fa01d7c87d79c9d7218f8701c70203bfe5#npm:26.9.0"],\ - ["eslint-plugin-n", "virtual:feaa032e1ffbff8da5dad8429b8494744ade8373389ef8e26f3d1f1980ceff327ab996fdc7c1977df285edeb918372fa01d7c87d79c9d7218f8701c70203bfe5#npm:15.7.0"],\ - ["eslint-plugin-promise", "virtual:feaa032e1ffbff8da5dad8429b8494744ade8373389ef8e26f3d1f1980ceff327ab996fdc7c1977df285edeb918372fa01d7c87d79c9d7218f8701c70203bfe5#npm:6.6.0"],\ + ["eslint", "virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:9.11.0"],\ + ["eslint-plugin-jest", "virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:28.8.3"],\ + ["eslint-plugin-lodash", "virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:8.0.0"],\ ["eslint-plugin-security", "npm:3.0.1"],\ ["express", "npm:4.21.0"],\ ["express-static-gzip", "npm:2.1.8"],\ @@ -1298,6 +1384,7 @@ const RAW_RUNTIME_STATE = ["jsonwebtoken", "npm:9.0.2"],\ ["lodash", "npm:4.17.21"],\ ["morgan", "npm:1.10.0"],\ + ["neostandard", "virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:0.11.5"],\ ["object-hash", "npm:3.0.0"],\ ["openapi-types", "npm:12.1.3"],\ ["openid-client", "npm:5.7.0"],\ @@ -1563,6 +1650,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["@humanwhocodes/gitignore-to-minimatch", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/@humanwhocodes-gitignore-to-minimatch-npm-1.0.2-247ae8a408-f2d3325e50.zip/node_modules/@humanwhocodes/gitignore-to-minimatch/",\ + "packageDependencies": [\ + ["@humanwhocodes/gitignore-to-minimatch", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@humanwhocodes/module-importer", [\ ["npm:1.0.1", {\ "packageLocation": "./.yarn/cache/@humanwhocodes-module-importer-npm-1.0.1-9d07ed2e4a-909b69c3b8.zip/node_modules/@humanwhocodes/module-importer/",\ @@ -1581,6 +1677,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["@humanwhocodes/retry", [\ + ["npm:0.3.0", {\ + "packageLocation": "./.yarn/cache/@humanwhocodes-retry-npm-0.3.0-fd8faa0baa-7111ec4e09.zip/node_modules/@humanwhocodes/retry/",\ + "packageDependencies": [\ + ["@humanwhocodes/retry", "npm:0.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@isaacs/cliui", [\ ["npm:8.0.2", {\ "packageLocation": "./.yarn/cache/@isaacs-cliui-npm-8.0.2-f4364666d5-b1bf42535d.zip/node_modules/@isaacs/cliui/",\ @@ -2562,6 +2667,33 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["@stylistic/eslint-plugin", [\ + ["npm:2.8.0", {\ + "packageLocation": "./.yarn/cache/@stylistic-eslint-plugin-npm-2.8.0-f3963a5979-e85fc3ecad.zip/node_modules/@stylistic/eslint-plugin/",\ + "packageDependencies": [\ + ["@stylistic/eslint-plugin", "npm:2.8.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:d28f94b4223d3c694bf416402e9202d001d755adf9255b0fd4b0df4e73293d260d1c67b6bf4ef640df020fb5c20f41ea4a37fb92e0255d4546dcea42c54f4b00#npm:2.8.0", {\ + "packageLocation": "./.yarn/__virtual__/@stylistic-eslint-plugin-virtual-def07016a7/0/cache/@stylistic-eslint-plugin-npm-2.8.0-f3963a5979-e85fc3ecad.zip/node_modules/@stylistic/eslint-plugin/",\ + "packageDependencies": [\ + ["@stylistic/eslint-plugin", "virtual:d28f94b4223d3c694bf416402e9202d001d755adf9255b0fd4b0df4e73293d260d1c67b6bf4ef640df020fb5c20f41ea4a37fb92e0255d4546dcea42c54f4b00#npm:2.8.0"],\ + ["@types/eslint", null],\ + ["@typescript-eslint/utils", "virtual:73833c4a05a898b9b13abad23a056467811c1bdbc944f103e68d358bd7533f47860db5df654655bd9f1fac53ad4138147bc69e3b4a7d1829bfe16f71928b9e87#npm:8.6.0"],\ + ["eslint", "virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:9.11.0"],\ + ["eslint-visitor-keys", "npm:4.0.0"],\ + ["espree", "npm:10.1.0"],\ + ["estraverse", "npm:5.3.0"],\ + ["picomatch", "npm:4.0.2"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@tootallnate/once", [\ ["npm:2.0.0", {\ "packageLocation": "./.yarn/cache/@tootallnate-once-npm-2.0.0-e36cf4f140-073bfa5480.zip/node_modules/@tootallnate/once/",\ @@ -2791,6 +2923,76 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["@typescript-eslint/eslint-plugin", [\ + ["npm:8.6.0", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-eslint-plugin-npm-8.6.0-73fa341384-c777f01535.zip/node_modules/@typescript-eslint/eslint-plugin/",\ + "packageDependencies": [\ + ["@typescript-eslint/eslint-plugin", "npm:8.6.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:19750da45fbfcf0c8434a3085531a0a650cdad5f094b5aec70c73144e8fea0729f04ae84e934890e3c9a28d8cdbb3ca4c0894290a913e7d7470a0259ed0492c5#npm:8.6.0", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-eslint-plugin-virtual-fe1bd38a55/0/cache/@typescript-eslint-eslint-plugin-npm-8.6.0-73fa341384-c777f01535.zip/node_modules/@typescript-eslint/eslint-plugin/",\ + "packageDependencies": [\ + ["@typescript-eslint/eslint-plugin", "virtual:19750da45fbfcf0c8434a3085531a0a650cdad5f094b5aec70c73144e8fea0729f04ae84e934890e3c9a28d8cdbb3ca4c0894290a913e7d7470a0259ed0492c5#npm:8.6.0"],\ + ["@eslint-community/regexpp", "npm:4.11.1"],\ + ["@types/eslint", null],\ + ["@types/typescript", null],\ + ["@types/typescript-eslint__parser", null],\ + ["@typescript-eslint/parser", "virtual:19750da45fbfcf0c8434a3085531a0a650cdad5f094b5aec70c73144e8fea0729f04ae84e934890e3c9a28d8cdbb3ca4c0894290a913e7d7470a0259ed0492c5#npm:8.6.0"],\ + ["@typescript-eslint/scope-manager", "npm:8.6.0"],\ + ["@typescript-eslint/type-utils", "virtual:fe1bd38a55f6c5a1af28cc6c0b333333b577061f6b57ce4ab4f3b720bb5ff024eb5d82568282d020a351bb700da81972aa14f5858f2e4b3ed66d83e41714d3a5#npm:8.6.0"],\ + ["@typescript-eslint/utils", "virtual:19750da45fbfcf0c8434a3085531a0a650cdad5f094b5aec70c73144e8fea0729f04ae84e934890e3c9a28d8cdbb3ca4c0894290a913e7d7470a0259ed0492c5#npm:8.6.0"],\ + ["@typescript-eslint/visitor-keys", "npm:8.6.0"],\ + ["eslint", null],\ + ["graphemer", "npm:1.4.0"],\ + ["ignore", "npm:5.3.2"],\ + ["natural-compare", "npm:1.4.0"],\ + ["ts-api-utils", "virtual:3559e7e5a5961e6852e14381d33a435c4daea7fd30f3fa5bee9dd7abf530031ed9fbcd0f3060b1edb2334e8c8f959f6f5e6fde6940ee0ccf2da7fdda3327896c#npm:1.3.0"],\ + ["typescript", null]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "@types/typescript-eslint__parser",\ + "@types/typescript",\ + "@typescript-eslint/parser",\ + "eslint",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@typescript-eslint/parser", [\ + ["npm:8.6.0", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-parser-npm-8.6.0-ba9ca503c0-3f280d289b.zip/node_modules/@typescript-eslint/parser/",\ + "packageDependencies": [\ + ["@typescript-eslint/parser", "npm:8.6.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:19750da45fbfcf0c8434a3085531a0a650cdad5f094b5aec70c73144e8fea0729f04ae84e934890e3c9a28d8cdbb3ca4c0894290a913e7d7470a0259ed0492c5#npm:8.6.0", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-parser-virtual-e342e3c7a8/0/cache/@typescript-eslint-parser-npm-8.6.0-ba9ca503c0-3f280d289b.zip/node_modules/@typescript-eslint/parser/",\ + "packageDependencies": [\ + ["@typescript-eslint/parser", "virtual:19750da45fbfcf0c8434a3085531a0a650cdad5f094b5aec70c73144e8fea0729f04ae84e934890e3c9a28d8cdbb3ca4c0894290a913e7d7470a0259ed0492c5#npm:8.6.0"],\ + ["@types/eslint", null],\ + ["@types/typescript", null],\ + ["@typescript-eslint/scope-manager", "npm:8.6.0"],\ + ["@typescript-eslint/types", "npm:8.6.0"],\ + ["@typescript-eslint/typescript-estree", "virtual:fcea177e867b5b8181dadc3400b3a32ec0535448efde91a7e45b96e8d913641595b267e9fdd77079746326e17ee2c75d3e2ed7e60e478e43628327df42b88cab#npm:8.6.0"],\ + ["@typescript-eslint/visitor-keys", "npm:8.6.0"],\ + ["debug", "virtual:1ff4b5f90832ba0a9c93ba1223af226e44ba70c1126a3740d93562b97bc36544e896a5e95908196f7458713e6a6089a34bfc67362fc6df7fa093bd06c878be47#npm:4.3.5"],\ + ["eslint", null],\ + ["typescript", null]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "@types/typescript",\ + "eslint",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@typescript-eslint/scope-manager", [\ ["npm:5.62.0", {\ "packageLocation": "./.yarn/cache/@typescript-eslint-scope-manager-npm-5.62.0-c0013838b0-8612532355.zip/node_modules/@typescript-eslint/scope-manager/",\ @@ -2809,6 +3011,41 @@ const RAW_RUNTIME_STATE = ["@typescript-eslint/visitor-keys", "npm:7.5.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:8.6.0", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-scope-manager-npm-8.6.0-140dfc3357-37092ef701.zip/node_modules/@typescript-eslint/scope-manager/",\ + "packageDependencies": [\ + ["@typescript-eslint/scope-manager", "npm:8.6.0"],\ + ["@typescript-eslint/types", "npm:8.6.0"],\ + ["@typescript-eslint/visitor-keys", "npm:8.6.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@typescript-eslint/type-utils", [\ + ["npm:8.6.0", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-type-utils-npm-8.6.0-ff51172a1e-914b4637ca.zip/node_modules/@typescript-eslint/type-utils/",\ + "packageDependencies": [\ + ["@typescript-eslint/type-utils", "npm:8.6.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:fe1bd38a55f6c5a1af28cc6c0b333333b577061f6b57ce4ab4f3b720bb5ff024eb5d82568282d020a351bb700da81972aa14f5858f2e4b3ed66d83e41714d3a5#npm:8.6.0", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-type-utils-virtual-f0296bc9a6/0/cache/@typescript-eslint-type-utils-npm-8.6.0-ff51172a1e-914b4637ca.zip/node_modules/@typescript-eslint/type-utils/",\ + "packageDependencies": [\ + ["@typescript-eslint/type-utils", "virtual:fe1bd38a55f6c5a1af28cc6c0b333333b577061f6b57ce4ab4f3b720bb5ff024eb5d82568282d020a351bb700da81972aa14f5858f2e4b3ed66d83e41714d3a5#npm:8.6.0"],\ + ["@types/typescript", null],\ + ["@typescript-eslint/typescript-estree", "virtual:fcea177e867b5b8181dadc3400b3a32ec0535448efde91a7e45b96e8d913641595b267e9fdd77079746326e17ee2c75d3e2ed7e60e478e43628327df42b88cab#npm:8.6.0"],\ + ["@typescript-eslint/utils", "virtual:19750da45fbfcf0c8434a3085531a0a650cdad5f094b5aec70c73144e8fea0729f04ae84e934890e3c9a28d8cdbb3ca4c0894290a913e7d7470a0259ed0492c5#npm:8.6.0"],\ + ["debug", "virtual:1ff4b5f90832ba0a9c93ba1223af226e44ba70c1126a3740d93562b97bc36544e896a5e95908196f7458713e6a6089a34bfc67362fc6df7fa093bd06c878be47#npm:4.3.5"],\ + ["ts-api-utils", "virtual:3559e7e5a5961e6852e14381d33a435c4daea7fd30f3fa5bee9dd7abf530031ed9fbcd0f3060b1edb2334e8c8f959f6f5e6fde6940ee0ccf2da7fdda3327896c#npm:1.3.0"],\ + ["typescript", null]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@typescript-eslint/types", [\ @@ -2825,6 +3062,13 @@ const RAW_RUNTIME_STATE = ["@typescript-eslint/types", "npm:7.5.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:8.6.0", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-types-npm-8.6.0-0dac0f420c-e7051d2122.zip/node_modules/@typescript-eslint/types/",\ + "packageDependencies": [\ + ["@typescript-eslint/types", "npm:8.6.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@typescript-eslint/typescript-estree", [\ @@ -2842,6 +3086,13 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ + ["npm:8.6.0", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-typescript-estree-npm-8.6.0-9540992a8b-33ab8c0322.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "npm:8.6.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ ["virtual:7dcd66ce3f5ec2c5457dad028d6068117cb3f3e36f74b28439359258388b0de40a388e914a1a301deb98e21d811ca981a237975f2c19cae57bfc46135c4cfe25#npm:5.62.0", {\ "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-cff22be7f5/0/cache/@typescript-eslint-typescript-estree-npm-5.62.0-5d1ea132a9-d7984a3e9d.zip/node_modules/@typescript-eslint/typescript-estree/",\ "packageDependencies": [\ @@ -2874,7 +3125,28 @@ const RAW_RUNTIME_STATE = ["is-glob", "npm:4.0.3"],\ ["minimatch", "npm:9.0.3"],\ ["semver", "npm:7.6.3"],\ - ["ts-api-utils", "virtual:d7b99fee6270c4adca4915d67fd385ba9a3a0712bb49a651b512d2bf62e34f9f2728c8179d8e79179380350e90994e7c4eda6ceb37404d7009f73b8914515f73#npm:1.3.0"],\ + ["ts-api-utils", "virtual:3559e7e5a5961e6852e14381d33a435c4daea7fd30f3fa5bee9dd7abf530031ed9fbcd0f3060b1edb2334e8c8f959f6f5e6fde6940ee0ccf2da7fdda3327896c#npm:1.3.0"],\ + ["typescript", null]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:fcea177e867b5b8181dadc3400b3a32ec0535448efde91a7e45b96e8d913641595b267e9fdd77079746326e17ee2c75d3e2ed7e60e478e43628327df42b88cab#npm:8.6.0", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-3559e7e5a5/0/cache/@typescript-eslint-typescript-estree-npm-8.6.0-9540992a8b-33ab8c0322.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "virtual:fcea177e867b5b8181dadc3400b3a32ec0535448efde91a7e45b96e8d913641595b267e9fdd77079746326e17ee2c75d3e2ed7e60e478e43628327df42b88cab#npm:8.6.0"],\ + ["@types/typescript", null],\ + ["@typescript-eslint/types", "npm:8.6.0"],\ + ["@typescript-eslint/visitor-keys", "npm:8.6.0"],\ + ["debug", "virtual:1ff4b5f90832ba0a9c93ba1223af226e44ba70c1126a3740d93562b97bc36544e896a5e95908196f7458713e6a6089a34bfc67362fc6df7fa093bd06c878be47#npm:4.3.5"],\ + ["fast-glob", "npm:3.3.2"],\ + ["is-glob", "npm:4.0.3"],\ + ["minimatch", "npm:9.0.5"],\ + ["semver", "npm:7.6.3"],\ + ["ts-api-utils", "virtual:3559e7e5a5961e6852e14381d33a435c4daea7fd30f3fa5bee9dd7abf530031ed9fbcd0f3060b1edb2334e8c8f959f6f5e6fde6940ee0ccf2da7fdda3327896c#npm:1.3.0"],\ ["typescript", null]\ ],\ "packagePeers": [\ @@ -2899,6 +3171,30 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ + ["npm:8.6.0", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-utils-npm-8.6.0-a435898cef-5b61510634.zip/node_modules/@typescript-eslint/utils/",\ + "packageDependencies": [\ + ["@typescript-eslint/utils", "npm:8.6.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:19750da45fbfcf0c8434a3085531a0a650cdad5f094b5aec70c73144e8fea0729f04ae84e934890e3c9a28d8cdbb3ca4c0894290a913e7d7470a0259ed0492c5#npm:8.6.0", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-utils-virtual-4426ae1de0/0/cache/@typescript-eslint-utils-npm-8.6.0-a435898cef-5b61510634.zip/node_modules/@typescript-eslint/utils/",\ + "packageDependencies": [\ + ["@typescript-eslint/utils", "virtual:19750da45fbfcf0c8434a3085531a0a650cdad5f094b5aec70c73144e8fea0729f04ae84e934890e3c9a28d8cdbb3ca4c0894290a913e7d7470a0259ed0492c5#npm:8.6.0"],\ + ["@eslint-community/eslint-utils", "virtual:4426ae1de0661049bc052715eaf9325b772e558c5025903e98d5f4550c207f161e1482790d656b663f49554ade660b02b65482fa731cb8e8e59b800fe4b6ee6a#npm:4.4.0"],\ + ["@types/eslint", null],\ + ["@typescript-eslint/scope-manager", "npm:8.6.0"],\ + ["@typescript-eslint/types", "npm:8.6.0"],\ + ["@typescript-eslint/typescript-estree", "virtual:fcea177e867b5b8181dadc3400b3a32ec0535448efde91a7e45b96e8d913641595b267e9fdd77079746326e17ee2c75d3e2ed7e60e478e43628327df42b88cab#npm:8.6.0"],\ + ["eslint", null]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }],\ ["virtual:3456afd5c34504e84fac152fd71fc284bcebb19d825f15eeee4b6a191c9b87e1b14a7f95827c741c5b4411cd62c948c2a1cf48db8675570b4f28c5921868ad78#npm:5.62.0", {\ "packageLocation": "./.yarn/__virtual__/@typescript-eslint-utils-virtual-7dcd66ce3f/0/cache/@typescript-eslint-utils-npm-5.62.0-907f2d579e-f09b7d9952.zip/node_modules/@typescript-eslint/utils/",\ "packageDependencies": [\ @@ -2920,6 +3216,23 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "HARD"\ }],\ + ["virtual:73833c4a05a898b9b13abad23a056467811c1bdbc944f103e68d358bd7533f47860db5df654655bd9f1fac53ad4138147bc69e3b4a7d1829bfe16f71928b9e87#npm:8.6.0", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-utils-virtual-fcea177e86/0/cache/@typescript-eslint-utils-npm-8.6.0-a435898cef-5b61510634.zip/node_modules/@typescript-eslint/utils/",\ + "packageDependencies": [\ + ["@typescript-eslint/utils", "virtual:73833c4a05a898b9b13abad23a056467811c1bdbc944f103e68d358bd7533f47860db5df654655bd9f1fac53ad4138147bc69e3b4a7d1829bfe16f71928b9e87#npm:8.6.0"],\ + ["@eslint-community/eslint-utils", "virtual:fcea177e867b5b8181dadc3400b3a32ec0535448efde91a7e45b96e8d913641595b267e9fdd77079746326e17ee2c75d3e2ed7e60e478e43628327df42b88cab#npm:4.4.0"],\ + ["@types/eslint", null],\ + ["@typescript-eslint/scope-manager", "npm:8.6.0"],\ + ["@typescript-eslint/types", "npm:8.6.0"],\ + ["@typescript-eslint/typescript-estree", "virtual:fcea177e867b5b8181dadc3400b3a32ec0535448efde91a7e45b96e8d913641595b267e9fdd77079746326e17ee2c75d3e2ed7e60e478e43628327df42b88cab#npm:8.6.0"],\ + ["eslint", "virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:9.11.0"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }],\ ["virtual:da573d507c55253f5add92de7c8d535884104080abd6262990ef071a4971ae7523b2d9bce7e8566f4baf37cbebd4260bfc7f849962382e1674a9422dff4da40e#npm:7.5.0", {\ "packageLocation": "./.yarn/__virtual__/@typescript-eslint-utils-virtual-e1f26f5b7e/0/cache/@typescript-eslint-utils-npm-7.5.0-76344a74cb-c815ed6909.zip/node_modules/@typescript-eslint/utils/",\ "packageDependencies": [\ @@ -2959,6 +3272,15 @@ const RAW_RUNTIME_STATE = ["eslint-visitor-keys", "npm:3.4.3"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:8.6.0", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-visitor-keys-npm-8.6.0-670a184023-9bd5d5daee.zip/node_modules/@typescript-eslint/visitor-keys/",\ + "packageDependencies": [\ + ["@typescript-eslint/visitor-keys", "npm:8.6.0"],\ + ["@typescript-eslint/types", "npm:8.6.0"],\ + ["eslint-visitor-keys", "npm:3.4.3"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@ungap/structured-clone", [\ @@ -3697,6 +4019,13 @@ const RAW_RUNTIME_STATE = ["acorn", "npm:8.11.3"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:8.12.1", {\ + "packageLocation": "./.yarn/cache/acorn-npm-8.12.1-610871d57c-51fb26cd67.zip/node_modules/acorn/",\ + "packageDependencies": [\ + ["acorn", "npm:8.12.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["acorn-jsx", [\ @@ -3707,6 +4036,19 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ + ["virtual:6847541ce4a3dcf7a9a6a3e4dde955afca0e2dd6c48216b83d71222ffd93cf79a6473d48f3e37dabb82467ce0f37e8b8b4a49925ee47dda6e8922eae0b01ab6f#npm:5.3.2", {\ + "packageLocation": "./.yarn/__virtual__/acorn-jsx-virtual-316726bcca/0/cache/acorn-jsx-npm-5.3.2-d7594599ea-4c54868fbe.zip/node_modules/acorn-jsx/",\ + "packageDependencies": [\ + ["acorn-jsx", "virtual:6847541ce4a3dcf7a9a6a3e4dde955afca0e2dd6c48216b83d71222ffd93cf79a6473d48f3e37dabb82467ce0f37e8b8b4a49925ee47dda6e8922eae0b01ab6f#npm:5.3.2"],\ + ["@types/acorn", null],\ + ["acorn", "npm:8.12.1"]\ + ],\ + "packagePeers": [\ + "@types/acorn",\ + "acorn"\ + ],\ + "linkType": "HARD"\ + }],\ ["virtual:a50722a5a9326b6a5f12350c494c4db3aa0f4caeac45e3e9e5fe071da20014ecfe738fe2ebe2c9c98abae81a4ea86b42f56d776b3bd5ec37f9ad3670c242b242#npm:5.3.2", {\ "packageLocation": "./.yarn/__virtual__/acorn-jsx-virtual-834321b202/0/cache/acorn-jsx-npm-5.3.2-d7594599ea-4c54868fbe.zip/node_modules/acorn-jsx/",\ "packageDependencies": [\ @@ -3965,6 +4307,21 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["array.prototype.findlast", [\ + ["npm:1.2.5", {\ + "packageLocation": "./.yarn/cache/array.prototype.findlast-npm-1.2.5-316cb71d39-ddc952b829.zip/node_modules/array.prototype.findlast/",\ + "packageDependencies": [\ + ["array.prototype.findlast", "npm:1.2.5"],\ + ["call-bind", "npm:1.0.7"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.23.2"],\ + ["es-errors", "npm:1.3.0"],\ + ["es-object-atoms", "npm:1.0.0"],\ + ["es-shim-unscopables", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["array.prototype.findlastindex", [\ ["npm:1.2.5", {\ "packageLocation": "./.yarn/cache/array.prototype.findlastindex-npm-1.2.5-f112a7bfcd-9621894877.zip/node_modules/array.prototype.findlastindex/",\ @@ -4006,6 +4363,20 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["array.prototype.tosorted", [\ + ["npm:1.1.4", {\ + "packageLocation": "./.yarn/cache/array.prototype.tosorted-npm-1.1.4-c1fc919434-eb3c4c4fc0.zip/node_modules/array.prototype.tosorted/",\ + "packageDependencies": [\ + ["array.prototype.tosorted", "npm:1.1.4"],\ + ["call-bind", "npm:1.0.7"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.23.3"],\ + ["es-errors", "npm:1.3.0"],\ + ["es-shim-unscopables", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["arraybuffer.prototype.slice", [\ ["npm:1.0.3", {\ "packageLocation": "./.yarn/cache/arraybuffer.prototype.slice-npm-1.0.3-97a993a091-d32754045b.zip/node_modules/arraybuffer.prototype.slice/",\ @@ -5507,6 +5878,17 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["enhanced-resolve", [\ + ["npm:5.17.1", {\ + "packageLocation": "./.yarn/cache/enhanced-resolve-npm-5.17.1-296305b69f-81a0515675.zip/node_modules/enhanced-resolve/",\ + "packageDependencies": [\ + ["enhanced-resolve", "npm:5.17.1"],\ + ["graceful-fs", "npm:4.2.11"],\ + ["tapable", "npm:2.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["entities", [\ ["npm:4.5.0", {\ "packageLocation": "./.yarn/cache/entities-npm-4.5.0-7cdb83b832-5b039739f7.zip/node_modules/entities/",\ @@ -5597,6 +5979,59 @@ const RAW_RUNTIME_STATE = ["which-typed-array", "npm:1.1.15"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:1.23.3", {\ + "packageLocation": "./.yarn/cache/es-abstract-npm-1.23.3-ffd85665f7-d27e9afafb.zip/node_modules/es-abstract/",\ + "packageDependencies": [\ + ["es-abstract", "npm:1.23.3"],\ + ["array-buffer-byte-length", "npm:1.0.1"],\ + ["arraybuffer.prototype.slice", "npm:1.0.3"],\ + ["available-typed-arrays", "npm:1.0.7"],\ + ["call-bind", "npm:1.0.7"],\ + ["data-view-buffer", "npm:1.0.1"],\ + ["data-view-byte-length", "npm:1.0.1"],\ + ["data-view-byte-offset", "npm:1.0.0"],\ + ["es-define-property", "npm:1.0.0"],\ + ["es-errors", "npm:1.3.0"],\ + ["es-object-atoms", "npm:1.0.0"],\ + ["es-set-tostringtag", "npm:2.0.3"],\ + ["es-to-primitive", "npm:1.2.1"],\ + ["function.prototype.name", "npm:1.1.6"],\ + ["get-intrinsic", "npm:1.2.4"],\ + ["get-symbol-description", "npm:1.0.2"],\ + ["globalthis", "npm:1.0.3"],\ + ["gopd", "npm:1.0.1"],\ + ["has-property-descriptors", "npm:1.0.2"],\ + ["has-proto", "npm:1.0.3"],\ + ["has-symbols", "npm:1.0.3"],\ + ["hasown", "npm:2.0.2"],\ + ["internal-slot", "npm:1.0.7"],\ + ["is-array-buffer", "npm:3.0.4"],\ + ["is-callable", "npm:1.2.7"],\ + ["is-data-view", "npm:1.0.1"],\ + ["is-negative-zero", "npm:2.0.3"],\ + ["is-regex", "npm:1.1.4"],\ + ["is-shared-array-buffer", "npm:1.0.3"],\ + ["is-string", "npm:1.0.7"],\ + ["is-typed-array", "npm:1.1.13"],\ + ["is-weakref", "npm:1.0.2"],\ + ["object-inspect", "npm:1.13.1"],\ + ["object-keys", "npm:1.1.1"],\ + ["object.assign", "npm:4.1.5"],\ + ["regexp.prototype.flags", "npm:1.5.2"],\ + ["safe-array-concat", "npm:1.1.2"],\ + ["safe-regex-test", "npm:1.0.3"],\ + ["string.prototype.trim", "npm:1.2.9"],\ + ["string.prototype.trimend", "npm:1.0.8"],\ + ["string.prototype.trimstart", "npm:1.0.8"],\ + ["typed-array-buffer", "npm:1.0.2"],\ + ["typed-array-byte-length", "npm:1.0.1"],\ + ["typed-array-byte-offset", "npm:1.0.2"],\ + ["typed-array-length", "npm:1.0.6"],\ + ["unbox-primitive", "npm:1.0.2"],\ + ["which-typed-array", "npm:1.1.15"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["es-define-property", [\ @@ -5618,6 +6053,29 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["es-iterator-helpers", [\ + ["npm:1.0.19", {\ + "packageLocation": "./.yarn/cache/es-iterator-helpers-npm-1.0.19-5a0b930ca7-ae8f0241e3.zip/node_modules/es-iterator-helpers/",\ + "packageDependencies": [\ + ["es-iterator-helpers", "npm:1.0.19"],\ + ["call-bind", "npm:1.0.7"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.23.3"],\ + ["es-errors", "npm:1.3.0"],\ + ["es-set-tostringtag", "npm:2.0.3"],\ + ["function-bind", "npm:1.1.2"],\ + ["get-intrinsic", "npm:1.2.4"],\ + ["globalthis", "npm:1.0.3"],\ + ["has-property-descriptors", "npm:1.0.2"],\ + ["has-proto", "npm:1.0.3"],\ + ["has-symbols", "npm:1.0.3"],\ + ["internal-slot", "npm:1.0.7"],\ + ["iterator.prototype", "npm:1.1.2"],\ + ["safe-array-concat", "npm:1.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["es-object-atoms", [\ ["npm:1.0.0", {\ "packageLocation": "./.yarn/cache/es-object-atoms-npm-1.0.0-c5cca6d760-1fed3d102e.zip/node_modules/es-object-atoms/",\ @@ -5780,6 +6238,83 @@ const RAW_RUNTIME_STATE = ["text-table", "npm:0.2.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:9.11.0", {\ + "packageLocation": "./.yarn/cache/eslint-npm-9.11.0-c863a38fe8-3438a78172.zip/node_modules/eslint/",\ + "packageDependencies": [\ + ["eslint", "npm:9.11.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:9.11.0", {\ + "packageLocation": "./.yarn/__virtual__/eslint-virtual-db4d494221/0/cache/eslint-npm-9.11.0-c863a38fe8-3438a78172.zip/node_modules/eslint/",\ + "packageDependencies": [\ + ["eslint", "virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:9.11.0"],\ + ["@eslint-community/eslint-utils", "virtual:fcea177e867b5b8181dadc3400b3a32ec0535448efde91a7e45b96e8d913641595b267e9fdd77079746326e17ee2c75d3e2ed7e60e478e43628327df42b88cab#npm:4.4.0"],\ + ["@eslint-community/regexpp", "npm:4.11.1"],\ + ["@eslint/config-array", "npm:0.18.0"],\ + ["@eslint/eslintrc", "npm:3.1.0"],\ + ["@eslint/js", "npm:9.11.0"],\ + ["@eslint/plugin-kit", "npm:0.2.0"],\ + ["@humanwhocodes/module-importer", "npm:1.0.1"],\ + ["@humanwhocodes/retry", "npm:0.3.0"],\ + ["@nodelib/fs.walk", "npm:1.2.8"],\ + ["@types/jiti", null],\ + ["ajv", "npm:6.12.6"],\ + ["chalk", "npm:4.1.2"],\ + ["cross-spawn", "npm:7.0.3"],\ + ["debug", "virtual:1ff4b5f90832ba0a9c93ba1223af226e44ba70c1126a3740d93562b97bc36544e896a5e95908196f7458713e6a6089a34bfc67362fc6df7fa093bd06c878be47#npm:4.3.5"],\ + ["escape-string-regexp", "npm:4.0.0"],\ + ["eslint-scope", "npm:8.0.2"],\ + ["eslint-visitor-keys", "npm:4.0.0"],\ + ["espree", "npm:10.1.0"],\ + ["esquery", "npm:1.6.0"],\ + ["esutils", "npm:2.0.3"],\ + ["fast-deep-equal", "npm:3.1.3"],\ + ["file-entry-cache", "npm:8.0.0"],\ + ["find-up", "npm:5.0.0"],\ + ["glob-parent", "npm:6.0.2"],\ + ["ignore", "npm:5.2.4"],\ + ["imurmurhash", "npm:0.1.4"],\ + ["is-glob", "npm:4.0.3"],\ + ["is-path-inside", "npm:3.0.3"],\ + ["jiti", null],\ + ["json-stable-stringify-without-jsonify", "npm:1.0.1"],\ + ["lodash.merge", "npm:4.6.2"],\ + ["minimatch", "npm:3.1.2"],\ + ["natural-compare", "npm:1.4.0"],\ + ["optionator", "npm:0.9.3"],\ + ["strip-ansi", "npm:6.0.1"],\ + ["text-table", "npm:0.2.0"]\ + ],\ + "packagePeers": [\ + "@types/jiti",\ + "jiti"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-compat-utils", [\ + ["npm:0.5.1", {\ + "packageLocation": "./.yarn/cache/eslint-compat-utils-npm-0.5.1-f1f8ade49a-325e815205.zip/node_modules/eslint-compat-utils/",\ + "packageDependencies": [\ + ["eslint-compat-utils", "npm:0.5.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:a1677a5fa6b843a702f42df9e82d69a020ec268fb0f032c0b602d1e9dd9368353a73aac00470b536d26451151c95aa035413ac6ef5ec5214a5fb0b8f3a1367dd#npm:0.5.1", {\ + "packageLocation": "./.yarn/__virtual__/eslint-compat-utils-virtual-a5e2f59a3c/0/cache/eslint-compat-utils-npm-0.5.1-f1f8ade49a-325e815205.zip/node_modules/eslint-compat-utils/",\ + "packageDependencies": [\ + ["eslint-compat-utils", "virtual:a1677a5fa6b843a702f42df9e82d69a020ec268fb0f032c0b602d1e9dd9368353a73aac00470b536d26451151c95aa035413ac6ef5ec5214a5fb0b8f3a1367dd#npm:0.5.1"],\ + ["@types/eslint", null],\ + ["eslint", "virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:9.11.0"],\ + ["semver", "npm:7.6.3"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["eslint-config-standard", [\ @@ -5891,6 +6426,31 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["eslint-plugin-es-x", [\ + ["npm:7.8.0", {\ + "packageLocation": "./.yarn/cache/eslint-plugin-es-x-npm-7.8.0-8237bd972e-002fda8c02.zip/node_modules/eslint-plugin-es-x/",\ + "packageDependencies": [\ + ["eslint-plugin-es-x", "npm:7.8.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:d098264af4564ccc632b2b03f5fad6a90dea18e8014cf0ee2da6fb3a55d0864b3014e7ff666e97dc2942b5f67777b53d3fab3f7037f7fc0d265a6758767b4a5d#npm:7.8.0", {\ + "packageLocation": "./.yarn/__virtual__/eslint-plugin-es-x-virtual-a1677a5fa6/0/cache/eslint-plugin-es-x-npm-7.8.0-8237bd972e-002fda8c02.zip/node_modules/eslint-plugin-es-x/",\ + "packageDependencies": [\ + ["eslint-plugin-es-x", "virtual:d098264af4564ccc632b2b03f5fad6a90dea18e8014cf0ee2da6fb3a55d0864b3014e7ff666e97dc2942b5f67777b53d3fab3f7037f7fc0d265a6758767b4a5d#npm:7.8.0"],\ + ["@eslint-community/eslint-utils", "virtual:fcea177e867b5b8181dadc3400b3a32ec0535448efde91a7e45b96e8d913641595b267e9fdd77079746326e17ee2c75d3e2ed7e60e478e43628327df42b88cab#npm:4.4.0"],\ + ["@eslint-community/regexpp", "npm:4.11.1"],\ + ["@types/eslint", null],\ + ["eslint", "virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:9.11.0"],\ + ["eslint-compat-utils", "virtual:a1677a5fa6b843a702f42df9e82d69a020ec268fb0f032c0b602d1e9dd9368353a73aac00470b536d26451151c95aa035413ac6ef5ec5214a5fb0b8f3a1367dd#npm:0.5.1"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["eslint-plugin-import", [\ ["npm:2.30.0", {\ "packageLocation": "./.yarn/cache/eslint-plugin-import-npm-2.30.0-4fd74d3ee6-4c9dcb1f27.zip/node_modules/eslint-plugin-import/",\ @@ -5965,6 +6525,35 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ + ["npm:28.8.3", {\ + "packageLocation": "./.yarn/cache/eslint-plugin-jest-npm-28.8.3-1ed9189d04-beacf85c2f.zip/node_modules/eslint-plugin-jest/",\ + "packageDependencies": [\ + ["eslint-plugin-jest", "npm:28.8.3"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:28.8.3", {\ + "packageLocation": "./.yarn/__virtual__/eslint-plugin-jest-virtual-73833c4a05/0/cache/eslint-plugin-jest-npm-28.8.3-1ed9189d04-beacf85c2f.zip/node_modules/eslint-plugin-jest/",\ + "packageDependencies": [\ + ["eslint-plugin-jest", "virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:28.8.3"],\ + ["@types/eslint", null],\ + ["@types/jest", null],\ + ["@types/typescript-eslint__eslint-plugin", null],\ + ["@typescript-eslint/eslint-plugin", null],\ + ["@typescript-eslint/utils", "virtual:73833c4a05a898b9b13abad23a056467811c1bdbc944f103e68d358bd7533f47860db5df654655bd9f1fac53ad4138147bc69e3b4a7d1829bfe16f71928b9e87#npm:8.6.0"],\ + ["eslint", "virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:9.11.0"],\ + ["jest", "virtual:f3f18773c1f2811e8d448670abfc3fed18cdffc11b444f7cbc3548ae5868e74f3c4ee449327c1fc9c24ce0732ee02505411a07539789bec8257188d17bbada1f#npm:29.7.0"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "@types/jest",\ + "@types/typescript-eslint__eslint-plugin",\ + "@typescript-eslint/eslint-plugin",\ + "eslint",\ + "jest"\ + ],\ + "linkType": "HARD"\ + }],\ ["virtual:faee47847dc7127a4fda44fca2035ae541a9af6260b1926ad890f5f677339c049ea62d6b398ffa233a226c0b5c370a517802e428d53b03a3356e9a04d51e8e42#npm:26.9.0", {\ "packageLocation": "./.yarn/__virtual__/eslint-plugin-jest-virtual-d455155348/0/cache/eslint-plugin-jest-npm-26.9.0-865b788669-6b3c984de3.zip/node_modules/eslint-plugin-jest/",\ "packageDependencies": [\ @@ -6010,6 +6599,29 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["eslint-plugin-lodash", [\ + ["npm:8.0.0", {\ + "packageLocation": "./.yarn/cache/eslint-plugin-lodash-npm-8.0.0-2371800091-7850aa39e4.zip/node_modules/eslint-plugin-lodash/",\ + "packageDependencies": [\ + ["eslint-plugin-lodash", "npm:8.0.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:8.0.0", {\ + "packageLocation": "./.yarn/__virtual__/eslint-plugin-lodash-virtual-ed1d311188/0/cache/eslint-plugin-lodash-npm-8.0.0-2371800091-7850aa39e4.zip/node_modules/eslint-plugin-lodash/",\ + "packageDependencies": [\ + ["eslint-plugin-lodash", "virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:8.0.0"],\ + ["@types/eslint", null],\ + ["eslint", "virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:9.11.0"],\ + ["lodash", "npm:4.17.21"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["eslint-plugin-n", [\ ["npm:15.7.0", {\ "packageLocation": "./.yarn/cache/eslint-plugin-n-npm-15.7.0-8ea46b0c89-192ec3188c.zip/node_modules/eslint-plugin-n/",\ @@ -6018,6 +6630,34 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ + ["npm:17.10.3", {\ + "packageLocation": "./.yarn/cache/eslint-plugin-n-npm-17.10.3-a0c541f5cb-4da20f8243.zip/node_modules/eslint-plugin-n/",\ + "packageDependencies": [\ + ["eslint-plugin-n", "npm:17.10.3"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:d28f94b4223d3c694bf416402e9202d001d755adf9255b0fd4b0df4e73293d260d1c67b6bf4ef640df020fb5c20f41ea4a37fb92e0255d4546dcea42c54f4b00#npm:17.10.3", {\ + "packageLocation": "./.yarn/__virtual__/eslint-plugin-n-virtual-d098264af4/0/cache/eslint-plugin-n-npm-17.10.3-a0c541f5cb-4da20f8243.zip/node_modules/eslint-plugin-n/",\ + "packageDependencies": [\ + ["eslint-plugin-n", "virtual:d28f94b4223d3c694bf416402e9202d001d755adf9255b0fd4b0df4e73293d260d1c67b6bf4ef640df020fb5c20f41ea4a37fb92e0255d4546dcea42c54f4b00#npm:17.10.3"],\ + ["@eslint-community/eslint-utils", "virtual:fcea177e867b5b8181dadc3400b3a32ec0535448efde91a7e45b96e8d913641595b267e9fdd77079746326e17ee2c75d3e2ed7e60e478e43628327df42b88cab#npm:4.4.0"],\ + ["@types/eslint", null],\ + ["enhanced-resolve", "npm:5.17.1"],\ + ["eslint", "virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:9.11.0"],\ + ["eslint-plugin-es-x", "virtual:d098264af4564ccc632b2b03f5fad6a90dea18e8014cf0ee2da6fb3a55d0864b3014e7ff666e97dc2942b5f67777b53d3fab3f7037f7fc0d265a6758767b4a5d#npm:7.8.0"],\ + ["get-tsconfig", "npm:4.8.1"],\ + ["globals", "npm:15.9.0"],\ + ["ignore", "npm:5.3.2"],\ + ["minimatch", "npm:9.0.5"],\ + ["semver", "npm:7.6.3"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }],\ ["virtual:feaa032e1ffbff8da5dad8429b8494744ade8373389ef8e26f3d1f1980ceff327ab996fdc7c1977df285edeb918372fa01d7c87d79c9d7218f8701c70203bfe5#npm:15.7.0", {\ "packageLocation": "./.yarn/__virtual__/eslint-plugin-n-virtual-e4758d061f/0/cache/eslint-plugin-n-npm-15.7.0-8ea46b0c89-192ec3188c.zip/node_modules/eslint-plugin-n/",\ "packageDependencies": [\ @@ -6048,6 +6688,26 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ + ["npm:7.1.0", {\ + "packageLocation": "./.yarn/cache/eslint-plugin-promise-npm-7.1.0-84a3fbeaa7-bbc3406139.zip/node_modules/eslint-plugin-promise/",\ + "packageDependencies": [\ + ["eslint-plugin-promise", "npm:7.1.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:d28f94b4223d3c694bf416402e9202d001d755adf9255b0fd4b0df4e73293d260d1c67b6bf4ef640df020fb5c20f41ea4a37fb92e0255d4546dcea42c54f4b00#npm:7.1.0", {\ + "packageLocation": "./.yarn/__virtual__/eslint-plugin-promise-virtual-cde783beca/0/cache/eslint-plugin-promise-npm-7.1.0-84a3fbeaa7-bbc3406139.zip/node_modules/eslint-plugin-promise/",\ + "packageDependencies": [\ + ["eslint-plugin-promise", "virtual:d28f94b4223d3c694bf416402e9202d001d755adf9255b0fd4b0df4e73293d260d1c67b6bf4ef640df020fb5c20f41ea4a37fb92e0255d4546dcea42c54f4b00#npm:7.1.0"],\ + ["@types/eslint", null],\ + ["eslint", "virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:9.11.0"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }],\ ["virtual:feaa032e1ffbff8da5dad8429b8494744ade8373389ef8e26f3d1f1980ceff327ab996fdc7c1977df285edeb918372fa01d7c87d79c9d7218f8701c70203bfe5#npm:6.6.0", {\ "packageLocation": "./.yarn/__virtual__/eslint-plugin-promise-virtual-f22f31317a/0/cache/eslint-plugin-promise-npm-6.6.0-8b48ba0714-93a667dbc9.zip/node_modules/eslint-plugin-promise/",\ "packageDependencies": [\ @@ -6062,6 +6722,46 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["eslint-plugin-react", [\ + ["npm:7.36.1", {\ + "packageLocation": "./.yarn/cache/eslint-plugin-react-npm-7.36.1-3f05625f11-8cb37f7fb3.zip/node_modules/eslint-plugin-react/",\ + "packageDependencies": [\ + ["eslint-plugin-react", "npm:7.36.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:d28f94b4223d3c694bf416402e9202d001d755adf9255b0fd4b0df4e73293d260d1c67b6bf4ef640df020fb5c20f41ea4a37fb92e0255d4546dcea42c54f4b00#npm:7.36.1", {\ + "packageLocation": "./.yarn/__virtual__/eslint-plugin-react-virtual-5f7c4d4b00/0/cache/eslint-plugin-react-npm-7.36.1-3f05625f11-8cb37f7fb3.zip/node_modules/eslint-plugin-react/",\ + "packageDependencies": [\ + ["eslint-plugin-react", "virtual:d28f94b4223d3c694bf416402e9202d001d755adf9255b0fd4b0df4e73293d260d1c67b6bf4ef640df020fb5c20f41ea4a37fb92e0255d4546dcea42c54f4b00#npm:7.36.1"],\ + ["@types/eslint", null],\ + ["array-includes", "npm:3.1.8"],\ + ["array.prototype.findlast", "npm:1.2.5"],\ + ["array.prototype.flatmap", "npm:1.3.2"],\ + ["array.prototype.tosorted", "npm:1.1.4"],\ + ["doctrine", "npm:2.1.0"],\ + ["es-iterator-helpers", "npm:1.0.19"],\ + ["eslint", "virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:9.11.0"],\ + ["estraverse", "npm:5.3.0"],\ + ["hasown", "npm:2.0.2"],\ + ["jsx-ast-utils", "npm:3.3.5"],\ + ["minimatch", "npm:3.1.2"],\ + ["object.entries", "npm:1.1.8"],\ + ["object.fromentries", "npm:2.0.8"],\ + ["object.values", "npm:1.2.0"],\ + ["prop-types", "npm:15.8.1"],\ + ["resolve", "patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d"],\ + ["semver", "npm:6.3.1"],\ + ["string.prototype.matchall", "npm:4.0.11"],\ + ["string.prototype.repeat", "npm:1.0.0"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["eslint-plugin-security", [\ ["npm:3.0.1", {\ "packageLocation": "./.yarn/cache/eslint-plugin-security-npm-3.0.1-c5165134bf-6b85feabe3.zip/node_modules/eslint-plugin-security/",\ @@ -6151,6 +6851,15 @@ const RAW_RUNTIME_STATE = ["estraverse", "npm:5.3.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:8.0.2", {\ + "packageLocation": "./.yarn/cache/eslint-scope-npm-8.0.2-984149bd64-477f820647.zip/node_modules/eslint-scope/",\ + "packageDependencies": [\ + ["eslint-scope", "npm:8.0.2"],\ + ["esrecurse", "npm:4.3.0"],\ + ["estraverse", "npm:5.3.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["eslint-utils", [\ @@ -6205,6 +6914,13 @@ const RAW_RUNTIME_STATE = ["eslint-visitor-keys", "npm:3.4.3"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/eslint-visitor-keys-npm-4.0.0-9098eefd77-76619f42cf.zip/node_modules/eslint-visitor-keys/",\ + "packageDependencies": [\ + ["eslint-visitor-keys", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["esm", [\ @@ -6217,6 +6933,16 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["espree", [\ + ["npm:10.1.0", {\ + "packageLocation": "./.yarn/cache/espree-npm-10.1.0-6847541ce4-52e6feaa77.zip/node_modules/espree/",\ + "packageDependencies": [\ + ["espree", "npm:10.1.0"],\ + ["acorn", "npm:8.12.1"],\ + ["acorn-jsx", "virtual:6847541ce4a3dcf7a9a6a3e4dde955afca0e2dd6c48216b83d71222ffd93cf79a6473d48f3e37dabb82467ce0f37e8b8b4a49925ee47dda6e8922eae0b01ab6f#npm:5.3.2"],\ + ["eslint-visitor-keys", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ ["npm:9.6.1", {\ "packageLocation": "./.yarn/cache/espree-npm-9.6.1-a50722a5a9-1a2e9b4699.zip/node_modules/espree/",\ "packageDependencies": [\ @@ -6245,6 +6971,14 @@ const RAW_RUNTIME_STATE = ["estraverse", "npm:5.3.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:1.6.0", {\ + "packageLocation": "./.yarn/cache/esquery-npm-1.6.0-16fee31531-cb9065ec60.zip/node_modules/esquery/",\ + "packageDependencies": [\ + ["esquery", "npm:1.6.0"],\ + ["estraverse", "npm:5.3.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["esrecurse", [\ @@ -6543,8 +7277,16 @@ const RAW_RUNTIME_STATE = ["npm:6.0.1", {\ "packageLocation": "./.yarn/cache/file-entry-cache-npm-6.0.1-31965cf0af-58473e8a82.zip/node_modules/file-entry-cache/",\ "packageDependencies": [\ - ["file-entry-cache", "npm:6.0.1"],\ - ["flat-cache", "npm:3.1.0"]\ + ["file-entry-cache", "npm:6.0.1"],\ + ["flat-cache", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:8.0.0", {\ + "packageLocation": "./.yarn/cache/file-entry-cache-npm-8.0.0-5b09d19a83-9e2b5938b1.zip/node_modules/file-entry-cache/",\ + "packageDependencies": [\ + ["file-entry-cache", "npm:8.0.0"],\ + ["flat-cache", "npm:4.0.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -6605,6 +7347,15 @@ const RAW_RUNTIME_STATE = ["rimraf", "npm:3.0.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:4.0.1", {\ + "packageLocation": "./.yarn/cache/flat-cache-npm-4.0.1-12bf2455f7-2c59d93e9f.zip/node_modules/flat-cache/",\ + "packageDependencies": [\ + ["flat-cache", "npm:4.0.1"],\ + ["flatted", "npm:3.3.1"],\ + ["keyv", "npm:4.5.4"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["flatted", [\ @@ -6930,6 +7681,16 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["get-tsconfig", [\ + ["npm:4.8.1", {\ + "packageLocation": "./.yarn/cache/get-tsconfig-npm-4.8.1-adab2fc965-536ee85d20.zip/node_modules/get-tsconfig/",\ + "packageDependencies": [\ + ["get-tsconfig", "npm:4.8.1"],\ + ["resolve-pkg-maps", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["glob", [\ ["npm:10.4.5", {\ "packageLocation": "./.yarn/cache/glob-npm-10.4.5-8c63175f05-19a9759ea7.zip/node_modules/glob/",\ @@ -6991,6 +7752,20 @@ const RAW_RUNTIME_STATE = ["type-fest", "npm:0.20.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:14.0.0", {\ + "packageLocation": "./.yarn/cache/globals-npm-14.0.0-5fc3d8d5da-b96ff42620.zip/node_modules/globals/",\ + "packageDependencies": [\ + ["globals", "npm:14.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:15.9.0", {\ + "packageLocation": "./.yarn/cache/globals-npm-15.9.0-52af85f5e6-de4b553e41.zip/node_modules/globals/",\ + "packageDependencies": [\ + ["globals", "npm:15.9.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["globalthis", [\ @@ -7313,6 +8088,13 @@ const RAW_RUNTIME_STATE = ["ignore", "npm:5.2.4"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:5.3.2", {\ + "packageLocation": "./.yarn/cache/ignore-npm-5.3.2-346d3ba017-f9f652c957.zip/node_modules/ignore/",\ + "packageDependencies": [\ + ["ignore", "npm:5.3.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["immutable", [\ @@ -7443,6 +8225,16 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["is-async-function", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/is-async-function-npm-2.0.0-ebf8596ab1-787bc93157.zip/node_modules/is-async-function/",\ + "packageDependencies": [\ + ["is-async-function", "npm:2.0.0"],\ + ["has-tostringtag", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["is-bigint", [\ ["npm:1.0.4", {\ "packageLocation": "./.yarn/cache/is-bigint-npm-1.0.4-31c2eecbc9-eb9c88e418.zip/node_modules/is-bigint/",\ @@ -7568,6 +8360,16 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["is-finalizationregistry", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/is-finalizationregistry-npm-1.0.2-15bf1bd7ce-81caecc984.zip/node_modules/is-finalizationregistry/",\ + "packageDependencies": [\ + ["is-finalizationregistry", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["is-fullwidth-code-point", [\ ["npm:3.0.0", {\ "packageLocation": "./.yarn/cache/is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-bb11d825e0.zip/node_modules/is-fullwidth-code-point/",\ @@ -7586,6 +8388,16 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["is-generator-function", [\ + ["npm:1.0.10", {\ + "packageLocation": "./.yarn/cache/is-generator-function-npm-1.0.10-1d0f3809ef-df03514df0.zip/node_modules/is-generator-function/",\ + "packageDependencies": [\ + ["is-generator-function", "npm:1.0.10"],\ + ["has-tostringtag", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["is-glob", [\ ["npm:4.0.3", {\ "packageLocation": "./.yarn/cache/is-glob-npm-4.0.3-cb87bf1bdb-17fb4014e2.zip/node_modules/is-glob/",\ @@ -7605,6 +8417,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["is-map", [\ + ["npm:2.0.3", {\ + "packageLocation": "./.yarn/cache/is-map-npm-2.0.3-9e061e76e3-2c4d431b74.zip/node_modules/is-map/",\ + "packageDependencies": [\ + ["is-map", "npm:2.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["is-named-css-color", [\ ["npm:1.0.0", {\ "packageLocation": "./.yarn/cache/is-named-css-color-npm-1.0.0-683c6eba30-baa65b0b27.zip/node_modules/is-named-css-color/",\ @@ -7681,6 +8502,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["is-set", [\ + ["npm:2.0.3", {\ + "packageLocation": "./.yarn/cache/is-set-npm-2.0.3-1b72c9a855-f73732e13f.zip/node_modules/is-set/",\ + "packageDependencies": [\ + ["is-set", "npm:2.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["is-shared-array-buffer", [\ ["npm:1.0.3", {\ "packageLocation": "./.yarn/cache/is-shared-array-buffer-npm-1.0.3-3b3b3142a6-adc11ab0ac.zip/node_modules/is-shared-array-buffer/",\ @@ -7737,6 +8567,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["is-weakmap", [\ + ["npm:2.0.2", {\ + "packageLocation": "./.yarn/cache/is-weakmap-npm-2.0.2-ced3cab2dc-443c35bb86.zip/node_modules/is-weakmap/",\ + "packageDependencies": [\ + ["is-weakmap", "npm:2.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["is-weakref", [\ ["npm:1.0.2", {\ "packageLocation": "./.yarn/cache/is-weakref-npm-1.0.2-ff80e8c314-1545c5d172.zip/node_modules/is-weakref/",\ @@ -7747,6 +8586,17 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["is-weakset", [\ + ["npm:2.0.3", {\ + "packageLocation": "./.yarn/cache/is-weakset-npm-2.0.3-f7d282c9c1-8ad6141b6a.zip/node_modules/is-weakset/",\ + "packageDependencies": [\ + ["is-weakset", "npm:2.0.3"],\ + ["call-bind", "npm:1.0.7"],\ + ["get-intrinsic", "npm:1.2.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["is-whitespace", [\ ["npm:0.3.0", {\ "packageLocation": "./.yarn/cache/is-whitespace-npm-0.3.0-994f2b3b8c-2f4ef13e01.zip/node_modules/is-whitespace/",\ @@ -7864,6 +8714,20 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["iterator.prototype", [\ + ["npm:1.1.2", {\ + "packageLocation": "./.yarn/cache/iterator.prototype-npm-1.1.2-009f234a21-a321513260.zip/node_modules/iterator.prototype/",\ + "packageDependencies": [\ + ["iterator.prototype", "npm:1.1.2"],\ + ["define-properties", "npm:1.2.1"],\ + ["get-intrinsic", "npm:1.2.4"],\ + ["has-symbols", "npm:1.0.3"],\ + ["reflect.getprototypeof", "npm:1.0.6"],\ + ["set-function-name", "npm:2.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["jackspeak", [\ ["npm:3.4.3", {\ "packageLocation": "./.yarn/cache/jackspeak-npm-3.4.3-546bfad080-6acc10d139.zip/node_modules/jackspeak/",\ @@ -8631,6 +9495,19 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["jsx-ast-utils", [\ + ["npm:3.3.5", {\ + "packageLocation": "./.yarn/cache/jsx-ast-utils-npm-3.3.5-114c80f97a-a32679e9cb.zip/node_modules/jsx-ast-utils/",\ + "packageDependencies": [\ + ["jsx-ast-utils", "npm:3.3.5"],\ + ["array-includes", "npm:3.1.8"],\ + ["array.prototype.flat", "npm:1.3.2"],\ + ["object.assign", "npm:4.1.5"],\ + ["object.values", "npm:1.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["jwa", [\ ["npm:1.4.1", {\ "packageLocation": "./.yarn/cache/jwa-npm-1.4.1-4f19d6572c-5c533540bf.zip/node_modules/jwa/",\ @@ -8690,6 +9567,14 @@ const RAW_RUNTIME_STATE = ["json-buffer", "npm:3.0.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:4.5.4", {\ + "packageLocation": "./.yarn/cache/keyv-npm-4.5.4-4c8e2cf7f7-aa52f3c5e1.zip/node_modules/keyv/",\ + "packageDependencies": [\ + ["keyv", "npm:4.5.4"],\ + ["json-buffer", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["kleur", [\ @@ -8829,6 +9714,16 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["loose-envify", [\ + ["npm:1.4.0", {\ + "packageLocation": "./.yarn/cache/loose-envify-npm-1.4.0-6307b72ccf-655d110220.zip/node_modules/loose-envify/",\ + "packageDependencies": [\ + ["loose-envify", "npm:1.4.0"],\ + ["js-tokens", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["loupe", [\ ["npm:3.1.1", {\ "packageLocation": "./.yarn/cache/loupe-npm-3.1.1-78e77452a4-99f88badc4.zip/node_modules/loupe/",\ @@ -9295,6 +10190,37 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["neostandard", [\ + ["npm:0.11.5", {\ + "packageLocation": "./.yarn/cache/neostandard-npm-0.11.5-308539f489-4c8254bec2.zip/node_modules/neostandard/",\ + "packageDependencies": [\ + ["neostandard", "npm:0.11.5"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:0.11.5", {\ + "packageLocation": "./.yarn/__virtual__/neostandard-virtual-d28f94b422/0/cache/neostandard-npm-0.11.5-308539f489-4c8254bec2.zip/node_modules/neostandard/",\ + "packageDependencies": [\ + ["neostandard", "virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:0.11.5"],\ + ["@humanwhocodes/gitignore-to-minimatch", "npm:1.0.2"],\ + ["@stylistic/eslint-plugin", "virtual:d28f94b4223d3c694bf416402e9202d001d755adf9255b0fd4b0df4e73293d260d1c67b6bf4ef640df020fb5c20f41ea4a37fb92e0255d4546dcea42c54f4b00#npm:2.8.0"],\ + ["@types/eslint", null],\ + ["eslint", "virtual:91da830b29af2704bfc9679729fb85d00ca0b8eeb24a837747a5bc0b5aec0e922594580a901a48c34c06a65b9b376f23fa3cbb88dc9fd35cddc5076ab48a067f#npm:9.11.0"],\ + ["eslint-plugin-n", "virtual:d28f94b4223d3c694bf416402e9202d001d755adf9255b0fd4b0df4e73293d260d1c67b6bf4ef640df020fb5c20f41ea4a37fb92e0255d4546dcea42c54f4b00#npm:17.10.3"],\ + ["eslint-plugin-promise", "virtual:d28f94b4223d3c694bf416402e9202d001d755adf9255b0fd4b0df4e73293d260d1c67b6bf4ef640df020fb5c20f41ea4a37fb92e0255d4546dcea42c54f4b00#npm:7.1.0"],\ + ["eslint-plugin-react", "virtual:d28f94b4223d3c694bf416402e9202d001d755adf9255b0fd4b0df4e73293d260d1c67b6bf4ef640df020fb5c20f41ea4a37fb92e0255d4546dcea42c54f4b00#npm:7.36.1"],\ + ["find-up", "npm:5.0.0"],\ + ["globals", "npm:15.9.0"],\ + ["peowly", "npm:1.3.2"],\ + ["typescript-eslint", "virtual:d28f94b4223d3c694bf416402e9202d001d755adf9255b0fd4b0df4e73293d260d1c67b6bf4ef640df020fb5c20f41ea4a37fb92e0255d4546dcea42c54f4b00#npm:8.6.0"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["netmask", [\ ["npm:2.0.2", {\ "packageLocation": "./.yarn/cache/netmask-npm-2.0.2-2299510a4d-cafd28388e.zip/node_modules/netmask/",\ @@ -9498,6 +10424,18 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["object.entries", [\ + ["npm:1.1.8", {\ + "packageLocation": "./.yarn/cache/object.entries-npm-1.1.8-386f7451b8-db9ea979d2.zip/node_modules/object.entries/",\ + "packageDependencies": [\ + ["object.entries", "npm:1.1.8"],\ + ["call-bind", "npm:1.0.7"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-object-atoms", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["object.fromentries", [\ ["npm:2.0.8", {\ "packageLocation": "./.yarn/cache/object.fromentries-npm-2.0.8-8f6e2db04a-cd4327e6c3.zip/node_modules/object.fromentries/",\ @@ -9907,6 +10845,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["peowly", [\ + ["npm:1.3.2", {\ + "packageLocation": "./.yarn/cache/peowly-npm-1.3.2-ad29e74c38-92af395548.zip/node_modules/peowly/",\ + "packageDependencies": [\ + ["peowly", "npm:1.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["picocolors", [\ ["npm:1.0.1", {\ "packageLocation": "./.yarn/cache/picocolors-npm-1.0.1-39442f3da8-c63cdad2bf.zip/node_modules/picocolors/",\ @@ -9930,6 +10877,13 @@ const RAW_RUNTIME_STATE = ["picomatch", "npm:2.3.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:4.0.2", {\ + "packageLocation": "./.yarn/cache/picomatch-npm-4.0.2-e93516ddf2-7c51f3ad2b.zip/node_modules/picomatch/",\ + "packageDependencies": [\ + ["picomatch", "npm:4.0.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["pinia", [\ @@ -10079,6 +11033,18 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["prop-types", [\ + ["npm:15.8.1", {\ + "packageLocation": "./.yarn/cache/prop-types-npm-15.8.1-17c71ee7ee-59ece7ca2f.zip/node_modules/prop-types/",\ + "packageDependencies": [\ + ["prop-types", "npm:15.8.1"],\ + ["loose-envify", "npm:1.4.0"],\ + ["object-assign", "npm:4.1.1"],\ + ["react-is", "npm:16.13.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["proto-list", [\ ["npm:1.2.4", {\ "packageLocation": "./.yarn/cache/proto-list-npm-1.2.4-a96a43df28-b9179f9939.zip/node_modules/proto-list/",\ @@ -10185,6 +11151,13 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["react-is", [\ + ["npm:16.13.1", {\ + "packageLocation": "./.yarn/cache/react-is-npm-16.13.1-a9b9382b4f-33977da7a5.zip/node_modules/react-is/",\ + "packageDependencies": [\ + ["react-is", "npm:16.13.1"]\ + ],\ + "linkType": "HARD"\ + }],\ ["npm:18.2.0", {\ "packageLocation": "./.yarn/cache/react-is-npm-18.2.0-0cc5edb910-6eb5e4b280.zip/node_modules/react-is/",\ "packageDependencies": [\ @@ -10222,6 +11195,22 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["reflect.getprototypeof", [\ + ["npm:1.0.6", {\ + "packageLocation": "./.yarn/cache/reflect.getprototypeof-npm-1.0.6-b33819c756-baf4ef8ee6.zip/node_modules/reflect.getprototypeof/",\ + "packageDependencies": [\ + ["reflect.getprototypeof", "npm:1.0.6"],\ + ["call-bind", "npm:1.0.7"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.23.3"],\ + ["es-errors", "npm:1.3.0"],\ + ["get-intrinsic", "npm:1.2.4"],\ + ["globalthis", "npm:1.0.3"],\ + ["which-builtin-type", "npm:1.1.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["regexp-tree", [\ ["npm:0.1.27", {\ "packageLocation": "./.yarn/cache/regexp-tree-npm-0.1.27-e0324e6a9c-f636f44b4a.zip/node_modules/regexp-tree/",\ @@ -10300,6 +11289,16 @@ const RAW_RUNTIME_STATE = ["supports-preserve-symlinks-flag", "npm:1.0.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d", {\ + "packageLocation": "./.yarn/cache/resolve-patch-95f8f5d302-78ad6edb83.zip/node_modules/resolve/",\ + "packageDependencies": [\ + ["resolve", "patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d"],\ + ["is-core-module", "npm:2.13.1"],\ + ["path-parse", "npm:1.0.7"],\ + ["supports-preserve-symlinks-flag", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["resolve-cwd", [\ @@ -10328,6 +11327,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["resolve-pkg-maps", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/resolve-pkg-maps-npm-1.0.0-135b70c854-fb8f7bbe2c.zip/node_modules/resolve-pkg-maps/",\ + "packageDependencies": [\ + ["resolve-pkg-maps", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["resolve.exports", [\ ["npm:2.0.2", {\ "packageLocation": "./.yarn/cache/resolve.exports-npm-2.0.2-f59b42bbe5-cc4cffdc25.zip/node_modules/resolve.exports/",\ @@ -11014,6 +12022,38 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["string.prototype.matchall", [\ + ["npm:4.0.11", {\ + "packageLocation": "./.yarn/cache/string.prototype.matchall-npm-4.0.11-a18d0665a1-915a2562ac.zip/node_modules/string.prototype.matchall/",\ + "packageDependencies": [\ + ["string.prototype.matchall", "npm:4.0.11"],\ + ["call-bind", "npm:1.0.7"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.23.2"],\ + ["es-errors", "npm:1.3.0"],\ + ["es-object-atoms", "npm:1.0.0"],\ + ["get-intrinsic", "npm:1.2.4"],\ + ["gopd", "npm:1.0.1"],\ + ["has-symbols", "npm:1.0.3"],\ + ["internal-slot", "npm:1.0.7"],\ + ["regexp.prototype.flags", "npm:1.5.2"],\ + ["set-function-name", "npm:2.0.2"],\ + ["side-channel", "npm:1.0.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["string.prototype.repeat", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/string.prototype.repeat-npm-1.0.0-3f87f5fd9e-94c7978566.zip/node_modules/string.prototype.repeat/",\ + "packageDependencies": [\ + ["string.prototype.repeat", "npm:1.0.0"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.23.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["string.prototype.trim", [\ ["npm:1.2.9", {\ "packageLocation": "./.yarn/cache/string.prototype.trim-npm-1.2.9-7b24b35971-dcef1a0fb6.zip/node_modules/string.prototype.trim/",\ @@ -11049,6 +12089,16 @@ const RAW_RUNTIME_STATE = ["es-abstract", "npm:1.23.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:1.0.8", {\ + "packageLocation": "./.yarn/cache/string.prototype.trimstart-npm-1.0.8-8c6b16ba6e-d53af18999.zip/node_modules/string.prototype.trimstart/",\ + "packageDependencies": [\ + ["string.prototype.trimstart", "npm:1.0.8"],\ + ["call-bind", "npm:1.0.7"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-object-atoms", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["string_decoder", [\ @@ -11194,6 +12244,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["tapable", [\ + ["npm:2.2.1", {\ + "packageLocation": "./.yarn/cache/tapable-npm-2.2.1-8cf5ff3039-bc40e6efe1.zip/node_modules/tapable/",\ + "packageDependencies": [\ + ["tapable", "npm:2.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["tar", [\ ["npm:6.2.1", {\ "packageLocation": "./.yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/",\ @@ -11370,10 +12429,10 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ - ["virtual:d7b99fee6270c4adca4915d67fd385ba9a3a0712bb49a651b512d2bf62e34f9f2728c8179d8e79179380350e90994e7c4eda6ceb37404d7009f73b8914515f73#npm:1.3.0", {\ - "packageLocation": "./.yarn/__virtual__/ts-api-utils-virtual-13af5f60bd/0/cache/ts-api-utils-npm-1.3.0-33457908f8-f54a0ba9ed.zip/node_modules/ts-api-utils/",\ + ["virtual:3559e7e5a5961e6852e14381d33a435c4daea7fd30f3fa5bee9dd7abf530031ed9fbcd0f3060b1edb2334e8c8f959f6f5e6fde6940ee0ccf2da7fdda3327896c#npm:1.3.0", {\ + "packageLocation": "./.yarn/__virtual__/ts-api-utils-virtual-67e4d2ec9d/0/cache/ts-api-utils-npm-1.3.0-33457908f8-f54a0ba9ed.zip/node_modules/ts-api-utils/",\ "packageDependencies": [\ - ["ts-api-utils", "virtual:d7b99fee6270c4adca4915d67fd385ba9a3a0712bb49a651b512d2bf62e34f9f2728c8179d8e79179380350e90994e7c4eda6ceb37404d7009f73b8914515f73#npm:1.3.0"],\ + ["ts-api-utils", "virtual:3559e7e5a5961e6852e14381d33a435c4daea7fd30f3fa5bee9dd7abf530031ed9fbcd0f3060b1edb2334e8c8f959f6f5e6fde6940ee0ccf2da7fdda3327896c#npm:1.3.0"],\ ["@types/typescript", null],\ ["typescript", null]\ ],\ @@ -11529,6 +12588,44 @@ const RAW_RUNTIME_STATE = ["possible-typed-array-names", "npm:1.0.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:1.0.6", {\ + "packageLocation": "./.yarn/cache/typed-array-length-npm-1.0.6-867a36a1ac-74253d7dc4.zip/node_modules/typed-array-length/",\ + "packageDependencies": [\ + ["typed-array-length", "npm:1.0.6"],\ + ["call-bind", "npm:1.0.7"],\ + ["for-each", "npm:0.3.3"],\ + ["gopd", "npm:1.0.1"],\ + ["has-proto", "npm:1.0.3"],\ + ["is-typed-array", "npm:1.1.13"],\ + ["possible-typed-array-names", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["typescript-eslint", [\ + ["npm:8.6.0", {\ + "packageLocation": "./.yarn/cache/typescript-eslint-npm-8.6.0-2150f6ebbd-d009170af1.zip/node_modules/typescript-eslint/",\ + "packageDependencies": [\ + ["typescript-eslint", "npm:8.6.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:d28f94b4223d3c694bf416402e9202d001d755adf9255b0fd4b0df4e73293d260d1c67b6bf4ef640df020fb5c20f41ea4a37fb92e0255d4546dcea42c54f4b00#npm:8.6.0", {\ + "packageLocation": "./.yarn/__virtual__/typescript-eslint-virtual-19750da45f/0/cache/typescript-eslint-npm-8.6.0-2150f6ebbd-d009170af1.zip/node_modules/typescript-eslint/",\ + "packageDependencies": [\ + ["typescript-eslint", "virtual:d28f94b4223d3c694bf416402e9202d001d755adf9255b0fd4b0df4e73293d260d1c67b6bf4ef640df020fb5c20f41ea4a37fb92e0255d4546dcea42c54f4b00#npm:8.6.0"],\ + ["@types/typescript", null],\ + ["@typescript-eslint/eslint-plugin", "virtual:19750da45fbfcf0c8434a3085531a0a650cdad5f094b5aec70c73144e8fea0729f04ae84e934890e3c9a28d8cdbb3ca4c0894290a913e7d7470a0259ed0492c5#npm:8.6.0"],\ + ["@typescript-eslint/parser", "virtual:19750da45fbfcf0c8434a3085531a0a650cdad5f094b5aec70c73144e8fea0729f04ae84e934890e3c9a28d8cdbb3ca4c0894290a913e7d7470a0259ed0492c5#npm:8.6.0"],\ + ["@typescript-eslint/utils", "virtual:19750da45fbfcf0c8434a3085531a0a650cdad5f094b5aec70c73144e8fea0729f04ae84e934890e3c9a28d8cdbb3ca4c0894290a913e7d7470a0259ed0492c5#npm:8.6.0"],\ + ["typescript", null]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["unbox-primitive", [\ @@ -12360,6 +13457,40 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["which-builtin-type", [\ + ["npm:1.1.4", {\ + "packageLocation": "./.yarn/cache/which-builtin-type-npm-1.1.4-23f1df9013-a4a76d20d8.zip/node_modules/which-builtin-type/",\ + "packageDependencies": [\ + ["which-builtin-type", "npm:1.1.4"],\ + ["function.prototype.name", "npm:1.1.6"],\ + ["has-tostringtag", "npm:1.0.2"],\ + ["is-async-function", "npm:2.0.0"],\ + ["is-date-object", "npm:1.0.5"],\ + ["is-finalizationregistry", "npm:1.0.2"],\ + ["is-generator-function", "npm:1.0.10"],\ + ["is-regex", "npm:1.1.4"],\ + ["is-weakref", "npm:1.0.2"],\ + ["isarray", "npm:2.0.5"],\ + ["which-boxed-primitive", "npm:1.0.2"],\ + ["which-collection", "npm:1.0.2"],\ + ["which-typed-array", "npm:1.1.15"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["which-collection", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/which-collection-npm-1.0.2-0d6277e921-3345fde209.zip/node_modules/which-collection/",\ + "packageDependencies": [\ + ["which-collection", "npm:1.0.2"],\ + ["is-map", "npm:2.0.3"],\ + ["is-set", "npm:2.0.3"],\ + ["is-weakmap", "npm:2.0.2"],\ + ["is-weakset", "npm:2.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["which-typed-array", [\ ["npm:1.1.15", {\ "packageLocation": "./.yarn/cache/which-typed-array-npm-1.1.15-91410874a2-4465d5348c.zip/node_modules/which-typed-array/",\ diff --git a/.yarn/cache/@eslint-community-regexpp-npm-4.11.1-37bbb67aaa-fbcc1cb65e.zip b/.yarn/cache/@eslint-community-regexpp-npm-4.11.1-37bbb67aaa-fbcc1cb65e.zip new file mode 100644 index 0000000000..36e164eb58 Binary files /dev/null and b/.yarn/cache/@eslint-community-regexpp-npm-4.11.1-37bbb67aaa-fbcc1cb65e.zip differ diff --git a/.yarn/cache/@eslint-config-array-npm-0.18.0-bb4bc4e301-0234aeb3e6.zip b/.yarn/cache/@eslint-config-array-npm-0.18.0-bb4bc4e301-0234aeb3e6.zip new file mode 100644 index 0000000000..77ac86ca73 Binary files /dev/null and b/.yarn/cache/@eslint-config-array-npm-0.18.0-bb4bc4e301-0234aeb3e6.zip differ diff --git a/.yarn/cache/@eslint-eslintrc-npm-3.1.0-3837a202e2-5b7332ed78.zip b/.yarn/cache/@eslint-eslintrc-npm-3.1.0-3837a202e2-5b7332ed78.zip new file mode 100644 index 0000000000..18e59b2a81 Binary files /dev/null and b/.yarn/cache/@eslint-eslintrc-npm-3.1.0-3837a202e2-5b7332ed78.zip differ diff --git a/.yarn/cache/@eslint-js-npm-9.11.0-5379f7136c-7403aeba28.zip b/.yarn/cache/@eslint-js-npm-9.11.0-5379f7136c-7403aeba28.zip new file mode 100644 index 0000000000..29dfcc67d4 Binary files /dev/null and b/.yarn/cache/@eslint-js-npm-9.11.0-5379f7136c-7403aeba28.zip differ diff --git a/.yarn/cache/@eslint-object-schema-npm-2.1.4-0546250476-e9885532ea.zip b/.yarn/cache/@eslint-object-schema-npm-2.1.4-0546250476-e9885532ea.zip new file mode 100644 index 0000000000..959b560f5c Binary files /dev/null and b/.yarn/cache/@eslint-object-schema-npm-2.1.4-0546250476-e9885532ea.zip differ diff --git a/.yarn/cache/@eslint-plugin-kit-npm-0.2.0-8ef0139590-00b92bc52a.zip b/.yarn/cache/@eslint-plugin-kit-npm-0.2.0-8ef0139590-00b92bc52a.zip new file mode 100644 index 0000000000..74dfa3888e Binary files /dev/null and b/.yarn/cache/@eslint-plugin-kit-npm-0.2.0-8ef0139590-00b92bc52a.zip differ diff --git a/.yarn/cache/@humanwhocodes-gitignore-to-minimatch-npm-1.0.2-247ae8a408-f2d3325e50.zip b/.yarn/cache/@humanwhocodes-gitignore-to-minimatch-npm-1.0.2-247ae8a408-f2d3325e50.zip new file mode 100644 index 0000000000..e3f1756a2d Binary files /dev/null and b/.yarn/cache/@humanwhocodes-gitignore-to-minimatch-npm-1.0.2-247ae8a408-f2d3325e50.zip differ diff --git a/.yarn/cache/@humanwhocodes-retry-npm-0.3.0-fd8faa0baa-7111ec4e09.zip b/.yarn/cache/@humanwhocodes-retry-npm-0.3.0-fd8faa0baa-7111ec4e09.zip new file mode 100644 index 0000000000..136c78fe4e Binary files /dev/null and b/.yarn/cache/@humanwhocodes-retry-npm-0.3.0-fd8faa0baa-7111ec4e09.zip differ diff --git a/.yarn/cache/@stylistic-eslint-plugin-npm-2.8.0-f3963a5979-e85fc3ecad.zip b/.yarn/cache/@stylistic-eslint-plugin-npm-2.8.0-f3963a5979-e85fc3ecad.zip new file mode 100644 index 0000000000..c18033cad2 Binary files /dev/null and b/.yarn/cache/@stylistic-eslint-plugin-npm-2.8.0-f3963a5979-e85fc3ecad.zip differ diff --git a/.yarn/cache/@typescript-eslint-eslint-plugin-npm-8.6.0-73fa341384-c777f01535.zip b/.yarn/cache/@typescript-eslint-eslint-plugin-npm-8.6.0-73fa341384-c777f01535.zip new file mode 100644 index 0000000000..4c1f9f602c Binary files /dev/null and b/.yarn/cache/@typescript-eslint-eslint-plugin-npm-8.6.0-73fa341384-c777f01535.zip differ diff --git a/.yarn/cache/@typescript-eslint-parser-npm-8.6.0-ba9ca503c0-3f280d289b.zip b/.yarn/cache/@typescript-eslint-parser-npm-8.6.0-ba9ca503c0-3f280d289b.zip new file mode 100644 index 0000000000..b838713f23 Binary files /dev/null and b/.yarn/cache/@typescript-eslint-parser-npm-8.6.0-ba9ca503c0-3f280d289b.zip differ diff --git a/.yarn/cache/@typescript-eslint-scope-manager-npm-8.6.0-140dfc3357-37092ef701.zip b/.yarn/cache/@typescript-eslint-scope-manager-npm-8.6.0-140dfc3357-37092ef701.zip new file mode 100644 index 0000000000..811ca281a4 Binary files /dev/null and b/.yarn/cache/@typescript-eslint-scope-manager-npm-8.6.0-140dfc3357-37092ef701.zip differ diff --git a/.yarn/cache/@typescript-eslint-type-utils-npm-8.6.0-ff51172a1e-914b4637ca.zip b/.yarn/cache/@typescript-eslint-type-utils-npm-8.6.0-ff51172a1e-914b4637ca.zip new file mode 100644 index 0000000000..9651cf685d Binary files /dev/null and b/.yarn/cache/@typescript-eslint-type-utils-npm-8.6.0-ff51172a1e-914b4637ca.zip differ diff --git a/.yarn/cache/@typescript-eslint-types-npm-8.6.0-0dac0f420c-e7051d2122.zip b/.yarn/cache/@typescript-eslint-types-npm-8.6.0-0dac0f420c-e7051d2122.zip new file mode 100644 index 0000000000..23528b3e8b Binary files /dev/null and b/.yarn/cache/@typescript-eslint-types-npm-8.6.0-0dac0f420c-e7051d2122.zip differ diff --git a/.yarn/cache/@typescript-eslint-typescript-estree-npm-8.6.0-9540992a8b-33ab8c0322.zip b/.yarn/cache/@typescript-eslint-typescript-estree-npm-8.6.0-9540992a8b-33ab8c0322.zip new file mode 100644 index 0000000000..10085438c8 Binary files /dev/null and b/.yarn/cache/@typescript-eslint-typescript-estree-npm-8.6.0-9540992a8b-33ab8c0322.zip differ diff --git a/.yarn/cache/@typescript-eslint-utils-npm-8.6.0-a435898cef-5b61510634.zip b/.yarn/cache/@typescript-eslint-utils-npm-8.6.0-a435898cef-5b61510634.zip new file mode 100644 index 0000000000..a3ec97bf7d Binary files /dev/null and b/.yarn/cache/@typescript-eslint-utils-npm-8.6.0-a435898cef-5b61510634.zip differ diff --git a/.yarn/cache/@typescript-eslint-visitor-keys-npm-8.6.0-670a184023-9bd5d5daee.zip b/.yarn/cache/@typescript-eslint-visitor-keys-npm-8.6.0-670a184023-9bd5d5daee.zip new file mode 100644 index 0000000000..101e6fb7bf Binary files /dev/null and b/.yarn/cache/@typescript-eslint-visitor-keys-npm-8.6.0-670a184023-9bd5d5daee.zip differ diff --git a/.yarn/cache/acorn-npm-8.12.1-610871d57c-51fb26cd67.zip b/.yarn/cache/acorn-npm-8.12.1-610871d57c-51fb26cd67.zip new file mode 100644 index 0000000000..a91f9777f1 Binary files /dev/null and b/.yarn/cache/acorn-npm-8.12.1-610871d57c-51fb26cd67.zip differ diff --git a/.yarn/cache/array.prototype.findlast-npm-1.2.5-316cb71d39-ddc952b829.zip b/.yarn/cache/array.prototype.findlast-npm-1.2.5-316cb71d39-ddc952b829.zip new file mode 100644 index 0000000000..9898d56ec5 Binary files /dev/null and b/.yarn/cache/array.prototype.findlast-npm-1.2.5-316cb71d39-ddc952b829.zip differ diff --git a/.yarn/cache/array.prototype.tosorted-npm-1.1.4-c1fc919434-eb3c4c4fc0.zip b/.yarn/cache/array.prototype.tosorted-npm-1.1.4-c1fc919434-eb3c4c4fc0.zip new file mode 100644 index 0000000000..9dd3e1413f Binary files /dev/null and b/.yarn/cache/array.prototype.tosorted-npm-1.1.4-c1fc919434-eb3c4c4fc0.zip differ diff --git a/.yarn/cache/enhanced-resolve-npm-5.17.1-296305b69f-81a0515675.zip b/.yarn/cache/enhanced-resolve-npm-5.17.1-296305b69f-81a0515675.zip new file mode 100644 index 0000000000..2b369a1069 Binary files /dev/null and b/.yarn/cache/enhanced-resolve-npm-5.17.1-296305b69f-81a0515675.zip differ diff --git a/.yarn/cache/es-abstract-npm-1.23.3-ffd85665f7-d27e9afafb.zip b/.yarn/cache/es-abstract-npm-1.23.3-ffd85665f7-d27e9afafb.zip new file mode 100644 index 0000000000..0dea71b109 Binary files /dev/null and b/.yarn/cache/es-abstract-npm-1.23.3-ffd85665f7-d27e9afafb.zip differ diff --git a/.yarn/cache/es-iterator-helpers-npm-1.0.19-5a0b930ca7-ae8f0241e3.zip b/.yarn/cache/es-iterator-helpers-npm-1.0.19-5a0b930ca7-ae8f0241e3.zip new file mode 100644 index 0000000000..741fe754b5 Binary files /dev/null and b/.yarn/cache/es-iterator-helpers-npm-1.0.19-5a0b930ca7-ae8f0241e3.zip differ diff --git a/.yarn/cache/eslint-compat-utils-npm-0.5.1-f1f8ade49a-325e815205.zip b/.yarn/cache/eslint-compat-utils-npm-0.5.1-f1f8ade49a-325e815205.zip new file mode 100644 index 0000000000..f54c69ceeb Binary files /dev/null and b/.yarn/cache/eslint-compat-utils-npm-0.5.1-f1f8ade49a-325e815205.zip differ diff --git a/.yarn/cache/eslint-npm-9.11.0-c863a38fe8-3438a78172.zip b/.yarn/cache/eslint-npm-9.11.0-c863a38fe8-3438a78172.zip new file mode 100644 index 0000000000..0e00e0d52b Binary files /dev/null and b/.yarn/cache/eslint-npm-9.11.0-c863a38fe8-3438a78172.zip differ diff --git a/.yarn/cache/eslint-plugin-es-x-npm-7.8.0-8237bd972e-002fda8c02.zip b/.yarn/cache/eslint-plugin-es-x-npm-7.8.0-8237bd972e-002fda8c02.zip new file mode 100644 index 0000000000..8ce24e74c8 Binary files /dev/null and b/.yarn/cache/eslint-plugin-es-x-npm-7.8.0-8237bd972e-002fda8c02.zip differ diff --git a/.yarn/cache/eslint-plugin-jest-npm-28.8.3-1ed9189d04-beacf85c2f.zip b/.yarn/cache/eslint-plugin-jest-npm-28.8.3-1ed9189d04-beacf85c2f.zip new file mode 100644 index 0000000000..f4aed2754d Binary files /dev/null and b/.yarn/cache/eslint-plugin-jest-npm-28.8.3-1ed9189d04-beacf85c2f.zip differ diff --git a/.yarn/cache/eslint-plugin-lodash-npm-8.0.0-2371800091-7850aa39e4.zip b/.yarn/cache/eslint-plugin-lodash-npm-8.0.0-2371800091-7850aa39e4.zip new file mode 100644 index 0000000000..658816212f Binary files /dev/null and b/.yarn/cache/eslint-plugin-lodash-npm-8.0.0-2371800091-7850aa39e4.zip differ diff --git a/.yarn/cache/eslint-plugin-n-npm-17.10.3-a0c541f5cb-4da20f8243.zip b/.yarn/cache/eslint-plugin-n-npm-17.10.3-a0c541f5cb-4da20f8243.zip new file mode 100644 index 0000000000..3bf628e841 Binary files /dev/null and b/.yarn/cache/eslint-plugin-n-npm-17.10.3-a0c541f5cb-4da20f8243.zip differ diff --git a/.yarn/cache/eslint-plugin-promise-npm-7.1.0-84a3fbeaa7-bbc3406139.zip b/.yarn/cache/eslint-plugin-promise-npm-7.1.0-84a3fbeaa7-bbc3406139.zip new file mode 100644 index 0000000000..f9e3dc8ea7 Binary files /dev/null and b/.yarn/cache/eslint-plugin-promise-npm-7.1.0-84a3fbeaa7-bbc3406139.zip differ diff --git a/.yarn/cache/eslint-plugin-react-npm-7.36.1-3f05625f11-8cb37f7fb3.zip b/.yarn/cache/eslint-plugin-react-npm-7.36.1-3f05625f11-8cb37f7fb3.zip new file mode 100644 index 0000000000..e3f2e6223c Binary files /dev/null and b/.yarn/cache/eslint-plugin-react-npm-7.36.1-3f05625f11-8cb37f7fb3.zip differ diff --git a/.yarn/cache/eslint-scope-npm-8.0.2-984149bd64-477f820647.zip b/.yarn/cache/eslint-scope-npm-8.0.2-984149bd64-477f820647.zip new file mode 100644 index 0000000000..38fa966e14 Binary files /dev/null and b/.yarn/cache/eslint-scope-npm-8.0.2-984149bd64-477f820647.zip differ diff --git a/.yarn/cache/eslint-visitor-keys-npm-4.0.0-9098eefd77-76619f42cf.zip b/.yarn/cache/eslint-visitor-keys-npm-4.0.0-9098eefd77-76619f42cf.zip new file mode 100644 index 0000000000..e0d3f49699 Binary files /dev/null and b/.yarn/cache/eslint-visitor-keys-npm-4.0.0-9098eefd77-76619f42cf.zip differ diff --git a/.yarn/cache/espree-npm-10.1.0-6847541ce4-52e6feaa77.zip b/.yarn/cache/espree-npm-10.1.0-6847541ce4-52e6feaa77.zip new file mode 100644 index 0000000000..9cab0acf41 Binary files /dev/null and b/.yarn/cache/espree-npm-10.1.0-6847541ce4-52e6feaa77.zip differ diff --git a/.yarn/cache/esquery-npm-1.6.0-16fee31531-cb9065ec60.zip b/.yarn/cache/esquery-npm-1.6.0-16fee31531-cb9065ec60.zip new file mode 100644 index 0000000000..6c806b633a Binary files /dev/null and b/.yarn/cache/esquery-npm-1.6.0-16fee31531-cb9065ec60.zip differ diff --git a/.yarn/cache/file-entry-cache-npm-8.0.0-5b09d19a83-9e2b5938b1.zip b/.yarn/cache/file-entry-cache-npm-8.0.0-5b09d19a83-9e2b5938b1.zip new file mode 100644 index 0000000000..daedfebc39 Binary files /dev/null and b/.yarn/cache/file-entry-cache-npm-8.0.0-5b09d19a83-9e2b5938b1.zip differ diff --git a/.yarn/cache/flat-cache-npm-4.0.1-12bf2455f7-2c59d93e9f.zip b/.yarn/cache/flat-cache-npm-4.0.1-12bf2455f7-2c59d93e9f.zip new file mode 100644 index 0000000000..4957d43c2e Binary files /dev/null and b/.yarn/cache/flat-cache-npm-4.0.1-12bf2455f7-2c59d93e9f.zip differ diff --git a/.yarn/cache/get-tsconfig-npm-4.8.1-adab2fc965-536ee85d20.zip b/.yarn/cache/get-tsconfig-npm-4.8.1-adab2fc965-536ee85d20.zip new file mode 100644 index 0000000000..ff945ee0ab Binary files /dev/null and b/.yarn/cache/get-tsconfig-npm-4.8.1-adab2fc965-536ee85d20.zip differ diff --git a/.yarn/cache/globals-npm-14.0.0-5fc3d8d5da-b96ff42620.zip b/.yarn/cache/globals-npm-14.0.0-5fc3d8d5da-b96ff42620.zip new file mode 100644 index 0000000000..0ea7d9b76d Binary files /dev/null and b/.yarn/cache/globals-npm-14.0.0-5fc3d8d5da-b96ff42620.zip differ diff --git a/.yarn/cache/globals-npm-15.9.0-52af85f5e6-de4b553e41.zip b/.yarn/cache/globals-npm-15.9.0-52af85f5e6-de4b553e41.zip new file mode 100644 index 0000000000..61f28e5e0e Binary files /dev/null and b/.yarn/cache/globals-npm-15.9.0-52af85f5e6-de4b553e41.zip differ diff --git a/.yarn/cache/ignore-npm-5.3.2-346d3ba017-f9f652c957.zip b/.yarn/cache/ignore-npm-5.3.2-346d3ba017-f9f652c957.zip new file mode 100644 index 0000000000..e788be2f4e Binary files /dev/null and b/.yarn/cache/ignore-npm-5.3.2-346d3ba017-f9f652c957.zip differ diff --git a/.yarn/cache/is-async-function-npm-2.0.0-ebf8596ab1-787bc93157.zip b/.yarn/cache/is-async-function-npm-2.0.0-ebf8596ab1-787bc93157.zip new file mode 100644 index 0000000000..1f68ffb4ee Binary files /dev/null and b/.yarn/cache/is-async-function-npm-2.0.0-ebf8596ab1-787bc93157.zip differ diff --git a/.yarn/cache/is-finalizationregistry-npm-1.0.2-15bf1bd7ce-81caecc984.zip b/.yarn/cache/is-finalizationregistry-npm-1.0.2-15bf1bd7ce-81caecc984.zip new file mode 100644 index 0000000000..664893a345 Binary files /dev/null and b/.yarn/cache/is-finalizationregistry-npm-1.0.2-15bf1bd7ce-81caecc984.zip differ diff --git a/.yarn/cache/is-generator-function-npm-1.0.10-1d0f3809ef-df03514df0.zip b/.yarn/cache/is-generator-function-npm-1.0.10-1d0f3809ef-df03514df0.zip new file mode 100644 index 0000000000..93a5dc5fec Binary files /dev/null and b/.yarn/cache/is-generator-function-npm-1.0.10-1d0f3809ef-df03514df0.zip differ diff --git a/.yarn/cache/is-map-npm-2.0.3-9e061e76e3-2c4d431b74.zip b/.yarn/cache/is-map-npm-2.0.3-9e061e76e3-2c4d431b74.zip new file mode 100644 index 0000000000..6fc31219bb Binary files /dev/null and b/.yarn/cache/is-map-npm-2.0.3-9e061e76e3-2c4d431b74.zip differ diff --git a/.yarn/cache/is-set-npm-2.0.3-1b72c9a855-f73732e13f.zip b/.yarn/cache/is-set-npm-2.0.3-1b72c9a855-f73732e13f.zip new file mode 100644 index 0000000000..7a52a8e44a Binary files /dev/null and b/.yarn/cache/is-set-npm-2.0.3-1b72c9a855-f73732e13f.zip differ diff --git a/.yarn/cache/is-weakmap-npm-2.0.2-ced3cab2dc-443c35bb86.zip b/.yarn/cache/is-weakmap-npm-2.0.2-ced3cab2dc-443c35bb86.zip new file mode 100644 index 0000000000..e858c212b0 Binary files /dev/null and b/.yarn/cache/is-weakmap-npm-2.0.2-ced3cab2dc-443c35bb86.zip differ diff --git a/.yarn/cache/is-weakset-npm-2.0.3-f7d282c9c1-8ad6141b6a.zip b/.yarn/cache/is-weakset-npm-2.0.3-f7d282c9c1-8ad6141b6a.zip new file mode 100644 index 0000000000..688a069f4d Binary files /dev/null and b/.yarn/cache/is-weakset-npm-2.0.3-f7d282c9c1-8ad6141b6a.zip differ diff --git a/.yarn/cache/iterator.prototype-npm-1.1.2-009f234a21-a321513260.zip b/.yarn/cache/iterator.prototype-npm-1.1.2-009f234a21-a321513260.zip new file mode 100644 index 0000000000..168b0eacaa Binary files /dev/null and b/.yarn/cache/iterator.prototype-npm-1.1.2-009f234a21-a321513260.zip differ diff --git a/.yarn/cache/jsx-ast-utils-npm-3.3.5-114c80f97a-a32679e9cb.zip b/.yarn/cache/jsx-ast-utils-npm-3.3.5-114c80f97a-a32679e9cb.zip new file mode 100644 index 0000000000..0677f987c9 Binary files /dev/null and b/.yarn/cache/jsx-ast-utils-npm-3.3.5-114c80f97a-a32679e9cb.zip differ diff --git a/.yarn/cache/keyv-npm-4.5.4-4c8e2cf7f7-aa52f3c5e1.zip b/.yarn/cache/keyv-npm-4.5.4-4c8e2cf7f7-aa52f3c5e1.zip new file mode 100644 index 0000000000..5ab94ee922 Binary files /dev/null and b/.yarn/cache/keyv-npm-4.5.4-4c8e2cf7f7-aa52f3c5e1.zip differ diff --git a/.yarn/cache/loose-envify-npm-1.4.0-6307b72ccf-655d110220.zip b/.yarn/cache/loose-envify-npm-1.4.0-6307b72ccf-655d110220.zip new file mode 100644 index 0000000000..d548cfd933 Binary files /dev/null and b/.yarn/cache/loose-envify-npm-1.4.0-6307b72ccf-655d110220.zip differ diff --git a/.yarn/cache/neostandard-npm-0.11.5-308539f489-4c8254bec2.zip b/.yarn/cache/neostandard-npm-0.11.5-308539f489-4c8254bec2.zip new file mode 100644 index 0000000000..98171b6794 Binary files /dev/null and b/.yarn/cache/neostandard-npm-0.11.5-308539f489-4c8254bec2.zip differ diff --git a/.yarn/cache/object.entries-npm-1.1.8-386f7451b8-db9ea979d2.zip b/.yarn/cache/object.entries-npm-1.1.8-386f7451b8-db9ea979d2.zip new file mode 100644 index 0000000000..5094ff5aae Binary files /dev/null and b/.yarn/cache/object.entries-npm-1.1.8-386f7451b8-db9ea979d2.zip differ diff --git a/.yarn/cache/peowly-npm-1.3.2-ad29e74c38-92af395548.zip b/.yarn/cache/peowly-npm-1.3.2-ad29e74c38-92af395548.zip new file mode 100644 index 0000000000..aec4449930 Binary files /dev/null and b/.yarn/cache/peowly-npm-1.3.2-ad29e74c38-92af395548.zip differ diff --git a/.yarn/cache/picomatch-npm-4.0.2-e93516ddf2-7c51f3ad2b.zip b/.yarn/cache/picomatch-npm-4.0.2-e93516ddf2-7c51f3ad2b.zip new file mode 100644 index 0000000000..8f96a3f3b7 Binary files /dev/null and b/.yarn/cache/picomatch-npm-4.0.2-e93516ddf2-7c51f3ad2b.zip differ diff --git a/.yarn/cache/prop-types-npm-15.8.1-17c71ee7ee-59ece7ca2f.zip b/.yarn/cache/prop-types-npm-15.8.1-17c71ee7ee-59ece7ca2f.zip new file mode 100644 index 0000000000..5a3f61f419 Binary files /dev/null and b/.yarn/cache/prop-types-npm-15.8.1-17c71ee7ee-59ece7ca2f.zip differ diff --git a/.yarn/cache/react-is-npm-16.13.1-a9b9382b4f-33977da7a5.zip b/.yarn/cache/react-is-npm-16.13.1-a9b9382b4f-33977da7a5.zip new file mode 100644 index 0000000000..5642a10f80 Binary files /dev/null and b/.yarn/cache/react-is-npm-16.13.1-a9b9382b4f-33977da7a5.zip differ diff --git a/.yarn/cache/reflect.getprototypeof-npm-1.0.6-b33819c756-baf4ef8ee6.zip b/.yarn/cache/reflect.getprototypeof-npm-1.0.6-b33819c756-baf4ef8ee6.zip new file mode 100644 index 0000000000..e417a0a312 Binary files /dev/null and b/.yarn/cache/reflect.getprototypeof-npm-1.0.6-b33819c756-baf4ef8ee6.zip differ diff --git a/.yarn/cache/resolve-npm-2.0.0-next.5-0e83bf26ee-a6c33555e3.zip b/.yarn/cache/resolve-npm-2.0.0-next.5-0e83bf26ee-a6c33555e3.zip new file mode 100644 index 0000000000..faec1f6bcb Binary files /dev/null and b/.yarn/cache/resolve-npm-2.0.0-next.5-0e83bf26ee-a6c33555e3.zip differ diff --git a/.yarn/cache/resolve-patch-95f8f5d302-78ad6edb83.zip b/.yarn/cache/resolve-patch-95f8f5d302-78ad6edb83.zip new file mode 100644 index 0000000000..cd86bbf4d8 Binary files /dev/null and b/.yarn/cache/resolve-patch-95f8f5d302-78ad6edb83.zip differ diff --git a/.yarn/cache/resolve-pkg-maps-npm-1.0.0-135b70c854-fb8f7bbe2c.zip b/.yarn/cache/resolve-pkg-maps-npm-1.0.0-135b70c854-fb8f7bbe2c.zip new file mode 100644 index 0000000000..22c706b65b Binary files /dev/null and b/.yarn/cache/resolve-pkg-maps-npm-1.0.0-135b70c854-fb8f7bbe2c.zip differ diff --git a/.yarn/cache/string.prototype.matchall-npm-4.0.11-a18d0665a1-915a2562ac.zip b/.yarn/cache/string.prototype.matchall-npm-4.0.11-a18d0665a1-915a2562ac.zip new file mode 100644 index 0000000000..a5ccd7557e Binary files /dev/null and b/.yarn/cache/string.prototype.matchall-npm-4.0.11-a18d0665a1-915a2562ac.zip differ diff --git a/.yarn/cache/string.prototype.repeat-npm-1.0.0-3f87f5fd9e-94c7978566.zip b/.yarn/cache/string.prototype.repeat-npm-1.0.0-3f87f5fd9e-94c7978566.zip new file mode 100644 index 0000000000..8b00a32217 Binary files /dev/null and b/.yarn/cache/string.prototype.repeat-npm-1.0.0-3f87f5fd9e-94c7978566.zip differ diff --git a/.yarn/cache/string.prototype.trimstart-npm-1.0.8-8c6b16ba6e-d53af18999.zip b/.yarn/cache/string.prototype.trimstart-npm-1.0.8-8c6b16ba6e-d53af18999.zip new file mode 100644 index 0000000000..2bd1e618d1 Binary files /dev/null and b/.yarn/cache/string.prototype.trimstart-npm-1.0.8-8c6b16ba6e-d53af18999.zip differ diff --git a/.yarn/cache/tapable-npm-2.2.1-8cf5ff3039-bc40e6efe1.zip b/.yarn/cache/tapable-npm-2.2.1-8cf5ff3039-bc40e6efe1.zip new file mode 100644 index 0000000000..878e386fe2 Binary files /dev/null and b/.yarn/cache/tapable-npm-2.2.1-8cf5ff3039-bc40e6efe1.zip differ diff --git a/.yarn/cache/typed-array-length-npm-1.0.6-867a36a1ac-74253d7dc4.zip b/.yarn/cache/typed-array-length-npm-1.0.6-867a36a1ac-74253d7dc4.zip new file mode 100644 index 0000000000..d40981f363 Binary files /dev/null and b/.yarn/cache/typed-array-length-npm-1.0.6-867a36a1ac-74253d7dc4.zip differ diff --git a/.yarn/cache/typescript-eslint-npm-8.6.0-2150f6ebbd-d009170af1.zip b/.yarn/cache/typescript-eslint-npm-8.6.0-2150f6ebbd-d009170af1.zip new file mode 100644 index 0000000000..9a30544c2e Binary files /dev/null and b/.yarn/cache/typescript-eslint-npm-8.6.0-2150f6ebbd-d009170af1.zip differ diff --git a/.yarn/cache/which-builtin-type-npm-1.1.4-23f1df9013-a4a76d20d8.zip b/.yarn/cache/which-builtin-type-npm-1.1.4-23f1df9013-a4a76d20d8.zip new file mode 100644 index 0000000000..a65371143b Binary files /dev/null and b/.yarn/cache/which-builtin-type-npm-1.1.4-23f1df9013-a4a76d20d8.zip differ diff --git a/.yarn/cache/which-collection-npm-1.0.2-0d6277e921-3345fde209.zip b/.yarn/cache/which-collection-npm-1.0.2-0d6277e921-3345fde209.zip new file mode 100644 index 0000000000..4ea54a6fe3 Binary files /dev/null and b/.yarn/cache/which-collection-npm-1.0.2-0d6277e921-3345fde209.zip differ diff --git a/backend/__fixtures__/auth.js b/backend/__fixtures__/auth.js index 517c046975..2aefc6cb2b 100644 --- a/backend/__fixtures__/auth.js +++ b/backend/__fixtures__/auth.js @@ -13,7 +13,7 @@ const pathToRegexp = require('path-to-regexp') const { COOKIE_HEADER_PAYLOAD, COOKIE_TOKEN, - COOKIE_SIGNATURE + COOKIE_SIGNATURE, } = require('../lib/security/constants') const jose = require('../lib/security/jose') const { sessionSecrets } = require('./config').default @@ -31,7 +31,7 @@ async function getCookieValue (token) { const cookies = { [COOKIE_HEADER_PAYLOAD]: join([header, payload], '.'), [COOKIE_SIGNATURE]: signature, - [COOKIE_TOKEN]: encrypted + [COOKIE_TOKEN]: encrypted, } return reduce(cookies, (accumulator, value, key) => { if (accumulator) { @@ -65,13 +65,13 @@ const auth = { }, get bearer () { return bearer - } + }, } }, getTokenPayload ({ authorization } = {}) { const [, token] = /^Bearer (.*)$/.exec(authorization) return decode(token) - } + }, } const mocks = { @@ -91,19 +91,19 @@ const mocks = { verbs: ['get'], apiGroups: ['core.gardener.cloud'], resources: ['projects'], - resourceName: ['foo'] + resourceName: ['foo'], }) resourceRules.push({ verbs: ['create'], apiGroups: ['core.gardener.cloud'], - resources: ['projects'] + resources: ['projects'], }) } else { resourceRules.push({ verbs: ['get'], apiGroups: ['core.gardener.cloud'], resources: ['projects'], - resourceName: ['foo'] + resourceName: ['foo'], }) } return { @@ -111,8 +111,8 @@ const mocks = { status: { resourceRules, nonResourceRules, - incomplete - } + incomplete, + }, } } }, @@ -143,8 +143,8 @@ const mocks = { return Promise.resolve({ ...json, status: { - allowed - } + allowed, + }, }) } }, @@ -163,14 +163,14 @@ const mocks = { return Promise.resolve({ status: { user, - authenticated - } + authenticated, + }, }) } - } + }, } module.exports = { ...auth, - mocks + mocks, } diff --git a/backend/__fixtures__/cloudprofiles.js b/backend/__fixtures__/cloudprofiles.js index 0ae5b68b64..51aca9f118 100644 --- a/backend/__fixtures__/cloudprofiles.js +++ b/backend/__fixtures__/cloudprofiles.js @@ -12,7 +12,7 @@ function getCloudProfile ({ uid, name, kind, seedSelector = {} }) { return { metadata: { name, - uid + uid, }, spec: { type: kind, @@ -20,14 +20,14 @@ function getCloudProfile ({ uid, name, kind, seedSelector = {} }) { kubernetes: { versions: [ { - version: '1.9.0' + version: '1.9.0', }, { - version: '1.8.5' - } - ] - } - } + version: '1.8.5', + }, + ], + }, + }, } } @@ -35,42 +35,42 @@ const cloudProfileList = [ getCloudProfile({ uid: 1, name: 'infra1-profileName', - kind: 'infra1' + kind: 'infra1', }), getCloudProfile({ uid: 2, name: 'infra1-profileName2', kind: 'infra1', seedSelector: { - providerTypes: ['infra2', 'infra3'] - } + providerTypes: ['infra2', 'infra3'], + }, }), getCloudProfile({ uid: 3, name: 'infra2-profileName', - kind: 'infra2' + kind: 'infra2', }), getCloudProfile({ uid: 4, name: 'infra3-profileName', kind: 'infra3', seedSelector: { - matchLabels: { foo: 'bar' } - } + matchLabels: { foo: 'bar' }, + }, }), getCloudProfile({ uid: 5, name: 'infra3-profileName2', - kind: 'infra3' + kind: 'infra3', }), getCloudProfile({ uid: 6, name: 'infra4-profileName', kind: 'infra4', seedSelector: { - providerTypes: ['*'] - } - }) + providerTypes: ['*'], + }, + }), ] const cloudprofiles = { @@ -83,7 +83,7 @@ const cloudprofiles = { list () { return cloneDeep(cloudProfileList) }, - reset () {} + reset () {}, } module.exports = cloudprofiles diff --git a/backend/__fixtures__/config.js b/backend/__fixtures__/config.js index cf8cb21627..681e4df208 100644 --- a/backend/__fixtures__/config.js +++ b/backend/__fixtures__/config.js @@ -11,7 +11,7 @@ const { toHex, toBase64, gardenerConfigPath } = require('./helper') const ca = [ '-----BEGIN CERTIFICATE-----', toBase64('...'), - '-----END CERTIFICATE-----' + '-----END CERTIFICATE-----', ].join('\n') const defaultConfigPath = gardenerConfigPath() @@ -30,8 +30,8 @@ const defaultConfig = { repository: 'ticket-dev', webhookSecret: toHex('webhook-secret'), authentication: { - token: toHex('token') - } + token: toHex('token'), + }, }, sessionSecret, sessionSecrets: [sessionSecret], @@ -41,69 +41,69 @@ const defaultConfig = { ca, client_id: 'dashboard', redirect_uris: [ - 'https://localhost:8443/auth/callback' + 'https://localhost:8443/auth/callback', ], scope: 'openid email profile groups audience:server:client_id:dashboard audience:server:client_id:kube-kubectl', clockTolerance: 42, public: { clientId: 'kube-kubectl', - clientSecret: toHex('kube-kubectl-secret') - } + clientSecret: toHex('kube-kubectl-secret'), + }, }, terminal: { container: { - image: 'dummyImage:1.0.0' + image: 'dummyImage:1.0.0', }, containerImageDescriptions: [ { image: '/dummyImage:.*/', - description: 'Dummy Image Description' + description: 'Dummy Image Description', }, { image: 'fooImage:0.1.2', - description: 'Foo Image Description' - } + description: 'Foo Image Description', + }, ], gardenTerminalHost: { - seedRef: 'infra1-seed2' + seedRef: 'infra1-seed2', }, garden: { operatorCredentials: { serviceAccountRef: { name: 'dashboard-terminal-admin', - namespace: 'garden' - } - } - } + namespace: 'garden', + }, + }, + }, }, unreachableSeeds: { matchLabels: { - 'test-unreachable': 'true' - } + 'test-unreachable': 'true', + }, }, frontend: { features: { - terminalEnabled: true + terminalEnabled: true, }, helpMenuItems: [ { title: 'Getting Started', icon: 'description', - url: 'https://gardener.cloud/about/' + url: 'https://gardener.cloud/about/', }, { title: 'Feedback', icon: 'mdi-slack', - url: 'https://kubernetes.slack.com/messages/gardener/' + url: 'https://kubernetes.slack.com/messages/gardener/', }, { title: 'Issues', icon: 'mdi-bug', - url: 'https://github.com/gardener/dashboard/issues/' - } + url: 'https://github.com/gardener/dashboard/issues/', + }, ], - serviceAccountDefaultTokenExpiration: 42 - } + serviceAccountDefaultTokenExpiration: 42, + }, } const configMap = new Map() @@ -111,22 +111,22 @@ const configMap = new Map() configMap.set(defaultConfigPath, defaultConfig) configMap.set('/etc/gardener/1/config.yaml', { - port: 1234 + port: 1234, }) configMap.set('/etc/gardener/2/config.yaml', { port: 1234, - logLevel: 'info' + logLevel: 'info', }) configMap.set('/etc/gardener/3/config.yaml', { - sessionSecret: undefined + sessionSecret: undefined, }) configMap.set('/etc/gardener/4/config.yaml', { oidc: { - ...defaultConfig.oidc - } + ...defaultConfig.oidc, + }, }) module.exports = { @@ -136,5 +136,5 @@ module.exports = { }, list () { return Array.from(configMap.entries()) - } + }, } diff --git a/backend/__fixtures__/configmaps.js b/backend/__fixtures__/configmaps.js index 17b3d39232..55bcba7551 100644 --- a/backend/__fixtures__/configmaps.js +++ b/backend/__fixtures__/configmaps.js @@ -14,7 +14,7 @@ const { createUrl } = require('./helper') function getConfigMap ({ namespace, name, labels, creationTimestamp, data = {} }) { const metadata = { namespace, - name + name, } if (!isEmpty(labels)) { metadata.labels = labels @@ -32,13 +32,13 @@ function getClusterIdentitConfigMap ({ identity = 'landscape-test' } = {}) { namespace: 'kube-system', name: 'cluster-identity', data: { - 'cluster-identity': identity - } + 'cluster-identity': identity, + }, }) } const configMapsList = [ - getClusterIdentitConfigMap() + getClusterIdentitConfigMap(), ] const configMaps = { @@ -60,13 +60,13 @@ const configMaps = { name, namespace, labels: { - 'gardener.cloud/role': 'ca-cluster' + 'gardener.cloud/role': 'ca-cluster', }, data: { - 'ca.crt': 'ca.crt' - } + 'ca.crt': 'ca.crt', + }, }) - } + }, } const matchOptions = { decode: decodeURIComponent } @@ -116,10 +116,10 @@ const mocks = { return Promise.reject(createError(404)) } - } + }, } module.exports = { ...configMaps, - mocks + mocks, } diff --git a/backend/__fixtures__/controllerregistrations.js b/backend/__fixtures__/controllerregistrations.js index fe7f5dff1c..e2ca695d4e 100644 --- a/backend/__fixtures__/controllerregistrations.js +++ b/backend/__fixtures__/controllerregistrations.js @@ -11,7 +11,7 @@ const { cloneDeep, find } = require('lodash') function getControllerRegistration ({ uid, name, version, resources }) { const metadata = { name, - uid + uid, } const spec = {} if (resources) { @@ -30,28 +30,28 @@ const controllerRegistrationList = [ version: 'v1.0.0', resources: [{ kind: 'OperatingSystemConfig', - type: 'gardenlinux' - }] + type: 'gardenlinux', + }], }), getControllerRegistration({ uid: 2, name: 'Network Registration', resources: [{ kind: 'Network', - type: 'gardium' - }] + type: 'gardium', + }], }), getControllerRegistration({ uid: 3, name: 'Network Registration 2', resources: [{ kind: 'Network', - type: 'foobium' + type: 'foobium', }, { kind: 'Foo', - type: 'bar' - }] + type: 'bar', + }], }), getControllerRegistration({ uid: 4, @@ -59,17 +59,17 @@ const controllerRegistrationList = [ resources: [{ kind: 'DNSRecord', type: 'gardenland', - primary: true - }] + primary: true, + }], }), getControllerRegistration({ uid: 5, name: 'extension-shoot-dns-service', resources: [{ kind: 'Foo', - type: 'bar' - }] - }) + type: 'bar', + }], + }), ] const controllerregistrations = { @@ -82,9 +82,9 @@ const controllerregistrations = { }, list () { return cloneDeep(controllerRegistrationList) - } + }, } module.exports = { - ...controllerregistrations + ...controllerregistrations, } diff --git a/backend/__fixtures__/env.js b/backend/__fixtures__/env.js index 7554640b30..1ed92cefa1 100644 --- a/backend/__fixtures__/env.js +++ b/backend/__fixtures__/env.js @@ -6,5 +6,5 @@ module.exports = { POD_NAME: 'pod-name', - POD_NAMESPACE: 'pod-namespace' + POD_NAMESPACE: 'pod-namespace', } diff --git a/backend/__fixtures__/github.js b/backend/__fixtures__/github.js index e4515168e0..21a89f4ea2 100644 --- a/backend/__fixtures__/github.js +++ b/backend/__fixtures__/github.js @@ -17,8 +17,8 @@ const { org, repository, authentication, - webhookSecret - } + webhookSecret, + }, } = require('./config').default const server = new URL(apiUrl) @@ -38,7 +38,7 @@ function getIssue ({ comments = 0, state = 'open', created_at, - updated_at + updated_at, }) { const issueId = 327883526 + number title = `[${projectName ?? namespace}/${name}] ${title}` @@ -59,13 +59,13 @@ function getIssue ({ user: { id: 21031061, avatar_url: 'https://avatars1.githubusercontent.com/u/21031061?v=4', - login: 'johndoe' + login: 'johndoe', }, labels: [{ id: 949737505, name: 'bug', - color: 'd73a4a' - }] + color: 'd73a4a', + }], } } @@ -74,7 +74,7 @@ function getComment ({ number, body, created_at, - updated_at + updated_at, }) { body = body || `This is comment ${id} for issue #${number}` const time = (1530563012 + number * 60) * 1000 @@ -90,8 +90,8 @@ function getComment ({ user: { id: 21031061, avatar_url: 'https://avatars1.githubusercontent.com/u/21031061?v=4', - login: 'johndoe' - } + login: 'johndoe', + }, } } @@ -99,12 +99,12 @@ const issueList = [ getIssue({ number: 1 }), getIssue({ number: 2, body: 'The second bug', comments: 1 }), getIssue({ number: 3, namespace: 'garden-foobar' }), - getIssue({ number: 4, state: 'closed', comments: 1 }) + getIssue({ number: 4, state: 'closed', comments: 1 }), ] const commentList = [ getComment({ id: 1, number: 4 }), - getComment({ id: 2, number: 2 }) + getComment({ id: 2, number: 2 }), ] const issues = { @@ -113,7 +113,7 @@ const issues = { }, list () { return cloneDeep(issueList) - } + }, } const comments = { @@ -122,7 +122,7 @@ const comments = { }, list () { return cloneDeep(commentList) - } + }, } function createHubSignature (body, secret = null) { @@ -145,5 +145,5 @@ module.exports = { createComment (id, number) { return getComment({ id, number }) }, - createHubSignature + createHubSignature, } diff --git a/backend/__fixtures__/helper.js b/backend/__fixtures__/helper.js index 335eb7186c..9a2505a90f 100644 --- a/backend/__fixtures__/helper.js +++ b/backend/__fixtures__/helper.js @@ -81,7 +81,7 @@ function createUrl (headers) { const { ':path': path, ':scheme': scheme = 'https', - ':authority': authority = 'localhost' + ':authority': authority = 'localhost', } = headers return new URL(path, scheme + '://' + authority) } @@ -131,17 +131,17 @@ function createTestKubeconfig (user = { token: 'token' }, cluster = { server: 's name: 'default', context: { user: 'user', - cluster: 'cluster' - } + cluster: 'cluster', + }, }], users: [{ name: 'user', - user + user, }], clusters: [{ name: 'cluster', - cluster - }] + cluster, + }], })) } @@ -162,5 +162,5 @@ module.exports = { toHex, formatTime, nextTick, - delay + delay, } diff --git a/backend/__fixtures__/index.js b/backend/__fixtures__/index.js index 980903b642..82206e1230 100644 --- a/backend/__fixtures__/index.js +++ b/backend/__fixtures__/index.js @@ -31,7 +31,7 @@ const env = require('./env') const user = { create (...args) { return auth.createUser(...args) - } + }, } function resetAll () { @@ -62,6 +62,6 @@ const fixtures = { github, helper, env, - resetAll + resetAll, } module.exports = fixtures diff --git a/backend/__fixtures__/kube.js b/backend/__fixtures__/kube.js index f6fa8a1eed..0ce81d6d00 100644 --- a/backend/__fixtures__/kube.js +++ b/backend/__fixtures__/kube.js @@ -16,5 +16,5 @@ module.exports = { server, ':scheme': scheme, ':authority': authority, - authorization + authorization, } diff --git a/backend/__fixtures__/leases.js b/backend/__fixtures__/leases.js index 3522c13490..14cac16f1b 100644 --- a/backend/__fixtures__/leases.js +++ b/backend/__fixtures__/leases.js @@ -23,12 +23,12 @@ const getLease = (renewTime = null) => { return { metadata: { namespace: POD_NAMESPACE, - name: 'gardener-dashboard-github-webhook' + name: 'gardener-dashboard-github-webhook', }, spec: { holderIdentity: POD_NAME, - renewTime - } + renewTime, + }, } } @@ -41,7 +41,7 @@ const leases = { }, get (namespace, name) { return find(leases.list(), { metadata: { namespace, name } }) - } + }, } const matchOptions = { decode: decodeURIComponent } @@ -87,10 +87,10 @@ const mocks = { const item = leases.get(name) return Promise.resolve(item) } - } + }, } module.exports = { ...leases, - mocks + mocks, } diff --git a/backend/__fixtures__/managedseeds.js b/backend/__fixtures__/managedseeds.js index 0fa861859f..7a0312f466 100644 --- a/backend/__fixtures__/managedseeds.js +++ b/backend/__fixtures__/managedseeds.js @@ -18,14 +18,14 @@ const managedSeedList = [ project: 'garden', createdBy: 'admin@example.org', secretBindingName: 'soil-infra1', - seed: 'soil-infra1' - }) + seed: 'soil-infra1', + }), ] function getManagedSeed ({ name, uid, - shootName + shootName, }) { const namespace = 'garden' uid = uid || `${namespace}--${name}` @@ -35,14 +35,14 @@ function getManagedSeed ({ metadata: { uid, name, - namespace + namespace, }, spec: { shoot: { - name: shootName - } + name: shootName, + }, }, - status: {} + status: {}, } } @@ -59,7 +59,7 @@ const managedSeeds = { return namespace ? filter(items, ['metadata.namespace', namespace]) : items - } + }, } const matchOptions = { decode: decodeURIComponent } @@ -79,10 +79,10 @@ const mocks = { } return Promise.resolve(item) } - } + }, } module.exports = { ...managedSeeds, - mocks + mocks, } diff --git a/backend/__fixtures__/nodes.js b/backend/__fixtures__/nodes.js index ba7f081a27..649c236ceb 100644 --- a/backend/__fixtures__/nodes.js +++ b/backend/__fixtures__/nodes.js @@ -12,7 +12,7 @@ const pathToRegexp = require('path-to-regexp') const nodeList = [ getNode({ name: 'node-1', hostname: 'host-1' }), - getNode({ name: 'node-2', hostname: 'host-2', ready: false }) + getNode({ name: 'node-2', hostname: 'host-2', ready: false }), ] function getNode (options = {}) { @@ -20,20 +20,20 @@ function getNode (options = {}) { name, creationTimestamp = '2020-01-01T00:00:00Z', hostname, - ready = true + ready = true, } = options const metadata = { name, - creationTimestamp + creationTimestamp, } if (hostname) { - set(metadata, 'labels["kubernetes.io/hostname"]', hostname) + set(metadata, ['labels', 'kubernetes.io/hostname'], hostname) } const status = { conditions: [{ type: 'Ready', - status: ready ? 'True' : 'False' - }] + status: ready ? 'True' : 'False', + }], } return { metadata, status } } @@ -48,7 +48,7 @@ const nodes = { }, list () { return cloneDeep(nodeList) - } + }, } const matchOptions = { decode: decodeURIComponent } @@ -64,10 +64,10 @@ const mocks = { const items = nodes.list() return Promise.resolve({ items }) } - } + }, } module.exports = { ...nodes, - mocks + mocks, } diff --git a/backend/__fixtures__/projects.js b/backend/__fixtures__/projects.js index 2648d0a525..cbbcb48ed3 100644 --- a/backend/__fixtures__/projects.js +++ b/backend/__fixtures__/projects.js @@ -19,7 +19,7 @@ function createUser (member) { const user = { apiGroup: 'rbac.authorization.k8s.io', kind: 'User', - name + name, } return user } @@ -38,13 +38,13 @@ function getProject ({ name, namespace, uid, resourceVersion = '42', createdBy, createdBy = createUser(createdBy) const metadata = { name, - resourceVersion + resourceVersion, } if (uid) { metadata.uid = uid } if (costObject) { - set(metadata, 'annotations["billing.gardener.cloud/costObject"]', costObject) + set(metadata, ['annotations', 'billing.gardener.cloud/costObject'], costObject) } return { metadata, @@ -54,11 +54,11 @@ function getProject ({ name, namespace, uid, resourceVersion = '42', createdBy, owner, members, purpose, - description + description, }, status: { - phase - } + phase, + }, } } @@ -68,7 +68,7 @@ const projectList = [ name: 'garden', namespace: 'garden', createdBy: 'admin@example.org', - owner: 'admin@example.org' + owner: 'admin@example.org', }), getProject({ uid: 1, @@ -80,30 +80,30 @@ const projectList = [ apiGroup: 'rbac.authorization.k8s.io', kind: 'User', name: 'foo@example.org', - roles: ['admin'] + roles: ['admin'], }, { apiGroup: 'rbac.authorization.k8s.io', kind: 'User', name: 'bar@example.org', - roles: ['admin', 'owner'] + roles: ['admin', 'owner'], }, { apiGroup: 'rbac.authorization.k8s.io', kind: 'User', name: 'system:serviceaccount:garden-foo:robot', - roles: ['viewer'] + roles: ['viewer'], }, { apiGroup: 'rbac.authorization.k8s.io', kind: 'User', name: 'system:serviceaccount:garden-baz:robot', - roles: ['viewer', 'admin'] - } + roles: ['viewer', 'admin'], + }, ], description: 'foo-description', purpose: 'foo-purpose', - costObject: '9999999999' + costObject: '9999999999', }), getProject({ uid: 2, @@ -115,17 +115,17 @@ const projectList = [ apiGroup: 'rbac.authorization.k8s.io', kind: 'User', name: 'foo@example.org', - roles: ['admin', 'owner'] + roles: ['admin', 'owner'], }, { apiGroup: 'rbac.authorization.k8s.io', kind: 'User', name: 'system:serviceaccount:garden-foo:robot', - roles: ['viewer', 'admin'] - } + roles: ['viewer', 'admin'], + }, ], description: 'bar-description', - purpose: 'bar-purpose' + purpose: 'bar-purpose', }), getProject({ uid: 3, @@ -137,9 +137,9 @@ const projectList = [ apiGroup: 'rbac.authorization.k8s.io', kind: 'Group', name: 'group1', - roles: ['admin', 'owner'] - } - ] + roles: ['admin', 'owner'], + }, + ], }), getProject({ uid: 4, @@ -151,9 +151,9 @@ const projectList = [ apiGroup: 'rbac.authorization.k8s.io', kind: 'Group', name: 'group2', - roles: ['admin', 'owner'] - } - ] + roles: ['admin', 'owner'], + }, + ], }), getProject({ uid: 5, @@ -161,7 +161,7 @@ const projectList = [ createdBy: 'admin@example.org', description: 'pending-description', purpose: 'pending-purpose', - phase: 'Pending' + phase: 'Pending', }), getProject({ uid: 6, @@ -173,11 +173,11 @@ const projectList = [ kind: 'ServiceAccount', namespace: 'garden-bar', name: 'robot', - roles: ['viewer'] - } + roles: ['viewer'], + }, ], description: 'secret-description', - purpose: 'secret-purpose' + purpose: 'secret-purpose', }), getProject({ uid: 7, @@ -186,8 +186,8 @@ const projectList = [ description: 'trial-description', purpose: 'trial-purpose', costObject: '1234567890', - phase: 'Failed' - }) + phase: 'Failed', + }), ] const projects = { @@ -209,9 +209,9 @@ const projects = { item = projects.get(item) } } - const members = get(item, 'spec.members', []) + const members = get(item, ['spec', 'members'], []) const userList = [ - 'admin@example.org' + 'admin@example.org', ] const groupList = [] for (const { kind, namespace, name } of members) { @@ -234,7 +234,7 @@ const projects = { }, reset () { this.items = [...projectList] - } + }, } const matchOptions = { decode: decodeURIComponent } @@ -262,17 +262,17 @@ const mocks = { const item = cloneDeep(json) const name = json.metadata.name const user = createUser(payload.id) - set(item, 'metadata.resourceVersion', resourceVersion) - set(item, 'metadata.uid', uid) - set(item, 'spec.namespace', `garden-${name}`) - set(item, 'spec.createdBy', user) - set(item, 'spec.owner', user) - set(item, 'spec.members', [{ + set(item, ['metadata', 'resourceVersion'], resourceVersion) + set(item, ['metadata', 'uid'], uid) + set(item, ['spec', 'namespace'], `garden-${name}`) + set(item, ['spec', 'createdBy'], user) + set(item, ['spec', 'owner'], user) + set(item, ['spec', 'members'], [{ ...user, role: 'owner', - roles: ['admin', 'uam'] + roles: ['admin', 'uam'], }]) - set(item, 'status.phase', 'Initial') + set(item, ['status', 'phase'], 'Initial') projects.items.push(item) return Promise.resolve(item) } @@ -295,9 +295,9 @@ const mocks = { const initialItems = filter(items, ['status.phase', 'Initial']) for (const oldItem of initialItems) { const item = cloneDeep(oldItem) - const resourceVersion = get(item, 'metadata.resourceVersion', '42') - set(item, 'status.phase', phase) - set(item, 'metadata.resourceVersion', (+resourceVersion + 1).toString()) + const resourceVersion = get(item, ['metadata', 'resourceVersion'], '42') + set(item, ['status', 'phase'], phase) + set(item, ['metadata', 'resourceVersion'], (+resourceVersion + 1).toString()) stream.write({ type: 'MODIFIED', object: item }) } if (end === true) { @@ -330,9 +330,9 @@ const mocks = { } const { params: { name } = {} } = matchResult const item = projects.get(name) - const resourceVersion = get(item, 'metadata.resourceVersion', '42') + const resourceVersion = get(item, ['metadata', 'resourceVersion'], '42') merge(item, json) - set(item, 'metadata.resourceVersion', (+resourceVersion + 1).toString()) + set(item, ['metadata', 'resourceVersion'], (+resourceVersion + 1).toString()) return Promise.resolve(item) } }, @@ -346,10 +346,10 @@ const mocks = { const item = projects.get(name) return Promise.resolve(item) } - } + }, } module.exports = { ...projects, - mocks + mocks, } diff --git a/backend/__fixtures__/quotas.js b/backend/__fixtures__/quotas.js index d14e715f1d..68d754cc05 100644 --- a/backend/__fixtures__/quotas.js +++ b/backend/__fixtures__/quotas.js @@ -13,33 +13,33 @@ function getQuota ({ namespace = 'garden-trial', scope = { apiVersion: 'v1', - kind: 'Secret' + kind: 'Secret', }, clusterLifetimeDays = 14, cpu = '200', - uid + uid, }) { uid = uid || `${namespace}--${name}` return { metadata: { name, namespace, - uid + uid, }, spec: { scope, clusterLifetimeDays, metrics: { - cpu - } - } + cpu, + }, + }, } } const quotaList = [ getQuota({ uid: 1, name: 'trial-secret-quota', namespace: 'garden-trial' }), getQuota({ uid: 2, name: 'foo-quota1', namespace: 'garden-foo' }), - getQuota({ uid: 3, name: 'foo-quota2', namespace: 'garden-foo' }) + getQuota({ uid: 3, name: 'foo-quota2', namespace: 'garden-foo' }), ] const quotas = { @@ -55,9 +55,9 @@ const quotas = { return namespace ? filter(items, ['metadata.namespace', namespace]) : items - } + }, } module.exports = { - ...quotas + ...quotas, } diff --git a/backend/__fixtures__/resourcequotas.js b/backend/__fixtures__/resourcequotas.js index 125cfb68c1..4c1c4e99b3 100644 --- a/backend/__fixtures__/resourcequotas.js +++ b/backend/__fixtures__/resourcequotas.js @@ -12,7 +12,7 @@ function getResourceQuotas ({ uid, name, namespace, hard, used }) { const metadata = { name, namespace, - uid + uid, } const spec = {} if (hard) { @@ -36,21 +36,21 @@ const resourceQuotasList = [ namespace: 'garden-foo', hard: { 'count/configmaps': '22', - 'count/secrets': '70' + 'count/secrets': '70', }, used: { 'count/configmaps': '5', - 'count/secrets': '12' - } - }) + 'count/secrets': '12', + }, + }), ] const resourceQuotas = { list () { return cloneDeep(resourceQuotasList) - } + }, } module.exports = { - ...resourceQuotas + ...resourceQuotas, } diff --git a/backend/__fixtures__/secretbindings.js b/backend/__fixtures__/secretbindings.js index 95128dd069..95e6da108b 100644 --- a/backend/__fixtures__/secretbindings.js +++ b/backend/__fixtures__/secretbindings.js @@ -20,9 +20,9 @@ const secretBindingList = [ cloudProfileName: 'infra1-profileName', secretRef: { namespace: 'garden-foo', - name: 'secret1' + name: 'secret1', }, - quotas + quotas, }), getSecretBinding({ namespace: 'garden-foo', @@ -30,9 +30,9 @@ const secretBindingList = [ cloudProfileName: 'infra3-profileName', secretRef: { namespace: 'garden-foo', - name: 'secret2' + name: 'secret2', }, - quotas + quotas, }), getSecretBinding({ namespace: 'garden-foo', @@ -40,9 +40,9 @@ const secretBindingList = [ cloudProfileName: 'infra1-profileName', secretRef: { namespace: 'garden-trial', - name: 'trial-secret' + name: 'trial-secret', }, - quotas + quotas, }), getSecretBinding({ namespace: 'garden-foo', @@ -50,10 +50,10 @@ const secretBindingList = [ dnsProviderName: 'foo-dns', secretRef: { namespace: 'garden-foo', - name: 'secret3' + name: 'secret3', }, - quotas - }) + quotas, + }), ] function getSecretBinding ({ namespace, name, cloudProfileName, dnsProviderName, secretRef = {}, quotas = [] }) { @@ -69,10 +69,10 @@ function getSecretBinding ({ namespace, name, cloudProfileName, dnsProviderName, metadata: { name, namespace, - labels + labels, }, secretRef, - quotas + quotas, } } @@ -89,7 +89,7 @@ const secretBindings = { return namespace ? filter(items, ['metadata.namespace', namespace]) : items - } + }, } const matchOptions = { decode: decodeURIComponent } @@ -116,8 +116,8 @@ const mocks = { } const { params: { namespace } = {} } = matchResult const item = cloneDeep(json) - set(item, 'metadata.namespace', namespace) - set(item, 'metadata. resourceVersion', resourceVersion) + set(item, ['metadata', 'namespace'], namespace) + set(item, ['metadata', ' resourceVersion'], resourceVersion) return Promise.resolve(item) } }, @@ -142,10 +142,10 @@ const mocks = { const item = secretBindings.get(namespace, name) return Promise.resolve(item) } - } + }, } module.exports = { ...secretBindings, - mocks + mocks, } diff --git a/backend/__fixtures__/secrets.js b/backend/__fixtures__/secrets.js index 095f028441..ce264cc5a6 100644 --- a/backend/__fixtures__/secrets.js +++ b/backend/__fixtures__/secrets.js @@ -20,7 +20,7 @@ const clientKeyData = toBase64('client-key-data') function getSecret ({ namespace, name, labels, creationTimestamp, data = {} }) { const metadata = { namespace, - name + name, } if (!isEmpty(labels)) { metadata.labels = labels @@ -39,31 +39,31 @@ function getSecret ({ namespace, name, labels, creationTimestamp, data = {} }) { function getCloudProviderSecret ({ cloudProfileName, ...options }) { return getSecret({ labels: { - 'cloudprofile.garden.sapcloud.io/name': cloudProfileName + 'cloudprofile.garden.sapcloud.io/name': cloudProfileName, }, - ...options + ...options, }) } function getKubeconfig ({ server, name = 'default' }) { const cluster = { 'certificate-authority-data': certificateAuthorityData, - server + server, } const user = { 'client-certificate-data': clientCertificateData, - 'client-key-data': clientKeyData + 'client-key-data': clientKeyData, } const context = { cluster: name, - user: name + user: name, } return yaml.dump({ kind: 'Config', clusters: [{ cluster, name }], contexts: [{ context, name }], users: [{ user, name }], - 'current-context': name + 'current-context': name, }) } @@ -74,8 +74,8 @@ const cloudProviderSecretList = [ cloudProfileName: 'infra1-profileName', data: { key: 'fooKey', - secret: 'fooSecret' - } + secret: 'fooSecret', + }, }), getCloudProviderSecret({ namespace: 'garden-foo', @@ -83,8 +83,8 @@ const cloudProviderSecretList = [ cloudProfileName: 'infra3-profileName', data: { key: 'fooKey', - secret: 'fooSecret' - } + secret: 'fooSecret', + }, }), getCloudProviderSecret({ namespace: 'garden-trial', @@ -92,9 +92,9 @@ const cloudProviderSecretList = [ cloudProfileName: 'infra1-profileName', data: { key: 'trialKey', - secret: 'trialSecret' - } - }) + secret: 'trialSecret', + }, + }), ] const secrets = { @@ -115,7 +115,7 @@ const secrets = { const { valid = false, invalid = false, - target = 'cp' + target = 'cp', } = options const shortcuts = [] if (valid) { @@ -126,13 +126,13 @@ const secrets = { container: { image: 'image:latest', command: ['cmd'], - args: ['a', 'b'] - } + args: ['a', 'b'], + }, }) } if (invalid) { shortcuts.push({ - invalidShortcut: 'foo' + invalidShortcut: 'foo', }) } if (shortcuts.length) { @@ -140,8 +140,8 @@ const secrets = { name: 'terminal.shortcuts', namespace, data: { - shortcuts: yaml.dump(shortcuts) - } + shortcuts: yaml.dump(shortcuts), + }, }) } }, @@ -154,11 +154,11 @@ const secrets = { data: { kubeconfig: getKubeconfig({ server: `https://api.${shootName}.${projectName}.shoot.cluster`, - name: `shoot--${projectName}--${shootName}` + name: `shoot--${projectName}--${shootName}`, }), username: `user-${projectName}-${shootName}`, - password: `pass-${projectName}-${shootName}` - } + password: `pass-${projectName}-${shootName}`, + }, }) }, getSeedSecret (namespace, name) { @@ -171,9 +171,9 @@ const secrets = { data: { kubeconfig: getKubeconfig({ server: `https://api.${region}.${type}.seed.cluster`, - name: `shoot--garden--${seedName}` - }) - } + name: `shoot--garden--${seedName}`, + }), + }, }) }, getMonitoringSecret (namespace, name, creationTimestamp) { @@ -183,8 +183,8 @@ const secrets = { creationTimestamp, data: { username: `user-${namespace}-${name}`, - password: `pass-${namespace}-${name}` - } + password: `pass-${namespace}-${name}`, + }, }) }, getServiceAccountSecret (namespace, name) { @@ -193,10 +193,10 @@ const secrets = { namespace, data: { namespace, - token: name - } + token: name, + }, }) - } + }, } const matchOptions = { decode: decodeURIComponent } @@ -229,8 +229,8 @@ const mocks = { } const { params: { namespace } = {} } = matchResult const item = cloneDeep(json) - set(item, 'metadata.namespace', namespace) - set(item, 'metadata.resourceVersion', resourceVersion) + set(item, ['metadata', 'namespace'], namespace) + set(item, ['metadata', 'resourceVersion'], resourceVersion) return Promise.resolve(item) } }, @@ -286,13 +286,13 @@ const mocks = { return Promise.reject(createError(503)) } const { params: { namespace, name } = {} } = matchResult - if (has(json, 'metadata.resourceVersion')) { + if (has(json, ['metadata', 'resourceVersion'])) { return Promise.reject(createError(409)) } const item = secrets.get(namespace, name) - const resourceVersion = get(item, 'metadata.resourceVersion', '42') + const resourceVersion = get(item, ['metadata', 'resourceVersion'], '42') merge(item, json) - set(item, 'metadata.resourceVersion', (+resourceVersion + 1).toString()) + set(item, ['metadata', 'resourceVersion'], (+resourceVersion + 1).toString()) return Promise.resolve(item) } }, @@ -306,10 +306,10 @@ const mocks = { const item = secrets.get(namespace, name) return Promise.resolve(item) } - } + }, } module.exports = { ...secrets, - mocks + mocks, } diff --git a/backend/__fixtures__/seeds.js b/backend/__fixtures__/seeds.js index 75789c837f..fb3c752361 100644 --- a/backend/__fixtures__/seeds.js +++ b/backend/__fixtures__/seeds.js @@ -16,7 +16,7 @@ function getSeed ({ seedProtected = false, seedVisible = true, labels = {}, - withSecretRef = true + withSecretRef = true, }) { uid = uid || `seed--${name}` const seed = { @@ -24,33 +24,33 @@ function getSeed ({ metadata: { name, uid, - labels + labels, }, spec: { provider: { type: kind, - region + region, }, ingress: { - domain: `ingress.${region}.${kind}.example.org` + domain: `ingress.${region}.${kind}.example.org`, }, taints: [], settings: { scheduling: { - visible: seedVisible - } - } - } + visible: seedVisible, + }, + }, + }, } if (seedProtected) { seed.spec.taints.push({ - key: 'seed.gardener.cloud/protected' + key: 'seed.gardener.cloud/protected', }) } if (withSecretRef) { seed.spec.secretRef = { name: `seedsecret-${name}`, - namespace: 'garden' + namespace: 'garden', } } @@ -66,7 +66,7 @@ const seedList = [ getSeed({ name: 'infra3-seed-with-selector', region: 'foo-europe', kind: 'infra3', seedProtected: false, seedVisible: true, labels: { foo: 'bar', fooz: 'baz' } }), getSeed({ name: 'infra3-seed-without-selector', region: 'foo-europe', kind: 'infra3', seedProtected: false, seedVisible: true }), getSeed({ name: 'infra3-seed-protected', region: 'foo-europe', kind: 'infra3', seedProtected: true }), - getSeed({ name: 'infra3-seed-invisible', region: 'foo-europe', kind: 'infra3', seedProtected: false, seedVisible: false }) + getSeed({ name: 'infra3-seed-invisible', region: 'foo-europe', kind: 'infra3', seedProtected: false, seedVisible: false }), ] const seeds = { @@ -78,7 +78,7 @@ const seeds = { }, list () { return cloneDeep(seedList) - } + }, } module.exports = seeds diff --git a/backend/__fixtures__/serviceaccounts.js b/backend/__fixtures__/serviceaccounts.js index 2c206ea6a4..f528e8b991 100644 --- a/backend/__fixtures__/serviceaccounts.js +++ b/backend/__fixtures__/serviceaccounts.js @@ -21,14 +21,14 @@ const serviceAccountList = [ getServiceAccount({ namespace: 'garden-bar', name: 'robot', createdBy: 'bar@example.org' }), getServiceAccount({ namespace: 'term-host-1', name: 'term-attach-1' }), getServiceAccount({ namespace: 'term-host-2', name: 'term-attach-2' }), - getServiceAccount({ namespace: 'term-host-3', name: 'term-attach-3' }) + getServiceAccount({ namespace: 'term-host-3', name: 'term-attach-3' }), ] function getServiceAccount ({ namespace, name, createdBy = 'admin@example.org', - creationTimestamp = '2020-01-01T00:00:00Z' + creationTimestamp = '2020-01-01T00:00:00Z', }) { return { metadata: { @@ -36,9 +36,9 @@ function getServiceAccount ({ namespace, creationTimestamp, annotations: { - 'gardener.cloud/created-by': createdBy - } - } + 'gardener.cloud/created-by': createdBy, + }, + }, } } @@ -55,7 +55,7 @@ const serviceaccounts = { return namespace ? filter(items, ['metadata.namespace', namespace]) : items - } + }, } const matchOptions = { decode: decodeURIComponent } @@ -84,11 +84,11 @@ const mocks = { const { params: { namespace } = {} } = matchResult const payload = getTokenPayload(headers) const item = cloneDeep(json) - set(item, 'metadata.namespace', namespace) - set(item, 'metadata.resourceVersion', resourceVersion) - set(item, 'metadata.uid', uid) - set(item, 'metadata.creationTimestamp', creationTimestamp) - set(item, 'metadata.annotations["gardener.cloud/created-by"]', payload.id) + set(item, ['metadata', 'namespace'], namespace) + set(item, ['metadata', 'resourceVersion'], resourceVersion) + set(item, ['metadata', 'uid'], uid) + set(item, ['metadata', 'creationTimestamp'], creationTimestamp) + set(item, ['metadata', 'annotations', 'gardener.cloud/created-by'], payload.id) return Promise.resolve(item) } }, @@ -99,7 +99,7 @@ const mocks = { return Promise.reject(createError(503)) } const item = cloneDeep(json) - set(item, 'status.token', token) + set(item, ['status', 'token'], token) return Promise.resolve(item) } }, @@ -118,7 +118,7 @@ const mocks = { for (const item of items) { const event = { type: 'ADDED', - object: cloneDeep(item) + object: cloneDeep(item), } stream.write(event) } @@ -151,9 +151,9 @@ const mocks = { } const { params: { namespace, name } = {} } = matchResult const item = serviceaccounts.get(namespace, name) - const resourceVersion = get(item, 'metadata.resourceVersion', '42') + const resourceVersion = get(item, ['metadata', 'resourceVersion'], '42') merge(item, json) - set(item, 'metadata.resourceVersion', (+resourceVersion + 1).toString()) + set(item, ['metadata', 'resourceVersion'], (+resourceVersion + 1).toString()) return Promise.resolve(item) } }, @@ -167,10 +167,10 @@ const mocks = { const item = serviceaccounts.get(namespace, name) return Promise.resolve(item) } - } + }, } module.exports = { ...serviceaccounts, - mocks + mocks, } diff --git a/backend/__fixtures__/shoots.js b/backend/__fixtures__/shoots.js index 33742406b7..1e2855661b 100644 --- a/backend/__fixtures__/shoots.js +++ b/backend/__fixtures__/shoots.js @@ -23,7 +23,7 @@ const shootList = [ project: 'foo', createdBy: 'foo@example.org', purpose: 'fooPurpose', - secretBindingName: 'foo-infra1' + secretBindingName: 'foo-infra1', }), getShoot({ uid: 2, @@ -32,7 +32,7 @@ const shootList = [ project: 'foo', createdBy: 'bar@example.org', purpose: 'barPurpose', - secretBindingName: 'foo-infra1' + secretBindingName: 'foo-infra1', }), getShoot({ uid: 3, @@ -43,7 +43,7 @@ const shootList = [ purpose: 'fooPurpose', secretBindingName: 'barSecretName', seed: 'infra4-seed-without-secretRef', - advertisedAddresses: null + advertisedAddresses: null, }), getShoot({ uid: 4, @@ -52,8 +52,8 @@ const shootList = [ project: 'garden', createdBy: 'admin@example.org', secretBindingName: 'soil-infra1', - seed: 'soil-infra1' - }) + seed: 'soil-infra1', + }), ] function getShoot ({ @@ -70,7 +70,7 @@ function getShoot ({ seed = 'infra1-seed', hibernation = { enabled: false }, kubernetesVersion = '1.16.0', - advertisedAddresses + advertisedAddresses, }) { uid = uid || `${namespace}--${name}` const shoot = { @@ -78,7 +78,7 @@ function getShoot ({ uid, name, namespace, - annotations: {} + annotations: {}, }, spec: { secretBindingName, @@ -86,15 +86,15 @@ function getShoot ({ region, hibernation, provider: { - type: kind + type: kind, }, seedName: seed, kubernetes: { - version: kubernetesVersion + version: kubernetesVersion, }, - purpose + purpose, }, - status: {} + status: {}, } if (createdBy) { shoot.metadata.annotations['gardener.cloud/created-by'] = createdBy @@ -105,7 +105,7 @@ function getShoot ({ if (advertisedAddresses !== null) { shoot.status.advertisedAddresses = advertisedAddresses ?? [{ name: 'external', - url: `https://api.${name}.${project}.shoot.test` + url: `https://api.${name}.${project}.shoot.test`, }] } return shoot @@ -127,7 +127,7 @@ const shoots = { return namespace ? filter(items, ['metadata.namespace', namespace]) : items - } + }, } const matchOptions = { decode: decodeURIComponent } @@ -170,19 +170,19 @@ const mocks = { } const item = cloneDeep(json) const name = item.metadata.name - set(item, 'metadata.namespace', namespace) - set(item, 'metadata.resourceVersion', resourceVersion) - set(item, 'metadata.uid', uid) - set(item, 'metadata.annotations["gardener.cloud/created-by"]', payload.id) - set(item, 'status.technicalID', `shoot--${project.metadata.name}--${name}`) + set(item, ['metadata', 'namespace'], namespace) + set(item, ['metadata', 'resourceVersion'], resourceVersion) + set(item, ['metadata', 'uid'], uid) + set(item, ['metadata', 'annotations', 'gardener.cloud/created-by'], payload.id) + set(item, ['status', 'technicalID'], `shoot--${project.metadata.name}--${name}`) return Promise.resolve(item) } }, createAdminKubeconfigRequest ({ user = { 'client-certificate-data': toBase64('certificate-authority-data'), - 'client-key-data': toBase64('client-key-data') - }, cluster = { server: 'https://shootApiServerHostname:6443' } + 'client-key-data': toBase64('client-key-data'), + }, cluster = { server: 'https://shootApiServerHostname:6443' }, } = {}) { return (headers, json) => { const matchResult = matchAdminKubeconfig(headers[':path']) @@ -191,12 +191,12 @@ const mocks = { } const { params: { namespace, name } = {} } = matchResult const item = cloneDeep(json) - const expirationSeconds = get(item, 'spec.expirationSeconds', 600) - set(item, 'metadata.namespace', namespace) - set(item, 'metadata.name', name) - set(item, 'status.kubeconfig', createTestKubeconfig(user, cluster)) - set(item, 'status.expirationTimestamp', formatTime( - new Date().setSeconds(new Date().getSeconds() + expirationSeconds)) + const expirationSeconds = get(item, ['spec', 'expirationSeconds'], 600) + set(item, ['metadata', 'namespace'], namespace) + set(item, ['metadata', 'name'], name) + set(item, ['status', 'kubeconfig'], createTestKubeconfig(user, cluster)) + set(item, ['status', 'expirationTimestamp'], formatTime( + new Date().setSeconds(new Date().getSeconds() + expirationSeconds)), ) return Promise.resolve(item) } @@ -231,7 +231,7 @@ const mocks = { if (!item) { return Promise.reject(createError(404)) } - const resourceVersion = get(item, 'metadata.resourceVersion', '42') + const resourceVersion = get(item, ['metadata', 'resourceVersion'], '42') switch (headers['content-type']) { case 'application/json-patch+json': item = applyPatch(item, json).newDocument @@ -240,7 +240,7 @@ const mocks = { merge(item, json) break } - set(item, 'metadata.resourceVersion', (+resourceVersion + 1).toString()) + set(item, ['metadata', 'resourceVersion'], (+resourceVersion + 1).toString()) return Promise.resolve(item) } }, @@ -255,9 +255,9 @@ const mocks = { if (!item) { return Promise.reject(createError(404)) } - const resourceVersion = get(item, 'metadata.resourceVersion', '42') + const resourceVersion = get(item, ['metadata', 'resourceVersion'], '42') item = cloneDeep(json) - set(item, 'metadata.resourceVersion', (+resourceVersion + 1).toString()) + set(item, ['metadata', 'resourceVersion'], (+resourceVersion + 1).toString()) return Promise.resolve(item) } }, @@ -269,7 +269,7 @@ const mocks = { } const { params: { namespace, name } = {} } = matchResult const item = shoots.get(namespace, name) - set(item, 'metadata.annotations["confirmation.gardener.cloud/deletion"]', 'true') + set(item, ['metadata', 'annotations', 'confirmation.gardener.cloud/deletion'], 'true') return Promise.resolve(item) } }, @@ -289,10 +289,10 @@ const mocks = { return Promise.resolve(item) } - } + }, } module.exports = { ...shoots, - mocks + mocks, } diff --git a/backend/__fixtures__/terminals.js b/backend/__fixtures__/terminals.js index 3c87eeedf1..4e8a0faea4 100644 --- a/backend/__fixtures__/terminals.js +++ b/backend/__fixtures__/terminals.js @@ -18,19 +18,19 @@ const terminalList = [ getTerminal({ target: 'garden', namespace: 'garden-foo', - identifier: '1' + identifier: '1', }), getTerminal({ target: 'cp', namespace: 'garden-foo', - identifier: '2' + identifier: '2', }), getTerminal({ target: 'shoot', namespace: 'garden-foo', identifier: '3', - preferredHost: 'shoot' - }) + preferredHost: 'shoot', + }), ] function getTerminal (options = {}) { @@ -40,7 +40,7 @@ function getTerminal (options = {}) { identifier, createdBy = 'admin@example.org', preferredHost = 'seed', - image = 'fooImage:0.1.2' + image = 'fooImage:0.1.2', } = options const generateName = `term-${target}-` const name = generateName + padStart(identifier, 5, '0') @@ -52,13 +52,13 @@ function getTerminal (options = {}) { annotations: { 'gardener.cloud/created-by': createdBy, 'dashboard.gardener.cloud/identifier': identifier, - 'dashboard.gardener.cloud/preferredHost': preferredHost + 'dashboard.gardener.cloud/preferredHost': preferredHost, }, labels: { 'dashboard.gardener.cloud/created-by-hash': hash(createdBy), - 'dashboard.gardener.cloud/identifier-hash': hash(identifier) + 'dashboard.gardener.cloud/identifier-hash': hash(identifier), }, - uid: identifier + uid: identifier, }, spec: { host: { @@ -67,21 +67,21 @@ function getTerminal (options = {}) { credentials: { secretRef: { namespace: 'garden', - name: 'host.kubeconfig' - } + name: 'host.kubeconfig', + }, }, pod: { container: { - image - } - } + image, + }, + }, }, - target: {} + target: {}, }, status: { attachServiceAccountName: 'term-attach-' + identifier, - podName: 'term-' + identifier - } + podName: 'term-' + identifier, + }, } } @@ -102,7 +102,7 @@ const terminals = { items = filter(items, ['metadata.labels', labelSelector]) } return items - } + }, } const matchOptions = { decode: decodeURIComponent } @@ -132,17 +132,17 @@ const mocks = { } const { params: { namespace } = {} } = matchResult const item = cloneDeep(json) - const identifier = get(item, 'metadata.annotations["dashboard.gardener.cloud/identifier"]', '21') - const generateName = get(item, 'metadata.generateName') + const identifier = get(item, ['metadata', 'annotations', 'dashboard.gardener.cloud/identifier'], '21') + const generateName = get(item, ['metadata', 'generateName']) if (generateName) { - set(item, 'metadata.name', generateName + padStart(identifier, 5, '0')) + set(item, ['metadata', 'name'], generateName + padStart(identifier, 5, '0')) } - const temporaryNamespace = get(item, 'spec.host.temporaryNamespace') + const temporaryNamespace = get(item, ['spec', 'host', 'temporaryNamespace']) if (temporaryNamespace) { - set(item, 'spec.host.namespace', 'term-host-' + identifier) + set(item, ['spec', 'host', 'namespace'], 'term-host-' + identifier) } - set(item, 'metadata.namespace', namespace) - set(item, 'metadata.resourceVersion', resourceVersion) + set(item, ['metadata', 'namespace'], namespace) + set(item, ['metadata', 'resourceVersion'], resourceVersion) return Promise.resolve(item) } }, @@ -161,7 +161,7 @@ const mocks = { for (const item of items) { const event = { type: 'ADDED', - object: cloneDeep(item) + object: cloneDeep(item), } stream.write(event) } @@ -194,9 +194,9 @@ const mocks = { } const { params: { namespace, name } = {} } = matchResult const item = terminals.get(namespace, name) - const resourceVersion = get(item, 'metadata.resourceVersion', '42') + const resourceVersion = get(item, ['metadata', 'resourceVersion'], '42') merge(item, json) - set(item, 'metadata.resourceVersion', (+resourceVersion + 1).toString()) + set(item, ['metadata', 'resourceVersion'], (+resourceVersion + 1).toString()) return Promise.resolve(item) } }, @@ -210,10 +210,10 @@ const mocks = { const item = terminals.get(namespace, name) return Promise.resolve(item) } - } + }, } module.exports = { ...terminals, - mocks + mocks, } diff --git a/backend/__mocks__/@gardener-dashboard/kube-client.js b/backend/__mocks__/@gardener-dashboard/kube-client.js index 08badc4ed4..b455cec078 100644 --- a/backend/__mocks__/@gardener-dashboard/kube-client.js +++ b/backend/__mocks__/@gardener-dashboard/kube-client.js @@ -10,5 +10,5 @@ const kubeClient = jest.requireActual('@gardener-dashboard/kube-client') module.exports = { ...kubeClient, - createDashboardClient: jest.fn().mockImplementation(kubeClient.createDashboardClient) + createDashboardClient: jest.fn().mockImplementation(kubeClient.createDashboardClient), } diff --git a/backend/__mocks__/@gardener-dashboard/kube-config.js b/backend/__mocks__/@gardener-dashboard/kube-config.js index 9c47d950ef..c3fd0c7903 100644 --- a/backend/__mocks__/@gardener-dashboard/kube-config.js +++ b/backend/__mocks__/@gardener-dashboard/kube-config.js @@ -9,9 +9,9 @@ const { Config, ClientConfig, cleanKubeconfig, ...originalKubeconfig } = jest.requireActual('@gardener-dashboard/kube-config') const mockLoadResult = new ClientConfig(Config.build({ - server: 'https://kubernetes:6443' + server: 'https://kubernetes:6443', }, { - token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmdhcmRlbjpkZWZhdWx0In0.-4rSuvvj5BStN6DwnmLAaRVbgpl5iCn2hG0pcqx0NPw' + token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmdhcmRlbjpkZWZhdWx0In0.-4rSuvvj5BStN6DwnmLAaRVbgpl5iCn2hG0pcqx0NPw', })) module.exports = { @@ -20,5 +20,5 @@ module.exports = { ClientConfig, cleanKubeconfig: jest.fn().mockImplementation(cleanKubeconfig), load: jest.fn().mockReturnValue(mockLoadResult), - mockLoadResult + mockLoadResult, } diff --git a/backend/__mocks__/@gardener-dashboard/logger.js b/backend/__mocks__/@gardener-dashboard/logger.js index 4b2474d859..6fbe174865 100644 --- a/backend/__mocks__/@gardener-dashboard/logger.js +++ b/backend/__mocks__/@gardener-dashboard/logger.js @@ -13,10 +13,10 @@ globalLogger.console = { debug: jest.fn(), info: jest.fn(), warn: jest.fn(), - error: jest.fn() + error: jest.fn(), } module.exports = { Logger, - globalLogger + globalLogger, } diff --git a/backend/__mocks__/@gardener-dashboard/request.js b/backend/__mocks__/@gardener-dashboard/request.js index 378fbc281f..58d5d35789 100644 --- a/backend/__mocks__/@gardener-dashboard/request.js +++ b/backend/__mocks__/@gardener-dashboard/request.js @@ -18,7 +18,7 @@ const { HTTP2_HEADER_AUTHORITY, HTTP2_HEADER_PATH, HTTP2_HEADER_METHOD, - HTTP2_HEADER_AUTHORIZATION + HTTP2_HEADER_AUTHORIZATION, } = http2.constants class MockClient { @@ -51,7 +51,7 @@ class MockClient { [HTTP2_HEADER_METHOD]: method, [HTTP2_HEADER_SCHEME]: protocol.replace(/:$/, ''), [HTTP2_HEADER_AUTHORITY]: host, - [HTTP2_HEADER_PATH]: pathname + [HTTP2_HEADER_PATH]: pathname, } headers[HTTP2_HEADER_PATH] = join(headers[HTTP2_HEADER_PATH], path) if (searchParams) { @@ -74,5 +74,5 @@ class MockClient { module.exports = { ...request, extend: jest.fn(options => new MockClient(options)), - mockRequest + mockRequest, } diff --git a/backend/__mocks__/@octokit/core.js b/backend/__mocks__/@octokit/core.js index 4becc0058c..55b213c1f8 100644 --- a/backend/__mocks__/@octokit/core.js +++ b/backend/__mocks__/@octokit/core.js @@ -37,18 +37,18 @@ const mockOctokitPaginateGraphQL = jest.fn().mockImplementation(async (_query, { body: comment.body, author: { login: comment.user.login, - avatarUrl: comment.user.avatar_url - } + avatarUrl: comment.user.avatar_url, + }, } }) return { repository: { issue: { comments: { - nodes - } - } - } + nodes, + }, + }, + }, } }) @@ -98,7 +98,7 @@ const Octokit = jest.fn().mockImplementation(options => { octokit.issues = { get: jest.fn().mockRejectedValue(serviceUnavailable), update: jest.fn().mockRejectedValue(serviceUnavailable), - createComment: jest.fn().mockRejectedValue(serviceUnavailable) + createComment: jest.fn().mockRejectedValue(serviceUnavailable), } return octokit }) @@ -109,5 +109,5 @@ module.exports = { mockListIssues, mockListComments, mockOctokitPaginateREST, - mockOctokitPaginateGraphQL + mockOctokitPaginateGraphQL, } diff --git a/backend/__mocks__/openid-client.js b/backend/__mocks__/openid-client.js index a9e9f5ee96..0bf3720811 100644 --- a/backend/__mocks__/openid-client.js +++ b/backend/__mocks__/openid-client.js @@ -24,7 +24,7 @@ Issuer.discover = jest.fn(issuer => { request_uri_parameter_supported: true, require_request_uri_registration: false, response_modes_supported: ['query', 'fragment'], - token_endpoint_auth_methods_supported: ['client_secret_basic'] + token_endpoint_auth_methods_supported: ['client_secret_basic'], })) }) diff --git a/backend/eslint.config.js b/backend/eslint.config.js new file mode 100644 index 0000000000..829415580c --- /dev/null +++ b/backend/eslint.config.js @@ -0,0 +1,62 @@ +// +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Gardener contributors +// +// SPDX-License-Identifier: Apache-2.0 +// + +const neostandard = require('neostandard') +const jest = require('eslint-plugin-jest') +const security = require('eslint-plugin-security') +const lodash = require('eslint-plugin-lodash') + +const jestConfig = jest.configs['flat/recommended'] +const securityConfig = security.configs.recommended +const lodashConfig = { + plugins: { + lodash, + }, + rules: { + 'lodash/path-style': ['error', 'array'], + }, +} + +module.exports = [ + ...neostandard({ + ignores: neostandard.resolveIgnoresFromGitignore(), + globals: { + ...jestConfig.languageOptions.globals, + createAgent: true, + fixtures: true, + }, + }), + lodashConfig, + securityConfig, + { + files: [ + '**/__tests__/**', + '**/test/**/*.spec.js', + ], + ...jestConfig, + }, + { + rules: { + '@stylistic/comma-dangle': ['error', 'always-multiline'], + 'no-console': 'error', + 'no-debugger': 'error', + }, + }, + { + files: [ + '**/__fixtures__/**', + '**/__mocks__/**', + '**/__tests__/**', + '**/test/**', + '**/jest.setup.js', + ], + rules: { + 'security/detect-object-injection': 'off', + 'security/detect-possible-timing-attacks': 'off', + 'security/detect-unsafe-regex': 'off', + }, + }, +] diff --git a/backend/jest.setup.js b/backend/jest.setup.js index 05a0923217..e4783f6686 100644 --- a/backend/jest.setup.js +++ b/backend/jest.setup.js @@ -24,7 +24,7 @@ function createHttpAgent () { const signal = 'SIGTERM' const healthChecks = { '/healthz': () => healthCheck(false), - '/healthz-transitive': () => healthCheck(true) + '/healthz-transitive': () => healthCheck(true), } process.removeAllListeners(signal) server = createTerminus(server, { signal, healthChecks }) @@ -34,7 +34,7 @@ function createHttpAgent () { server, close () { server.close() - } + }, } for (const method of ['get', 'put', 'patch', 'delete', 'post']) { @@ -74,17 +74,17 @@ function createSocketAgent (cache) { reconnectionDelay: 0, forceNew: true, autoConnect: false, - transports: ['websocket'] + transports: ['websocket'], }) socket.connect() if (connected) { await pEvent(socket, 'connect', { timeout: 1000, - rejectionEvents: ['error', 'connect_error'] + rejectionEvents: ['error', 'connect_error'], }) } return socket - } + }, } return agent @@ -108,7 +108,7 @@ jest.mock('./lib/config/gardener', () => { } return { ...originalGardener, - readConfig: jest.fn(path => mockFiles.get(path)) + readConfig: jest.fn(path => mockFiles.get(path)), } }) @@ -124,7 +124,7 @@ jest.mock('./lib/cache', () => { 'quotas', 'projects', 'controllerregistrations', - 'resourcequotas' + 'resourcequotas', ] for (const key of keys) { cache.set(key, { @@ -134,7 +134,7 @@ jest.mock('./lib/cache', () => { }, find (predicate) { return find(this.list(), predicate) - } + }, }) } cache.ticketCache = createTicketCache() diff --git a/backend/lib/api.js b/backend/lib/api.js index 8ab329827c..b88615f240 100644 --- a/backend/lib/api.js +++ b/backend/lib/api.js @@ -23,13 +23,13 @@ const router = express.Router() router.use(compression({ threshold: 8192, - level: zlib.constants.Z_DEFAULT_COMPRESSION + level: zlib.constants.Z_DEFAULT_COMPRESSION, })) router.use(requestLogger) router.use(monitorResponseTimes()) router.use(cookieParser()) router.use(bodyParser.json({ - limit: config.maxRequestBodySize + limit: config.maxRequestBodySize, })) router.use(authenticate({ createClient })) for (const [key, value] of Object.entries(routes)) { @@ -41,5 +41,5 @@ router.use(sendError) // exports module.exports = { router, - hooks + hooks, } diff --git a/backend/lib/app.js b/backend/lib/app.js index 7f820ba9e9..e8d4824441 100644 --- a/backend/lib/app.js +++ b/backend/lib/app.js @@ -35,9 +35,9 @@ const INDEX_FILENAME = join(PUBLIC_DIRNAME, 'index.html') const STATIC_PATHS = ['/assets', '/static', '/js', '/css', '/fonts', '/img'] // csp sources -const connectSrc = _.get(config, 'contentSecurityPolicy.connectSrc', ['\'self\'']) +const connectSrc = _.get(config, ['contentSecurityPolicy', 'connectSrc'], ['\'self\'']) const imgSrc = ['\'self\'', 'data:', 'https://www.gravatar.com'] -const gitHubRepoUrl = _.get(config, 'frontend.ticket.gitHubRepoUrl') +const gitHubRepoUrl = _.get(config, ['frontend', 'ticket', 'gitHubRepoUrl']) if (gitHubRepoUrl) { const url = new URL(gitHubRepoUrl) const gitHubHostname = url.hostname @@ -79,11 +79,11 @@ app.use(helmet.contentSecurityPolicy({ fontSrc: ['\'self\'', 'data:'], imgSrc, scriptSrc: ['\'self\'', '\'unsafe-eval\''], - frameAncestors: ['\'self\''] - } + frameAncestors: ['\'self\''], + }, })) app.use(helmet.referrerPolicy({ - policy: 'same-origin' + policy: 'same-origin', })) app.use(expressStaticGzip(PUBLIC_DIRNAME, { @@ -91,13 +91,13 @@ app.use(expressStaticGzip(PUBLIC_DIRNAME, { orderPreference: ['br'], serveStatic: { immutable: true, - maxAge: '1 Week' - } + maxAge: '1 Week', + }, })) app.use(STATIC_PATHS, notFound) app.use(helmet.xFrameOptions({ - action: 'deny' + action: 'deny', })) app.use(historyFallback(INDEX_FILENAME)) diff --git a/backend/lib/auth.js b/backend/lib/auth.js index a3d6a52410..5197c946fd 100644 --- a/backend/lib/auth.js +++ b/backend/lib/auth.js @@ -14,7 +14,7 @@ const { authorizationCallback, refreshToken, authorizeToken, - clearCookies + clearCookies, } = require('./security') const { requestLogger } = require('./middleware') @@ -46,7 +46,7 @@ router.route('/logout') clearCookies(res) const { error = {}, - redirectPath + redirectPath, } = req.query const hash = error.message ? `#error=${encodeURIComponent(error.message)}` diff --git a/backend/lib/cache/index.js b/backend/lib/cache/index.js index 63dc83d055..28414acd17 100644 --- a/backend/lib/cache/index.js +++ b/backend/lib/cache/index.js @@ -81,9 +81,9 @@ module.exports = { }, getVisibleAndNotProtectedSeeds () { const predicate = item => { - const taints = _.get(item, 'spec.taints') + const taints = _.get(item, ['spec', 'taints']) const unprotected = !_.find(taints, ['key', 'seed.gardener.cloud/protected']) - const visible = _.get(item, 'spec.settings.scheduling.visible') + const visible = _.get(item, ['spec', 'settings', 'scheduling', 'visible']) return unprotected && visible } return _.filter(cache.getSeeds(), predicate) @@ -102,7 +102,7 @@ module.exports = { return _ .chain(cache.getProjects()) .find(['metadata.name', name]) - .get('spec.namespace') + .get(['spec', 'namespace']) .value() }, getShoots (namespace, query = {}) { @@ -140,5 +140,5 @@ module.exports = { }, getTicketCache () { return cache.getTicketCache() - } + }, } diff --git a/backend/lib/cache/tickets.js b/backend/lib/cache/tickets.js index 13bf0178aa..904a8b52e9 100644 --- a/backend/lib/cache/tickets.js +++ b/backend/lib/cache/tickets.js @@ -146,7 +146,7 @@ function init () { addOrUpdateIssue, addOrUpdateComment, removeIssue, - removeComment + removeComment, } } diff --git a/backend/lib/config/gardener.js b/backend/lib/config/gardener.js index 1be47f2fa6..f927a514da 100644 --- a/backend/lib/config/gardener.js +++ b/backend/lib/config/gardener.js @@ -27,96 +27,96 @@ If both environmentVariableName and filePath are missing/empty, the config path const configMappings = [ { environmentVariableName: 'VUE_APP_VERSION', - configPath: 'frontend.appVersion' + configPath: 'frontend.appVersion', }, { environmentVariableName: 'SESSION_SECRET', filePath: '/etc/gardener-dashboard/secrets/session/sessionSecret', - configPath: 'sessionSecret' + configPath: 'sessionSecret', }, { environmentVariableName: 'SESSION_SECRET_PREVIOUS', filePath: '/etc/gardener-dashboard/secrets/session/sessionSecretPrevious', - configPath: 'sessionSecretPrevious' + configPath: 'sessionSecretPrevious', }, { environmentVariableName: 'API_SERVER_URL', - configPath: 'apiServerUrl' + configPath: 'apiServerUrl', }, { environmentVariableName: 'OIDC_ISSUER', - configPath: 'oidc.issuer' + configPath: 'oidc.issuer', }, { environmentVariableName: 'OIDC_CA', - configPath: 'oidc.ca' + configPath: 'oidc.ca', }, { environmentVariableName: 'OIDC_CLIENT_ID', filePath: '/etc/gardener-dashboard/secrets/oidc/client_id', - configPath: 'oidc.client_id' + configPath: 'oidc.client_id', }, { environmentVariableName: 'OIDC_CLIENT_SECRET', filePath: '/etc/gardener-dashboard/secrets/oidc/client_secret', - configPath: 'oidc.client_secret' + configPath: 'oidc.client_secret', }, { environmentVariableName: 'GITHUB_AUTHENTICATION_APP_ID', filePath: '/etc/gardener-dashboard/secrets/github/authentication.appId', configPath: 'gitHub.authentication.appId', - type: 'Integer' + type: 'Integer', }, { environmentVariableName: 'GITHUB_AUTHENTICATION_CLIENT_ID', filePath: '/etc/gardener-dashboard/secrets/github/authentication.clientId', - configPath: 'gitHub.authentication.clientId' + configPath: 'gitHub.authentication.clientId', }, { environmentVariableName: 'GITHUB_AUTHENTICATION_CLIENT_SECRET', filePath: '/etc/gardener-dashboard/secrets/github/authentication.clientSecret', - configPath: 'gitHub.authentication.clientSecret' + configPath: 'gitHub.authentication.clientSecret', }, { environmentVariableName: 'GITHUB_AUTHENTICATION_INSTALLATION_ID', filePath: '/etc/gardener-dashboard/secrets/github/authentication.installationId', configPath: 'gitHub.authentication.installationId', - type: 'Integer' + type: 'Integer', }, { environmentVariableName: 'GITHUB_AUTHENTICATION_PRIVATE_KEY', filePath: '/etc/gardener-dashboard/secrets/github/authentication.privateKey', - configPath: 'gitHub.authentication.privateKey' + configPath: 'gitHub.authentication.privateKey', }, { environmentVariableName: 'GITHUB_AUTHENTICATION_TOKEN', filePath: '/etc/gardener-dashboard/secrets/github/authentication.token', - configPath: 'gitHub.authentication.token' + configPath: 'gitHub.authentication.token', }, { environmentVariableName: 'GITHUB_WEBHOOK_SECRET', filePath: '/etc/gardener-dashboard/secrets/github/webhookSecret', - configPath: 'gitHub.webhookSecret' + configPath: 'gitHub.webhookSecret', }, { environmentVariableName: 'LOG_LEVEL', - configPath: 'logLevel' + configPath: 'logLevel', }, { environmentVariableName: 'LOG_HTTP_REQUEST_BODY', configPath: 'logHttpRequestBody', - type: 'Boolean' + type: 'Boolean', }, { environmentVariableName: 'PORT', configPath: 'port', - type: 'Integer' + type: 'Integer', }, { environmentVariableName: 'METRICS_PORT', configPath: 'metricsPort', - type: 'Integer' - } + type: 'Integer', + }, ] function parseConfigValue (value, type) { @@ -138,7 +138,7 @@ module.exports = { environmentVariableName, configPath, filePath, - type = 'String' + type = 'String', } = configMapping let rawValue = env[environmentVariableName] // eslint-disable-line security/detect-object-injection if (!rawValue && filePath) { @@ -159,7 +159,7 @@ module.exports = { isProd, logLevel: isProd ? 'warn' : 'debug', port: 3030, - metricsPort: 9050 + metricsPort: 9050, } }, getFilename ({ argv, env } = process) { @@ -181,20 +181,20 @@ module.exports = { this.assignConfigFromEnvironmentAndFileSystem(config, env) const requiredConfigurationProperties = [ 'sessionSecret', - 'apiServerUrl' + 'apiServerUrl', ] // When OIDC is configured, some more configuration is required if (config.oidc) { - const redirectUri = _.get(config, 'oidc.redirect_uri') - const redirectUris = _.get(config, 'oidc.redirect_uris') + const redirectUri = _.get(config, ['oidc', 'redirect_uri']) + const redirectUris = _.get(config, ['oidc', 'redirect_uris']) if (redirectUri && _.isEmpty(redirectUris)) { - _.set(config, 'oidc.redirect_uris', [redirectUri]) + _.set(config, ['oidc', 'redirect_uris'], [redirectUri]) } requiredConfigurationProperties.push( 'oidc.issuer', 'oidc.client_id', - 'oidc.redirect_uris' + 'oidc.redirect_uris', ) } @@ -206,11 +206,11 @@ module.exports = { if (config.sessionSecretPrevious) { sessionSecrets.push(config.sessionSecretPrevious) } - _.set(config, 'sessionSecrets', sessionSecrets) - _.set(config, 'frontend.apiServerUrl', config.apiServerUrl) - _.set(config, 'frontend.clusterIdentity', config.clusterIdentity) - if (!config.gitHub && _.has(config, 'frontend.ticket')) { - _.unset(config, 'frontend.ticket') + _.set(config, ['sessionSecrets'], sessionSecrets) + _.set(config, ['frontend', 'apiServerUrl'], config.apiServerUrl) + _.set(config, ['frontend', 'clusterIdentity'], config.clusterIdentity) + if (!config.gitHub && _.has(config, ['frontend', 'ticket'])) { + _.unset(config, ['frontend', 'ticket']) } return config @@ -218,5 +218,5 @@ module.exports = { readConfig (path) { const data = fs.readFileSync(path, 'utf8') // eslint-disable-line security/detect-non-literal-fs-filename return yaml.load(data) - } + }, } diff --git a/backend/lib/github/index.js b/backend/lib/github/index.js index d96254396d..98c9d6d4b2 100644 --- a/backend/lib/github/index.js +++ b/backend/lib/github/index.js @@ -11,13 +11,13 @@ const config = require('../config') const { org: owner, - repository: repo + repository: repo, } = config.gitHub || {} function searchIssues ({ state, title } = {}) { const q = [ `repo:${owner}/${repo}`, - 'is:issue' + 'is:issue', ] if (state) { q.push(`state:${state}`) @@ -26,7 +26,7 @@ function searchIssues ({ state, title } = {}) { q.push(`${title} in:title`) } const options = octokit.search.issuesAndPullRequests.endpoint.merge({ - q: q.join(' ') + q: q.join(' '), }) return octokit.paginate(options) } @@ -35,7 +35,7 @@ function getIssue ({ number }) { return octokit.issues.get({ owner, repo, - issue_number: number + issue_number: number, }) } @@ -44,7 +44,7 @@ function closeIssue ({ number }) { owner, repo, issue_number: number, - state: 'closed' + state: 'closed', }) } @@ -91,12 +91,12 @@ async function getComments ({ number }) { html_url: node.url, user: { login: author.login ?? 'ghost', - avatar_url: author.avatarUrl + avatar_url: author.avatarUrl, }, created_at: node.createdAt, updated_at: node.updatedAt, author_association: node.authorAssociation, - body: node.body + body: node.body, } }) } @@ -106,7 +106,7 @@ function createComment ({ number }, body) { owner, repo, issue_number: number, - body + body, }) } @@ -116,5 +116,5 @@ module.exports = { closeIssue, getIssue, getComments, - createComment + createComment, } diff --git a/backend/lib/github/octokit.js b/backend/lib/github/octokit.js index be05a2dd57..01d64e7671 100644 --- a/backend/lib/github/octokit.js +++ b/backend/lib/github/octokit.js @@ -43,11 +43,11 @@ function getAuthOptions (auth) { clientId, clientSecret, installationId, - privateKey + privateKey, } = auth || {} if (token) { return { - auth: token + auth: token, } } if (appId && clientId && clientSecret && installationId && privateKey) { @@ -58,8 +58,8 @@ function getAuthOptions (auth) { clientId, clientSecret, installationId, - privateKey - } + privateKey, + }, } } } @@ -70,14 +70,14 @@ function init (options) { apiUrl: baseUrl = 'https://api.github.com', ca, timeout = 30000, - authentication - } = {} + authentication, + } = {}, } = config let agent = false if (ca) { agent = new Agent({ ca, - keepAlive: true + keepAlive: true, }) } const authOptions = getAuthOptions(authentication) @@ -88,8 +88,8 @@ function init (options) { log: OctokitLog, request: { agent, - timeout - } + timeout, + }, }, options) return new Octokit(options) diff --git a/backend/lib/github/webhook/handler.js b/backend/lib/github/webhook/handler.js index 69d7dff5bf..680bdd122d 100644 --- a/backend/lib/github/webhook/handler.js +++ b/backend/lib/github/webhook/handler.js @@ -21,8 +21,8 @@ async function updateLease () { const body = { spec: { holderIdentity: process.env.POD_NAME || 'gardener-dashboard', - renewTime: currentMicroDateStr() - } + renewTime: currentMicroDateStr(), + }, } try { await dashboardClient['coordination.k8s.io'].leases.mergePatch(namespace, name, body) @@ -31,7 +31,7 @@ async function updateLease () { // Lease not found, create it try { body.metadata = { - name + name, } await dashboardClient['coordination.k8s.io'].leases.create(namespace, body) } catch (createErr) { diff --git a/backend/lib/github/webhook/router.js b/backend/lib/github/webhook/router.js index f55ea8a350..aed0ef2d09 100644 --- a/backend/lib/github/webhook/router.js +++ b/backend/lib/github/webhook/router.js @@ -20,7 +20,7 @@ const router = express.Router() const middlewares = [ requestLogger, monitorResponseTimes(), - bodyParser.json({ verify }) + bodyParser.json({ verify }), ] router.route('/') diff --git a/backend/lib/healthz/index.js b/backend/lib/healthz/index.js index 1d5b36b2e7..99675a648f 100644 --- a/backend/lib/healthz/index.js +++ b/backend/lib/healthz/index.js @@ -25,5 +25,5 @@ async function healthCheck (transitive = false) { } module.exports = { - healthCheck + healthCheck, } diff --git a/backend/lib/hooks.js b/backend/lib/hooks.js index a89626972d..ca63480dfb 100644 --- a/backend/lib/hooks.js +++ b/backend/lib/hooks.js @@ -76,7 +76,7 @@ class LifecycleHooks { seeds: client['core.gardener.cloud'].seeds.informer(), shoots: client['core.gardener.cloud'].shoots.informerAllNamespaces(), // core - resourcequotas: client.core.resourcequotas.informerAllNamespaces() + resourcequotas: client.core.resourcequotas.informerAllNamespaces(), } if (config.gitHub?.webhookSecret) { @@ -93,7 +93,7 @@ module.exports = () => { const client = createDashboardClient({ id: 'watch', pingInterval: 30000, - maxOutstandingPings: 2 + maxOutstandingPings: 2, }) return new LifecycleHooks(client) } diff --git a/backend/lib/io.js b/backend/lib/io.js index 7f5366c2fb..b86f13d489 100644 --- a/backend/lib/io.js +++ b/backend/lib/io.js @@ -32,7 +32,7 @@ function authenticateFn (options) { const noop = () => {} const res = { clearCookie: noop, - cookie: noop + cookie: noop, } return async req => { @@ -132,7 +132,7 @@ function synchronizeShoots (socket, uids = []) { const [ isAdmin, namespaces, - qualifiedNames + qualifiedNames, ] = parseRooms(rooms) const uidNotFound = uid => { @@ -145,9 +145,9 @@ function synchronizeShoots (socket, uids = []) { details: { uid, group: 'core.gardener.cloud', - kind: 'shoots' + kind: 'shoots', }, - code: 404 + code: 404, } } return uids.map(uid => { @@ -199,7 +199,7 @@ function setDisconnectTimeout (socket, delay) { function init (httpServer, cache) { const io = createServer(httpServer, { path: '/api/events', - serveClient: false + serveClient: false, }) // middleware @@ -218,8 +218,8 @@ function init (httpServer, cache) { code: 'ERR_JWT_TOKEN_REFRESH_REQUIRED', data: { rti: user.rti, - exp: user.refresh_at - } + exp: user.refresh_at, + }, }) } } diff --git a/backend/lib/markdown.js b/backend/lib/markdown.js index 3858ca15c3..f60c9866fc 100644 --- a/backend/lib/markdown.js +++ b/backend/lib/markdown.js @@ -20,19 +20,19 @@ function createConverter (options) { emoji: true, simplifiedAutoLink: true, simpleLineBreaks: true, - ...options + ...options, }) return { makeSanitizedHtml (text, options) { return sanitizeHtml(converter.makeHtml(text), { allowedTags: [...sanitizeHtml.defaults.allowedTags, 'img', 'details', 'summary'], - ...options + ...options, }) - } + }, } } module.exports = { - createConverter + createConverter, } diff --git a/backend/lib/middleware.js b/backend/lib/middleware.js index 5a4a7cba27..737b29869e 100644 --- a/backend/lib/middleware.js +++ b/backend/lib/middleware.js @@ -83,7 +83,7 @@ function renderError (err, req, res, next) { res.format({ json: () => res.status(locals.code).send(locals), - default: () => res.status(locals.code).send(ErrorTemplate(locals)) + default: () => res.status(locals.code).send(ErrorTemplate(locals)), }) } @@ -129,5 +129,5 @@ module.exports = { sendError, renderError, metricsRoute, - ErrorTemplate + ErrorTemplate, } diff --git a/backend/lib/openapi/index.js b/backend/lib/openapi/index.js index 5d60b473a9..73d9e9adf2 100644 --- a/backend/lib/openapi/index.js +++ b/backend/lib/openapi/index.js @@ -41,9 +41,9 @@ async function getSchemaDefinitions (user) { const selectedSchemaDefinitions = _ .chain(dereferencedOpenApi) - .get('components.schemas') + .get(['components', 'schemas']) .pick([ - 'com.github.gardener.gardener.pkg.apis.core.v1beta1.Shoot' + 'com.github.gardener.gardener.pkg.apis.core.v1beta1.Shoot', ]) .value() _.assign(schemaDefinitions, selectedSchemaDefinitions) diff --git a/backend/lib/routes/cloudProviderSecrets.js b/backend/lib/routes/cloudProviderSecrets.js index 710d0f4095..fdb04fa20d 100644 --- a/backend/lib/routes/cloudProviderSecrets.js +++ b/backend/lib/routes/cloudProviderSecrets.js @@ -11,7 +11,7 @@ const { cloudProviderSecrets } = require('../services') const { metricsRoute } = require('../middleware') const router = module.exports = express.Router({ - mergeParams: true + mergeParams: true, }) const metricsMiddleware = metricsRoute('cloudprovidersecrets') diff --git a/backend/lib/routes/config.js b/backend/lib/routes/config.js index 38bf74a398..57db1b791b 100644 --- a/backend/lib/routes/config.js +++ b/backend/lib/routes/config.js @@ -54,11 +54,11 @@ function sanitizeFrontendConfig (frontendConfig) { sla = {}, addonDefinition = {}, accessRestriction: { - items = [] + items = [], } = {}, vendorHints = [], resourceQuotaHelp = '', - controlPlaneHighAvailabilityHelp = '' + controlPlaneHighAvailabilityHelp = '', } = sanitizedFrontendConfig convertAndSanitize(alert, 'message') @@ -72,14 +72,14 @@ function sanitizeFrontendConfig (frontendConfig) { const { display = {}, input = {}, - options = [] + options = [], } = item convertAndSanitize(display, 'description') convertAndSanitize(input, 'description') for (const option of options) { const { display = {}, - input = {} + input = {}, } = option convertAndSanitize(display, 'description') convertAndSanitize(input, 'description') diff --git a/backend/lib/routes/index.js b/backend/lib/routes/index.js index ec727db6cb..f636dceeff 100644 --- a/backend/lib/routes/index.js +++ b/backend/lib/routes/index.js @@ -22,9 +22,9 @@ module.exports = { '/namespaces/:namespace/tickets': require('./tickets'), '/namespaces/:namespace/cloudprovidersecrets': require('./cloudProviderSecrets'), '/namespaces/:namespace/members': require('./members'), - '/namespaces/:namespace/resourcequotas': require('./resourceQuotas') + '/namespaces/:namespace/resourcequotas': require('./resourceQuotas'), } -if (_.get(config, 'frontend.features.terminalEnabled', false)) { +if (_.get(config, ['frontend', 'features', 'terminalEnabled'], false)) { module.exports['/terminals'] = require('./terminals') } diff --git a/backend/lib/routes/info.js b/backend/lib/routes/info.js index 7b34c538e6..c03fd246cb 100644 --- a/backend/lib/routes/info.js +++ b/backend/lib/routes/info.js @@ -35,14 +35,14 @@ async function fetchGardenerVersion () { spec: { service, insecureSkipTLSVerify, - caBundle - } + caBundle, + }, } = await dashboardClient['apiregistration.k8s.io'].apiservices.get('v1beta1.core.gardener.cloud') const clientConfig = { url: `https://${service.name}.${service.namespace}`, extend (options) { return Object.assign(Object.create(this), options) - } + }, } if (caBundle) { clientConfig.ca = decodeBase64(caBundle) diff --git a/backend/lib/routes/members.js b/backend/lib/routes/members.js index 5cccbd9ee7..7725f7b134 100644 --- a/backend/lib/routes/members.js +++ b/backend/lib/routes/members.js @@ -12,7 +12,7 @@ const { UnprocessableEntity } = require('http-errors') const { metricsRoute } = require('../middleware') const router = module.exports = express.Router({ - mergeParams: true + mergeParams: true, }) const metricsMiddleware = metricsRoute('members') diff --git a/backend/lib/routes/resourceQuotas.js b/backend/lib/routes/resourceQuotas.js index 24a8cdac75..a4139118d8 100644 --- a/backend/lib/routes/resourceQuotas.js +++ b/backend/lib/routes/resourceQuotas.js @@ -11,7 +11,7 @@ const { resourceQuotas } = require('../services') const { metricsRoute } = require('../middleware') const router = module.exports = express.Router({ - mergeParams: true + mergeParams: true, }) const metricsMiddleware = metricsRoute('resourcequotas') diff --git a/backend/lib/routes/shoots.js b/backend/lib/routes/shoots.js index 467b04cc80..dc3a7734fc 100644 --- a/backend/lib/routes/shoots.js +++ b/backend/lib/routes/shoots.js @@ -12,7 +12,7 @@ const { metricsRoute } = require('../middleware') const { trimObjectMetadata } = require('../utils') const router = module.exports = express.Router({ - mergeParams: true + mergeParams: true, }) const metricsMiddleware = metricsRoute('shoots') diff --git a/backend/lib/routes/terminals.js b/backend/lib/routes/terminals.js index 344bd5da82..a5e9f607da 100644 --- a/backend/lib/routes/terminals.js +++ b/backend/lib/routes/terminals.js @@ -12,7 +12,7 @@ const { UnprocessableEntity } = require('http-errors') const { metricsRoute } = require('../middleware') const router = module.exports = express.Router({ - mergeParams: true + mergeParams: true, }) const metricsMiddleware = metricsRoute('terminals') diff --git a/backend/lib/routes/tickets.js b/backend/lib/routes/tickets.js index 2c4b61efc0..3141954e6d 100644 --- a/backend/lib/routes/tickets.js +++ b/backend/lib/routes/tickets.js @@ -13,7 +13,7 @@ const tickets = require('../services/tickets') const { metricsRoute } = require('../middleware') const router = module.exports = express.Router({ - mergeParams: true + mergeParams: true, }) const ticketCache = cache.getTicketCache() diff --git a/backend/lib/routes/user.js b/backend/lib/routes/user.js index 4a4d92fb45..5f3495db64 100644 --- a/backend/lib/routes/user.js +++ b/backend/lib/routes/user.js @@ -14,7 +14,7 @@ const { authorization } = require('../services') const { metricsRoute } = require('../middleware') const router = module.exports = express.Router({ - mergeParams: true + mergeParams: true, }) const metricsMiddleware = metricsRoute('user') @@ -41,7 +41,7 @@ router.route('/token') .get(async (req, res, next) => { const token = getToken(req.user) res.send({ - token + token, }) }) @@ -52,15 +52,15 @@ router.route('/kubeconfig') apiServerUrl: server, apiServerCaData: certificateAuthorityData, apiServerSkipTlsVerify: insecureSkipTlsVerify, - oidc = {} + oidc = {}, } = config const { issuer: issuerUrl, public: { clientId = oidc.client_id, clientSecret, - usePKCE - } = {} + usePKCE, + } = {}, } = oidc const body = { server, @@ -68,8 +68,8 @@ router.route('/kubeconfig') insecureSkipTlsVerify, oidc: { issuerUrl, - clientId - } + clientId, + }, } if (clientSecret) { body.oidc.clientSecret = clientSecret diff --git a/backend/lib/security/constants.js b/backend/lib/security/constants.js index 2eda50ac1c..82ed81ab3e 100644 --- a/backend/lib/security/constants.js +++ b/backend/lib/security/constants.js @@ -14,5 +14,5 @@ module.exports = { COOKIE_SIGNATURE: HOST_PREFIX + 'gSgn', COOKIE_TOKEN: HOST_PREFIX + 'gTkn', COOKIE_CODE_VERIFIER: HOST_PREFIX + 'gCdVrfr', - COOKIE_STATE: HOST_PREFIX + 'gStt' + COOKIE_STATE: HOST_PREFIX + 'gStt', } diff --git a/backend/lib/security/index.js b/backend/lib/security/index.js index b25735185c..105914ef8f 100644 --- a/backend/lib/security/index.js +++ b/backend/lib/security/index.js @@ -22,7 +22,7 @@ const { verify, decode, encrypt, - decrypt + decrypt, } = require('./jose')(sessionSecrets) const now = () => Math.floor(Date.now() / 1000) @@ -41,7 +41,7 @@ const { COOKIE_SIGNATURE, COOKIE_CODE_VERIFIER, COOKIE_STATE, - GARDENER_AUDIENCE + GARDENER_AUDIENCE, } = require('./constants') const { @@ -54,12 +54,12 @@ const { sessionLifetime = 86400, rejectUnauthorized = true, ca, - clockTolerance = 15 + clockTolerance = 15, } = oidc const responseTypes = ['code'] const httpOptions = { followRedirect: false, - rejectUnauthorized + rejectUnauthorized, } if (ca) { httpOptions.ca = ca @@ -95,7 +95,7 @@ function discoverClient (url) { const options = { client_id: clientId, redirect_uris: redirectUris, - response_types: responseTypes + response_types: responseTypes, } if (clientSecret) { options.client_secret = clientSecret @@ -110,7 +110,7 @@ function discoverClient (url) { forever: true, minTimeout: 1000, maxTimeout: 60 * 1000, - randomize: true + randomize: true, }) } @@ -157,12 +157,12 @@ async function authorizationUrl (req, res) { res.cookie(COOKIE_STATE, { redirectPath, redirectOrigin, - state + state, }, { secure: true, httpOnly: true, maxAge: 180_000, // cookie will be removed after 3 minutes - sameSite: 'Lax' + sameSite: 'Lax', }) const client = await exports.getIssuerClient() if (!includes(redirectUris, backendRedirectUri)) { @@ -171,7 +171,7 @@ async function authorizationUrl (req, res) { const params = { redirect_uri: backendRedirectUri, state, - scope + scope, } if (usePKCE) { const codeChallengeMethod = getCodeChallengeMethod(client) @@ -180,7 +180,7 @@ async function authorizationUrl (req, res) { secure: true, httpOnly: true, maxAge: 180_000, // cookie will be removed after 3 minutes - sameSite: 'Lax' + sameSite: 'Lax', }) switch (codeChallengeMethod) { case 'S256': @@ -197,7 +197,7 @@ async function authorizationUrl (req, res) { async function authorizeToken (req, res) { const idToken = chain(req.body) - .get('token') + .get(['token']) .trim() .value() const payload = {} @@ -211,7 +211,7 @@ async function createAccessToken (payload, idToken) { const user = { auth: { bearer: idToken } } const results = await Promise.allSettled([ authentication.isAuthenticated({ token: idToken }), - authorization.isAdmin(user) + authorization.isAdmin(user), ]) // throw an error if any promise has been rejected for (const { status, reason: err } of results) { @@ -221,13 +221,13 @@ async function createAccessToken (payload, idToken) { } const [ { value: { username, groups } }, - { value: isAdmin } + { value: isAdmin }, ] = results Object.assign(payload, { id: username, groups, aud: [GARDENER_AUDIENCE], - isAdmin + isAdmin, }) const idTokenPayload = decode(idToken) if (idTokenPayload) { @@ -253,13 +253,13 @@ async function setCookies (res, tokenSet) { res.cookie(COOKIE_HEADER_PAYLOAD, join([header, payload], '.'), { secure: true, expires: undefined, - sameSite: 'Lax' + sameSite: 'Lax', }) res.cookie(COOKIE_SIGNATURE, signature, { secure: true, httpOnly: true, expires: undefined, - sameSite: 'Lax' + sameSite: 'Lax', }) const values = [tokenSet.id_token] if (tokenSet.refresh_token) { @@ -270,7 +270,7 @@ async function setCookies (res, tokenSet) { secure: true, httpOnly: true, expires: undefined, - sameSite: 'Lax' + sameSite: 'Lax', }) return accessToken } @@ -278,7 +278,7 @@ async function setCookies (res, tokenSet) { async function authorizationCallback (req, res) { const options = { secure: true, - path: '/' + path: '/', } let stateObject = {} if (COOKIE_STATE in req.cookies) { @@ -288,7 +288,7 @@ async function authorizationCallback (req, res) { const { redirectPath, redirectOrigin, - state + state, } = stateObject const client = await exports.getIssuerClient() @@ -296,7 +296,7 @@ async function authorizationCallback (req, res) { const backendRedirectUri = getBackendRedirectUri(redirectOrigin) const checks = { response_type: 'code', - state + state, } if (COOKIE_CODE_VERIFIER in req.cookies) { checks.code_verifier = req.cookies[COOKIE_CODE_VERIFIER] // eslint-disable-line security/detect-object-injection -- COOKIE_CODE_VERIFIER is a constant @@ -371,7 +371,7 @@ async function getTokenSet (cookies) { } catch (err) { const { message, - code = 'ERR_JWE_DECRYPTION_FAILED' + code = 'ERR_JWE_DECRYPTION_FAILED', } = err throw createError(401, message, { code }) } @@ -382,7 +382,7 @@ async function getTokenSet (cookies) { const tokenSet = new TokenSet({ id_token: idToken, refresh_token: refreshToken, - access_token: accessToken + access_token: accessToken, }) return tokenSet } @@ -464,14 +464,14 @@ function authenticate (options = {}) { const tokenSet = await getTokenSet(req.cookies) const user = await verifyAccessToken(tokenSet.access_token) const auth = Object.freeze({ - bearer: tokenSet.id_token + bearer: tokenSet.id_token, }) Object.defineProperty(user, 'auth', { value: auth, - enumerable: true + enumerable: true, }) Object.defineProperty(user, 'client', { - value: options.createClient({ auth }) + value: options.createClient({ auth }), }) req.user = user next() @@ -485,7 +485,7 @@ function authenticate (options = {}) { function clearCookies (res) { const options = { secure: true, - path: '/' + path: '/', } res.clearCookie(COOKIE_HEADER_PAYLOAD, options) res.clearCookie(COOKIE_SIGNATURE, options) @@ -509,5 +509,5 @@ exports = module.exports = { authorizationCallback, refreshToken, authorizeToken, - authenticate + authenticate, } diff --git a/backend/lib/security/jose.js b/backend/lib/security/jose.js index 189764e01a..e7170e41ce 100644 --- a/backend/lib/security/jose.js +++ b/backend/lib/security/jose.js @@ -78,7 +78,7 @@ module.exports = sessionSecrets => { const encodedText = encoder.encode(text) const protectedHeader = { enc: 'A128CBC-HS256', - alg: 'PBES2-HS256+A128KW' + alg: 'PBES2-HS256+A128KW', } return new jose.CompactEncrypt(encodedText) .setProtectedHeader(protectedHeader) @@ -86,7 +86,7 @@ module.exports = sessionSecrets => { }, async decrypt (data) { const options = { - keyManagementAlgorithms: ['PBES2-HS256+A128KW'] + keyManagementAlgorithms: ['PBES2-HS256+A128KW'], } let firstError for (const symetricKey of symmetricKeys) { @@ -98,6 +98,6 @@ module.exports = sessionSecrets => { } } throw firstError - } + }, } } diff --git a/backend/lib/server.js b/backend/lib/server.js index b63dbfb571..12d65d9490 100644 --- a/backend/lib/server.js +++ b/backend/lib/server.js @@ -33,7 +33,7 @@ function createServer (app, metricsApp) { // create terminus const healthChecks = { '/healthz': () => healthCheckFunc(false), - '/healthz-transitive': () => healthCheckFunc(true) + '/healthz-transitive': () => healthCheckFunc(true), } terminus.createTerminus(server, { @@ -57,7 +57,7 @@ function createServer (app, metricsApp) { }, logger (...args) { logger.error(...args) - } + }, }) return { @@ -76,7 +76,7 @@ function createServer (app, metricsApp) { } await new Promise(resolve => server.listen(port, resolve)) logger.info('Server listening on port %d', port) - } + }, } } diff --git a/backend/lib/services/authentication.js b/backend/lib/services/authentication.js index c842ad2246..db932d4064 100644 --- a/backend/lib/services/authentication.js +++ b/backend/lib/services/authentication.js @@ -11,7 +11,7 @@ const { Unauthorized } = require('http-errors') const logger = require('../logger') const { dashboardClient, - Resources + Resources, } = require('@gardener-dashboard/kube-client') exports.isAuthenticated = async function ({ token } = {}) { @@ -20,19 +20,19 @@ exports.isAuthenticated = async function ({ token } = {}) { kind, apiVersion, metadata: { - name: `token-${Date.now()}` + name: `token-${Date.now()}`, }, spec: { - token - } + token, + }, } try { const { status: { user = {}, authenticated = false, - error = 'User not authenticated' - } = {} + error = 'User not authenticated', + } = {}, } = await dashboardClient['authentication.k8s.io'].tokenreviews.create(body) assert.strictEqual(authenticated, true, error) assert.ok(user.username, 'User authenticated but username is empty') diff --git a/backend/lib/services/authorization.js b/backend/lib/services/authorization.js index 37f44fca6a..0c0a04c6c9 100644 --- a/backend/lib/services/authorization.js +++ b/backend/lib/services/authorization.js @@ -19,13 +19,13 @@ async function hasAuthorization (user, { resourceAttributes, nonResourceAttribut apiVersion, spec: { resourceAttributes, - nonResourceAttributes - } + nonResourceAttributes, + }, } const { status: { - allowed = false - } = {} + allowed = false, + } = {}, } = await client['authorization.k8s.io'].selfsubjectaccessreviews.create(body) return allowed } @@ -36,8 +36,8 @@ exports.isAdmin = function (user) { resourceAttributes: { verb: 'get', group: '', - resource: 'secrets' - } + resource: 'secrets', + }, }) } @@ -46,8 +46,8 @@ exports.canListProjects = function (user) { resourceAttributes: { verb: 'list', group: 'core.gardener.cloud', - resource: 'projects' - } + resource: 'projects', + }, }) } @@ -55,8 +55,8 @@ exports.canGetOpenAPI = function (user) { return hasAuthorization(user, { nonResourceAttributes: { verb: 'get', - path: '/openapi/v3' - } + path: '/openapi/v3', + }, }) } @@ -66,8 +66,8 @@ exports.canListShoots = function (user, namespace) { verb: 'list', group: 'core.gardener.cloud', resource: 'shoots', - namespace - } + namespace, + }, }) } @@ -78,8 +78,8 @@ exports.canGetShoot = function (user, namespace, name) { group: 'core.gardener.cloud', resource: 'shoots', namespace, - name - } + name, + }, }) } @@ -88,8 +88,8 @@ exports.canListSeeds = function (user) { resourceAttributes: { verb: 'list', group: 'core.gardener.cloud', - resource: 'seeds' - } + resource: 'seeds', + }, }) } @@ -98,8 +98,8 @@ exports.canListCloudProfiles = function (user) { resourceAttributes: { verb: 'list', group: 'core.gardener.cloud', - resource: 'cloudprofiles' - } + resource: 'cloudprofiles', + }, }) } @@ -109,8 +109,8 @@ exports.canGetCloudProfiles = function (user, name) { verb: 'get', group: 'core.gardener.cloud', resource: 'cloudprofiles', - name - } + name, + }, }) } @@ -120,8 +120,8 @@ exports.canListResourceQuotas = function (user, namespace) { verb: 'list', group: '', resource: 'resourcequotas', - namespace - } + namespace, + }, }) } @@ -130,8 +130,8 @@ exports.canListControllerRegistrations = function (user) { resourceAttributes: { verb: 'list', group: 'core.gardener.cloud', - resource: 'controllerregistrations' - } + resource: 'controllerregistrations', + }, }) } @@ -142,8 +142,8 @@ exports.canGetSecret = function (user, namespace, name) { group: '', resource: 'secrets', namespace, - name - } + name, + }, }) } @@ -160,16 +160,16 @@ exports.selfSubjectRulesReview = async function (user, namespace) { kind, apiVersion, spec: { - namespace - } + namespace, + }, } const { status: { resourceRules, nonResourceRules, incomplete, - evaluationError - } = {} + evaluationError, + } = {}, } = await client['authorization.k8s.io'].selfsubjectrulesreviews.create(body) return { resourceRules, nonResourceRules, incomplete, evaluationError } } diff --git a/backend/lib/services/cloudProviderSecrets.js b/backend/lib/services/cloudProviderSecrets.js index a0e27106dc..0b85de005f 100644 --- a/backend/lib/services/cloudProviderSecrets.js +++ b/backend/lib/services/cloudProviderSecrets.js @@ -24,7 +24,7 @@ const cleartextPropertyKeys = [ 'AWS_REGION', 'Server', 'TSIGKeyName', - 'Zone' + 'Zone', ] const normalizedCleartextPropertyKeys = cleartextPropertyKeys.map(key => key.toLowerCase()) const cloudprofiles = require('./cloudprofiles') @@ -32,7 +32,7 @@ const shoots = require('./shoots') const { getQuotas, findProjectByNamespace } = require('../cache') function fromResource ({ secretBinding, cloudProviderKind, secret, quotas = [], projectName, hasCostObject }) { - const labels = _.get(secretBinding, 'metadata.labels', {}) + const labels = _.get(secretBinding, ['metadata', 'labels'], {}) const cloudProfileName = labels['cloudprofile.garden.sapcloud.io/name'] const dnsProviderName = labels['gardener.cloud/dnsProviderName'] @@ -46,9 +46,9 @@ function fromResource ({ secretBinding, cloudProviderKind, secret, quotas = [], cloudProfileName, dnsProviderName, projectName, - hasCostObject + hasCostObject, }, - quotas + quotas, } if (secret) { @@ -65,7 +65,7 @@ function fromResource ({ secretBinding, cloudProviderKind, secret, quotas = [], } cloudProviderSecret.data = _.mapValues(secret.data, iteratee) - const secretAccountKey = _.get(secret.data, 'serviceaccount.json') + const secretAccountKey = _.get(secret.data, ['serviceaccount', 'json']) if (secretAccountKey) { cloudProviderSecret.data.project = projectId(secretAccountKey) } @@ -77,7 +77,7 @@ function fromResource ({ secretBinding, cloudProviderKind, secret, quotas = [], function projectId (serviceAccountKey) { try { const key = JSON.parse(decodeBase64(serviceAccountKey)) - const projectId = _.get(key, 'project_id', '') + const projectId = _.get(key, ['project_id'], '') return projectId } catch (err) { return '' @@ -120,7 +120,7 @@ function toSecretBindingResource ({ metadata }) { const secretBinding = { apiVersion, kind, metadata, secretRef } if (providerType) { secretBinding.provider = { - type: providerType + type: providerType, } } @@ -150,10 +150,10 @@ async function getCloudProviderSecrets ({ secretBindings, cloudProfileList, secr const cloudProfileName = labels['cloudprofile.garden.sapcloud.io/name'] const dnsProviderName = labels['gardener.cloud/dnsProviderName'] const name = metadata.name - const secretName = _.get(secretBinding, 'secretRef.name') - const secretNamespace = _.get(secretBinding, 'secretRef.namespace', namespace) + const secretName = _.get(secretBinding, ['secretRef', 'name']) + const secretNamespace = _.get(secretBinding, ['secretRef', 'namespace'], namespace) const cloudProfile = _.find(cloudProfileList, ['metadata.name', cloudProfileName]) - const cloudProviderKind = _.get(cloudProfile, 'metadata.cloudProviderKind') + const cloudProviderKind = _.get(cloudProfile, ['metadata', 'cloudProviderKind']) const projectInfo = getProjectNameAndHasCostObject(secretNamespace) if (cloudProfileName && !cloudProviderKind) { throw new Error(fmt('Could not determine cloud provider kind for cloud profile name %s. Skipping secretbinding with name %s', cloudProfileName, name)) @@ -171,7 +171,7 @@ async function getCloudProviderSecrets ({ secretBindings, cloudProfileList, secr cloudProviderKind, secret, quotas: resolveQuotas(secretBinding), - ...projectInfo + ...projectInfo, }) infrastructureSecrets.push(infrastructureSecret) } catch (err) { @@ -183,7 +183,7 @@ async function getCloudProviderSecrets ({ secretBindings, cloudProfileList, secr async function getCloudProviderKind (user, name) { const cloudProfile = await cloudprofiles.read({ user, name }) - return _.get(cloudProfile, 'metadata.cloudProviderKind') + return _.get(cloudProfile, ['metadata', 'cloudProviderKind']) } /* @@ -194,8 +194,8 @@ async function getCloudProviderKind (user, name) { */ function getProjectNameAndHasCostObject (namespace) { const project = findProjectByNamespace(namespace) - const projectName = _.get(project, 'metadata.name') - const costObject = _.get(project, 'metadata.annotations["billing.gardener.cloud/costObject"]') + const projectName = _.get(project, ['metadata', 'name']) + const costObject = _.get(project, ['metadata', 'annotations', 'billing.gardener.cloud/costObject']) const hasCostObject = !_.isEmpty(costObject) return { projectName, hasCostObject } } @@ -207,18 +207,18 @@ exports.list = async function ({ user, namespace }) { const [ cloudProfileList, { items: secretList }, - { items: secretBindings } + { items: secretBindings }, ] = await Promise.all([ cloudprofiles.list({ user }), client.core.secrets.list(namespace, { labelSelector: 'reference.gardener.cloud/secretbinding=true' }), - client['core.gardener.cloud'].secretbindings.list(namespace) + client['core.gardener.cloud'].secretbindings.list(namespace), ]) return getCloudProviderSecrets({ secretBindings, cloudProfileList, secretList, - namespace + namespace, }) } catch (err) { logger.error(err) @@ -244,7 +244,7 @@ exports.create = async function ({ user, namespace, body }) { throw err } - const cloudProfileName = _.get(secretBinding, 'metadata.labels["cloudprofile.garden.sapcloud.io/name"]') + const cloudProfileName = _.get(secretBinding, ['metadata', 'labels', 'cloudprofile.garden.sapcloud.io/name']) let cloudProviderKind if (cloudProfileName) { cloudProviderKind = await getCloudProviderKind(user, cloudProfileName) @@ -256,7 +256,7 @@ exports.create = async function ({ user, namespace, body }) { secret, cloudProviderKind, quotas: resolveQuotas(secretBinding), - ...projectInfo + ...projectInfo, }) } @@ -283,13 +283,13 @@ exports.patch = async function ({ user, namespace, name, body }) { const patchOperations = [{ op: 'replace', path: '/data', - value: data + value: data, }] const secretRef = secretBinding.secretRef const secret = client.core.secrets.jsonPatch(secretRef.namespace, secretRef.name, patchOperations) - const cloudProfileName = _.get(secretBinding, 'metadata.labels["cloudprofile.garden.sapcloud.io/name"]') + const cloudProfileName = _.get(secretBinding, ['metadata', 'labels', 'cloudprofile.garden.sapcloud.io/name']) let cloudProviderKind if (cloudProfileName) { cloudProviderKind = await getCloudProviderKind(user, cloudProfileName) @@ -301,7 +301,7 @@ exports.patch = async function ({ user, namespace, name, body }) { secret, cloudProviderKind, quotas: resolveQuotas(secretBinding), - ...projectInfo + ...projectInfo, }) } @@ -323,13 +323,13 @@ exports.remove = async function ({ user, namespace, name }) { const secretRef = secretBinding.secretRef await Promise.all([ await client['core.gardener.cloud'].secretbindings.delete(namespace, name), - await client.core.secrets.delete(secretRef.namespace, secretRef.name) + await client.core.secrets.delete(secretRef.namespace, secretRef.name), ]) return { metadata: { name, namespace, - secretRef - } + secretRef, + }, } } diff --git a/backend/lib/services/cloudprofiles.js b/backend/lib/services/cloudprofiles.js index 619ea77cf9..9aca3eb582 100644 --- a/backend/lib/services/cloudprofiles.js +++ b/backend/lib/services/cloudprofiles.js @@ -14,9 +14,9 @@ const { getCloudProfiles, getVisibleAndNotProtectedSeeds } = require('../cache') function fromResource ({ cloudProfile: { metadata, spec }, seedNames }) { const cloudProviderKind = spec.type - const name = _.get(metadata, 'name') + const name = _.get(metadata, ['name']) const displayName = _.get(metadata, ['annotations', 'garden.sapcloud.io/displayName'], name) - const resourceVersion = _.get(metadata, 'resourceVersion') + const resourceVersion = _.get(metadata, ['resourceVersion']) metadata = { name, cloudProviderKind, displayName, resourceVersion } const data = { seedNames, ...spec } return { metadata, data } @@ -29,14 +29,14 @@ function emptyToUndefined (value) { function assignSeedsToCloudProfileIteratee (seeds) { return cloudProfileResource => { function filterProviderType (seed) { - const seedProviderType = _.get(seed, 'spec.provider.type') + const seedProviderType = _.get(seed, ['spec', 'provider', 'type']) return providerTypes.some(providerType => [seedProviderType, '*'].includes(providerType)) } const providerType = cloudProfileResource.spec.type - const matchLabels = _.get(cloudProfileResource, 'spec.seedSelector.matchLabels') - const providerTypes = _.get(cloudProfileResource, 'spec.seedSelector.providerTypes', [providerType]) + const matchLabels = _.get(cloudProfileResource, ['spec', 'seedSelector', 'matchLabels']) + const providerTypes = _.get(cloudProfileResource, ['spec', 'seedSelector', 'providerTypes'], [providerType]) const matchLabelsFilter = { - metadata: {} + metadata: {}, } if (matchLabels) { matchLabelsFilter.metadata.labels = matchLabels @@ -52,7 +52,7 @@ function assignSeedsToCloudProfileIteratee (seeds) { return fromResource({ cloudProfile: cloudProfileResource, - seedNames: seedNamesForCloudProfile + seedNames: seedNamesForCloudProfile, }) } } diff --git a/backend/lib/services/index.js b/backend/lib/services/index.js index dc5fe193ae..10a481e722 100644 --- a/backend/lib/services/index.js +++ b/backend/lib/services/index.js @@ -16,5 +16,5 @@ module.exports = { tickets: require('./tickets'), terminals: require('./terminals'), controllerregistrations: require('./controllerregistrations'), - resourceQuotas: require('./resourceQuotas') + resourceQuotas: require('./resourceQuotas'), } diff --git a/backend/lib/services/members/Member.js b/backend/lib/services/members/Member.js index 32c85a61e9..8e326c9d67 100644 --- a/backend/lib/services/members/Member.js +++ b/backend/lib/services/members/Member.js @@ -14,7 +14,7 @@ const PROPERTY_NAMES = Object.freeze([ 'deletionTimestamp', 'description', 'kubeconfig', - 'orphaned' + 'orphaned', ]) class Member { @@ -30,13 +30,13 @@ class Member { return { kind: 'ServiceAccount', namespace, - name + name, } } return { kind: 'User', apiGroup: 'rbac.authorization.k8s.io', - name: username + name: username, } } diff --git a/backend/lib/services/members/MemberManager.js b/backend/lib/services/members/MemberManager.js index a7024ae5a0..88b3a2c99e 100644 --- a/backend/lib/services/members/MemberManager.js +++ b/backend/lib/services/members/MemberManager.js @@ -39,7 +39,7 @@ class MemberManager { if (item.kind === 'ServiceAccount') { item.extend({ - kubeconfig: await this.getKubeconfig(item) + kubeconfig: await this.getKubeconfig(item), }) } return item.member @@ -57,7 +57,7 @@ class MemberManager { if (item.kind === 'ServiceAccount') { await this.createServiceAccount(item, { createdBy: this.userId, - description + description, }) } if (roles.length) { @@ -80,10 +80,10 @@ class MemberManager { if (item.extensions?.orphaned) { await this.createServiceAccount(item, { createdBy: this.userId, - description + description, }) item.extend({ - orphaned: false + orphaned: false, }) } else { await this.updateServiceAccount(item, { description }) @@ -135,7 +135,7 @@ class MemberManager { const annotations = { 'dashboard.gardener.cloud/created-by': createdBy, - 'dashboard.gardener.cloud/description': description + 'dashboard.gardener.cloud/description': description, } let serviceAccount @@ -144,8 +144,8 @@ class MemberManager { metadata: { name, namespace, - annotations - } + annotations, + }, }) } catch (err) { if (!isHttpError(err) || err.statusCode !== 409) { @@ -156,22 +156,22 @@ class MemberManager { // in this case we just want to restore the annotations serviceAccount = await this.client.core.serviceaccounts.mergePatch(namespace, name, { metadata: { - annotations - } + annotations, + }, }) } const { metadata: { - creationTimestamp - } + creationTimestamp, + }, } = serviceAccount item.extend({ createdBy, creationTimestamp, description, - orphaned: false + orphaned: false, }) this.subjectList.set(item.id, item) @@ -204,20 +204,20 @@ class MemberManager { namespace, annotations: { 'dashboard.gardener.cloud/created-by': createdBy, - 'dashboard.gardener.cloud/description': description - } - } + 'dashboard.gardener.cloud/description': description, + }, + }, }) const { metadata: { - creationTimestamp - } + creationTimestamp, + }, } = serviceAccount item.extend({ createdBy, creationTimestamp, - description + description, }) this.subjectList.set(item.id, item) } @@ -233,9 +233,9 @@ class MemberManager { await this.client.core.serviceaccounts.mergePatch(namespace, name, { metadata: { annotations: { - 'dashboard.gardener.cloud/description': description - } - } + 'dashboard.gardener.cloud/description': description, + }, + }, }) } } @@ -256,7 +256,7 @@ class MemberManager { } async getKubeconfig (item) { - const defaultTokenExpiration = _.get(config, 'frontend.serviceAccountDefaultTokenExpiration', 7776000) // default is 90 days + const defaultTokenExpiration = _.get(config, ['frontend', 'serviceAccountDefaultTokenExpiration'], 7776000) // default is 90 days const { namespace, name } = Member.parseUsername(item.id) @@ -265,9 +265,9 @@ class MemberManager { kind, apiVersion, spec: { - audiences: _.get(config, 'tokenRequestAudiences'), - expirationSeconds: defaultTokenExpiration - } + audiences: _.get(config, ['tokenRequestAudiences']), + expirationSeconds: defaultTokenExpiration, + }, } const tokenRequest = await this.client.core.serviceaccounts.createTokenRequest(namespace, name, body) @@ -286,7 +286,7 @@ class MemberManager { namespace, token, server, - caData + caData, }) } @@ -316,10 +316,10 @@ class MemberManager { const name = findProjectByNamespace(namespace).metadata.name const [ project, - { items: serviceAccounts } + { items: serviceAccounts }, ] = await Promise.all([ client['core.gardener.cloud'].projects.get(name), - client.core.serviceaccounts.list(namespace) + client.core.serviceaccounts.list(namespace), ]) return new this(client, id, project, serviceAccounts) } diff --git a/backend/lib/services/members/SubjectList.js b/backend/lib/services/members/SubjectList.js index caf3280cf3..ff55446b4f 100644 --- a/backend/lib/services/members/SubjectList.js +++ b/backend/lib/services/members/SubjectList.js @@ -15,8 +15,8 @@ class SubjectList { const { spec: { namespace, - members: subjects - } + members: subjects, + }, } = project const createServiceAccountItem = ({ metadata, secrets }) => { const { namespace, name, annotations = {}, creationTimestamp, deletionTimestamp } = metadata @@ -26,14 +26,14 @@ class SubjectList { const item = SubjectListItem.create({ kind: 'ServiceAccount', namespace, - name + name, }) item.extend({ createdBy, description, creationTimestamp, deletionTimestamp, - secrets + secrets, }) return item } @@ -81,7 +81,7 @@ class SubjectList { this.subjectListItemMap = new Map([ ...subjectListItemMap, - ...serviceAccountItemMap + ...serviceAccountItemMap, ]) } diff --git a/backend/lib/services/members/SubjectListItem.js b/backend/lib/services/members/SubjectListItem.js index 037ae7b10d..fe5a4541a7 100644 --- a/backend/lib/services/members/SubjectListItem.js +++ b/backend/lib/services/members/SubjectListItem.js @@ -12,7 +12,7 @@ const Member = require('./Member') const allowedExtensionProperties = Object.freeze([ ...Member.allowedExtensionProperties, - 'secrets' + 'secrets', ]) class SubjectListItem { @@ -54,7 +54,7 @@ class SubjectListItem { Object.assign(SubjectListItem, { NOT_IN_LIST: -1, - END_OF_LIST: Number.MAX_SAFE_INTEGER + END_OF_LIST: Number.MAX_SAFE_INTEGER, }) class SubjectListItemUniq extends SubjectListItem { @@ -115,7 +115,7 @@ class SubjectListItemGroup extends SubjectListItem { return _ .chain(this.items) .head() - .get('id') + .get(['id']) .value() } @@ -130,7 +130,7 @@ class SubjectListItemGroup extends SubjectListItem { set roles (roles = []) { const diff = { del: _.difference(this.roles, roles), - add: _.difference(roles, this.roles) + add: _.difference(roles, this.roles), } const deleteRoles = item => { item.roles = _.difference(item.roles, diff.del) diff --git a/backend/lib/services/projects.js b/backend/lib/services/projects.js index da40f010a6..e9eff6099a 100644 --- a/backend/lib/services/projects.js +++ b/backend/lib/services/projects.js @@ -18,7 +18,7 @@ const PROJECT_INITIALIZATION_TIMEOUT = 30 * 1000 async function validateDeletePreconditions ({ user, name }) { const project = cache.getProject(name) - const namespace = _.get(project, 'spec.namespace') + const namespace = _.get(project, ['spec', 'namespace']) const shootList = await shoots.list({ user, namespace }) if (!_.isEmpty(shootList.items)) { @@ -39,8 +39,8 @@ exports.list = async function ({ user }) { exports.create = async function ({ user, body }) { const client = user.client - const name = _.get(body, 'metadata.name') - _.set(body, 'spec.namespace', `garden-${name}`) + const name = _.get(body, ['metadata', 'name']) + _.set(body, ['spec', 'namespace'], `garden-${name}`) let project = await client['core.gardener.cloud'].projects.create(body) const isProjectReady = ({ type, object: project }) => { @@ -48,7 +48,7 @@ exports.create = async function ({ user, body }) { throw new InternalServerError('Project resource has been deleted') } return { - ok: _.get(project, 'status.phase') === 'Ready' + ok: _.get(project, ['status', 'phase']) === 'Ready', } } const timeout = exports.projectInitializationTimeout @@ -81,9 +81,9 @@ exports.remove = async function ({ user, name }) { const body = { metadata: { annotations: { - 'confirmation.gardener.cloud/deletion': 'true' - } - } + 'confirmation.gardener.cloud/deletion': 'true', + }, + }, } await client['core.gardener.cloud'].projects.mergePatch(name, body) try { @@ -94,9 +94,9 @@ exports.remove = async function ({ user, name }) { const revertBody = { metadata: { annotations: { - 'confirmation.gardener.cloud/deletion': null - } - } + 'confirmation.gardener.cloud/deletion': null, + }, + }, } await client['core.gardener.cloud'].projects.mergePatch(name, revertBody) throw error // Re-throw the error after reverting the annotation diff --git a/backend/lib/services/resourceQuotas.js b/backend/lib/services/resourceQuotas.js index 62ebf3b6f7..d52cde7bc7 100644 --- a/backend/lib/services/resourceQuotas.js +++ b/backend/lib/services/resourceQuotas.js @@ -16,7 +16,7 @@ function fromResource (resourceQuotas) { return { metadata: {}, spec: {}, - status + status, } }) } diff --git a/backend/lib/services/seeds.js b/backend/lib/services/seeds.js index fcaba60b26..16b68703f4 100644 --- a/backend/lib/services/seeds.js +++ b/backend/lib/services/seeds.js @@ -15,22 +15,22 @@ const { isSeedUnreachable } = require('../utils') function fromResource (seed) { const unreachable = isSeedUnreachable(seed) const metadata = { - name: _.get(seed, 'metadata.name'), - unreachable + name: _.get(seed, ['metadata', 'name']), + unreachable, } - const taints = _.get(seed, 'spec.taints') + const taints = _.get(seed, ['spec', 'taints']) const unprotected = !_.find(taints, ['key', 'seed.gardener.cloud/protected']) - const visible = _.get(seed, 'spec.settings.scheduling.visible') - const provider = _.get(seed, 'spec.provider') - const volume = _.get(seed, 'spec.volume') - const ingressDomain = _.get(seed, 'spec.ingress.domain') + const visible = _.get(seed, ['spec', 'settings', 'scheduling', 'visible']) + const provider = _.get(seed, ['spec', 'provider']) + const volume = _.get(seed, ['spec', 'volume']) + const ingressDomain = _.get(seed, ['spec', 'ingress', 'domain']) const data = { volume, ...provider, visible, unprotected, - ingressDomain + ingressDomain, } return { metadata, data } diff --git a/backend/lib/services/shoots.js b/backend/lib/services/shoots.js index 60020a475d..9bf5a7d2d7 100644 --- a/backend/lib/services/shoots.js +++ b/backend/lib/services/shoots.js @@ -23,7 +23,7 @@ const { decodeBase64, encodeBase64, getSeedNameFromShoot, - projectFilter + projectFilter, } = utils const { getSeed } = cache @@ -38,7 +38,7 @@ exports.list = async function ({ user, namespace, labelSelector }) { return { apiVersion: 'v1', kind: 'List', - items: cache.getShoots(namespace, query) + items: cache.getShoots(namespace, query), } } else { // user is permitted to list shoots only in namespaces associated with their projects @@ -65,7 +65,7 @@ exports.list = async function ({ user, namespace, labelSelector }) { kind: 'List', items: namespaces .filter(namespace => allowedNamespaceMap.get(namespace)) - .flatMap(namespace => cache.getShoots(namespace, query)) + .flatMap(namespace => cache.getShoots(namespace, query)), } } } @@ -76,7 +76,7 @@ exports.list = async function ({ user, namespace, labelSelector }) { return { apiVersion: 'v1', kind: 'List', - items: cache.getShoots(namespace, query) + items: cache.getShoots(namespace, query), } } @@ -85,7 +85,7 @@ exports.create = async function ({ user, namespace, body }) { const username = user.id const annotations = { - 'gardener.cloud/created-by': username + 'gardener.cloud/created-by': username, } body = _.merge({}, body, { metadata: { namespace, annotations } }) @@ -111,7 +111,7 @@ exports.replace = async function ({ user, namespace, name, body }) { const { metadata, kind, apiVersion, status } = await client['core.gardener.cloud'].shoots.get(namespace, name) const { metadata: { labels, annotations }, - spec + spec, } = body // assign new labels and annotations to metadata Object.assign(metadata, { labels, annotations }) @@ -127,7 +127,7 @@ exports.replaceVersion = async function ({ user, namespace, name, body }) { const patchOperations = [{ op: 'replace', path: '/spec/kubernetes/version', - value: version + value: version, }] return client['core.gardener.cloud'].shoots.jsonPatch(namespace, name, patchOperations) } @@ -138,7 +138,7 @@ exports.replaceEnableStaticTokenKubeconfig = async function ({ user, namespace, const patchOperations = [{ op: 'replace', path: '/spec/kubernetes/enableStaticTokenKubeconfig', - value: enableStaticTokenKubeconfig + value: enableStaticTokenKubeconfig, }] return client['core.gardener.cloud'].shoots.jsonPatch(namespace, name, patchOperations) } @@ -149,9 +149,9 @@ exports.replaceHibernationEnabled = async function ({ user, namespace, name, bod const payload = { spec: { hibernation: { - enabled - } - } + enabled, + }, + }, } return client['core.gardener.cloud'].shoots.mergePatch(namespace, name, payload) } @@ -162,9 +162,9 @@ exports.replaceHibernationSchedules = async function ({ user, namespace, name, b const payload = { spec: { hibernation: { - schedules - } - } + schedules, + }, + }, } return client['core.gardener.cloud'].shoots.mergePatch(namespace, name, payload) } @@ -174,8 +174,8 @@ exports.replacePurpose = async function ({ user, namespace, name, body }) { const purpose = body.purpose const payload = { spec: { - purpose - } + purpose, + }, } return client['core.gardener.cloud'].shoots.mergePatch(namespace, name, payload) } @@ -186,7 +186,7 @@ exports.replaceSeedName = async function ({ user, namespace, name, body }) { const patchOperations = [{ op: 'replace', path: '/spec/seedName', - value: seedName + value: seedName, }] return client['core.gardener.cloud'].shoots.jsonPatch(namespace, [name, 'binding'], patchOperations) } @@ -198,15 +198,15 @@ exports.createAdminKubeconfig = async function ({ user, namespace, name, body }) kind, apiVersion, spec: { - expirationSeconds: body.expirationSeconds - } + expirationSeconds: body.expirationSeconds, + }, } const { status } = await client['core.gardener.cloud'].shoots.createAdminKubeconfigRequest(namespace, name, payload) const kubeconfig = utils.decodeBase64(status.kubeconfig) return { - kubeconfig + kubeconfig, } } @@ -215,8 +215,8 @@ exports.replaceAddons = async function ({ user, namespace, name, body }) { const addons = body const payload = { spec: { - addons - } + addons, + }, } return client['core.gardener.cloud'].shoots.mergePatch(namespace, name, payload) @@ -228,9 +228,9 @@ exports.replaceControlPlaneHighAvailability = async function ({ user, namespace, const payload = { spec: { controlPlane: { - highAvailability - } - } + highAvailability, + }, + }, } return client['core.gardener.cloud'].shoots.mergePatch(namespace, name, payload) @@ -240,8 +240,8 @@ exports.patchProvider = async function ({ user, namespace, name, body }) { const client = user.client const payload = { spec: { - provider: body - } + provider: body, + }, } return client['core.gardener.cloud'].shoots.mergePatch(namespace, name, payload) } @@ -254,14 +254,14 @@ exports.replaceMaintenance = async function ({ user, namespace, name, body }) { maintenance: { timeWindow: { begin: timeWindowBegin, - end: timeWindowEnd + end: timeWindowEnd, }, autoUpdate: { kubernetesVersion: updateKubernetesVersion, - machineImageVersion: updateOSVersion - } - } - } + machineImageVersion: updateOSVersion, + }, + }, + }, } return client['core.gardener.cloud'].shoots.mergePatch(namespace, name, payload) } @@ -270,8 +270,8 @@ const patchAnnotations = async function ({ user, namespace, name, annotations }) const client = user.client const body = { metadata: { - annotations - } + annotations, + }, } return client['core.gardener.cloud'].shoots.mergePatch(namespace, name, body) } @@ -280,7 +280,7 @@ exports.patchAnnotations = patchAnnotations exports.remove = async function ({ user, namespace, name }) { const client = user.client const annotations = { - 'confirmation.gardener.cloud/deletion': 'true' + 'confirmation.gardener.cloud/deletion': 'true', } await patchAnnotations({ user, namespace, name, annotations }) @@ -303,18 +303,18 @@ exports.info = async function ({ user, namespace, name }) { const [ { value: shoot, reason: shootError }, - { value: secret } + { value: secret }, ] = await Promise.allSettled([ read({ user, namespace, - name + name, }), client.getSecret({ namespace, name: `${name}.kubeconfig`, - throwNotFound: false - }) + throwNotFound: false, + }), ]) if (shootError) { @@ -322,7 +322,7 @@ exports.info = async function ({ user, namespace, name }) { } const data = { - canLinkToSeed: false + canLinkToSeed: false, } try { @@ -345,7 +345,7 @@ exports.info = async function ({ user, namespace, name }) { if (secret) { _ .chain(secret) - .get('data') + .get(['data']) .pick('kubeconfig', 'token') .forEach((value, key) => { value = decodeBase64(value) @@ -364,7 +364,7 @@ exports.info = async function ({ user, namespace, name }) { } data.dashboardUrlPath = getDashboardUrlPath(shoot.spec.kubernetes.version) - const oidcObservabilityUrlsEnabled = _.get(config, 'frontend.features.oidcObservabilityUrlsEnabled', false) + const oidcObservabilityUrlsEnabled = _.get(config, ['frontend', 'features', 'oidcObservabilityUrlsEnabled'], false) if (!oidcObservabilityUrlsEnabled && await authorization.canGetSecret(user, namespace, `${name}.monitoring`)) { await assignMonitoringSecret(client, data, namespace, name) } @@ -373,7 +373,7 @@ exports.info = async function ({ user, namespace, name }) { } async function getGardenClusterIdentity () { - const configClusterIdentity = _.get(config, 'clusterIdentity') + const configClusterIdentity = _.get(config, ['clusterIdentity']) if (configClusterIdentity) { return configClusterIdentity @@ -410,18 +410,18 @@ async function getKubeconfigGardenlogin (client, shoot) { const [ caData, - gardenClusterIdentity + gardenClusterIdentity, ] = await Promise.all([ getClusterCaData(client, { namespace, name }), - getGardenClusterIdentity() + getGardenClusterIdentity(), ]) const extensions = [{ name: 'client.authentication.k8s.io/exec', extension: { shootRef: { namespace, name }, - gardenClusterIdentity - } + gardenClusterIdentity, + }, }] const userName = `${namespace}--${name}` @@ -453,14 +453,14 @@ Note that the kubeconfig refers to the path of the garden cluster kubeconfig whi apiVersion: 'client.authentication.k8s.io/v1beta1', command: 'kubectl-gardenlogin', args: [ - 'get-client-certificate' + 'get-client-certificate', ], provideClusterInfo: true, interactiveMode: 'IfAvailable', - installHint - } - } - }] + installHint, + }, + }, + }], } for (const [i, address] of shoot.status.advertisedAddresses.entries()) { @@ -479,8 +479,8 @@ Note that the kubeconfig refers to the path of the garden cluster kubeconfig whi cluster: { server: address.url, 'certificate-authority-data': caData, - extensions - } + extensions, + }, }) cfg.contexts.push({ @@ -488,8 +488,8 @@ Note that the kubeconfig refers to the path of the garden cluster kubeconfig whi context: { cluster: name, user: userName, - namespace: 'default' - } + namespace: 'default', + }, }) } @@ -514,7 +514,7 @@ async function assignMonitoringSecret (client, data, namespace, shootName) { if (secret) { _ .chain(secret) - .get('data') + .get(['data']) .pick('username', 'password') .forEach((value, key) => { if (key === 'password') { diff --git a/backend/lib/services/terminals/index.js b/backend/lib/services/terminals/index.js index f2f02922e4..0b4e594774 100644 --- a/backend/lib/services/terminals/index.js +++ b/backend/lib/services/terminals/index.js @@ -20,12 +20,12 @@ const { isHttpError } = require('@gardener-dashboard/request') const { decodeBase64, getConfigValue, - getSeedNameFromShoot + getSeedNameFromShoot, } = require('../../utils') const { toTerminalResource, - fromNodeResource + fromNodeResource, } = require('./resources') const { @@ -33,7 +33,7 @@ const { getKubeApiServerHostForShoot, getGardenTerminalHostClusterCredentials, getGardenHostClusterKubeApiServer, - getShootRef + getShootRef, } = require('./utils') const { getSeed, findProjectByNamespace } = require('../../cache') @@ -48,7 +48,7 @@ const DASHBOARD_WEBTERMINAL_NAME = 'dashboard-webterminal' const TargetEnum = { GARDEN: 'garden', CONTROL_PLANE: 'cp', - SHOOT: 'shoot' + SHOOT: 'shoot', } const converter = exports.converter = markdown.createConverter() @@ -85,12 +85,12 @@ exports.listProjectTerminalShortcuts = async function ({ user, body = {} }) { function toTerminalMetadata (terminal) { const metadata = _.pick(terminal.metadata, ['name', 'namespace']) - metadata.identifier = _.get(terminal, 'metadata.annotations["dashboard.gardener.cloud/identifier"]') + metadata.identifier = _.get(terminal, ['metadata', 'annotations', 'dashboard.gardener.cloud/identifier']) return metadata } function imageHelpText (terminal) { - const containerImage = _.get(terminal, 'spec.host.pod.container.image') + const containerImage = _.get(terminal, ['spec', 'host', 'pod', 'container', 'image']) const containerImageDescriptions = getConfigValue('terminal.containerImageDescriptions', []) const containerImageDescription = findImageDescription(containerImage, containerImageDescriptions) return converter.makeSanitizedHtml(containerImageDescription) @@ -106,7 +106,7 @@ function findImageDescription (containerImage, containerImageDescriptions) { } return image === containerImage }) - .get('description') + .get(['description']) .value() } // exported for unit test @@ -118,8 +118,8 @@ async function readServiceAccountToken (client, { namespace, serviceAccountName kind, apiVersion, spec: { - expirationSeconds: _.get(config, 'terminal.serviceAccountTokenExpiration', 43200) // default is 12h - } + expirationSeconds: _.get(config, ['terminal', 'serviceAccountTokenExpiration'], 43200), // default is 12h + }, } const tokenRequest = await client.core.serviceaccounts.createTokenRequest(namespace, serviceAccountName, body) @@ -132,18 +132,18 @@ async function listTerminals ({ user, namespace, identifier }) { const client = user.client const selectors = [ - `dashboard.gardener.cloud/created-by-hash=${hash(username)}` + `dashboard.gardener.cloud/created-by-hash=${hash(username)}`, ] if (identifier) { selectors.push(`dashboard.gardener.cloud/identifier-hash=${hash(identifier)}`) } const query = { - labelSelector: selectors.join(',') + labelSelector: selectors.join(','), } const terminals = await client['dashboard.gardener.cloud'].terminals.list(namespace, query) return _ .chain(terminals) - .get('items') + .get(['items']) .filter(terminal => _.isEmpty(terminal.metadata.deletionTimestamp)) .filter(['metadata.annotations["gardener.cloud/created-by"]', username]) .value() @@ -194,11 +194,11 @@ async function getTargetCluster ({ user, namespace, name, target, preferredHost, cleanupProjectMembership: false, authorization: { roleBindings: undefined, - projectMemberships: undefined + projectMemberships: undefined, }, apiServer: { - caData: undefined - } + caData: undefined, + }, } switch (target) { @@ -215,10 +215,10 @@ async function getTargetCluster ({ user, namespace, name, target, preferredHost, roleRef: { apiGroup: 'rbac.authorization.k8s.io', kind: 'ClusterRole', - name: 'gardener.cloud:system:administrators' + name: 'gardener.cloud:system:administrators', }, - bindingKind: 'ClusterRoleBinding' - } + bindingKind: 'ClusterRoleBinding', + }, ]) } else { const projectName = findProjectByNamespace(namespace).metadata.name @@ -234,17 +234,17 @@ async function getTargetCluster ({ user, namespace, name, target, preferredHost, targetCluster.credentials = { serviceAccountRef: { name: serviceAccountName, - namespace - } + namespace, + }, } targetCluster.cleanupProjectMembership = true targetCluster.authorization.projectMemberships = [ { projectName, roles: [ - 'admin' - ] - } + 'admin', + ], + }, ] } @@ -268,18 +268,18 @@ async function getTargetCluster ({ user, namespace, name, target, preferredHost, targetCluster.credentials = { shootRef: { name, - namespace - } + namespace, + }, } targetCluster.authorization.roleBindings = [ { roleRef: { apiGroup: 'rbac.authorization.k8s.io', kind: 'ClusterRole', - name: 'cluster-admin' + name: 'cluster-admin', }, - bindingKind: 'ClusterRoleBinding' - } + bindingKind: 'ClusterRoleBinding', + }, ] break } @@ -304,7 +304,7 @@ async function getTargetCluster ({ user, namespace, name, target, preferredHost, const { namespace: secretRefNamespace, - name: secretRefName + name: secretRefName, } = secretRef || {} const seedKubeconfigSecret = await client.core.secrets.get(secretRefNamespace, secretRefName) @@ -324,10 +324,10 @@ async function getTargetCluster ({ user, namespace, name, target, preferredHost, roleRef: { apiGroup: 'rbac.authorization.k8s.io', kind: 'ClusterRole', - name: 'cluster-admin' + name: 'cluster-admin', }, - bindingKind: 'RoleBinding' - } + bindingKind: 'RoleBinding', + }, ] break } @@ -344,10 +344,10 @@ async function getGardenTerminalHostCluster (client, { body }) { const [ credentials, - kubeApiServer + kubeApiServer, ] = await Promise.all([ await getGardenTerminalHostClusterCredentials(client), - await getGardenHostClusterKubeApiServer(client) + await getGardenHostClusterKubeApiServer(client), ]) hostCluster.namespace = undefined // this will create a temporary namespace hostCluster.credentials = credentials @@ -362,7 +362,7 @@ async function getSeedHostCluster (client, { namespace, name, target, body, shoo shootResource = await client.getShoot({ namespace, name }) } if (target === TargetEnum.SHOOT) { - hostCluster.isHostOrTargetHibernated = _.get(shootResource, 'spec.hibernation.enabled', false) + hostCluster.isHostOrTargetHibernated = _.get(shootResource, ['spec', 'hibernation', 'enabled'], false) } const seedShootNamespace = getSeedShootNamespace(shootResource) @@ -393,14 +393,14 @@ async function getShootHostCluster (client, { namespace, name, body, shootResour if (!shootResource) { shootResource = await client.getShoot({ namespace, name }) } - hostCluster.isHostOrTargetHibernated = _.get(shootResource, 'spec.hibernation.enabled', false) + hostCluster.isHostOrTargetHibernated = _.get(shootResource, ['spec', 'hibernation', 'enabled'], false) hostCluster.namespace = undefined // this will create a temporary namespace hostCluster.credentials = { shootRef: { namespace, - name - } + name, + }, } hostCluster.kubeApiServer = await getKubeApiServerHostForShoot(shootResource) return hostCluster @@ -408,7 +408,7 @@ async function getShootHostCluster (client, { namespace, name, body, shootResour function getContainerConfigFromBody ({ container }) { return { - container: _.pick(container, ['image', 'command', 'args']) + container: _.pick(container, ['image', 'command', 'args']), } } @@ -420,7 +420,7 @@ function getConfigFromBody (body) { function getPreferredHost ({ user, body }) { const defaultHost = user.isAdmin ? 'seed' : 'shoot' - return _.get(body, 'preferredHost', defaultHost) + return _.get(body, ['preferredHost'], defaultHost) } function getHostCluster ({ user, namespace, name, target, preferredHost, body, shootResource }) { @@ -442,7 +442,7 @@ async function createTerminal ({ user, namespace, target, hostCluster, targetClu const client = user.client const isAdmin = user.isAdmin const image = getContainerImage({ isAdmin, preferredImage: hostCluster.config.container.image }) - _.set(hostCluster, 'config.container.image', image) + _.set(hostCluster, ['config', 'container', 'image'], image) const podLabels = getPodLabels(target) @@ -450,12 +450,12 @@ async function createTerminal ({ user, namespace, target, hostCluster, targetClu ...hostCluster.config, namespace: hostCluster.namespace, credentials: hostCluster.credentials, - podLabels + podLabels, }) const terminalTarget = createTarget({ ...targetCluster }) const labels = { - 'dashboard.gardener.cloud/created-by-hash': hash(user.id) + 'dashboard.gardener.cloud/created-by-hash': hash(user.id), } if (identifier) { labels['dashboard.gardener.cloud/identifier-hash'] = hash(identifier) @@ -463,7 +463,7 @@ async function createTerminal ({ user, namespace, target, hostCluster, targetClu const annotations = { 'dashboard.gardener.cloud/identifier': identifier, - 'dashboard.gardener.cloud/preferredHost': preferredHost + 'dashboard.gardener.cloud/preferredHost': preferredHost, } const prefix = `term-${target}-` const terminalResource = toTerminalResource({ prefix, namespace, annotations, labels, host: terminalHost, target: terminalTarget }) @@ -475,7 +475,7 @@ function getPodLabels (target) { let labels = { 'networking.gardener.cloud/to-dns': 'allowed', 'networking.gardener.cloud/to-public-networks': 'allowed', - 'networking.gardener.cloud/to-private-networks': 'allowed' + 'networking.gardener.cloud/to-private-networks': 'allowed', } switch (target) { case TargetEnum.GARDEN: @@ -498,7 +498,7 @@ function createHost ({ credentials, namespace, container, podLabels, node, hostP image, command, args, - privileged = false + privileged = false, } = container const host = { credentials, @@ -510,15 +510,15 @@ function createHost ({ credentials, namespace, container, podLabels, node, hostP image, command, args, - privileged + privileged, }, hostPID, - hostNetwork - } + hostNetwork, + }, } if (node) { host.pod.nodeSelector = { - 'kubernetes.io/hostname': node + 'kubernetes.io/hostname': node, } } return host @@ -533,7 +533,7 @@ function createTarget ({ kubeconfigContextNamespace, apiServer, credentials, aut authorization, namespace, temporaryNamespace, - cleanupProjectMembership + cleanupProjectMembership, } } @@ -548,15 +548,15 @@ async function readTerminalUntilReady ({ user, namespace, name }) { if (terminal.metadata.annotations['gardener.cloud/created-by'] !== username) { throw new Forbidden('You are not the user who created the terminal resource') } - const podName = _.get(terminal, 'status.podName') - const attachServiceAccountName = _.get(terminal, 'status.attachServiceAccountName') + const podName = _.get(terminal, ['status', 'podName']) + const attachServiceAccountName = _.get(terminal, ['status', 'attachServiceAccountName']) const isReady = podName && attachServiceAccountName if (!isReady) { - const lastErrorDescription = _.get(terminal, 'status.lastError.description') + const lastErrorDescription = _.get(terminal, ['status', 'lastError', 'description']) return { ok: false, - reason: lastErrorDescription + reason: lastErrorDescription, } } @@ -573,20 +573,20 @@ async function getOrCreateTerminalSession ({ user, namespace, name, target, body let [ terminal, - shootResource + shootResource, ] = await Promise.all([ findExistingTerminalResource({ user, namespace, body }), - getShootResource({ user, namespace, name, target }) + getShootResource({ user, namespace, name, target }), ]) - const preferredHost = _.get(terminal, 'metadata.annotations["dashboard.gardener.cloud/preferredHost"]', getPreferredHost({ user, body })) + const preferredHost = _.get(terminal, ['metadata', 'annotations', 'dashboard.gardener.cloud/preferredHost'], getPreferredHost({ user, body })) const [ hostCluster, - targetCluster + targetCluster, ] = await Promise.all([ getHostCluster({ user, namespace, name, target, preferredHost, body, shootResource }), - getTargetCluster({ user, namespace, name, target, preferredHost, shootResource }) + getTargetCluster({ user, namespace, name, target, preferredHost, shootResource }), ]) if (hostCluster.isHostOrTargetHibernated) { @@ -621,9 +621,9 @@ async function getOrCreateTerminalSession ({ user, namespace, name, target, body metadata: toTerminalMetadata(terminal), hostCluster: { kubeApiServer: hostCluster.kubeApiServer, - namespace: terminal.spec.host.namespace + namespace: terminal.spec.host.namespace, }, - imageHelpText: imageHelpText(terminal) + imageHelpText: imageHelpText(terminal), } } @@ -633,15 +633,15 @@ async function ensureServiceAccountCleanup (client, { terminal, namespace, name kind: terminal.kind, blockOwnerDeletion: false, name: terminal.metadata.name, - uid: terminal.metadata.uid + uid: terminal.metadata.uid, } const { metadata: { ownerReferences = [], labels = {}, - finalizers = [] - } + finalizers = [], + }, } = await client.core.serviceaccounts.get(namespace, name) let dirty = false @@ -669,8 +669,8 @@ async function ensureServiceAccountCleanup (client, { terminal, namespace, name metadata: { finalizers, ownerReferences, - labels - } + labels, + }, } await client.core.serviceaccounts.mergePatch(namespace, name, payload) @@ -701,7 +701,7 @@ async function fetchTerminalSession ({ user, body: { name, namespace } }) { const hostClient = await createHostClient(client, host.credentials) const token = await readServiceAccountToken(hostClient, { namespace: host.namespace, - serviceAccountName: terminal.status.attachServiceAccountName + serviceAccountName: terminal.status.attachServiceAccountName, }) return { @@ -710,9 +710,9 @@ async function fetchTerminalSession ({ user, body: { name, namespace } }) { token, pod: { name: terminal.status.podName, - container: TERMINAL_CONTAINER_NAME - } - } + container: TERMINAL_CONTAINER_NAME, + }, + }, } } @@ -721,13 +721,13 @@ async function listTerminalSessions ({ user, namespace }) { return _.map(terminals, terminal => { return { - metadata: toTerminalMetadata(terminal) + metadata: toTerminalMetadata(terminal), } }) } function getSeedShootNamespace (shoot) { - const seedShootNamespace = _.get(shoot, 'status.technicalID') + const seedShootNamespace = _.get(shoot, ['status', 'technicalID']) if (_.isEmpty(seedShootNamespace)) { throw new Error(`could not determine namespace in seed for shoot ${shoot.metadata.name}`) } @@ -790,7 +790,7 @@ function getTerminalResource (client, { name, namespace }) { async function setKeepaliveAnnotation (client, terminal) { const annotations = { - 'dashboard.gardener.cloud/operation': 'keepalive' + 'dashboard.gardener.cloud/operation': 'keepalive', } try { const { name, namespace } = terminal.metadata @@ -808,21 +808,21 @@ async function getTerminalConfig ({ user, namespace, name, target }) { const config = { container: { - image: getContainerImage({ isAdmin }) - } + image: getContainerImage({ isAdmin }), + }, } if (target === TargetEnum.SHOOT) { const shootRef = { namespace, - name + name, } const hostClient = await client.createShootAdminKubeconfigClient(shootRef) const nodeList = await hostClient.core.nodes.list() config.nodes = _ .chain(nodeList) - .get('items') + .get(['items']) .map(fromNodeResource) .value() } @@ -837,13 +837,13 @@ function pickShortcutValues (data) { 'container.image', 'container.command', 'container.args', - 'shootSelector.matchLabels' + 'shootSelector.matchLabels', ]) return shortcut } function fromShortcutSecretResource (secret) { - const shortcutsBase64 = _.get(secret, 'data.shortcuts') + const shortcutsBase64 = _.get(secret, ['data', 'shortcuts']) const shortcuts = yaml.load(decodeBase64(shortcutsBase64)) return _ .chain(shortcuts) diff --git a/backend/lib/services/terminals/resources.js b/backend/lib/services/terminals/resources.js index f188399a1f..5e292ce5f6 100644 --- a/backend/lib/services/terminals/resources.js +++ b/backend/lib/services/terminals/resources.js @@ -27,7 +27,7 @@ function toResource ({ annotations = {}, labels = {}, ownerReferences, - data + data, }) { const apiVersion = resource.apiVersion const kind = resource.kind @@ -37,7 +37,7 @@ function toResource ({ const metadata = { labels, annotations, - ownerReferences + ownerReferences, } if (name) { metadata.name = name @@ -52,7 +52,7 @@ function toResource ({ const resourceBody = { apiVersion, kind, - metadata + metadata, } _.assign(resourceBody, data) @@ -61,24 +61,24 @@ function toResource ({ function fromNodeResource ({ metadata, status = {} }) { const { name, creationTimestamp, labels } = metadata - const version = _.get(status, 'nodeInfo.kubeletVersion') - const conditions = _.get(status, 'conditions') + const version = _.get(status, ['nodeInfo', 'kubeletVersion']) + const conditions = _.get(status, ['conditions']) const readyCondition = _.find(conditions, condition => condition.type === 'Ready') - const readyStatus = _.get(readyCondition, 'status', 'UNKNOWN') + const readyStatus = _.get(readyCondition, ['status'], 'UNKNOWN') return { metadata: { name, - creationTimestamp + creationTimestamp, }, data: { kubernetesHostname: labels['kubernetes.io/hostname'], version, - readyStatus - } + readyStatus, + }, } } module.exports = { toTerminalResource, - fromNodeResource + fromNodeResource, } diff --git a/backend/lib/services/terminals/utils.js b/backend/lib/services/terminals/utils.js index 5474fe409e..4476014674 100644 --- a/backend/lib/services/terminals/utils.js +++ b/backend/lib/services/terminals/utils.js @@ -12,7 +12,7 @@ const _ = require('lodash') const { getConfigValue, getSeedNameFromShoot, - getSeedIngressDomain + getSeedIngressDomain, } = require('../../utils') const { getSeed, findProjectByNamespace } = require('../../cache') @@ -20,7 +20,7 @@ const { getSeed, findProjectByNamespace } = require('../../cache') const GardenTerminalHostRefType = { SECRET_REF: 'secretRef', SEED_REF: 'seedRef', - SHOOT_REF: 'shootRef' + SHOOT_REF: 'shootRef', } /* @@ -35,10 +35,10 @@ async function getGardenTerminalHostClusterCredentials (client) { const secret = _.head(runtimeSecrets) const secretRef = { namespace: secret.metadata.namespace, - name: secret.metadata.name + name: secret.metadata.name, } return { - secretRef + secretRef, } } case GardenTerminalHostRefType.SEED_REF: { @@ -47,22 +47,22 @@ async function getGardenTerminalHostClusterCredentials (client) { if (managedSeed) { return { - shootRef: getShootRef(managedSeed) + shootRef: getShootRef(managedSeed), } } return { - secretRef: _.get(seed, 'spec.secretRef') + secretRef: _.get(seed, ['spec', 'secretRef']), } } case GardenTerminalHostRefType.SHOOT_REF: { // TODO refactor to return shootRef instead. The static kubeconfig might be disabled const shootName = getConfigValue('terminal.gardenTerminalHost.shootRef.name') const secretRef = { namespace: getConfigValue('terminal.gardenTerminalHost.shootRef.namespace', 'garden'), - name: `${shootName}.kubeconfig` + name: `${shootName}.kubeconfig`, } return { - secretRef + secretRef, } } default: @@ -141,7 +141,7 @@ function getGardenTerminalHostClusterSecrets (client) { assert.ok(namespace, 'namespace must be set') const labelSelector = getConfigValue('terminal.gardenTerminalHost.secretRef.labelSelector', ['runtime=gardenTerminalHost']) const query = { - labelSelector: labelSelector.join(',') + labelSelector: labelSelector.join(','), } return client.core.secrets.list(namespace, query) } @@ -149,7 +149,7 @@ function getGardenTerminalHostClusterSecrets (client) { function getShootRef (managedSeed) { return { namespace: managedSeed.metadata.namespace, - name: managedSeed.spec.shoot.name + name: managedSeed.spec.shoot.name, } } @@ -158,5 +158,5 @@ module.exports = { getKubeApiServerHostForShoot, getGardenTerminalHostClusterCredentials, getGardenHostClusterKubeApiServer, - getShootRef + getShootRef, } diff --git a/backend/lib/services/tickets.js b/backend/lib/services/tickets.js index aa96a5835f..919e515b9f 100644 --- a/backend/lib/services/tickets.js +++ b/backend/lib/services/tickets.js @@ -16,11 +16,11 @@ function fromLabel (item) { return _.pick(item, [ 'id', 'name', - 'color' + 'color', ]) } -const apiUrl = _.get(config, 'gitHub.apiUrl') +const apiUrl = _.get(config, ['gitHub', 'apiUrl']) const options = {} if (apiUrl) { @@ -42,11 +42,11 @@ function fromIssue (issue) { 'created_at', 'updated_at', 'number', - 'state' + 'state', ]) .assign({ projectName, - name + name, }) .value(), data: _ @@ -55,14 +55,14 @@ function fromIssue (issue) { 'user.login', 'user.avatar_url', 'html_url', - 'comments' + 'comments', ]) .assign({ body: converter.makeSanitizedHtml(issue.body), labels, - ticketTitle + ticketTitle, }) - .value() + .value(), } } exports.fromIssue = fromIssue @@ -73,12 +73,12 @@ function fromComment (number, name, projectName, item) { .pick([ 'id', 'created_at', - 'updated_at' + 'updated_at', ]) .assign({ number, name, - projectName + projectName, }) .value() const data = _ @@ -86,16 +86,16 @@ function fromComment (number, name, projectName, item) { .pick([ 'user.login', 'user.avatar_url', - 'html_url' + 'html_url', ]) .assign({ - body: converter.makeSanitizedHtml(item.body) + body: converter.makeSanitizedHtml(item.body), }) .value() return { kind: 'comment', metadata, - data + data, } } exports.fromComment = fromComment diff --git a/backend/lib/utils/index.js b/backend/lib/utils/index.js index d3375646d6..1659fe829b 100644 --- a/backend/lib/utils/index.js +++ b/backend/lib/utils/index.js @@ -33,7 +33,7 @@ function projectFilter (user, canListProjects = false) { const isMemberOf = project => { return _ .chain(project) - .get('spec.members') + .get(['spec', 'members']) .find(({ kind, namespace, name }) => { switch (kind) { case 'Group': @@ -58,7 +58,7 @@ function projectFilter (user, canListProjects = false) { } const isPending = project => { - return _.get(project, 'status.phase', 'Pending') === 'Pending' + return _.get(project, ['status', 'phase'], 'Pending') === 'Pending' } return project => { @@ -95,7 +95,7 @@ function parseRooms (rooms) { return [ isAdmin, namespaces, - qualifiedNames + qualifiedNames, ] } @@ -109,7 +109,7 @@ function trimObjectMetadata (object) { function trimProject (project) { project = trimObjectMetadata(project) - _.set(project, 'spec.members', undefined) + _.set(project, ['spec', 'members'], undefined) return project } @@ -230,11 +230,11 @@ function shootHasIssue (shoot) { } function getSeedIngressDomain (seed) { - return _.get(seed, 'spec.ingress.domain') + return _.get(seed, ['spec', 'ingress', 'domain']) } function isSeedUnreachable (seed) { - const matchLabels = _.get(config, 'unreachableSeeds.matchLabels') + const matchLabels = _.get(config, ['unreachableSeeds', 'matchLabels']) if (!matchLabels) { return false } @@ -259,6 +259,6 @@ module.exports = { EXISTS, NOT_EXISTS, EQUAL, - NOT_EQUAL - }) + NOT_EQUAL, + }), } diff --git a/backend/lib/watches/leases.js b/backend/lib/watches/leases.js index c871f2050e..0b48cdcb5d 100644 --- a/backend/lib/watches/leases.js +++ b/backend/lib/watches/leases.js @@ -39,7 +39,7 @@ module.exports = (io, informer, { signal }) => { const { projectName, name } = event.object.metadata const namespace = cache.getProjectNamespace(projectName) const rooms = [ - `shoots;${namespace}/${name}` + `shoots;${namespace}/${name}`, ] nsp.to(rooms).emit('comments', event) }) @@ -50,7 +50,7 @@ module.exports = (io, informer, { signal }) => { }, { interval: pollIntervalSeconds * 1000 || 0, throttle: syncThrottleSeconds * 1000 || 0, - signal + signal, }) syncManager.sync() diff --git a/backend/lib/watches/shoots.js b/backend/lib/watches/shoots.js index 54334f82c2..6c878fe89a 100644 --- a/backend/lib/watches/shoots.js +++ b/backend/lib/watches/shoots.js @@ -18,7 +18,7 @@ module.exports = (io, informer, options) => { const rooms = [ 'shoots:admin', `shoots;${namespace}`, - `shoots;${namespace}/${name}` + `shoots;${namespace}/${name}`, ] nsp.to(rooms).emit('shoots', { type, uid }) } @@ -42,7 +42,7 @@ module.exports = (io, informer, options) => { } const rooms = [ 'shoots:unhealthy:admin', - `shoots:unhealthy;${namespace}` + `shoots:unhealthy;${namespace}`, ] nsp.to(rooms).emit('shoots', { type, uid }) } diff --git a/backend/package.json b/backend/package.json index df0c39a77d..af30c07ee4 100644 --- a/backend/package.json +++ b/backend/package.json @@ -27,7 +27,7 @@ ], "scripts": { "serve": "cross-env NODE_ENV=development node server.js", - "lint": "eslint --ext .js server.js .", + "lint": "eslint server.js .", "test": "cross-env NODE_ENV=test jest", "test-coverage": "yarn test --coverage" }, @@ -76,72 +76,19 @@ "abort-controller": "^3.0.0", "cross-env": "^7.0.3", "dockerfile-ast": "^0.6.1", - "eslint": "^8.57.0", - "eslint-config-standard": "^17.1.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jest": "^26.9.0", - "eslint-plugin-n": "^15.7.0", - "eslint-plugin-promise": "^6.6.0", + "eslint": "^9.11.0", + "eslint-plugin-jest": "^28.8.3", + "eslint-plugin-lodash": "^8.0.0", "eslint-plugin-security": "^3.0.1", "fast-json-patch": "^3.1.1", "jest": "^29.7.0", + "neostandard": "^0.11.5", "p-event": "^4.2.0", "path-to-regexp": "^8.0.0", "set-cookie-parser": "^2.6.0", "socket.io-client": "^4.7.5", "supertest": "^7.0.0" }, - "eslintConfig": { - "env": { - "commonjs": true, - "jest/globals": true - }, - "plugins": [ - "jest" - ], - "extends": [ - "standard", - "plugin:security/recommended-legacy", - "plugin:jest/recommended" - ], - "globals": { - "createAgent": true, - "fixtures": true - }, - "rules": { - "no-console": "error", - "no-debugger": "error" - }, - "ignorePatterns": [ - "public", - "my*.js" - ], - "overrides": [ - { - "files": [ - "**/__fixtures__/**", - "**/__mocks__/**", - "**/__tests__/**", - "**/test/**", - "jest.setup.js" - ], - "rules": { - "security/detect-object-injection": "off", - "security/detect-possible-timing-attacks": "off", - "security/detect-unsafe-regex": "off" - } - }, - { - "files": [ - "**/__tests__/**", - "**/test/**/*.spec.js" - ], - "env": { - "jest": true - } - } - ] - }, "jest": { "restoreMocks": true, "verbose": true, diff --git a/backend/test/acceptance/api.cloudProviderSecrets.spec.js b/backend/test/acceptance/api.cloudProviderSecrets.spec.js index e6472f7160..21c4eb2b50 100644 --- a/backend/test/acceptance/api.cloudProviderSecrets.spec.js +++ b/backend/test/acceptance/api.cloudProviderSecrets.spec.js @@ -22,8 +22,8 @@ describe('api', function () { cache.initialize({ shoots: { - store: createStore(fixtures.shoots.list()) - } + store: createStore(fixtures.shoots.list()), + }, }) }) @@ -62,7 +62,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -81,7 +81,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -91,11 +91,11 @@ describe('api', function () { const metadata = { name: 'new-infra1', cloudProfileName, - cloudProviderKind: 'infra1' + cloudProviderKind: 'infra1', } const data = { key: 'myKey', - secret: 'mySecret' + secret: 'mySecret', } mockRequest.mockImplementationOnce(fixtures.secrets.mocks.create()) @@ -109,7 +109,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -118,11 +118,11 @@ describe('api', function () { it('should create a cloudProvider dns secret', async function () { const metadata = { name: 'new-dns1', - dnsProviderName + dnsProviderName, } const data = { key: 'myKey', - secret: 'mySecret' + secret: 'mySecret', } mockRequest.mockImplementationOnce(fixtures.secrets.mocks.create()) @@ -135,7 +135,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(2) + expect(mockRequest).toHaveBeenCalledTimes(2) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -144,7 +144,7 @@ describe('api', function () { it('should patch an own cloudProvider secret', async function () { const data = { key: 'myKey', - secret: 'mySecret' + secret: 'mySecret', } mockRequest.mockImplementationOnce(fixtures.secretbindings.mocks.get()) @@ -158,7 +158,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -176,11 +176,11 @@ describe('api', function () { .expect('content-type', /json/) .expect(422) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot({ - details: expect.any(Object) + details: expect.any(Object), }) }) @@ -196,7 +196,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(4) + expect(mockRequest).toHaveBeenCalledTimes(4) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -213,11 +213,11 @@ describe('api', function () { .expect('content-type', /json/) .expect(422) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot({ - details: expect.any(Object) + details: expect.any(Object), }) }) @@ -233,11 +233,11 @@ describe('api', function () { .expect('content-type', /json/) .expect(422) - expect(mockRequest).toBeCalledTimes(2) + expect(mockRequest).toHaveBeenCalledTimes(2) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot({ - details: expect.any(Object) + details: expect.any(Object), }) }) }) diff --git a/backend/test/acceptance/api.cloudprofiles.spec.js b/backend/test/acceptance/api.cloudprofiles.spec.js index c3eca98454..aed4f7f69a 100644 --- a/backend/test/acceptance/api.cloudprofiles.spec.js +++ b/backend/test/acceptance/api.cloudprofiles.spec.js @@ -34,7 +34,7 @@ describe('api', function () { .set('cookie', await user.cookie) .expect('content-type', /json/) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() diff --git a/backend/test/acceptance/api.controllerregistrations.spec.js b/backend/test/acceptance/api.controllerregistrations.spec.js index 00c9630ebf..376cf32c58 100644 --- a/backend/test/acceptance/api.controllerregistrations.spec.js +++ b/backend/test/acceptance/api.controllerregistrations.spec.js @@ -35,7 +35,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -50,7 +50,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() diff --git a/backend/test/acceptance/api.info.spec.js b/backend/test/acceptance/api.info.spec.js index 2b07d9a7b7..31be96bdfb 100644 --- a/backend/test/acceptance/api.info.spec.js +++ b/backend/test/acceptance/api.info.spec.js @@ -29,7 +29,7 @@ describe('api', function () { const aud = ['gardener'] const service = { name: 'gardener-apiserver', - namespace: 'gardener' + namespace: 'gardener', } const caBundle = fixtures.helper.toBase64('ca') @@ -40,10 +40,10 @@ describe('api', function () { .expect('content-type', /json/) .expect(403) - expect(mockRequest).not.toBeCalled() + expect(mockRequest).not.toHaveBeenCalled() expect(res.body).toMatchSnapshot({ - details: expect.any(Object) + details: expect.any(Object), }) }) @@ -53,10 +53,10 @@ describe('api', function () { .expect('content-type', /json/) .expect(401) - expect(mockRequest).not.toBeCalled() + expect(mockRequest).not.toHaveBeenCalled() expect(res.body).toMatchSnapshot({ - details: expect.any(Object) + details: expect.any(Object), }) }) @@ -69,10 +69,10 @@ describe('api', function () { .expect('content-type', /json/) .expect(401) - expect(mockRequest).not.toBeCalled() + expect(mockRequest).not.toHaveBeenCalled() expect(res.body).toMatchSnapshot({ - details: expect.any(Object) + details: expect.any(Object), }) }) @@ -85,10 +85,10 @@ describe('api', function () { .expect('content-type', /json/) .expect(401) - expect(mockRequest).not.toBeCalled() + expect(mockRequest).not.toHaveBeenCalled() expect(res.body).toMatchSnapshot({ - details: expect.any(Object) + details: expect.any(Object), }) }) @@ -105,11 +105,11 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(2) + expect(mockRequest).toHaveBeenCalledTimes(2) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot({ - version: expect.any(String) + version: expect.any(String), }) }) @@ -125,11 +125,11 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(2) + expect(mockRequest).toHaveBeenCalledTimes(2) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot({ - version: expect.any(String) + version: expect.any(String), }) }) }) diff --git a/backend/test/acceptance/api.members.spec.js b/backend/test/acceptance/api.members.spec.js index 8af7d7c135..295256dd47 100644 --- a/backend/test/acceptance/api.members.spec.js +++ b/backend/test/acceptance/api.members.spec.js @@ -37,7 +37,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(2) + expect(mockRequest).toHaveBeenCalledTimes(2) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -52,10 +52,10 @@ describe('api', function () { .expect('content-type', /json/) .expect(404) - expect(mockRequest).not.toBeCalled() + expect(mockRequest).not.toHaveBeenCalled() expect(res.body).toMatchSnapshot({ - details: expect.any(Object) + details: expect.any(Object), }) }) @@ -72,7 +72,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -90,11 +90,11 @@ describe('api', function () { .post(`/api/namespaces/${namespace}/members/${name}`) .set('cookie', await user.cookie) .send({ - method: 'resetServiceAccount' + method: 'resetServiceAccount', }) .expect(200) - expect(mockRequest).toBeCalledTimes(4) + expect(mockRequest).toHaveBeenCalledTimes(4) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -110,12 +110,12 @@ describe('api', function () { .set('cookie', await user.cookie) .send({ name: 'baz@example.org', - roles: ['admin', 'owner'] + roles: ['admin', 'owner'], }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -130,16 +130,16 @@ describe('api', function () { .set('cookie', await user.cookie) .send({ name: 'foo@example.org', - roles: ['admin'] + roles: ['admin'], }) .expect('content-type', /json/) .expect(409) - expect(mockRequest).toBeCalledTimes(2) + expect(mockRequest).toHaveBeenCalledTimes(2) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot({ - details: expect.any(Object) + details: expect.any(Object), }) }) @@ -154,12 +154,12 @@ describe('api', function () { .put(`/api/namespaces/${namespace}/members/${name}`) .set('cookie', await user.cookie) .send({ - roles: ['newRole'] + roles: ['newRole'], }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -178,7 +178,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -196,7 +196,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(2) + expect(mockRequest).toHaveBeenCalledTimes(2) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -212,12 +212,12 @@ describe('api', function () { .set('cookie', await user.cookie) .send({ name: `system:serviceaccount:${namespace}:foo`, - roles: [] + roles: [], }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -237,7 +237,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(4) + expect(mockRequest).toHaveBeenCalledTimes(4) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -255,12 +255,12 @@ describe('api', function () { .send({ name: `system:serviceaccount:${namespace}:foo`, roles: ['myrole'], - description: 'description' + description: 'description', }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(4) + expect(mockRequest).toHaveBeenCalledTimes(4) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -275,16 +275,16 @@ describe('api', function () { .set('cookie', await user.cookie) .send({ name: `system:serviceaccount:${namespace}:robot`, - roles: ['myrole'] + roles: ['myrole'], }) .expect('content-type', /json/) .expect(409) - expect(mockRequest).toBeCalledTimes(2) + expect(mockRequest).toHaveBeenCalledTimes(2) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot({ - details: expect.any(Object) + details: expect.any(Object), }) }) @@ -301,12 +301,12 @@ describe('api', function () { .set('cookie', await user.cookie) .send({ roles: ['myrole'], - description: 'newDescription' + description: 'newDescription', }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(4) + expect(mockRequest).toHaveBeenCalledTimes(4) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -323,12 +323,12 @@ describe('api', function () { .put(`/api/namespaces/${namespace}/members/${name}`) .set('cookie', await user.cookie) .send({ - roles: ['myrole'] + roles: ['myrole'], }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -345,12 +345,12 @@ describe('api', function () { .put(`/api/namespaces/${namespace}/members/${name}`) .set('cookie', await user.cookie) .send({ - roles: [] + roles: [], }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -366,12 +366,12 @@ describe('api', function () { .set('cookie', await user.cookie) .send({ name: 'system:serviceaccount:othernamespace:fsa', - roles: ['myrole'] + roles: ['myrole'], }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -386,12 +386,12 @@ describe('api', function () { .set('cookie', await user.cookie) .send({ name: 'system:serviceaccount:othernamespace:fsa-noroles', - roles: [] + roles: [], }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(2) + expect(mockRequest).toHaveBeenCalledTimes(2) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -410,7 +410,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() diff --git a/backend/test/acceptance/api.seeds.spec.js b/backend/test/acceptance/api.seeds.spec.js index 047e7395dd..f2bbb0b890 100644 --- a/backend/test/acceptance/api.seeds.spec.js +++ b/backend/test/acceptance/api.seeds.spec.js @@ -35,7 +35,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() diff --git a/backend/test/acceptance/api.shoots.spec.js b/backend/test/acceptance/api.shoots.spec.js index 369251cc91..e4350a3c1f 100644 --- a/backend/test/acceptance/api.shoots.spec.js +++ b/backend/test/acceptance/api.shoots.spec.js @@ -27,7 +27,7 @@ describe('api', function () { cache.initialize({ projects: { - store: createStore(fixtures.projects.list()) + store: createStore(fixtures.projects.list()), }, shoots: { store: createStore(fixtures.shoots.list().map(item => { @@ -36,11 +36,11 @@ describe('api', function () { : 'unhealthy' item.metadata.labels = { ...item.metadata.labels, - 'shoot.gardener.cloud/status': status + 'shoot.gardener.cloud/status': status, } return item - })) - } + })), + }, }) }) @@ -59,7 +59,7 @@ describe('api', function () { const name = 'barShoot' const namespace = 'garden-foo' const user = fixtures.auth.createUser({ - id: 'foo@example.org' + id: 'foo@example.org', }) it('should return shoots for a single namespace', async function () { @@ -71,7 +71,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body.items.map(item => item.metadata.uid)).toEqual([1, 2, 3]) @@ -87,7 +87,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body.items.map(item => item.metadata.uid)).toEqual([1, 2, 3, 4]) @@ -105,7 +105,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body.items.map(item => item.metadata.uid)).toEqual([1, 2, 3]) @@ -123,7 +123,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body.items.map(item => item.metadata.uid)).toEqual([3]) @@ -139,7 +139,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(403) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() const { code, reason, message, status } = res.body @@ -152,7 +152,7 @@ describe('api', function () { namespace: 'garden-foo', project: 'foo', purpose: 'newPurpose', - secretBindingName: 'foo-infra1' + secretBindingName: 'foo-infra1', }) mockRequest.mockImplementationOnce(fixtures.shoots.mocks.create()) @@ -162,12 +162,12 @@ describe('api', function () { .set('cookie', await user.cookie) .send({ metadata, - spec + spec, }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -182,7 +182,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -198,7 +198,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(2) + expect(mockRequest).toHaveBeenCalledTimes(2) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -219,16 +219,16 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(7) + expect(mockRequest).toHaveBeenCalledTimes(7) expect(mockRequest.mock.calls).toMatchSnapshot() - expect(kubeconfig.cleanKubeconfig).toBeCalledTimes(1) + expect(kubeconfig.cleanKubeconfig).toHaveBeenCalledTimes(1) - expect(logger.info).toBeCalledTimes(0) + expect(logger.info).toHaveBeenCalledTimes(0) expect(res.body).toMatchSnapshot({ kubeconfig: expect.any(String), - kubeconfigGardenlogin: expect.any(String) + kubeconfigGardenlogin: expect.any(String), }, 'body') expect(yaml.load(res.body.kubeconfig)).toMatchSnapshot('body.kubeconfig') expect(yaml.load(res.body.kubeconfigGardenlogin)).toMatchSnapshot('body.kubeconfigGardenlogin') @@ -249,16 +249,16 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(5) + expect(mockRequest).toHaveBeenCalledTimes(5) expect(mockRequest.mock.calls).toMatchSnapshot() - expect(kubeconfig.cleanKubeconfig).toBeCalledTimes(1) + expect(kubeconfig.cleanKubeconfig).toHaveBeenCalledTimes(1) - expect(logger.info).toBeCalledTimes(1) - expect(logger.info).lastCalledWith('failed to get gardenlogin kubeconfig', 'Shoot has no advertised addresses') + expect(logger.info).toHaveBeenCalledTimes(1) + expect(logger.info).toHaveBeenLastCalledWith('failed to get gardenlogin kubeconfig', 'Shoot has no advertised addresses') expect(res.body).toMatchSnapshot({ - kubeconfig: expect.any(String) + kubeconfig: expect.any(String), }, 'body') expect(yaml.load(res.body.kubeconfig)).toMatchSnapshot('body.kubeconfig') }) @@ -267,7 +267,7 @@ describe('api', function () { const { metadata, spec } = fixtures.shoots.get(namespace, name) metadata.annotations['gardener.cloud/created-by'] = 'baz@example.org' metadata.labels = { - foo: 'bar' + foo: 'bar', } mockRequest.mockImplementationOnce(fixtures.shoots.mocks.get()) @@ -278,12 +278,12 @@ describe('api', function () { .set('cookie', await user.cookie) .send({ metadata, - spec + spec, }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(2) + expect(mockRequest).toHaveBeenCalledTimes(2) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -296,12 +296,12 @@ describe('api', function () { .put(`/api/namespaces/${namespace}/shoots/${name}/spec/kubernetes/version`) .set('cookie', await user.cookie) .send({ - version: '1.17.1' + version: '1.17.1', }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -314,12 +314,12 @@ describe('api', function () { .put(`/api/namespaces/${namespace}/shoots/${name}/spec/kubernetes/enableStaticTokenKubeconfig`) .set('cookie', await user.cookie) .send({ - enableStaticTokenKubeconfig: true + enableStaticTokenKubeconfig: true, }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -334,12 +334,12 @@ describe('api', function () { .send({ timeWindowBegin: '230000+0000', timeWindowEnd: '000000+0000', - updateKubernetesVersion: true + updateKubernetesVersion: true, }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -353,18 +353,18 @@ describe('api', function () { .set('cookie', await user.cookie) .send({ workers: [{ - name: 'worker-g5rk1' + name: 'worker-g5rk1', }], network: { zones: [{ - workers: '10.250.0.0/20' - }] - } + workers: '10.250.0.0/20', + }], + }, }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -377,12 +377,12 @@ describe('api', function () { .put(`/api/namespaces/${namespace}/shoots/${name}/spec/hibernation/enabled`) .set('cookie', await user.cookie) .send({ - enabled: true + enabled: true, }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -396,12 +396,12 @@ describe('api', function () { .set('cookie', await user.cookie) .send([{ start: '00 17 * * 1,2,3,4,5,6', - end: '00 08 * * 1,2,3,4,5,6' + end: '00 08 * * 1,2,3,4,5,6', }]) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -414,12 +414,12 @@ describe('api', function () { .patch(`/api/namespaces/${namespace}/shoots/${name}/metadata/annotations`) .set('cookie', await user.cookie) .send({ - foo: 'bar' + foo: 'bar', }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -432,12 +432,12 @@ describe('api', function () { .put(`/api/namespaces/${namespace}/shoots/${name}/spec/purpose`) .set('cookie', await user.cookie) .send({ - purpose: 'testing' + purpose: 'testing', }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -450,12 +450,12 @@ describe('api', function () { .put(`/api/namespaces/${namespace}/shoots/${name}/spec/seedname`) .set('cookie', await user.cookie) .send({ - seedName: 'foo-new-seed' + seedName: 'foo-new-seed', }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -471,14 +471,14 @@ describe('api', function () { { testAddon: { enabled: true, - foo: 'bar' - } - } + foo: 'bar', + }, + }, ]) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -491,16 +491,16 @@ describe('api', function () { .post(`/api/namespaces/${namespace}/shoots/${name}/adminkubeconfig`) .set('cookie', await user.cookie) .send({ - expirationSeconds: 600 + expirationSeconds: 600, }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot({ - kubeconfig: expect.any(String) + kubeconfig: expect.any(String), }, 'body') expect(yaml.load(res.body.kubeconfig)).toMatchSnapshot('body.kubeconfig') }) diff --git a/backend/test/acceptance/api.terminals.spec.js b/backend/test/acceptance/api.terminals.spec.js index 47bb9ebe22..3e509c93f9 100644 --- a/backend/test/acceptance/api.terminals.spec.js +++ b/backend/test/acceptance/api.terminals.spec.js @@ -14,7 +14,7 @@ function getTerminalName (target, identifier) { return [ 'term', target, - padStart(identifier, 5, '0') + padStart(identifier, 5, '0'), ].join('-') } @@ -48,7 +48,7 @@ describe('api', function () { mockRequest.mockImplementationOnce(fixtures.auth.mocks.reviewSelfSubjectAccess()) mockRequest.mockImplementationOnce(fixtures.secrets.mocks.get({ valid: true, - invalid: true + invalid: true, })) const res = await agent @@ -58,14 +58,14 @@ describe('api', function () { method: 'listProjectTerminalShortcuts', params: { coordinate: { - namespace - } - } + namespace, + }, + }, }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(2) + expect(mockRequest).toHaveBeenCalledTimes(2) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -75,7 +75,7 @@ describe('api', function () { mockRequest.mockImplementationOnce(fixtures.auth.mocks.reviewSelfSubjectAccess()) mockRequest.mockImplementationOnce(fixtures.secrets.mocks.get({ valid: false, - invalid: true + invalid: true, })) const res = await agent @@ -85,14 +85,14 @@ describe('api', function () { method: 'listProjectTerminalShortcuts', params: { coordinate: { - namespace - } - } + namespace, + }, + }, }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(2) + expect(mockRequest).toHaveBeenCalledTimes(2) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -102,7 +102,7 @@ describe('api', function () { mockRequest.mockImplementationOnce(fixtures.auth.mocks.reviewSelfSubjectAccess()) mockRequest.mockImplementationOnce(fixtures.secrets.mocks.get({ valid: false, - invalid: false + invalid: false, })) const res = await agent @@ -112,14 +112,14 @@ describe('api', function () { method: 'listProjectTerminalShortcuts', params: { coordinate: { - namespace - } - } + namespace, + }, + }, }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(2) + expect(mockRequest).toHaveBeenCalledTimes(2) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -151,17 +151,17 @@ describe('api', function () { identifier, coordinate: { namespace, - target - } - } + target, + }, + }, }) .expect('content-type', /json/) .expect(200) - expect(makeSanitizedHtmlStub).toBeCalledTimes(1) + expect(makeSanitizedHtmlStub).toHaveBeenCalledTimes(1) expect(makeSanitizedHtmlStub.mock.calls).toEqual([['Dummy Image Description']]) - expect(mockRequest).toBeCalledTimes(6) + expect(mockRequest).toHaveBeenCalledTimes(6) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -191,17 +191,17 @@ describe('api', function () { coordinate: { namespace, name: shootName, - target - } - } + target, + }, + }, }) .expect('content-type', /json/) .expect(200) - expect(makeSanitizedHtmlStub).toBeCalledTimes(1) + expect(makeSanitizedHtmlStub).toHaveBeenCalledTimes(1) expect(makeSanitizedHtmlStub.mock.calls).toEqual([['Dummy Image Description']]) - expect(mockRequest).toBeCalledTimes(7) + expect(mockRequest).toHaveBeenCalledTimes(7) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -225,17 +225,17 @@ describe('api', function () { identifier, coordinate: { namespace, - target - } - } + target, + }, + }, }) .expect('content-type', /json/) .expect(200) - expect(makeSanitizedHtmlStub).toBeCalledTimes(1) + expect(makeSanitizedHtmlStub).toHaveBeenCalledTimes(1) expect(makeSanitizedHtmlStub.mock.calls).toEqual([['Foo Image Description']]) - expect(mockRequest).toBeCalledTimes(6) + expect(mockRequest).toHaveBeenCalledTimes(6) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -254,13 +254,13 @@ describe('api', function () { method: 'fetch', params: { name, - namespace - } + namespace, + }, }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(4) + expect(mockRequest).toHaveBeenCalledTimes(4) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -277,14 +277,14 @@ describe('api', function () { params: { coordinate: { namespace, - target - } - } + target, + }, + }, }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -302,13 +302,13 @@ describe('api', function () { method: 'heartbeat', params: { name, - namespace - } + namespace, + }, }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -326,13 +326,13 @@ describe('api', function () { method: 'remove', params: { name, - namespace - } + namespace, + }, }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -366,17 +366,17 @@ describe('api', function () { coordinate: { name: shootName, namespace, - target - } - } + target, + }, + }, }) .expect('content-type', /json/) .expect(200) - expect(makeSanitizedHtmlStub).toBeCalledTimes(1) + expect(makeSanitizedHtmlStub).toHaveBeenCalledTimes(1) expect(makeSanitizedHtmlStub.mock.calls).toEqual([['Dummy Image Description']]) - expect(mockRequest).toBeCalledTimes(8) + expect(mockRequest).toHaveBeenCalledTimes(8) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -394,14 +394,14 @@ describe('api', function () { coordinate: { name: shootName, namespace, - target - } - } + target, + }, + }, }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -421,13 +421,13 @@ describe('api', function () { method: 'heartbeat', params: { name, - namespace - } + namespace, + }, }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -458,18 +458,18 @@ describe('api', function () { coordinate: { name: shootName, namespace, - target + target, }, - preferredHost: 'shoot' - } + preferredHost: 'shoot', + }, }) .expect('content-type', /json/) .expect(200) - expect(makeSanitizedHtmlStub).toBeCalledTimes(1) + expect(makeSanitizedHtmlStub).toHaveBeenCalledTimes(1) expect(makeSanitizedHtmlStub.mock.calls).toEqual([['Dummy Image Description']]) - expect(mockRequest).toBeCalledTimes(5) + expect(mockRequest).toHaveBeenCalledTimes(5) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -492,17 +492,17 @@ describe('api', function () { coordinate: { name: shootName, namespace, - target - } - } + target, + }, + }, }) .expect('content-type', /json/) .expect(200) - expect(makeSanitizedHtmlStub).toBeCalledTimes(1) + expect(makeSanitizedHtmlStub).toHaveBeenCalledTimes(1) expect(makeSanitizedHtmlStub.mock.calls).toEqual([['Foo Image Description']]) - expect(mockRequest).toBeCalledTimes(5) + expect(mockRequest).toHaveBeenCalledTimes(5) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -522,14 +522,14 @@ describe('api', function () { coordinate: { name: shootName, namespace, - target - } - } + target, + }, + }, }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -548,14 +548,14 @@ describe('api', function () { method: 'list', params: { coordinate: { - namespace - } - } + namespace, + }, + }, }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(2) + expect(mockRequest).toHaveBeenCalledTimes(2) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() diff --git a/backend/test/acceptance/api.tickets.spec.js b/backend/test/acceptance/api.tickets.spec.js index 4a60d41a00..a4fa7fa426 100644 --- a/backend/test/acceptance/api.tickets.spec.js +++ b/backend/test/acceptance/api.tickets.spec.js @@ -26,11 +26,11 @@ describe('api', function () { fixtures.github.createIssue(1, 'foo'), fixtures.github.createIssue(2, 'bar', { comments: 1 }), fixtures.github.createIssue(3, 'foobar'), - fixtures.github.createIssue(4, 'foo', { comments: 1, state: 'closed' }) + fixtures.github.createIssue(4, 'foo', { comments: 1, state: 'closed' }), ]) mockListComments.mockReturnValue([ fixtures.github.createComment(1, 2), - fixtures.github.createComment(2, 4) + fixtures.github.createComment(2, 4), ]) await tickets.loadOpenIssues() }) @@ -41,7 +41,7 @@ describe('api', function () { describe('tickets', function () { const user = fixtures.auth.createUser({ - id: 'foo@example.org' + id: 'foo@example.org', }) it('should fetch open issues for all namespaces', async () => { @@ -53,9 +53,9 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).not.toBeCalled() - expect(mockListIssues).toBeCalledTimes(1) - expect(mockListComments).not.toBeCalled() + expect(mockRequest).not.toHaveBeenCalled() + expect(mockListIssues).toHaveBeenCalledTimes(1) + expect(mockListComments).not.toHaveBeenCalled() expect(res.body).toMatchSnapshot() }) @@ -69,9 +69,9 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).not.toBeCalled() - expect(mockListIssues).toBeCalledTimes(1) - expect(mockListComments).not.toBeCalled() + expect(mockRequest).not.toHaveBeenCalled() + expect(mockListIssues).toHaveBeenCalledTimes(1) + expect(mockListComments).not.toHaveBeenCalled() expect(res.body).toMatchSnapshot() }) @@ -86,9 +86,9 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).not.toBeCalled() - expect(mockListIssues).toBeCalledTimes(1) - expect(mockListComments).toBeCalledTimes(1) + expect(mockRequest).not.toHaveBeenCalled() + expect(mockListIssues).toHaveBeenCalledTimes(1) + expect(mockListComments).toHaveBeenCalledTimes(1) expect(res.body).toMatchSnapshot() }) diff --git a/backend/test/acceptance/api.user.spec.js b/backend/test/acceptance/api.user.spec.js index fa8dafde36..ad07daedc0 100644 --- a/backend/test/acceptance/api.user.spec.js +++ b/backend/test/acceptance/api.user.spec.js @@ -32,7 +32,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).not.toBeCalled() + expect(mockRequest).not.toHaveBeenCalled() expect(res.body).toMatchSnapshot() }) @@ -44,12 +44,12 @@ describe('api', function () { .post('/api/user/subjectrules') .set('cookie', await user.cookie) .send({ - namespace: 'garden-foo' + namespace: 'garden-foo', }) .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() @@ -62,7 +62,7 @@ describe('api', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).not.toBeCalled() + expect(mockRequest).not.toHaveBeenCalled() expect(res.body).toMatchSnapshot() }) diff --git a/backend/test/acceptance/auth.spec.js b/backend/test/acceptance/auth.spec.js index 0741c2f9b4..4449607b3b 100644 --- a/backend/test/acceptance/auth.spec.js +++ b/backend/test/acceptance/auth.spec.js @@ -20,7 +20,7 @@ const { setCookies, sign, decrypt, - decode + decode, } = security async function getCookieValue (tokenSet) { @@ -28,7 +28,7 @@ async function getCookieValue (tokenSet) { const res = { cookie (key, value) { values.push(`${key}=${value}`) - } + }, } await setCookies(res, tokenSet) return values.join(';') @@ -38,10 +38,10 @@ async function parseCookies (res) { const { [COOKIE_HEADER_PAYLOAD]: cookieHeaderPayload, [COOKIE_SIGNATURE]: cookieSignature, - [COOKIE_TOKEN]: cookieToken + [COOKIE_TOKEN]: cookieToken, } = setCookieParser.parse(res, { decodeValues: true, - map: true + map: true, }) assert.strictEqual(cookieHeaderPayload.sameSite, 'Lax') assert.strictEqual(cookieHeaderPayload.httpOnly, undefined) @@ -64,7 +64,7 @@ class Client { client_id: clientId, client_secret: clientSecret, redirect_uris: redirectUris, - response_types: responseTypes + response_types: responseTypes, }) { this.user = user this.issuer = issuer @@ -77,7 +77,7 @@ class Client { authorizationUrl ({ redirect_uri: redirectUri, state, - scope + scope, }) { const url = new URL(this.issuer) url.pathname = '/auth' @@ -106,7 +106,7 @@ class Client { refresh (token) { const tokenSet = new TokenSet({ id_token: token, - refresh_token: 'refresh-token' + refresh_token: 'refresh-token', }) tokenSet.expires_at = tokenSet.claims().exp return tokenSet @@ -134,7 +134,7 @@ describe('auth', function () { beforeEach(() => { mockRequest.mockReset() const client = Object.assign(new Client({ user, ...oidc }), { - CLOCK_TOLERANCE: oidc.clockTolerance || 30 + CLOCK_TOLERANCE: oidc.clockTolerance || 30, }) getIssuerClientStub = jest.spyOn(security, 'getIssuerClient').mockResolvedValue(client) mockRefresh = jest.spyOn(client, 'refresh') @@ -149,8 +149,8 @@ describe('auth', function () { .redirects(0) .expect(302) - expect(getIssuerClientStub).toBeCalledTimes(1) - expect(mockState).toBeCalledTimes(1) + expect(getIssuerClientStub).toHaveBeenCalledTimes(1) + expect(mockState).toHaveBeenCalledTimes(1) const url = new URL(res.headers.location) expect(url.searchParams.get('client_id')).toBe(oidc.client_id) expect(url.searchParams.get('redirect_uri')).toBe(redirectUri) @@ -170,7 +170,7 @@ describe('auth', function () { .redirects(0) .expect(302) - expect(getIssuerClientStub).toBeCalledTimes(1) + expect(getIssuerClientStub).toHaveBeenCalledTimes(1) const url = new URL(res.headers.location) expect(url.searchParams.get('redirect_uri')).toBe(redirectUri) const state = url.searchParams.get('state') @@ -186,7 +186,7 @@ describe('auth', function () { .redirects(0) .expect(302) - expect(getIssuerClientStub).toBeCalledTimes(1) + expect(getIssuerClientStub).toHaveBeenCalledTimes(1) expect(res.headers).toHaveProperty('location', `/login#error=${encodeURIComponent(message)}`) }) @@ -201,27 +201,27 @@ describe('auth', function () { .redirects(0) .expect(302) - expect(mockRequest).toBeCalledTimes(2) + expect(mockRequest).toHaveBeenCalledTimes(2) expect(mockRequest.mock.calls[0]).toEqual([ { ...pick(fixtures.kube, [':scheme', ':authority', 'authorization']), ':method': 'post', - ':path': '/apis/authentication.k8s.io/v1/tokenreviews' + ':path': '/apis/authentication.k8s.io/v1/tokenreviews', }, { apiVersion: 'authentication.k8s.io/v1', kind: 'TokenReview', metadata: { - name: expect.stringMatching(/token-\d+/) + name: expect.stringMatching(/token-\d+/), }, spec: { - token: bearer - } - } + token: bearer, + }, + }, ]) expect(mockRequest.mock.calls[1]).toMatchSnapshot() - expect(getIssuerClientStub).toBeCalledTimes(2) + expect(getIssuerClientStub).toHaveBeenCalledTimes(2) expect(res.headers).toHaveProperty('location', '/') }) @@ -239,7 +239,7 @@ describe('auth', function () { .redirects(0) .expect(302) - expect(getIssuerClientStub).toBeCalledTimes(2) + expect(getIssuerClientStub).toHaveBeenCalledTimes(2) expect(res.headers).toHaveProperty('location', `/login#error=${encodeURIComponent(message)}`) }) @@ -257,23 +257,23 @@ describe('auth', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(2) + expect(mockRequest).toHaveBeenCalledTimes(2) expect(mockRequest.mock.calls[0]).toEqual([ { ...pick(fixtures.kube, [':scheme', ':authority', 'authorization']), ':method': 'post', - ':path': '/apis/authentication.k8s.io/v1/tokenreviews' + ':path': '/apis/authentication.k8s.io/v1/tokenreviews', }, { apiVersion: 'authentication.k8s.io/v1', kind: 'TokenReview', metadata: { - name: expect.stringMatching(/token-\d+/) + name: expect.stringMatching(/token-\d+/), }, spec: { - token: bearer - } - } + token: bearer, + }, + }, ]) expect(mockRequest.mock.calls[1]).toMatchSnapshot() @@ -285,7 +285,7 @@ describe('auth', function () { aud: ['gardener'], isAdmin: false, exp: expect.toBeWithinRange(expiresAt, expiresAt + 3), - jti: expect.stringMatching(/[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}/i) + jti: expect.stringMatching(/[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}/i), })) expect(idToken).toEqual(bearer) expect(refreshToken).toBeUndefined() @@ -304,10 +304,10 @@ describe('auth', function () { const { [COOKIE_HEADER_PAYLOAD]: cookieHeaderPayload, [COOKIE_SIGNATURE]: cookieSignature, - [COOKIE_TOKEN]: cookieToken + [COOKIE_TOKEN]: cookieToken, } = setCookieParser.parse(res, { decodeValues: true, - map: true + map: true, }) expect(cookieHeaderPayload.value).toHaveLength(0) expect(cookieHeaderPayload.expires).toEqual(ZERO_DATE) @@ -323,25 +323,25 @@ describe('auth', function () { const idTokenPayload = { iat, sub: id, - exp: iat - 60 + exp: iat - 60, } const accessTokenPayload = { iat, id, exp: iat + 24 * 60 * 60, refresh_at: idTokenPayload.exp, - aud: ['gardener'] + aud: ['gardener'], } // in this test the refreshToken is return as new idToken in the `client.refresh` mock implementation const refreshTokenPayload = { iat: iat + 60, sub: id, - exp: iat + 61 * 60 + exp: iat + 61 * 60, } const tokenSet = new TokenSet({ id_token: await sign(idTokenPayload), access_token: await sign(accessTokenPayload), - refresh_token: await sign(refreshTokenPayload) + refresh_token: await sign(refreshTokenPayload), }) mockRequest.mockImplementationOnce(fixtures.auth.mocks.reviewToken()) @@ -353,29 +353,29 @@ describe('auth', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(2) + expect(mockRequest).toHaveBeenCalledTimes(2) expect(mockRequest.mock.calls).toEqual([[ { ...pick(fixtures.kube, [':scheme', ':authority', 'authorization']), ':method': 'post', - ':path': '/apis/authentication.k8s.io/v1/tokenreviews' + ':path': '/apis/authentication.k8s.io/v1/tokenreviews', }, { apiVersion: 'authentication.k8s.io/v1', kind: 'TokenReview', metadata: { - name: expect.stringMatching(/^token-\d+/) + name: expect.stringMatching(/^token-\d+/), }, spec: { - token: tokenSet.refresh_token - } - } + token: tokenSet.refresh_token, + }, + }, ], [ { ...pick(fixtures.kube, [':scheme', ':authority']), authorization: `Bearer ${tokenSet.refresh_token}`, ':method': 'post', - ':path': '/apis/authorization.k8s.io/v1/selfsubjectaccessreviews' + ':path': '/apis/authorization.k8s.io/v1/selfsubjectaccessreviews', }, { apiVersion: 'authorization.k8s.io/v1', @@ -385,12 +385,12 @@ describe('auth', function () { resourceAttributes: { group: '', resource: 'secrets', - verb: 'get' - } - } - } + verb: 'get', + }, + }, + }, ]]) - expect(mockRefresh).toBeCalledTimes(1) + expect(mockRefresh).toHaveBeenCalledTimes(1) expect(mockRefresh.mock.calls[0]).toEqual([tokenSet.refresh_token]) const [accessToken, idToken, refreshToken] = await parseCookies(res) @@ -406,7 +406,7 @@ describe('auth', function () { aud: accessTokenPayload.aud, isAdmin: false, refresh_at: refreshTokenPayload.exp, - rti: expect.stringMatching(/^[a-z0-9]{7}$/) + rti: expect.stringMatching(/^[a-z0-9]{7}$/), }) }) }) diff --git a/backend/test/acceptance/config.spec.js b/backend/test/acceptance/config.spec.js index 38dcfef5eb..e89eedab17 100644 --- a/backend/test/acceptance/config.spec.js +++ b/backend/test/acceptance/config.spec.js @@ -34,7 +34,7 @@ describe('config', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(res.body).toMatchSnapshot() diff --git a/backend/test/acceptance/healthz.spec.js b/backend/test/acceptance/healthz.spec.js index d9c0d45015..23135a1941 100644 --- a/backend/test/acceptance/healthz.spec.js +++ b/backend/test/acceptance/healthz.spec.js @@ -32,11 +32,11 @@ describe('healthz', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls[0]).toEqual([{ ...pick(fixtures.kube, [':scheme', ':authority', 'authorization']), ':method': 'get', - ':path': '/healthz' + ':path': '/healthz', }]) expect(res.body).toEqual({ status: 'ok' }) diff --git a/backend/test/acceptance/io.spec.js b/backend/test/acceptance/io.spec.js index 7a2be90893..99bc08bfad 100644 --- a/backend/test/acceptance/io.spec.js +++ b/backend/test/acceptance/io.spec.js @@ -62,7 +62,7 @@ async function synchronize (socket, ...args) { statusCode = 500, name = 'InternalError', message = 'Failed to synchronize shoots', - items = [] + items = [], } = await socket.timeout(1000).emitWithAck('synchronize', ...args) if (statusCode === 200) { return items @@ -85,11 +85,11 @@ describe('api', function () { cache.cache.resetTicketCache() cache.initialize({ projects: { - store: createStore(fixtures.projects.list()) + store: createStore(fixtures.projects.list()), }, shoots: { - store: createStore(fixtures.shoots.list()) - } + store: createStore(fixtures.shoots.list()), + }, }) agent = createAgent('io', cache) nsp = agent.io.sockets @@ -104,11 +104,11 @@ describe('api', function () { fixtures.github.createIssue(1, 'foo'), fixtures.github.createIssue(2, 'bar', { comments: 1 }), fixtures.github.createIssue(3, 'foobar'), - fixtures.github.createIssue(4, 'foo', { comments: 1, state: 'closed' }) + fixtures.github.createIssue(4, 'foo', { comments: 1, state: 'closed' }), ]) mockListComments.mockReturnValue([ fixtures.github.createComment(1, 2), - fixtures.github.createComment(2, 4) + fixtures.github.createComment(2, 4), ]) await tickets.loadOpenIssues() }) @@ -121,13 +121,13 @@ describe('api', function () { describe('events', function () { describe('when user is "foo"', () => { const user = fixtures.auth.createUser({ - id: 'foo@example.org' + id: 'foo@example.org', }) let args beforeEach(async () => { socket = await agent.connect({ - cookie: await user.cookie + cookie: await user.cookie, }) }) @@ -136,19 +136,19 @@ describe('api', function () { await subscribe(socket, 'shoots', { namespace: 'garden-foo', name: 'fooShoot' }) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(getRooms(socket, nsp)).toEqual(new Set([ socket.id, - 'shoots;garden-foo/fooShoot' + 'shoots;garden-foo/fooShoot', ])) args = [ socket, nsp.to('shoots;garden-foo/fooShoot'), 'shoots', - { namespace: 'garden-foo', name: 'fooShoot' } + { namespace: 'garden-foo', name: 'fooShoot' }, ] await expect(publishEvent(...args)).resolves.toEqual(args[3]) @@ -156,7 +156,7 @@ describe('api', function () { socket, nsp.to('shoots;garden-foo/barShoot'), 'shoots', - { namespace: 'garden-foo', name: 'barShoot' } + { namespace: 'garden-foo', name: 'barShoot' }, ] await expect(publishEvent(...args)).resolves.toBeUndefined() }) @@ -166,17 +166,17 @@ describe('api', function () { await subscribe(socket, 'shoots', { namespace: 'garden-foo' }) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(getRooms(socket, nsp)).toEqual(new Set([ socket.id, - 'shoots;garden-foo' + 'shoots;garden-foo', ])) await unsubscribe(socket, 'shoots') expect(getRooms(socket, nsp)).toEqual(new Set([ - socket.id + socket.id, ])) }) @@ -187,13 +187,13 @@ describe('api', function () { await subscribe(socket, 'shoots', { namespace: '_all' }) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(getRooms(socket, nsp)).toEqual(new Set([ socket.id, 'shoots;garden-foo', - 'shoots;garden-bar' + 'shoots;garden-bar', ])) }) @@ -204,13 +204,13 @@ describe('api', function () { await subscribe(socket, 'shoots', { namespace: '_all', labelSelector: 'shoot.gardener.cloud/status!=healthy' }) - expect(mockRequest).toBeCalledTimes(3) + expect(mockRequest).toHaveBeenCalledTimes(3) expect(mockRequest.mock.calls).toMatchSnapshot() expect(getRooms(socket, nsp)).toEqual(new Set([ socket.id, 'shoots:unhealthy;garden-foo', - 'shoots:unhealthy;garden-bar' + 'shoots:unhealthy;garden-bar', ])) }) @@ -220,7 +220,7 @@ describe('api', function () { await expect(subscribe(socket, 'shoots', { namespace: 'garden-baz' })).rejects.toEqual(expect.objectContaining({ name: 'ForbiddenError', statusCode: 403, - message: 'Insufficient authorization for shoot subscription' + message: 'Insufficient authorization for shoot subscription', })) }) @@ -232,7 +232,7 @@ describe('api', function () { await expect(subscribe(socket, 'shoots', { namespace: '_all' })).rejects.toEqual(expect.objectContaining({ name: 'ForbiddenError', statusCode: 403, - message: 'Insufficient authorization for shoot subscription' + message: 'Insufficient authorization for shoot subscription', })) }) @@ -240,7 +240,7 @@ describe('api', function () { await expect(subscribe(socket, 'baz')).rejects.toEqual(expect.objectContaining({ name: 'TypeError', statusCode: 500, - message: 'Invalid subscription type - baz' + message: 'Invalid subscription type - baz', })) }) @@ -248,19 +248,19 @@ describe('api', function () { await expect(unsubscribe(socket, 'baz')).rejects.toEqual(expect.objectContaining({ name: 'TypeError', statusCode: 500, - message: 'Invalid subscription type - baz' + message: 'Invalid subscription type - baz', })) }) }) describe('when user is "admin"', () => { const user = fixtures.auth.createUser({ - id: 'admin@example.org' + id: 'admin@example.org', }) beforeEach(async () => { socket = await agent.connect({ - cookie: await user.cookie + cookie: await user.cookie, }) }) @@ -269,12 +269,12 @@ describe('api', function () { await subscribe(socket, 'shoots', { namespace: 'garden-foo', name: 'fooShoot' }) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(getRooms(socket, nsp)).toEqual(new Set([ socket.id, - 'shoots;garden-foo/fooShoot' + 'shoots;garden-foo/fooShoot', ])) const items = await synchronize(socket, 'shoots', [1, 2]) @@ -286,12 +286,12 @@ describe('api', function () { await subscribe(socket, 'shoots', { namespace: 'garden-foo' }) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(getRooms(socket, nsp)).toEqual(new Set([ socket.id, - 'shoots;garden-foo' + 'shoots;garden-foo', ])) const items = await synchronize(socket, 'shoots', [1, 4]) @@ -303,12 +303,12 @@ describe('api', function () { await subscribe(socket, 'shoots', { namespace: '_all' }) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(getRooms(socket, nsp)).toEqual(new Set([ socket.id, - 'shoots:admin' + 'shoots:admin', ])) const items = await synchronize(socket, 'shoots', [1, 4]) @@ -320,12 +320,12 @@ describe('api', function () { await subscribe(socket, 'shoots', { namespace: '_all', labelSelector: 'shoot.gardener.cloud/status!=healthy' }) - expect(mockRequest).toBeCalledTimes(1) + expect(mockRequest).toHaveBeenCalledTimes(1) expect(mockRequest.mock.calls).toMatchSnapshot() expect(getRooms(socket, nsp)).toEqual(new Set([ socket.id, - 'shoots:unhealthy:admin' + 'shoots:unhealthy:admin', ])) }) @@ -350,7 +350,7 @@ describe('api', function () { const exp = timestamp - 30 const user = fixtures.auth.createUser({ id: 'baz@example.org', - exp + exp, }) const cookie = await user.cookie await expect(agent.connect({ cookie })).rejects.toEqual(expect.objectContaining({ @@ -358,8 +358,8 @@ describe('api', function () { message: 'jwt expired', data: { statusCode: 401, - code: 'ERR_JWT_TOKEN_EXPIRED' - } + code: 'ERR_JWT_TOKEN_EXPIRED', + }, })) }) @@ -369,7 +369,7 @@ describe('api', function () { const user = fixtures.auth.createUser({ id: 'baz@example.org', rti, - refresh_at: refreshAt + refresh_at: refreshAt, }) const cookie = await user.cookie await expect(agent.connect({ cookie })).rejects.toEqual(expect.objectContaining({ @@ -379,8 +379,8 @@ describe('api', function () { statusCode: 401, code: 'ERR_JWT_TOKEN_REFRESH_REQUIRED', rti, - exp: refreshAt - } + exp: refreshAt, + }, })) }) }) @@ -402,20 +402,20 @@ describe('api', function () { const options = { id: 'baz@example.org', rti: 'abcdefg', - refresh_at: Math.ceil(Date.now() / 1000) + 4 + refresh_at: Math.ceil(Date.now() / 1000) + 4, } const user = fixtures.auth.createUser(options) socket = await agent.connect({ - cookie: await user.cookie + cookie: await user.cookie, }) - expect(mockSetDisconnectTimeout).toBeCalledTimes(1) + expect(mockSetDisconnectTimeout).toHaveBeenCalledTimes(1) expect(mockSetDisconnectTimeout.mock.calls[0]).toEqual([ expect.objectContaining({ data: { - user: expect.objectContaining(options) - } + user: expect.objectContaining(options), + }, }), - expect.toBeWithinRange(0, 5000) + expect.toBeWithinRange(0, 5000), ]) await expect(pEvent(socket, 'disconnect')).resolves.toEqual('io server disconnect') }) diff --git a/backend/test/acceptance/openapi.spec.js b/backend/test/acceptance/openapi.spec.js index ef86e909fe..2fa103afcd 100644 --- a/backend/test/acceptance/openapi.spec.js +++ b/backend/test/acceptance/openapi.spec.js @@ -31,8 +31,8 @@ describe('openapi', function () { const shootDefinitions = { 'com.github.gardener.gardener.pkg.apis.core.v1beta1.Shoot': { - type: 'object' - } + type: 'object', + }, } mockRequest.mockImplementationOnce(fixtures.auth.mocks.reviewSelfSubjectAccess()) @@ -41,10 +41,10 @@ describe('openapi', function () { schemas: { ...shootDefinitions, foo: { - type: 'object' - } - } - } + type: 'object', + }, + }, + }, }) const dereferenceStub = jest.spyOn(SwaggerParser, 'dereference').mockImplementation(obj => obj) @@ -54,13 +54,13 @@ describe('openapi', function () { .expect('content-type', /json/) .expect(200) - expect(mockRequest).toBeCalledTimes(2) + expect(mockRequest).toHaveBeenCalledTimes(2) expect(mockRequest.mock.calls[0]).toEqual([ { ...pick(fixtures.kube, [':scheme', ':authority']), authorization: `Bearer ${await user.bearer}`, ':method': 'post', - ':path': '/apis/authorization.k8s.io/v1/selfsubjectaccessreviews' + ':path': '/apis/authorization.k8s.io/v1/selfsubjectaccessreviews', }, { apiVersion: 'authorization.k8s.io/v1', @@ -68,18 +68,18 @@ describe('openapi', function () { spec: expect.objectContaining({ nonResourceAttributes: { verb: 'get', - path: '/openapi/v3' - } - }) - } + path: '/openapi/v3', + }, + }), + }, ]) expect(mockRequest.mock.calls[1]).toEqual([{ ...pick(fixtures.kube, [':scheme', ':authority', 'authorization']), ':method': 'get', - ':path': '/openapi/v3/apis/core.gardener.cloud/v1beta1' + ':path': '/openapi/v3/apis/core.gardener.cloud/v1beta1', }]) - expect(dereferenceStub).toBeCalledTimes(1) + expect(dereferenceStub).toHaveBeenCalledTimes(1) expect(res.body).toEqual(shootDefinitions) }) }) diff --git a/backend/test/acceptance/security.spec.js b/backend/test/acceptance/security.spec.js index 80b18b0f9c..3c5b5a41e0 100644 --- a/backend/test/acceptance/security.spec.js +++ b/backend/test/acceptance/security.spec.js @@ -17,7 +17,7 @@ describe('security', function () { expect(client[custom.http_options]()).toMatchObject({ followRedirect: false, rejectUnauthorized, - ca + ca, }) expect(client[custom.clock_tolerance]).toBe(42) }) diff --git a/backend/test/acceptance/webhook.spec.js b/backend/test/acceptance/webhook.spec.js index 8a923dcd20..6a958985e1 100644 --- a/backend/test/acceptance/webhook.spec.js +++ b/backend/test/acceptance/webhook.spec.js @@ -33,7 +33,7 @@ describe('github', function () { describe('#loadOpenIssues', () => { it('should initialize the cache with all open issues', async () => { - expect(octokit.paginate).toBeCalledTimes(1) + expect(octokit.paginate).toHaveBeenCalledTimes(1) const issues = cache.getIssues() expect(issues).toHaveLength(3) @@ -76,15 +76,15 @@ describe('github', function () { .send(body) .expect(204) - expect(mockRequest).toBeCalledTimes(1) - expect(mockRequest).toBeCalledWith( + expect(mockRequest).toHaveBeenCalledTimes(1) + expect(mockRequest).toHaveBeenCalledWith( expect.anything(), { spec: { holderIdentity: fixtures.env.POD_NAME, - renewTime: microDateStr - } - } + renewTime: microDateStr, + }, + }, ) }) }) @@ -100,7 +100,7 @@ describe('github', function () { .send(body) .expect(422) - expect(mockRequest).toBeCalledTimes(0) + expect(mockRequest).toHaveBeenCalledTimes(0) }) it('should error if wrong HTTP method is used', async () => { @@ -117,7 +117,7 @@ describe('github', function () { expect(res.headers.allow).toEqual('POST') }) - expect(mockRequest).toBeCalledTimes(0) + expect(mockRequest).toHaveBeenCalledTimes(0) }) }) }) diff --git a/backend/test/cache.spec.js b/backend/test/cache.spec.js index 9f645f56e4..bd78c462d3 100644 --- a/backend/test/cache.spec.js +++ b/backend/test/cache.spec.js @@ -21,10 +21,10 @@ describe('cache', function () { const a = { store: { id: 1 } } const b = { store: { id: 2 } } cache.initialize({ a, b }) - expect(stub).toBeCalledTimes(2) + expect(stub).toHaveBeenCalledTimes(2) expect(stub.mock.calls).toEqual([ ['a', { id: 1 }], - ['b', { id: 2 }] + ['b', { id: 2 }], ]) }) @@ -32,34 +32,34 @@ describe('cache', function () { const list = [] const stub = jest.spyOn(internalCache, 'getCloudProfiles').mockReturnValue(list) expect(cache.getCloudProfiles()).toBe(list) - expect(stub).toBeCalledTimes(1) + expect(stub).toHaveBeenCalledTimes(1) }) it('should dispatch "getQuotas" to internal cache', function () { const list = [] const stub = jest.spyOn(internalCache, 'getQuotas').mockReturnValue(list) expect(cache.getQuotas()).toBe(list) - expect(stub).toBeCalledTimes(1) + expect(stub).toHaveBeenCalledTimes(1) }) it('should dispatch "getSeeds" to internal cache', function () { const list = [] const stub = jest.spyOn(internalCache, 'getSeeds').mockReturnValue(list) expect(cache.getSeeds()).toBe(list) - expect(stub).toBeCalledTimes(1) + expect(stub).toHaveBeenCalledTimes(1) }) it('should dispatch "getProjects" to internal cache', function () { const list = [] const stub = jest.spyOn(internalCache, 'getProjects').mockReturnValue(list) expect(cache.getProjects()).toBe(list) - expect(stub).toBeCalledTimes(1) + expect(stub).toHaveBeenCalledTimes(1) }) it('should dispatch "getShoots" to internal cache', function () { const list = [ { metadata: { uid: 1, namespace: 'foo' } }, - { metadata: { uid: 2, namespace: 'bar' } } + { metadata: { uid: 2, namespace: 'bar' } }, ] const store = new Store() store.replace(list) @@ -89,14 +89,14 @@ describe('cache', function () { const list = [] const stub = jest.spyOn(internalCache, 'getControllerRegistrations').mockReturnValue(list) expect(cache.getControllerRegistrations()).toBe(list) - expect(stub).toBeCalledTimes(1) + expect(stub).toHaveBeenCalledTimes(1) }) it('should dispatch "getResourceQuotas" to internal cache', function () { const list = [] const stub = jest.spyOn(internalCache, 'getResourceQuotas').mockReturnValue(list) expect(cache.getResourceQuotas()).toBe(list) - expect(stub).toBeCalledTimes(1) + expect(stub).toHaveBeenCalledTimes(1) }) describe('Cache', function () { diff --git a/backend/test/cache.tickets.spec.js b/backend/test/cache.tickets.spec.js index 5bc294ba58..4c5f174610 100644 --- a/backend/test/cache.tickets.spec.js +++ b/backend/test/cache.tickets.spec.js @@ -21,8 +21,8 @@ function createIssue ({ number, name = 'foo', projectName = 'test', updatedAt }) number, updated_at: updatedAt, name, - projectName - } + projectName, + }, } } @@ -32,8 +32,8 @@ function createComment ({ number, id, updatedAt }) { metadata: { number, id, - updated_at: updatedAt - } + updated_at: updatedAt, + }, } } @@ -81,14 +81,14 @@ describe('cache', function () { describe('#getIssues', function () { it('should return all issues', function () { expect(cache.getIssues()).toEqual(allIssues) - expect(emitSpy).not.toBeCalled() + expect(emitSpy).not.toHaveBeenCalled() }) }) describe('#getIssue', function () { it('should return the first issue', function () { expect(cache.getIssue(1)).toBe(firstIssue) - expect(emitSpy).not.toBeCalled() + expect(emitSpy).not.toHaveBeenCalled() }) }) @@ -97,14 +97,14 @@ describe('cache', function () { const issue = _ .chain(firstIssue) .cloneDeep() - .set('metadata.updated_at', timestamp(+60)) + .set(['metadata', 'updated_at'], timestamp(+60)) .value() cache.addOrUpdateIssue({ issue }) expect(emitSpy).toHaveBeenCalledTimes(1) expect(emitSpy.mock.calls[0]).toEqual(['issue', { kind: 'issue', type: 'MODIFIED', - object: issue + object: issue, }]) }) @@ -112,10 +112,10 @@ describe('cache', function () { const issue = _ .chain(firstIssue) .cloneDeep() - .set('metadata.updated_at', timestamp(-60)) + .set(['metadata', 'updated_at'], timestamp(-60)) .value() cache.addOrUpdateIssue({ issue }) - expect(emitSpy).not.toBeCalled() + expect(emitSpy).not.toHaveBeenCalled() }) }) @@ -126,12 +126,12 @@ describe('cache', function () { expect(emitSpy.mock.calls[0]).toEqual(['issue', { kind: 'issue', type: 'DELETED', - object: firstIssue + object: firstIssue, }]) expect(emitSpy.mock.calls[1]).toEqual(['comment', { kind: 'comment', type: 'DELETED', - object: firstComment + object: firstComment, }]) }) }) @@ -141,7 +141,7 @@ describe('cache', function () { const comment = _ .chain(firstComment) .cloneDeep() - .set('metadata.updated_at', timestamp(+60)) + .set(['metadata', 'updated_at'], timestamp(+60)) .value() const issueNumber = comment.metadata.number cache.addOrUpdateComment({ issueNumber, comment }) @@ -149,7 +149,7 @@ describe('cache', function () { expect(emitSpy.mock.calls[0]).toEqual(['comment', { kind: 'comment', type: 'MODIFIED', - object: comment + object: comment, }]) }) @@ -157,11 +157,11 @@ describe('cache', function () { const comment = _ .chain(firstComment) .cloneDeep() - .set('metadata.updated_at', timestamp(-60)) + .set(['metadata', 'updated_at'], timestamp(-60)) .value() const issueNumber = comment.metadata.number cache.addOrUpdateComment({ issueNumber, comment }) - expect(emitSpy).not.toBeCalled() + expect(emitSpy).not.toHaveBeenCalled() }) }) @@ -172,7 +172,7 @@ describe('cache', function () { expect(emitSpy.mock.calls[0]).toEqual(['comment', { kind: 'comment', type: 'DELETED', - object: firstComment + object: firstComment, }]) }) }) @@ -181,7 +181,7 @@ describe('cache', function () { it('should return the issueNumbers for name "foo" and project "test"', function () { const numbers = cache.getIssueNumbersForNameAndProjectName({ projectName: 'test', name: 'foo' }) expect(numbers).toEqual([1, 2]) - expect(emitSpy).not.toBeCalled() + expect(emitSpy).not.toHaveBeenCalled() }) }) @@ -190,7 +190,7 @@ describe('cache', function () { const comments = cache.getCommentsForIssue({ issueNumber: 1 }) expect(comments).toHaveLength(1) expect(comments[0]).toEqual(firstComment) - expect(emitSpy).not.toBeCalled() + expect(emitSpy).not.toHaveBeenCalled() }) }) }) diff --git a/backend/test/config.spec.js b/backend/test/config.spec.js index 3b855df08e..21c8dd2c5b 100644 --- a/backend/test/config.spec.js +++ b/backend/test/config.spec.js @@ -27,7 +27,7 @@ describe('config', function () { it('should return the defaults for the test environment', function () { expect(originalGardener.readConfig(path)).toEqual({ port: 1234 }) - expect(readFileSyncStub).toBeCalledTimes(1) + expect(readFileSyncStub).toHaveBeenCalledTimes(1) expect(readFileSyncStub.mock.calls[0]).toEqual([path, 'utf8']) }) }) @@ -40,7 +40,7 @@ describe('config', function () { isProd: false, logLevel: 'debug', port: 3030, - metricsPort: 9050 + metricsPort: 9050, }) }) }) @@ -71,7 +71,7 @@ describe('config', function () { describe('#loadConfig', function () { const environmentVariables = { API_SERVER_URL: 'apiServerUrl', - SESSION_SECRET: 'secret' + SESSION_SECRET: 'secret', } let readFileSyncSpy @@ -87,7 +87,7 @@ describe('config', function () { it('should return the config in test environment', function () { const env = Object.assign({ - NODE_ENV: 'test' + NODE_ENV: 'test', }, environmentVariables) const config = gardener.loadConfig(undefined, { env }) @@ -97,7 +97,7 @@ describe('config', function () { it('should return the config in production environment', function () { const env = Object.assign({ - NODE_ENV: 'production' + NODE_ENV: 'production', }, environmentVariables) const filename = '/etc/gardener/1/config.yaml' @@ -112,7 +112,7 @@ describe('config', function () { const env = Object.assign({ NODE_ENV: 'production', PORT: '3456', - LOG_LEVEL: 'error' + LOG_LEVEL: 'error', }, environmentVariables) const filename = '/etc/gardener/2/config.yaml' @@ -125,7 +125,7 @@ describe('config', function () { it('should return the config in development environment', function () { const env = Object.assign({ - NODE_ENV: 'development' + NODE_ENV: 'development', }, environmentVariables) const filename = '/etc/gardener/3/config.yaml' @@ -140,7 +140,7 @@ describe('config', function () { const env = Object.assign({ OIDC_CLIENT_ID: 'client_id', OIDC_CLIENT_SECRET: 'client_secret', - OIDC_CA: 'ca' + OIDC_CA: 'ca', }, environmentVariables) const filename = '/etc/gardener/4/config.yaml' @@ -157,7 +157,7 @@ describe('config', function () { '/etc/gardener-dashboard/secrets/oidc/client_id': 'client_id_from_file', '/etc/gardener-dashboard/secrets/oidc/client_secret': 'client_secret_from_file', '/etc/gardener-dashboard/secrets/github/authentication.appId': '12345', - '/etc/gardener-dashboard/secrets/github/authentication.installationId': '67890' + '/etc/gardener-dashboard/secrets/github/authentication.installationId': '67890', } readFileSyncSpy.mockImplementation(filePath => { diff --git a/backend/test/docker.spec.js b/backend/test/docker.spec.js index 5ab837ef8f..c597e168d8 100644 --- a/backend/test/docker.spec.js +++ b/backend/test/docker.spec.js @@ -16,11 +16,11 @@ const { DockerfileParser } = require('dockerfile-ast') /* Nodejs release schedule (see https://nodejs.org/en/about/releases/) */ const activeNodeReleases = { 20: { - endOfLife: new Date('2026-04-30T23:59:59Z') + endOfLife: new Date('2026-04-30T23:59:59Z'), }, 22: { - endOfLife: new Date('2027-04-30T23:59:59Z') - } + endOfLife: new Date('2027-04-30T23:59:59Z'), + }, } async function getDashboardDockerfile () { diff --git a/backend/test/github.spec.js b/backend/test/github.spec.js index 2bf7d2d03d..6feaee5c37 100644 --- a/backend/test/github.spec.js +++ b/backend/test/github.spec.js @@ -71,36 +71,36 @@ describe('github', () => { const expectedBody = { spec: { holderIdentity, - renewTime: microDateStr - } + renewTime: microDateStr, + }, } - expect(mergePatchStub).toBeCalledWith(namespace, leaseName, expectedBody) + expect(mergePatchStub).toHaveBeenCalledWith(namespace, leaseName, expectedBody) }) it('should update the lease object for an issue_comment event', async () => { const expectedBody = { spec: { holderIdentity, - renewTime: microDateStr - } + renewTime: microDateStr, + }, } await handleGithubEvent('issue_comment', { comment: { updated_at: dateStr } }) - expect(mergePatchStub).toBeCalledWith(namespace, leaseName, expectedBody) + expect(mergePatchStub).toHaveBeenCalledWith(namespace, leaseName, expectedBody) }) it('should rethrow errors from underlying kube client', async () => { const expectedBody = { spec: { holderIdentity, - renewTime: microDateStr - } + renewTime: microDateStr, + }, } mergePatchStub.mockRejectedValueOnce(createError(403, 'Forbidden')) await expect(handleGithubEvent('issue_comment', { comment: { updated_at: dateStr } })).rejects.toThrow(InternalServerError) - expect(mergePatchStub).toBeCalledWith(namespace, leaseName, expectedBody) + expect(mergePatchStub).toHaveBeenCalledWith(namespace, leaseName, expectedBody) }) }) @@ -115,14 +115,14 @@ describe('github', () => { const expectedBody = { metadata: { - name: leaseName + name: leaseName, }, spec: { holderIdentity, - renewTime: microDateStr - } + renewTime: microDateStr, + }, } - expect(createStub).toBeCalledWith(namespace, expectedBody) + expect(createStub).toHaveBeenCalledWith(namespace, expectedBody) }) }) }) @@ -167,7 +167,7 @@ describe('github', () => { it('should fail with an assertion error', () => { expect(() => verify(req, res, body)).toThrow(new AssertionError({ - message: 'Property \'gitHub.webhookSecret\' not configured on dashboard backend' + message: 'Property \'gitHub.webhookSecret\' not configured on dashboard backend', })) }) }) @@ -195,7 +195,7 @@ describe('github', () => { syncManagerOpts = { signal: abortController.signal, interval: 10_000, - throttle: 2_000 + throttle: 2_000, } }) @@ -213,8 +213,8 @@ describe('github', () => { // eslint-disable-next-line no-unused-vars const syncManager = new SyncManager(loadTicketsStub, syncManagerOpts) - expect(signal.addEventListener).toBeCalledTimes(1) - expect(signal.addEventListener).toBeCalledWith('abort', expect.any(Function), { once: true }) + expect(signal.addEventListener).toHaveBeenCalledTimes(1) + expect(signal.addEventListener).toHaveBeenCalledWith('abort', expect.any(Function), { once: true }) }) it('should be "ready" after first successful sync', async () => { @@ -222,7 +222,7 @@ describe('github', () => { syncManager.sync() await advanceTimersAndFlushPromises(0) - expect(loadTicketsStub).toBeCalledTimes(1) + expect(loadTicketsStub).toHaveBeenCalledTimes(1) await advanceTimersAndFlushPromises(loadTicketsDuration) expect(syncManager.ready).toEqual(true) }) @@ -237,7 +237,7 @@ describe('github', () => { jest.advanceTimersByTime(loadTicketsDuration) await flushPromises() expect(syncManager.ready).toEqual(false) - expect(logger.error).toBeCalledTimes(1) + expect(logger.error).toHaveBeenCalledTimes(1) }) describe('interval loading of tickets', () => { @@ -250,13 +250,13 @@ describe('github', () => { syncManager.sync() await advanceTimersAndFlushPromises(loadTicketsDuration) - expect(loadTicketsStub).toBeCalledTimes(1) + expect(loadTicketsStub).toHaveBeenCalledTimes(1) await advanceTimersAndFlushPromises(syncManagerOpts.interval) // When the interval is over a new timeout - in this case - with delay of 0 ms is scheduled. // jest.advanceTimersByTime(0) does not trigger setTimeout(..., 0). So use 1(ms) here. await advanceTimersAndFlushPromises(1) - expect(loadTicketsStub).toBeCalledTimes(2) + expect(loadTicketsStub).toHaveBeenCalledTimes(2) }) it('interval should be reset upon sync call', async () => { @@ -265,21 +265,21 @@ describe('github', () => { syncManager.sync() await advanceTimersAndFlushPromises(loadTicketsDuration) - expect(loadTicketsStub).toBeCalledTimes(1) + expect(loadTicketsStub).toHaveBeenCalledTimes(1) // reset interval by calling sync manually await advanceTimersAndFlushPromises(incompleteInterval) syncManager.sync() await advanceTimersAndFlushPromises(loadTicketsDuration) - expect(loadTicketsStub).toBeCalledTimes(2) + expect(loadTicketsStub).toHaveBeenCalledTimes(2) await advanceTimersAndFlushPromises(incompleteInterval) - expect(loadTicketsStub).toBeCalledTimes(2) + expect(loadTicketsStub).toHaveBeenCalledTimes(2) // advance timers so that one full sync interval has passed since last sync()-call await advanceTimersAndFlushPromises(syncManagerOpts.interval - incompleteInterval) await advanceTimersAndFlushPromises(1) - expect(loadTicketsStub).toBeCalledTimes(3) + expect(loadTicketsStub).toHaveBeenCalledTimes(3) }) it('should stop interval loading on abort', async () => { @@ -287,12 +287,12 @@ describe('github', () => { syncManager.sync() await advanceTimersAndFlushPromises(loadTicketsDuration) - expect(loadTicketsStub).toBeCalledTimes(1) + expect(loadTicketsStub).toHaveBeenCalledTimes(1) abortController.abort() await advanceTimersAndFlushPromises(syncManagerOpts.interval * 2) - expect(loadTicketsStub).toBeCalledTimes(1) + expect(loadTicketsStub).toHaveBeenCalledTimes(1) }) }) @@ -306,12 +306,12 @@ describe('github', () => { syncManager.sync() await advanceTimersAndFlushPromises(1) - expect(loadTicketsStub).toBeCalledTimes(1) + expect(loadTicketsStub).toHaveBeenCalledTimes(1) syncManager.sync() // still within the throttle period after which it should execute await advanceTimersAndFlushPromises(syncManagerOpts.throttle) - expect(loadTicketsStub).toBeCalledTimes(2) + expect(loadTicketsStub).toHaveBeenCalledTimes(2) }) it('should run multiple loadTicket invocations in parallel', async () => { @@ -323,7 +323,7 @@ describe('github', () => { await advanceTimersAndFlushPromises(1) } - expect(loadTicketsStub).toBeCalledTimes(3) + expect(loadTicketsStub).toHaveBeenCalledTimes(3) }) it('should idle if no new or pending sync calls occure', async () => { @@ -332,11 +332,11 @@ describe('github', () => { syncManager.sync() await advanceTimersAndFlushPromises(syncManagerOpts.throttle) - expect(loadTicketsStub).toBeCalledTimes(1) + expect(loadTicketsStub).toHaveBeenCalledTimes(1) jest.runAllTimers() await flushPromises() - expect(loadTicketsStub).toBeCalledTimes(1) + expect(loadTicketsStub).toHaveBeenCalledTimes(1) }) it('should not execute pending throttled loads after abort', async () => { @@ -345,12 +345,12 @@ describe('github', () => { syncManager.sync() syncManager.sync() await advanceTimersAndFlushPromises(loadTicketsDuration) - expect(loadTicketsStub).toBeCalledTimes(1) + expect(loadTicketsStub).toHaveBeenCalledTimes(1) abortController.abort() await advanceTimersAndFlushPromises(syncManagerOpts.throttle - loadTicketsDuration) - expect(loadTicketsStub).toBeCalledTimes(1) + expect(loadTicketsStub).toHaveBeenCalledTimes(1) }) }) }) @@ -364,7 +364,7 @@ describe('github', () => { expect(mockOctokitPaginateGraphQL).toHaveBeenCalledTimes(1) expect(mockOctokitPaginateGraphQL.mock.calls[0]).toEqual([ expect.stringMatching(/^query paginate\(\$cursor: String, \$owner: String!, \$repo: String!, \$number: Int!\)/), - { owner, repo, number } + { owner, repo, number }, ]) expect(comments).toHaveLength(1) expect(comments[0].body).toBe('This is comment 2 for issue #2') diff --git a/backend/test/healthz.spec.js b/backend/test/healthz.spec.js index e87e7f6d45..d38762490f 100644 --- a/backend/test/healthz.spec.js +++ b/backend/test/healthz.spec.js @@ -19,23 +19,23 @@ describe('healthz', function () { it('should successfully check transitive healthz', async function () { await healthCheck(true) - expect(healthz.get).toBeCalledTimes(1) + expect(healthz.get).toHaveBeenCalledTimes(1) }) it('should successfully check non-transitive healthz', async function () { await healthCheck(false) - expect(healthz.get).not.toBeCalled() + expect(healthz.get).not.toHaveBeenCalled() }) it('should throw a HTTP Error', async function () { healthz.get.mockRejectedValue(createHttpError({ statusCode: 500, body: 'body' })) await expect(healthCheck(true)).rejects.toThrow(/^Kubernetes apiserver is not healthy.*\(Status code: 500\)/) - expect(healthz.get).toBeCalledTimes(1) + expect(healthz.get).toHaveBeenCalledTimes(1) }) it('should throw an Error', async function () { healthz.get.mockRejectedValue(new Error('Failed')) await expect(healthCheck(true)).rejects.toThrow(/^Could not reach Kubernetes apiserver/) - expect(healthz.get).toBeCalledTimes(1) + expect(healthz.get).toHaveBeenCalledTimes(1) }) }) diff --git a/backend/test/hooks.spec.js b/backend/test/hooks.spec.js index a35a9479f7..4c180f14cf 100644 --- a/backend/test/hooks.spec.js +++ b/backend/test/hooks.spec.js @@ -44,7 +44,7 @@ describe('hooks', () => { ['core.gardener.cloud', 'quotas'], ['core.gardener.cloud', 'shoots'], ['core', 'resourcequotas'], - ['coordination.k8s.io', 'leases'] + ['coordination.k8s.io', 'leases'], ] for (const [apiGroup, name] of resources) { @@ -52,9 +52,9 @@ describe('hooks', () => { const informer = { names: { - plural: name + plural: name, }, - mockFn: jest.fn(() => informer) + mockFn: jest.fn(() => informer), } observable.informerAllNamespaces = informer.mockFn @@ -64,7 +64,7 @@ describe('hooks', () => { for (const [, name] of resources) { const { mockFn, names } = informers[name] expect(names.plural).toBe(name) - expect(mockFn).toBeCalledTimes(1) + expect(mockFn).toHaveBeenCalledTimes(1) } }) @@ -72,15 +72,15 @@ describe('hooks', () => { // initial state expect(hooks.io).toBeUndefined() await hooks.cleanup() - expect(hooks.ac.abort).toBeCalledTimes(1) + expect(hooks.ac.abort).toHaveBeenCalledTimes(1) hooks.ac.abort.mockClear() // listening state hooks.io = { - close: jest.fn(callback => setImmediate(callback)) + close: jest.fn(callback => setImmediate(callback)), } await hooks.cleanup() - expect(hooks.ac.abort).toBeCalledTimes(1) - expect(hooks.io.close).toBeCalledTimes(1) + expect(hooks.ac.abort).toHaveBeenCalledTimes(1) + expect(hooks.io.close).toHaveBeenCalledTimes(1) expect(hooks.io.close.mock.calls[0]).toEqual([expect.any(Function)]) }) @@ -96,15 +96,15 @@ describe('hooks', () => { leases: { run: jest.fn(), store: { - untilHasSynced: Promise.resolve('leases') - } + untilHasSynced: Promise.resolve('leases'), + }, }, shoots: { run: jest.fn(), store: { - untilHasSynced: Promise.resolve('shoots') - } - } + untilHasSynced: Promise.resolve('shoots'), + }, + }, } hooks.constructor.createInformers = mockCreateInformers = jest.fn(() => informers) cache.initialize = jest.fn() @@ -115,25 +115,25 @@ describe('hooks', () => { it('should create and run informers, create io instance and initialize cache and watches', async function () { await expect(hooks.beforeListen(server)).resolves.toEqual(['leases', 'shoots']) - expect(mockCreateInformers).toBeCalledTimes(1) + expect(mockCreateInformers).toHaveBeenCalledTimes(1) expect(mockCreateInformers.mock.calls[0]).toHaveLength(1) expect(mockCreateInformers.mock.calls[0][0]).toBe(hooks.client) for (const informer of Object.values(informers)) { - expect(informer.run).toBeCalledTimes(1) + expect(informer.run).toHaveBeenCalledTimes(1) expect(informer.run.mock.calls[0]).toHaveLength(1) expect(informer.run.mock.calls[0][0]).toBe(hooks.ac.signal) } - expect(cache.initialize).toBeCalledTimes(1) + expect(cache.initialize).toHaveBeenCalledTimes(1) expect(cache.initialize.mock.calls[0]).toHaveLength(1) expect(cache.initialize.mock.calls[0][0]).toBe(informers) - expect(io).toBeCalledTimes(1) + expect(io).toHaveBeenCalledTimes(1) expect(io.mock.calls[0]).toEqual([server, cache]) for (const [key, watch] of Object.entries(watches)) { - expect(watch).toBeCalledTimes(1) + expect(watch).toHaveBeenCalledTimes(1) expect(watch.mock.calls[0]).toHaveLength(key === 'leases' ? 3 : 2) expect(watch.mock.calls[0][0]).toBe(ioInstance) expect(watch.mock.calls[0][1]).toBe(informers[key]) diff --git a/backend/test/security.spec.js b/backend/test/security.spec.js index b619027b8a..961a9fd112 100644 --- a/backend/test/security.spec.js +++ b/backend/test/security.spec.js @@ -126,11 +126,11 @@ describe('security', function () { authorization_endpoint: issuerUrl + '/oauth2/authorize', token_endpoint: issuerUrl + '/oauth2/token', jwks_uri: issuerUrl + '/oauth2/jwks', - code_challenge_methods_supported: ['S256', 'plain'] + code_challenge_methods_supported: ['S256', 'plain'], }) client = new issuer.Client({ client_id: config.oidc.client_id, - client_secret: config.oidc.client_secret + client_secret: config.oidc.client_secret, }) mockGetIssuerClient = jest.spyOn(security, 'getIssuerClient').mockResolvedValue(client) mockRefresh = jest.spyOn(client, 'refresh').mockImplementation(async () => { @@ -139,7 +139,7 @@ describe('security', function () { return { id_token: idToken, expires_at: iat + expiresIn, - refresh_token: 'new-refresh-token' + refresh_token: 'new-refresh-token', } }) mockState = jest.spyOn(openidClient.generators, 'state').mockReturnValue('state') @@ -157,34 +157,34 @@ describe('security', function () { const scope = 'oidc email groups profile offline_access' mockSecurity({ oidc: { scope, usePKCE: true } }) const query = { - redirectUrl: redirectUrl.toString() + redirectUrl: redirectUrl.toString(), } const req = { query } const res = { - cookie: jest.fn() + cookie: jest.fn(), } const authorizationUrl = await security.authorizationUrl(req, res) const url = new URL(authorizationUrl) - expect(mockGetIssuerClient).toBeCalledTimes(1) - expect(mockState).toBeCalledTimes(1) - expect(mockCodeVerifier).toBeCalledTimes(1) - expect(mockCodeChallenge).toBeCalledTimes(1) + expect(mockGetIssuerClient).toHaveBeenCalledTimes(1) + expect(mockState).toHaveBeenCalledTimes(1) + expect(mockCodeVerifier).toHaveBeenCalledTimes(1) + expect(mockCodeChallenge).toHaveBeenCalledTimes(1) expect(mockCodeChallenge.mock.calls[0]).toEqual(['code-verifier']) - expect(res.cookie).toBeCalledTimes(2) + expect(res.cookie).toHaveBeenCalledTimes(2) expect(res.cookie.mock.calls).toEqual([ [ '__Host-gStt', { redirectOrigin: redirectUrl.origin, redirectPath: redirectUrl.pathname, - state: 'state' + state: 'state', }, { httpOnly: true, maxAge: 180000, sameSite: 'Lax', - secure: true - } + secure: true, + }, ], [ '__Host-gCdVrfr', @@ -193,9 +193,9 @@ describe('security', function () { httpOnly: true, maxAge: 180000, sameSite: 'Lax', - secure: true - } - ] + secure: true, + }, + ], ]) expect(url.origin).toBe(config.oidc.issuer) const params = Object.fromEntries(url.searchParams) @@ -206,7 +206,7 @@ describe('security', function () { redirect_uri: redirectUrl.origin + '/auth/callback', state: 'state', code_challenge: 'code-challenge', - code_challenge_method: 'S256' + code_challenge_method: 'S256', })) }) @@ -215,21 +215,21 @@ describe('security', function () { const { COOKIE_HEADER_PAYLOAD, COOKIE_SIGNATURE, - COOKIE_TOKEN + COOKIE_TOKEN, } = security const sub = 'john.doe@example.org' const iat = now() const idTokenPayload = { iat, sub, - exp: iat - 60 + exp: iat - 60, } const accessTokenPayload = { iat, id: sub, exp: iat + 24 * expiresIn, refresh_at: idTokenPayload.exp, - aud: ['gardener'] + aud: ['gardener'], } const idToken = await jose.sign(idTokenPayload) const accessToken = await jose.sign(accessTokenPayload) @@ -238,37 +238,37 @@ describe('security', function () { const encryptedValues = await jose.encrypt([idToken, refreshToken].join(',')) const req = { headers: { - 'x-requested-with': 'XMLHttpRequest' + 'x-requested-with': 'XMLHttpRequest', }, cookies: { [COOKIE_HEADER_PAYLOAD]: [header, payload].join('.'), [COOKIE_SIGNATURE]: signature, - [COOKIE_TOKEN]: encryptedValues - } + [COOKIE_TOKEN]: encryptedValues, + }, } const res = { cookie: jest.fn(), - clearCookie: jest.fn() + clearCookie: jest.fn(), } const user = await security.refreshToken(req, res) - expect(mockGetIssuerClient).toBeCalledTimes(1) - expect(mockRefresh).toBeCalledTimes(1) + expect(mockGetIssuerClient).toHaveBeenCalledTimes(1) + expect(mockRefresh).toHaveBeenCalledTimes(1) expect(mockRefresh.mock.calls[0]).toEqual([refreshToken]) expect(mockRefresh.mock.results[0].value).toBeInstanceOf(Promise) const tokenSet = await mockRefresh.mock.results[0].value expect(tokenSet).toEqual(expect.objectContaining({ id_token: expect.stringMatching(/^[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+$/), expires_at: expect.any(Number), - refresh_token: 'new-refresh-token' + refresh_token: 'new-refresh-token', })) - expect(mockIsAuthenticated).toBeCalledTimes(1) + expect(mockIsAuthenticated).toHaveBeenCalledTimes(1) expect(mockIsAuthenticated.mock.calls[0]).toEqual([{ - token: tokenSet.id_token + token: tokenSet.id_token, }]) - expect(mockIsAdmin).toBeCalledTimes(1) + expect(mockIsAdmin).toHaveBeenCalledTimes(1) expect(mockIsAdmin.mock.calls[0]).toEqual([{ - auth: { bearer: tokenSet.id_token } + auth: { bearer: tokenSet.id_token }, }]) expect(user).toEqual({ iat: expect.toBeWithinRange(iat, iat + 5), @@ -279,27 +279,27 @@ describe('security', function () { exp: accessTokenPayload.exp, refresh_at: security.decode(tokenSet.id_token).exp, rti: expect.stringMatching(/^[a-z0-9]{7}$/), - isAdmin: false + isAdmin: false, }) - expect(res.clearCookie).not.toBeCalled() - expect(res.cookie).toBeCalledTimes(3) + expect(res.clearCookie).not.toHaveBeenCalled() + expect(res.cookie).toHaveBeenCalledTimes(3) expect(res.cookie.mock.calls).toEqual([ [ COOKIE_HEADER_PAYLOAD, expect.stringMatching(/^[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+$/), - { secure: true, expires: undefined, sameSite: 'Lax' } + { secure: true, expires: undefined, sameSite: 'Lax' }, ], [ COOKIE_SIGNATURE, expect.stringMatching(/^[a-zA-Z0-9_-]{43}$/), - { secure: true, httpOnly: true, expires: undefined, sameSite: 'Lax' } + { secure: true, httpOnly: true, expires: undefined, sameSite: 'Lax' }, ], [ COOKIE_TOKEN, expect.stringMatching(/^[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+$/), - { secure: true, httpOnly: true, expires: undefined, sameSite: 'Lax' } - ] + { secure: true, httpOnly: true, expires: undefined, sameSite: 'Lax' }, + ], ]) }) }) diff --git a/backend/test/server.spec.js b/backend/test/server.spec.js index ea3f888744..fdf31a511d 100644 --- a/backend/test/server.spec.js +++ b/backend/test/server.spec.js @@ -23,7 +23,7 @@ function createApplication (port, metricsPort) { map.set('healthCheck', jest.fn()) map.set('hooks', { cleanup: jest.fn(() => Promise.resolve()), - beforeListen: jest.fn(() => Promise.resolve()) + beforeListen: jest.fn(() => Promise.resolve()), }) map.set('logger', { log: jest.fn(), @@ -38,7 +38,7 @@ function createApplication (port, metricsPort) { }, info (...args) { this.log('info', ...args) - } + }, }) app.get = Map.prototype.get.bind(map) return app @@ -48,7 +48,7 @@ describe('server', () => { const port = 1234 const metricsPort = 5678 const mockServer = { - listen: jest.fn((_, callback) => setImmediate(callback)) + listen: jest.fn((_, callback) => setImmediate(callback)), } const mockTerminus = {} let app @@ -78,36 +78,36 @@ describe('server', () => { }) it('should create and run the server', async () => { - expect(mockCreateServer).toBeCalledTimes(2) + expect(mockCreateServer).toHaveBeenCalledTimes(2) expect(mockCreateServer.mock.calls[0]).toHaveLength(1) expect(mockCreateServer.mock.calls[0][0]).toBe(app) expect(mockCreateServer.mock.calls[1]).toHaveLength(1) expect(mockCreateServer.mock.calls[1][0]).toBe(metricsApp) - expect(mockCreateTerminus).toBeCalledTimes(1) + expect(mockCreateTerminus).toHaveBeenCalledTimes(1) expect(mockCreateTerminus.mock.calls[0]).toHaveLength(2) expect(mockCreateTerminus.mock.calls[0][0]).toBe(mockServer) const terminusOptions = mockCreateTerminus.mock.calls[0][1] expect(terminusOptions.beforeShutdown).toEqual(expect.any(Function)) expect(terminusOptions.onSignal).toEqual(expect.any(Function)) await server.run() - expect(hooks.beforeListen).toBeCalledTimes(1) + expect(hooks.beforeListen).toHaveBeenCalledTimes(1) expect(hooks.beforeListen.mock.calls[0]).toHaveLength(1) expect(hooks.beforeListen.mock.calls[0][0]).toEqual(mockServer) expect(logger.log.mock.calls).toEqual([ ['info', 'Metrics server listening on port %d', metricsPort], ['debug', 'Before listen hook succeeded after %d ms', expect.any(Number)], - ['info', 'Server listening on port %d', 1234] + ['info', 'Server listening on port %d', 1234], ]) }) it('should initialize terminus', async () => { - expect(terminus.createTerminus).toBeCalledTimes(1) + expect(terminus.createTerminus).toHaveBeenCalledTimes(1) expect(terminus.createTerminus.mock.calls[0]).toHaveLength(2) const { healthChecks, beforeShutdown, onSignal, onShutdown, logger: error } = terminus.createTerminus.mock.calls[0][1] for (const key in healthChecks) { healthChecks[key]() } - expect(healthCheck).toBeCalledTimes(2) + expect(healthCheck).toHaveBeenCalledTimes(2) expect(healthCheck.mock.calls).toEqual([[false], [true]]) global.setTimeout.mockClear() diff --git a/backend/test/services.members.spec.js b/backend/test/services.members.spec.js index 5640145463..aed9c0eb6f 100644 --- a/backend/test/services.members.spec.js +++ b/backend/test/services.members.spec.js @@ -22,14 +22,14 @@ describe('services', function () { name: 'foo@bar.com', role: 'admin', roles: [ - 'owner' - ] + 'owner', + ], }, { apiGroup: 'rbac.authorization.k8s.io', kind: 'User', name: 'mutiple@bar.com', - role: 'admin' + role: 'admin', }, { kind: 'ServiceAccount', @@ -38,8 +38,8 @@ describe('services', function () { role: 'admin', roles: [ 'myrole', - 'viewer' - ] + 'viewer', + ], }, { apiGroup: 'rbac.authorization.k8s.io', @@ -47,20 +47,20 @@ describe('services', function () { name: 'mutiple@bar.com', role: 'admin', roles: [ - 'viewer' - ] + 'viewer', + ], }, { apiGroup: 'rbac.authorization.k8s.io', kind: 'User', name: 'system:serviceaccount:garden-foo:robot-user', - role: 'admin' + role: 'admin', }, { apiGroup: 'rbac.authorization.k8s.io', kind: 'User', name: 'system:serviceaccount:garden-foo:robot-multiple', - role: 'otherrole' + role: 'otherrole', }, { kind: 'ServiceAccount', @@ -68,8 +68,8 @@ describe('services', function () { namespace: 'garden-foo', role: 'admin', roles: [ - 'myrole' - ] + 'myrole', + ], }, { kind: 'ServiceAccount', @@ -77,14 +77,14 @@ describe('services', function () { namespace: 'garden-foo', role: 'myrole', roles: [ - 'viewer' - ] + 'viewer', + ], }, { kind: 'ServiceAccount', name: 'robot-orphaned', namespace: 'garden-foo', - role: 'myrole' + role: 'myrole', }, { kind: 'ServiceAccount', @@ -92,21 +92,21 @@ describe('services', function () { namespace: 'garden-foreign', role: 'myrole', roles: [ - 'viewer' - ] + 'viewer', + ], }, { apiGroup: 'rbac.authorization.k8s.io', kind: 'User', name: 'system:serviceaccount:garden-foreign:robot-foreign-namespace', - role: 'admin' + role: 'admin', }, { apiGroup: 'rbac.authorization.k8s.io', kind: 'User', name: 'system:serviceaccount:garden-other-foreign:robot-other-foreign-namespace', - role: 'otherrole' - } + role: 'otherrole', + }, ] const serviceAccounts = [ @@ -117,9 +117,9 @@ describe('services', function () { creationTimestamp: 'bar-time', annotations: { 'dashboard.gardener.cloud/created-by': 'k8s', - 'dashboard.gardener.cloud/description': 'description' - } - } + 'dashboard.gardener.cloud/description': 'description', + }, + }, }, { metadata: { @@ -127,64 +127,64 @@ describe('services', function () { namespace: 'garden-foo', annotations: { 'dashboard.gardener.cloud/created-by': 'foo', - 'dashboard.gardener.cloud/description': 'description' + 'dashboard.gardener.cloud/description': 'description', }, - creationTimestamp: 'bar-time' - } + creationTimestamp: 'bar-time', + }, }, { metadata: { name: 'robot-user', namespace: 'garden-foo', annotations: { - 'dashboard.gardener.cloud/created-by': 'foo' + 'dashboard.gardener.cloud/created-by': 'foo', }, - creationTimestamp: 'bar-time' - } + creationTimestamp: 'bar-time', + }, }, { metadata: { name: 'robot-multiple', namespace: 'garden-foo', annotations: { - 'dashboard.gardener.cloud/created-by': 'foo' + 'dashboard.gardener.cloud/created-by': 'foo', }, - creationTimestamp: 'bar-time' - } + creationTimestamp: 'bar-time', + }, }, { metadata: { name: 'robot-nomember', namespace: 'garden-foo', annotations: { - 'dashboard.gardener.cloud/created-by': 'foo' + 'dashboard.gardener.cloud/created-by': 'foo', }, - creationTimestamp: 'bar-time' - } + creationTimestamp: 'bar-time', + }, }, { metadata: { name: 'robot-deleted', namespace: 'garden-foo', creationTimestamp: 'bar-time', - deletionTimestamp: 'baz-time' - } - } + deletionTimestamp: 'baz-time', + }, + }, ] const project = { spec: { members: memberSubjects, - namespace: 'garden-foo' + namespace: 'garden-foo', }, metadata: { - name: 'foo' - } + name: 'foo', + }, } const client = { 'core.gardener.cloud': {}, - core: {} + core: {}, } const findObjectFn = (objects) => { @@ -199,22 +199,22 @@ describe('services', function () { beforeEach(function () { client['core.gardener.cloud'].projects = { - mergePatch: jest.fn().mockResolvedValue() + mergePatch: jest.fn().mockResolvedValue(), } client.core.serviceaccounts = { create: jest.fn().mockImplementation((namespace, body) => { if (body.metadata.name === 'default') { throw createError(409) } - return Promise.resolve(_.set(body, 'metadata.creationTimestamp', 'now')) + return Promise.resolve(_.set(body, ['metadata', 'creationTimestamp'], 'now')) }), createTokenRequest: jest.fn().mockImplementation((namespace, name, body) => { - return Promise.resolve(_.set(body, 'status.token', 'secret')) + return Promise.resolve(_.set(body, ['status', 'token'], 'secret')) }), delete: jest.fn().mockImplementation(findObjectFn(serviceAccounts)), mergePatch: jest.fn().mockImplementation((namespace, name, body) => { - return Promise.resolve(_.set(body, 'metadata.creationTimestamp', 'bar-time')) - }) + return Promise.resolve(_.set(body, ['metadata', 'creationTimestamp'], 'bar-time')) + }), } }) @@ -254,36 +254,36 @@ describe('services', function () { expect(frontendMemberList).toHaveLength(11) expect(frontendMemberList).toContainEqual({ username: 'mutiple@bar.com', - roles: ['admin', 'viewer'] + roles: ['admin', 'viewer'], }) expect(frontendMemberList).toContainEqual({ username: 'system:serviceaccount:garden-foo:robot-multiple', roles: ['otherrole', 'admin', 'myrole', 'viewer'], createdBy: 'foo', creationTimestamp: 'bar-time', - description: undefined + description: undefined, }) expect(frontendMemberList).toContainEqual({ username: 'system:serviceaccount:garden-foreign:robot-foreign-namespace', - roles: ['myrole', 'viewer', 'admin'] + roles: ['myrole', 'viewer', 'admin'], }) expect(frontendMemberList).toContainEqual({ username: 'system:serviceaccount:garden-foo:robot-nomember', roles: [], createdBy: 'foo', creationTimestamp: 'bar-time', - description: undefined + description: undefined, }) expect(frontendMemberList).toContainEqual({ username: 'system:serviceaccount:garden-foo:robot-orphaned', roles: ['myrole'], - orphaned: true + orphaned: true, }) expect(frontendMemberList).toContainEqual({ username: 'system:serviceaccount:garden-foo:robot-deleted', roles: [], creationTimestamp: 'bar-time', - deletionTimestamp: 'baz-time' + deletionTimestamp: 'baz-time', }) }) @@ -295,7 +295,7 @@ describe('services', function () { roles: ['admin', 'myrole', 'viewer'], createdBy: 'foo', creationTimestamp: 'bar-time', - description: 'description' + description: 'description', }) }) }) @@ -438,7 +438,7 @@ describe('services', function () { const id = 'system:serviceaccount:garden-foo:robot-sa' const item = memberManager.subjectList.get(id) await memberManager.deleteServiceAccount(item) - expect(client.core.serviceaccounts.delete).toBeCalledTimes(1) + expect(client.core.serviceaccounts.delete).toHaveBeenCalledTimes(1) expect(client.core.serviceaccounts.delete.mock.calls[0]).toEqual(['garden-foo', 'robot-sa']) expect(memberManager.subjectList.has(id)).toBe(false) }) @@ -447,7 +447,7 @@ describe('services', function () { const id = 'system:serviceaccount:garden-foreign:robot-foreign-namespace' const item = memberManager.subjectList.get(id) await memberManager.deleteServiceAccount(item) - expect(client.core.serviceaccounts.delete).not.toBeCalled() + expect(client.core.serviceaccounts.delete).not.toHaveBeenCalled() expect(memberManager.subjectList.has(id)).toBe(true) }) @@ -455,7 +455,7 @@ describe('services', function () { const id = 'system:serviceaccount:garden-foo:robot-orphaned' const item = memberManager.subjectList.get(id) await memberManager.deleteServiceAccount(item) - expect(client.core.serviceaccounts.delete).toBeCalledTimes(1) + expect(client.core.serviceaccounts.delete).toHaveBeenCalledTimes(1) expect(client.core.serviceaccounts.delete.mock.calls[0]).toEqual(['garden-foo', 'robot-orphaned']) expect(memberManager.subjectList.has(id)).toBe(false) }) @@ -474,20 +474,20 @@ describe('services', function () { it('should delete and create a serviceaccount', async function () { const id = 'system:serviceaccount:garden-foo:robot-sa' await memberManager.resetServiceAccount(id) - expect(client.core.serviceaccounts.delete).toBeCalledTimes(1) + expect(client.core.serviceaccounts.delete).toHaveBeenCalledTimes(1) expect(client.core.serviceaccounts.delete.mock.calls[0]).toEqual(['garden-foo', 'robot-sa']) const body = { metadata: { annotations: { 'dashboard.gardener.cloud/created-by': 'foo', - 'dashboard.gardener.cloud/description': 'description' + 'dashboard.gardener.cloud/description': 'description', }, creationTimestamp: 'now', name: 'robot-sa', - namespace: 'garden-foo' - } + namespace: 'garden-foo', + }, } - expect(client.core.serviceaccounts.create).toBeCalledTimes(1) + expect(client.core.serviceaccounts.create).toHaveBeenCalledTimes(1) expect(client.core.serviceaccounts.create.mock.calls[0]).toEqual(['garden-foo', body]) }) @@ -504,37 +504,37 @@ describe('services', function () { it('should skip service accounts that are no members', async function () { const id = 'system:serviceaccount:garden-foo:no-member' await memberManager.resetServiceAccount(id) - expect(client.core.serviceaccounts.delete).toBeCalledTimes(0) - expect(client.core.serviceaccounts.create).toBeCalledTimes(0) + expect(client.core.serviceaccounts.delete).toHaveBeenCalledTimes(0) + expect(client.core.serviceaccounts.create).toHaveBeenCalledTimes(0) }) it('should patch the default service account', async function () { const id = 'system:serviceaccount:garden-foo:default' await memberManager.resetServiceAccount(id) - expect(client.core.serviceaccounts.delete).toBeCalledTimes(1) + expect(client.core.serviceaccounts.delete).toHaveBeenCalledTimes(1) expect(client.core.serviceaccounts.delete.mock.calls[0]).toEqual(['garden-foo', 'default']) const body = { metadata: { annotations: { 'dashboard.gardener.cloud/created-by': 'k8s', - 'dashboard.gardener.cloud/description': 'description' + 'dashboard.gardener.cloud/description': 'description', }, name: 'default', - namespace: 'garden-foo' - } + namespace: 'garden-foo', + }, } - expect(client.core.serviceaccounts.create).toBeCalledTimes(1) + expect(client.core.serviceaccounts.create).toHaveBeenCalledTimes(1) expect(client.core.serviceaccounts.create.mock.calls[0]).toEqual(['garden-foo', body]) const patch = { metadata: { annotations: { 'dashboard.gardener.cloud/created-by': 'k8s', - 'dashboard.gardener.cloud/description': 'description' + 'dashboard.gardener.cloud/description': 'description', }, - creationTimestamp: 'bar-time' - } + creationTimestamp: 'bar-time', + }, } - expect(client.core.serviceaccounts.mergePatch).toBeCalledTimes(1) + expect(client.core.serviceaccounts.mergePatch).toHaveBeenCalledTimes(1) expect(client.core.serviceaccounts.mergePatch.mock.calls[0]).toEqual(['garden-foo', 'default', patch]) }) }) @@ -549,13 +549,13 @@ describe('services', function () { kind: 'TokenRequest', spec: { audiences: ['aud1', 'aud2'], - expirationSeconds: 42 + expirationSeconds: 42, }, status: { - token: 'secret' - } + token: 'secret', + }, } - expect(client.core.serviceaccounts.createTokenRequest).toBeCalledTimes(1) + expect(client.core.serviceaccounts.createTokenRequest).toHaveBeenCalledTimes(1) expect(client.core.serviceaccounts.createTokenRequest.mock.calls[0]).toEqual(['garden-foo', 'robot-user', body]) expect(kubeConfig.users[0].user.token).toContain('secret') }) diff --git a/backend/test/services.projects.spec.js b/backend/test/services.projects.spec.js index ceb25e2262..b189690192 100644 --- a/backend/test/services.projects.spec.js +++ b/backend/test/services.projects.spec.js @@ -20,10 +20,10 @@ jest.mock('@gardener-dashboard/kube-client', () => ({ dashboardClient: { 'core.gardener.cloud': { projects: { - watch: jest.fn() - } - } - } + watch: jest.fn(), + }, + }, + }, })) const createUser = (username) => { @@ -35,10 +35,10 @@ const createUser = (username) => { create: jest.fn(), get: jest.fn(), mergePatch: jest.fn(), - delete: jest.fn() - } - } - } + delete: jest.fn(), + }, + }, + }, } } @@ -49,73 +49,73 @@ describe('services/projects', () => { projectList = [ { metadata: { - name: 'foo' + name: 'foo', }, spec: { members: [ { kind: 'User', - name: 'foo@bar.com' + name: 'foo@bar.com', }, { kind: 'User', - name: 'system:serviceaccount:garden-foo:robot-user' + name: 'system:serviceaccount:garden-foo:robot-user', }, { kind: 'ServiceAccount', name: 'robot-sa', - namespace: 'garden-foo' - } - ] + namespace: 'garden-foo', + }, + ], }, status: { - phase: 'Ready' - } + phase: 'Ready', + }, }, { metadata: { - name: 'bar' + name: 'bar', }, spec: { members: [ { kind: 'User', - name: 'bar@bar.com' - } - ] + name: 'bar@bar.com', + }, + ], }, status: { - phase: 'Ready' - } + phase: 'Ready', + }, }, { metadata: { - name: 'pending' + name: 'pending', }, spec: { members: [ { apiGroup: 'rbac.authorization.k8s.io', kind: 'User', - name: 'bar@bar.com' - } - ] - } + name: 'bar@bar.com', + }, + ], + }, }, { metadata: { - name: 'terminating' + name: 'terminating', }, status: { - phase: 'Terminating' - } - } + phase: 'Terminating', + }, + }, ] jest.clearAllMocks() cache.getProjects = jest.fn().mockImplementation(() => projectList) cache.getProject = jest.fn(name => projectList.find(project => project.metadata.name === name)) dashboardClient['core.gardener.cloud'].projects.watch.mockResolvedValue({ - until: jest.fn().mockResolvedValue(projectList[0]) + until: jest.fn().mockResolvedValue(projectList[0]), }) }) @@ -129,7 +129,7 @@ describe('services/projects', () => { expect(result).toEqual(expect.arrayContaining([ expect.objectContaining({ metadata: { name: 'foo' } }), expect.objectContaining({ metadata: { name: 'bar' } }), - expect.objectContaining({ metadata: { name: 'terminating' } }) + expect.objectContaining({ metadata: { name: 'terminating' } }), ])) }) @@ -174,7 +174,7 @@ describe('services/projects', () => { // Mock the project creation to return a pending project user.client['core.gardener.cloud'].projects.create.mockResolvedValue({ ...body, - status: { phase: 'Pending' } + status: { phase: 'Pending' }, }) // Mock the watch functionality to eventually return a ready project @@ -184,11 +184,11 @@ describe('services/projects', () => { setTimeout(() => { resolve({ ...body, - status: { phase: 'Ready' } + status: { phase: 'Ready' }, }) }, 10) // Simulate delay for the project to become ready }) - }) + }), }) const result = await projects.create({ user, body }) @@ -200,10 +200,10 @@ describe('services/projects', () => { const user = createUser('creator@bar.com') user.client['core.gardener.cloud'].projects.create.mockResolvedValue({ ...body, - status: { phase: 'Pending' } + status: { phase: 'Pending' }, }) dashboardClient['core.gardener.cloud'].projects.watch.mockResolvedValue({ - until: jest.fn().mockRejectedValue(new Error('Timeout')) + until: jest.fn().mockRejectedValue(new Error('Timeout')), }) await expect(projects.create({ user, body })).rejects.toThrow('Timeout') @@ -214,7 +214,7 @@ describe('services/projects', () => { const user = createUser('creator@bar.com') user.client['core.gardener.cloud'].projects.create.mockResolvedValue({ ...body, - status: { phase: 'Pending' } + status: { phase: 'Pending' }, }) dashboardClient['core.gardener.cloud'].projects.watch.mockResolvedValue({ until: jest.fn((isProjectReady) => { @@ -227,7 +227,7 @@ describe('services/projects', () => { } }, 10) // Simulate delay before project is deleted }) - }) + }), }) await expect(projects.create({ user, body })).rejects.toThrow(InternalServerError) @@ -238,7 +238,7 @@ describe('services/projects', () => { const user = createUser('creator@bar.com') user.client['core.gardener.cloud'].projects.create.mockResolvedValue({ ...body, - status: { phase: 'Pending' } + status: { phase: 'Pending' }, }) dashboardClient['core.gardener.cloud'].projects.watch.mockResolvedValue({ until: jest.fn((isProjectReady) => { @@ -247,7 +247,7 @@ describe('services/projects', () => { resolve(isProjectReady({ type: 'MODIFIED', object: { ...body, status: { phase: 'Ready' } } })) }, 10) // Simulate delay before project becomes ready }) - }) + }), }) const result = await projects.create({ user, body }) @@ -259,7 +259,7 @@ describe('services/projects', () => { const user = createUser('creator@bar.com') user.client['core.gardener.cloud'].projects.create.mockResolvedValue({ ...body, - status: { phase: 'Pending' } + status: { phase: 'Pending' }, }) dashboardClient['core.gardener.cloud'].projects.watch.mockResolvedValue({ until: jest.fn((isProjectReady) => { @@ -268,7 +268,7 @@ describe('services/projects', () => { resolve(isProjectReady({ type: 'MODIFIED', object: { ...body, status: { phase: 'Pending' } } })) }, 10) // Simulate delay before project remains pending }) - }) + }), }) const result = await projects.create({ user, body }) @@ -335,17 +335,17 @@ describe('services/projects', () => { expect(user.client['core.gardener.cloud'].projects.mergePatch).toHaveBeenCalledWith(projectName, { metadata: { annotations: { - 'confirmation.gardener.cloud/deletion': 'true' - } - } + 'confirmation.gardener.cloud/deletion': 'true', + }, + }, }) expect(user.client['core.gardener.cloud'].projects.mergePatch).toHaveBeenCalledWith(projectName, { metadata: { annotations: { - 'confirmation.gardener.cloud/deletion': null - } - } + 'confirmation.gardener.cloud/deletion': null, + }, + }, }) }) }) diff --git a/backend/test/services.shoots.spec.js b/backend/test/services.shoots.spec.js index bcd0777599..261fcbbc10 100644 --- a/backend/test/services.shoots.spec.js +++ b/backend/test/services.shoots.spec.js @@ -8,7 +8,7 @@ const { getDashboardUrlPath, - getGardenClusterIdentity + getGardenClusterIdentity, } = require('../lib/services/shoots') const config = require('../lib/config') const { mockRequest } = require('@gardener-dashboard/request') @@ -18,28 +18,28 @@ describe('services', function () { describe('#getDashboardUrlPath', function () { it('should return dashboard URL path for kubernetes version < 1.16.0', function () { expect(getDashboardUrlPath('1.14.0')).toBe( - '/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/' + '/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/', ) expect(getDashboardUrlPath('1.15.1')).toBe( - '/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/' + '/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/', ) expect(getDashboardUrlPath('1.15.9')).toBe( - '/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/' + '/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/', ) }) it('should return dashboard URL path for kubernetes version >= 1.16.0', function () { expect(getDashboardUrlPath('1.16.0')).toBe( - '/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/' + '/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/', ) expect(getDashboardUrlPath('1.16.1')).toBe( - '/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/' + '/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/', ) expect(getDashboardUrlPath('1.17.0')).toBe( - '/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/' + '/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/', ) expect(getDashboardUrlPath('v1.17.0')).toBe( - '/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/' + '/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/', ) }) diff --git a/backend/test/services.terminals.spec.js b/backend/test/services.terminals.spec.js index 8c846a1bbf..a314f8e276 100644 --- a/backend/test/services.terminals.spec.js +++ b/backend/test/services.terminals.spec.js @@ -17,16 +17,16 @@ const { encodeBase64 } = require('../lib/utils') const { ensureTerminalAllowed, findImageDescription, - fromShortcutSecretResource + fromShortcutSecretResource, } = require('../lib/services/terminals') const { getGardenTerminalHostClusterCredentials, - getGardenHostClusterKubeApiServer + getGardenHostClusterKubeApiServer, } = require('../lib/services/terminals/utils') const { - dashboardClient + dashboardClient, } = require('@gardener-dashboard/kube-client') const { AssertionError } = assert @@ -53,11 +53,11 @@ describe('services', function () { return { items: [ { metadata: { namespace, name: firstSecretName } }, - { metadata: { namespace, name: secondSecretName } } - ] + { metadata: { namespace, name: secondSecretName } }, + ], } - } - } + }, + }, }, async getManagedSeed ({ namespace, name }) { await nextTick() @@ -66,7 +66,7 @@ describe('services', function () { } return { metadata: { namespace, name }, - spec: { shoot: { name } } + spec: { shoot: { name } }, } }, async getShoot ({ namespace, name }) { @@ -79,11 +79,11 @@ describe('services', function () { kind: 'Shoot', metadata: { namespace, name }, spec: { - seedName: soilName + seedName: soilName, }, status: { - technicalID: `shoot--garden--${name}` - } + technicalID: `shoot--garden--${name}`, + }, } } const project = namespace.replace(/^garden-/, '') @@ -91,29 +91,29 @@ describe('services', function () { kind: 'Shoot', metadata: { namespace, name }, spec: { - seedName + seedName, }, status: { - technicalID: `shoot--${project}--${name}` - } + technicalID: `shoot--${project}--${name}`, + }, } - } + }, } function createTerminalConfig (terminal = {}) { return _.merge({ containerImage: 'image:1.2.3', gardenTerminalHost: { - apiServerIngressHost: 'gardenTerminalApiServerIngressHost' + apiServerIngressHost: 'gardenTerminalApiServerIngressHost', }, garden: { operatorCredentials: { serviceAccountRef: { name: 'operatorServiceAccountName', - namespace: 'garden' - } - } - } + namespace: 'garden', + }, + }, + }, }, terminal) } @@ -138,7 +138,7 @@ describe('services', function () { const containerImage = 'foo:bar' const containerImageDescriptions = [{ image: '/foo:.*/', - description: 'baz' + description: 'baz', }] expect(findImageDescription(containerImage, containerImageDescriptions)).toBe('baz') }) @@ -148,13 +148,13 @@ describe('services', function () { let containerImageDescriptions = [{ image: '/dummy:.*/', - description: 'baz' + description: 'baz', }] expect(findImageDescription(containerImage, containerImageDescriptions)).toBeUndefined() containerImageDescriptions = [{ image: 'foo:.*', // will not be recognized as regexp as it has to start and end with / - description: 'baz' + description: 'baz', }] expect(findImageDescription(containerImage, containerImageDescriptions)).toBeUndefined() }) @@ -164,7 +164,7 @@ describe('services', function () { const containerImageDescriptions = [{ image: 'foo:bar', - description: 'baz' + description: 'baz', }] expect(findImageDescription(containerImage, containerImageDescriptions)).toBe('baz') }) @@ -174,7 +174,7 @@ describe('services', function () { const containerImageDescriptions = [{ image: 'bar:foo', - description: 'baz' + description: 'baz', }] expect(findImageDescription(containerImage, containerImageDescriptions)).toBeUndefined() @@ -188,47 +188,47 @@ describe('services', function () { it('should return the secret reference by secretRef', async function () { const gardenTerminalHost = { secretRef: { - namespace: 'secretNamespace' - } + namespace: 'secretNamespace', + }, } terminalStub.mockReturnValue(createTerminalConfig({ gardenTerminalHost })) const listSecretsSpy = jest.spyOn(client.core.secrets, 'list') const { secretRef } = await getGardenTerminalHostClusterCredentials(client) - expect(listSecretsSpy).toBeCalledTimes(1) + expect(listSecretsSpy).toHaveBeenCalledTimes(1) expect(listSecretsSpy.mock.calls[0]).toEqual([ gardenTerminalHost.secretRef.namespace, { - labelSelector: 'runtime=gardenTerminalHost' - } + labelSelector: 'runtime=gardenTerminalHost', + }, ]) expect(secretRef).toEqual({ namespace: gardenTerminalHost.secretRef.namespace, - name: firstSecretName + name: firstSecretName, }) }) describe('get credentials by seedRef', function () { it('should return the secret reference for non-managed Seeds', async function () { const gardenTerminalHost = { - seedRef: soilName + seedRef: soilName, } terminalStub.mockReturnValue(createTerminalConfig({ gardenTerminalHost })) const { secretRef } = await getGardenTerminalHostClusterCredentials(client) expect(secretRef).toEqual({ namespace: 'garden', - name: `seedsecret-${gardenTerminalHost.seedRef}` + name: `seedsecret-${gardenTerminalHost.seedRef}`, }) }) it('should return the shoot reference for managed Seeds', async function () { const gardenTerminalHost = { - seedRef: seedName + seedRef: seedName, } terminalStub.mockReturnValue(createTerminalConfig({ gardenTerminalHost })) const { shootRef } = await getGardenTerminalHostClusterCredentials(client) expect(shootRef).toEqual({ namespace: 'garden', - name: seedName + name: seedName, }) }) }) @@ -237,20 +237,20 @@ describe('services', function () { const gardenTerminalHost = { shootRef: { namespace: 'shootNamespace', - name: 'shootName' - } + name: 'shootName', + }, } terminalStub.mockReturnValue(createTerminalConfig({ gardenTerminalHost })) const { secretRef } = await getGardenTerminalHostClusterCredentials(client) expect(secretRef).toEqual({ namespace: gardenTerminalHost.shootRef.namespace, - name: `${gardenTerminalHost.shootRef.name}.kubeconfig` + name: `${gardenTerminalHost.shootRef.name}.kubeconfig`, }) }) it('should throw an assertion error', async function () { const gardenTerminalHost = { - noRef: 'none' + noRef: 'none', } terminalStub.mockReturnValue(createTerminalConfig({ gardenTerminalHost })) await expect(getGardenTerminalHostClusterCredentials(client)).rejects.toThrow(AssertionError) @@ -258,7 +258,7 @@ describe('services', function () { it('should throw a no seed error', async function () { const gardenTerminalHost = { - seedRef: 'none' + seedRef: 'none', } terminalStub.mockReturnValue(createTerminalConfig({ gardenTerminalHost })) await expect(getGardenTerminalHostClusterCredentials(client)).rejects.toThrow(`There is no seed with name ${gardenTerminalHost.seedRef}`) @@ -297,21 +297,21 @@ describe('services', function () { it('should pick only valid fields from shortcut resource', function () { let actualShortcuts = fromShortcutSecretResource({ - data: encodeBase64(yaml.dump({})) + data: encodeBase64(yaml.dump({})), }) expect(actualShortcuts).toEqual([]) actualShortcuts = fromShortcutSecretResource({ data: { - shortcuts: undefined - } + shortcuts: undefined, + }, }) expect(actualShortcuts).toEqual([]) actualShortcuts = fromShortcutSecretResource({ data: { - shortcuts: encodeBase64('invalid') - } + shortcuts: encodeBase64('invalid'), + }, }) expect(actualShortcuts).toEqual([]) @@ -319,10 +319,10 @@ describe('services', function () { data: { shortcuts: encodeBase64(yaml.dump([ { - foo: 'bar' - } - ])) - } + foo: 'bar', + }, + ])), + }, }) expect(actualShortcuts).toEqual([]) @@ -331,15 +331,15 @@ describe('services', function () { shortcuts: encodeBase64(yaml.dump([ {}, // invalid object { - description: 'invalid due to missing required keys' + description: 'invalid due to missing required keys', }, { title: 'invalid target', - target: 'foo' + target: 'foo', }, { title: 'minimalistic shortcut', - target: 'shoot' + target: 'shoot', }, { title: 'title', @@ -348,22 +348,22 @@ describe('services', function () { container: { image: 'image', command: ['command'], - args: ['args'] + args: ['args'], }, shootSelector: { matchLabels: { - foo: 'bar' - } + foo: 'bar', + }, }, - foo: 'ignore' - } - ])) - } + foo: 'ignore', + }, + ])), + }, }) expect(actualShortcuts).toEqual([ { title: 'minimalistic shortcut', - target: 'shoot' + target: 'shoot', }, { title: 'title', @@ -372,14 +372,14 @@ describe('services', function () { container: { image: 'image', command: ['command'], - args: ['args'] + args: ['args'], }, shootSelector: { matchLabels: { - foo: 'bar' - } - } - } + foo: 'bar', + }, + }, + }, ]) }) }) @@ -390,8 +390,8 @@ describe('services', function () { const gardenTerminalHost = { apiServerIngressHost: 'apiServerIngressHost', secretRef: { - namespace: 'secretNamespace' - } + namespace: 'secretNamespace', + }, } terminalStub.mockReturnValue(createTerminalConfig({ gardenTerminalHost })) const kubeApiServer = await getGardenHostClusterKubeApiServer(client) @@ -400,7 +400,7 @@ describe('services', function () { it('should return the secret reference by shooted seedRef', async function () { const gardenTerminalHost = { - seedRef: seedName + seedRef: seedName, } const project = 'garden' terminalStub.mockReturnValue(createTerminalConfig({ gardenTerminalHost })) @@ -411,7 +411,7 @@ describe('services', function () { it('should return the secret reference by non-shooted seedRef', async function () { const gardenTerminalHost = { - seedRef: 'soil-infra1' + seedRef: 'soil-infra1', } terminalStub.mockReturnValue(createTerminalConfig({ gardenTerminalHost })) const kubeApiServer = await getGardenHostClusterKubeApiServer(client) @@ -423,8 +423,8 @@ describe('services', function () { const gardenTerminalHost = { shootRef: { namespace: 'garden', - name: 'infra1-seed' - } + name: 'infra1-seed', + }, } const project = 'garden' terminalStub.mockReturnValue(createTerminalConfig({ gardenTerminalHost })) @@ -435,7 +435,7 @@ describe('services', function () { it('should throw an assertion error', async function () { const gardenTerminalHost = { - noRef: 'none' + noRef: 'none', } terminalStub.mockReturnValue(createTerminalConfig({ gardenTerminalHost })) await expect(getGardenHostClusterKubeApiServer(client)).rejects.toThrow(AssertionError) diff --git a/backend/test/utils.spec.js b/backend/test/utils.spec.js index 66be30afce..71f310cd72 100644 --- a/backend/test/utils.spec.js +++ b/backend/test/utils.spec.js @@ -19,7 +19,7 @@ const { constants, trimObjectMetadata, trimProject, - parseRooms + parseRooms, } = require('../lib/utils') describe('utils', function () { @@ -37,7 +37,7 @@ describe('utils', function () { }) it('should return some config values with defaults', function () { - expect(() => getConfigValue('test')).toThrowError(AssertionError) + expect(() => getConfigValue('test')).toThrow(AssertionError) expect(getConfigValue('logLevel')).toBe('info') }) @@ -45,9 +45,9 @@ describe('utils', function () { const shoot = { metadata: { labels: { - 'shoot.gardener.cloud/status': undefined - } - } + 'shoot.gardener.cloud/status': undefined, + }, + }, } expect(shootHasIssue(shoot)).toBe(false) shoot.metadata.labels['shoot.gardener.cloud/status'] = 'healthy' @@ -57,14 +57,14 @@ describe('utils', function () { }) it('should return the seed name for a shoot resource', function () { - expect(() => getSeedNameFromShoot({})).toThrowError(AssertionError) + expect(() => getSeedNameFromShoot({})).toThrow(AssertionError) const shoot = { spec: { - seedName: 'foo' + seedName: 'foo', }, status: { - seed: 'bar' - } + seed: 'bar', + }, } expect(getSeedNameFromShoot(shoot)).toBe('foo') }) @@ -76,15 +76,15 @@ describe('utils', function () { const metadata = { name, annotations: { - foo: 'bar' - } + foo: 'bar', + }, } expect(trimObjectMetadata({ metadata })).toEqual({ metadata }) const extendedMetadata = merge(metadata, { managedFields, annotations: { - 'kubectl.kubernetes.io/last-applied-configuration': lastAppliedConfiguration - } + 'kubectl.kubernetes.io/last-applied-configuration': lastAppliedConfiguration, + }, }) expect(trimObjectMetadata({ metadata: extendedMetadata })).toEqual({ metadata }) }) @@ -96,69 +96,69 @@ describe('utils', function () { const metadata = { name, annotations: { - foo: 'bar' - } + foo: 'bar', + }, } const spec = { - members: ['member1', 'member2'] + members: ['member1', 'member2'], } const project = { metadata, spec } // Test case where metadata does not have managedFields or last-applied-configuration expect(trimProject(cloneDeep(project))).toEqual({ metadata, - spec: {} + spec: {}, }) // Test case where metadata has managedFields and last-applied-configuration const extendedMetadata = merge(cloneDeep(metadata), { managedFields, annotations: { - 'kubectl.kubernetes.io/last-applied-configuration': lastAppliedConfiguration - } + 'kubectl.kubernetes.io/last-applied-configuration': lastAppliedConfiguration, + }, }) const extendedProject = { metadata: extendedMetadata, spec } expect(trimProject(cloneDeep(extendedProject))).toEqual({ metadata, - spec: {} + spec: {}, }) }) it('should parse labelSelectors', () => { expect(parseSelectors([ - 'shoot.gardener.cloud/status!=healthy' + 'shoot.gardener.cloud/status!=healthy', ])).toEqual([{ key: 'shoot.gardener.cloud/status', op: constants.NOT_EQUAL, - value: 'healthy' + value: 'healthy', }]) expect(parseSelectors([ 'foo=1', 'bar==2', - 'qux!=3' + 'qux!=3', ])).toEqual([{ key: 'foo', op: constants.EQUAL, - value: '1' + value: '1', }, { key: 'bar', op: constants.EQUAL, - value: '2' + value: '2', }, { key: 'qux', op: constants.NOT_EQUAL, - value: '3' + value: '3', }]) expect(parseSelectors([ 'foo', - '!baz' + '!baz', ])).toEqual([{ key: 'foo', - op: constants.EXISTS + op: constants.EXISTS, }, { key: 'baz', - op: constants.NOT_EXISTS + op: constants.NOT_EXISTS, }]) }) @@ -166,69 +166,69 @@ describe('utils', function () { const labels = { foo: '1', bar: '2', - qux: '3' + qux: '3', } const item = { metadata: { - labels - } + labels, + }, } expect(filterBySelectors([{ key: 'foo', - op: constants.EXISTS + op: constants.EXISTS, }])(item)).toBe(true) expect(filterBySelectors([{ key: 'baz', - op: constants.EXISTS + op: constants.EXISTS, }])(item)).toBe(false) expect(filterBySelectors([{ key: 'baz', - op: constants.NOT_EXISTS + op: constants.NOT_EXISTS, }])(item)).toBe(true) expect(filterBySelectors([{ key: 'foo', - op: constants.NOT_EXISTS + op: constants.NOT_EXISTS, }])(item)).toBe(false) expect(filterBySelectors([{ key: 'foo', op: constants.EQUAL, - value: '1' + value: '1', }])(item)).toBe(true) expect(filterBySelectors([{ key: 'bar', op: constants.EQUAL, - value: '1' + value: '1', }])(item)).toBe(false) expect(filterBySelectors([{ key: 'qux', op: constants.NOT_EQUAL, - value: '2' + value: '2', }])(item)).toBe(true) expect(filterBySelectors([{ key: 'qux', op: constants.NOT_EQUAL, - value: '3' + value: '3', }])(item)).toBe(false) }) it('should parse rooms for all kind of shoot subscriptions', () => { expect(parseRooms(['seeds:admin'])).toEqual([ - false, [], [] + false, [], [], ]) expect(parseRooms(['shoots:admin'])).toEqual([ - true, [], [] + true, [], [], ]) expect(parseRooms(['shoots:unhealthy:admin'])).toEqual([ - true, [], [] + true, [], [], ]) expect(parseRooms(['shoots;garden-foo'])).toEqual([ - false, ['garden-foo'], [] + false, ['garden-foo'], [], ]) expect(parseRooms(['shoots:unhealthy;garden-foo'])).toEqual([ - false, ['garden-foo'], [] + false, ['garden-foo'], [], ]) expect(parseRooms(['shoots;garden-foo/bar'])).toEqual([ - false, [], ['garden-foo/bar'] + false, [], ['garden-foo/bar'], ]) }) }) diff --git a/backend/test/watches.spec.js b/backend/test/watches.spec.js index 9d52b52e2a..edd004b270 100644 --- a/backend/test/watches.spec.js +++ b/backend/test/watches.spec.js @@ -25,7 +25,7 @@ const rooms = new Map() function getRoom (name) { if (!rooms.has(name)) { rooms.set(name, { - emit: jest.fn() + emit: jest.fn(), }) } return rooms.get(name) @@ -40,16 +40,16 @@ const nsp = { for (const room of this.rooms) { room.emit(...args) } - } + }, } } return getRoom(name) }), - emit: jest.fn() + emit: jest.fn(), } const io = { - of: jest.fn().mockReturnValue(nsp) + of: jest.fn().mockReturnValue(nsp), } describe('watches', function () { @@ -68,13 +68,13 @@ describe('watches', function () { const foobarUnhealthy = _ .chain(foobar) .cloneDeep() - .set('metadata.labels["shoot.gardener.cloud/status"]', 'unhealthy') + .set(['metadata', 'labels', 'shoot.gardener.cloud/status'], 'unhealthy') .value() const foobazUnhealthy = _ .chain(foobaz) .cloneDeep() - .set('metadata.labels["shoot.gardener.cloud/status"]', 'unhealthy') + .set(['metadata', 'labels', 'shoot.gardener.cloud/status'], 'unhealthy') .value() let shootsWithIssues @@ -86,35 +86,35 @@ describe('watches', function () { it('should watch shoots without issues', async function () { watches.shoots(io, informer) - expect(io.of).toBeCalledTimes(1) + expect(io.of).toHaveBeenCalledTimes(1) expect(io.of.mock.calls).toEqual([['/']]) informer.emit('add', foobar) informer.emit('update', foobar) informer.emit('delete', foobar) - expect(logger.error).not.toBeCalled() + expect(logger.error).not.toHaveBeenCalled() const keys = ['shoots:admin', 'shoots;foo', 'shoots;foo/bar'] - expect(nsp.to).toBeCalledTimes(3) + expect(nsp.to).toHaveBeenCalledTimes(3) expect(nsp.to.mock.calls).toEqual([[keys], [keys], [keys]]) expect(Array.from(rooms.keys())).toEqual(keys) for (const key of keys) { const room = rooms.get(key) - expect(room.emit).toBeCalledTimes(3) + expect(room.emit).toHaveBeenCalledTimes(3) expect(room.emit.mock.calls).toEqual([ [ 'shoots', - { type: 'ADDED', uid: foobar.metadata.uid } + { type: 'ADDED', uid: foobar.metadata.uid }, ], [ 'shoots', - { type: 'MODIFIED', uid: foobar.metadata.uid } + { type: 'MODIFIED', uid: foobar.metadata.uid }, ], [ 'shoots', - { type: 'DELETED', uid: foobar.metadata.uid } - ] + { type: 'DELETED', uid: foobar.metadata.uid }, + ], ]) } }) @@ -135,30 +135,30 @@ describe('watches', function () { expect(shootsWithIssues).toHaveProperty('size', 0) const fooRoom = rooms.get('shoots;foo') - expect(fooRoom.emit).toBeCalledTimes(5) + expect(fooRoom.emit).toHaveBeenCalledTimes(5) const fooIssuesRoom = rooms.get('shoots:unhealthy;foo') - expect(fooIssuesRoom.emit).toBeCalledTimes(5) + expect(fooIssuesRoom.emit).toHaveBeenCalledTimes(5) expect(fooIssuesRoom.emit.mock.calls).toEqual([ [ 'shoots', - { type: 'ADDED', uid: foobarUnhealthy.metadata.uid } + { type: 'ADDED', uid: foobarUnhealthy.metadata.uid }, ], [ 'shoots', - { type: 'DELETED', uid: foobar.metadata.uid } + { type: 'DELETED', uid: foobar.metadata.uid }, ], [ 'shoots', - { type: 'ADDED', uid: foobazUnhealthy.metadata.uid } + { type: 'ADDED', uid: foobazUnhealthy.metadata.uid }, ], [ 'shoots', - { type: 'MODIFIED', uid: foobazUnhealthy.metadata.uid } + { type: 'MODIFIED', uid: foobazUnhealthy.metadata.uid }, ], [ 'shoots', - { type: 'DELETED', uid: foobazUnhealthy.metadata.uid } - ] + { type: 'DELETED', uid: foobazUnhealthy.metadata.uid }, + ], ]) }) }) @@ -166,7 +166,7 @@ describe('watches', function () { describe('leases', function () { const metadata = { projectName: 'foo', - name: 'bar' + name: 'bar', } const issueEvent = { object: { metadata } } const commentEvent = { object: { metadata } } @@ -181,12 +181,12 @@ describe('watches', function () { handler(commentEvent) break } - } + }, } const gitHubConfig = { pollIntervalSeconds: 10, - syncThrottleSeconds: 2 + syncThrottleSeconds: 2, } let gitHubStub @@ -212,8 +212,8 @@ describe('watches', function () { await watches.leases(io, informer, { signal: abortController.signal }) - expect(logger.warn).toBeCalledTimes(1) - expect(ticketCache.on).toBeCalledTimes(0) + expect(logger.warn).toHaveBeenCalledTimes(1) + expect(ticketCache.on).toHaveBeenCalledTimes(0) }) it('should add event listeners and create SyncManager', async function () { @@ -222,24 +222,24 @@ describe('watches', function () { watches.leases(io, informer, { signal }) - expect(io.of).toBeCalledTimes(1) - expect(io.of).toBeCalledWith('/') + expect(io.of).toHaveBeenCalledTimes(1) + expect(io.of).toHaveBeenCalledWith('/') - expect(ticketCache.on).toBeCalledTimes(2) - expect(ticketCache.on).toBeCalledWith('issue', expect.any(Function)) - expect(ticketCache.on).toBeCalledWith('comment', expect.any(Function)) + expect(ticketCache.on).toHaveBeenCalledTimes(2) + expect(ticketCache.on).toHaveBeenCalledWith('issue', expect.any(Function)) + expect(ticketCache.on).toHaveBeenCalledWith('comment', expect.any(Function)) - expect(SyncManager).toBeCalledTimes(1) - expect(SyncManager).toBeCalledWith(expect.any(Function), { + expect(SyncManager).toHaveBeenCalledTimes(1) + expect(SyncManager).toHaveBeenCalledWith(expect.any(Function), { interval: gitHubConfig.pollIntervalSeconds * 1000, throttle: gitHubConfig.syncThrottleSeconds * 1000, - signal + signal, }) const syncManagerInstance = SyncManager.mock.instances[0] - expect(syncManagerInstance.sync).toBeCalledTimes(1) + expect(syncManagerInstance.sync).toHaveBeenCalledTimes(1) - expect(informer.on).toBeCalledTimes(1) - expect(informer.on).toBeCalledWith('update', expect.any(Function)) + expect(informer.on).toHaveBeenCalledTimes(1) + expect(informer.on).toHaveBeenCalledWith('update', expect.any(Function)) }) it('should create SyncManager with defaults', async () => { @@ -247,14 +247,14 @@ describe('watches', function () { watches.leases(io, informer, { signal }) - expect(SyncManager).toBeCalledTimes(1) + expect(SyncManager).toHaveBeenCalledTimes(1) expect(SyncManager.mock.calls[0]).toEqual([ expect.any(Function), { interval: 0, throttle: 0, - signal - } + signal, + }, ]) }) @@ -265,10 +265,10 @@ describe('watches', function () { gitHubStub.mockReturnValue({}) watches.leases(io, informer, { signal }) - expect(SyncManager).toBeCalledTimes(1) + expect(SyncManager).toHaveBeenCalledTimes(1) const [funcWithDefaultConcurrency] = SyncManager.mock.calls[0] await funcWithDefaultConcurrency() - expect(pLimit).toBeCalledWith(10) + expect(pLimit).toHaveBeenCalledWith(10) }) it('should call loadOpenIssuesAndComments with configured concurrency parameter', async () => { @@ -278,23 +278,23 @@ describe('watches', function () { gitHubStub.mockReturnValue({ syncConcurrency: 42 }) watches.leases(io, informer, { signal }) - expect(SyncManager).toBeCalledTimes(1) + expect(SyncManager).toHaveBeenCalledTimes(1) const [funcWithConfiguredConcurrency] = SyncManager.mock.calls[0] await funcWithConfiguredConcurrency() - expect(pLimit).toBeCalledWith(42) + expect(pLimit).toHaveBeenCalledWith(42) }) it('should emit ticket cache events to socket io', async () => { watches.leases(io, informer, { signal }) - expect(nsp.emit).toBeCalledTimes(1) - expect(nsp.emit).toBeCalledWith('issues', issueEvent) + expect(nsp.emit).toHaveBeenCalledTimes(1) + expect(nsp.emit).toHaveBeenCalledWith('issues', issueEvent) const room = `shoots;${cache.getProjectNamespace(issueEvent.object.metadata.projectName)}/${issueEvent.object.metadata.name}` const mockRoom = rooms.get(room) - expect(nsp.to).toBeCalledWith([room]) - expect(mockRoom.emit).toBeCalledTimes(1) - expect(mockRoom.emit).toBeCalledWith('comments', issueEvent) + expect(nsp.to).toHaveBeenCalledWith([room]) + expect(mockRoom.emit).toHaveBeenCalledTimes(1) + expect(mockRoom.emit).toHaveBeenCalledWith('comments', issueEvent) }) it('should listen to informer update events', async function () { @@ -302,13 +302,13 @@ describe('watches', function () { watches.leases(io, informer, { signal }) - expect(informer.on).toBeCalledTimes(1) - expect(informer.on).toBeCalledWith('update', expect.any(Function)) + expect(informer.on).toHaveBeenCalledTimes(1) + expect(informer.on).toHaveBeenCalledWith('update', expect.any(Function)) informer.emit('update', {}) const syncManagerInstance = SyncManager.mock.instances[0] - expect(syncManagerInstance.sync).toBeCalledTimes(2) + expect(syncManagerInstance.sync).toHaveBeenCalledTimes(2) }) it('should should load issues and comments of all issues', async function () { @@ -327,10 +327,10 @@ describe('watches', function () { await loadOpenIssuesAndComments(10) - expect(tickets.loadOpenIssues).toBeCalledTimes(1) - expect(tickets.loadIssueComments).toBeCalledTimes(t.length) + expect(tickets.loadOpenIssues).toHaveBeenCalledTimes(1) + expect(tickets.loadIssueComments).toHaveBeenCalledTimes(t.length) for (const number of issueNumbers) { - expect(tickets.loadIssueComments).toBeCalledWith({ number }) + expect(tickets.loadIssueComments).toHaveBeenCalledWith({ number }) } }) }) diff --git a/yarn.lock b/yarn.lock index d9dd2347a2..31cc586939 100644 --- a/yarn.lock +++ b/yarn.lock @@ -644,7 +644,7 @@ __metadata: languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": +"@eslint-community/eslint-utils@npm:^4.1.2, @eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" dependencies: @@ -655,6 +655,13 @@ __metadata: languageName: node linkType: hard +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.11.0": + version: 4.11.1 + resolution: "@eslint-community/regexpp@npm:4.11.1" + checksum: 10c0/fbcc1cb65ef5ed5b92faa8dc542e035269065e7ebcc0b39c81a4fe98ad35cfff20b3c8df048641de15a7757e07d69f85e2579c1a5055f993413ba18c055654f8 + languageName: node + linkType: hard + "@eslint-community/regexpp@npm:^4.6.1": version: 4.9.0 resolution: "@eslint-community/regexpp@npm:4.9.0" @@ -662,6 +669,17 @@ __metadata: languageName: node linkType: hard +"@eslint/config-array@npm:^0.18.0": + version: 0.18.0 + resolution: "@eslint/config-array@npm:0.18.0" + dependencies: + "@eslint/object-schema": "npm:^2.1.4" + debug: "npm:^4.3.1" + minimatch: "npm:^3.1.2" + checksum: 10c0/0234aeb3e6b052ad2402a647d0b4f8a6aa71524bafe1adad0b8db1dfe94d7f5f26d67c80f79bb37ac61361a1d4b14bb8fb475efe501de37263cf55eabb79868f + languageName: node + linkType: hard + "@eslint/eslintrc@npm:^2.1.4": version: 2.1.4 resolution: "@eslint/eslintrc@npm:2.1.4" @@ -679,6 +697,23 @@ __metadata: languageName: node linkType: hard +"@eslint/eslintrc@npm:^3.1.0": + version: 3.1.0 + resolution: "@eslint/eslintrc@npm:3.1.0" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^10.0.1" + globals: "npm:^14.0.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10c0/5b7332ed781edcfc98caa8dedbbb843abfb9bda2e86538529c843473f580e40c69eb894410eddc6702f487e9ee8f8cfa8df83213d43a8fdb549f23ce06699167 + languageName: node + linkType: hard + "@eslint/js@npm:8.57.0": version: 8.57.0 resolution: "@eslint/js@npm:8.57.0" @@ -686,6 +721,29 @@ __metadata: languageName: node linkType: hard +"@eslint/js@npm:9.11.0": + version: 9.11.0 + resolution: "@eslint/js@npm:9.11.0" + checksum: 10c0/7403aeba28ba9cae3470d149b334a51375eb7fd850f167555c81cc72fe98e5cc5ac3059ccdbe68eb255a49d7498a7288d25429af0c7d20afeb4b3c0748349bb4 + languageName: node + linkType: hard + +"@eslint/object-schema@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/object-schema@npm:2.1.4" + checksum: 10c0/e9885532ea70e483fb007bf1275968b05bb15ebaa506d98560c41a41220d33d342e19023d5f2939fed6eb59676c1bda5c847c284b4b55fce521d282004da4dda + languageName: node + linkType: hard + +"@eslint/plugin-kit@npm:^0.2.0": + version: 0.2.0 + resolution: "@eslint/plugin-kit@npm:0.2.0" + dependencies: + levn: "npm:^0.4.1" + checksum: 10c0/00b92bc52ad09b0e2bbbb30591c02a895f0bec3376759562590e8a57a13d096b22f8c8773b6bf791a7cf2ea614123b3d592fd006c51ac5fd0edbb90ea6d8760c + languageName: node + linkType: hard + "@floating-ui/core@npm:^1.1.0": version: 1.5.2 resolution: "@floating-ui/core@npm:1.5.2" @@ -743,12 +801,9 @@ __metadata: cookie-parser: "npm:^1.4.6" cross-env: "npm:^7.0.3" dockerfile-ast: "npm:^0.6.1" - eslint: "npm:^8.57.0" - eslint-config-standard: "npm:^17.1.0" - eslint-plugin-import: "npm:^2.29.1" - eslint-plugin-jest: "npm:^26.9.0" - eslint-plugin-n: "npm:^15.7.0" - eslint-plugin-promise: "npm:^6.6.0" + eslint: "npm:^9.11.0" + eslint-plugin-jest: "npm:^28.8.3" + eslint-plugin-lodash: "npm:^8.0.0" eslint-plugin-security: "npm:^3.0.1" express: "npm:^4.18.3" express-static-gzip: "npm:^2.1.7" @@ -762,6 +817,7 @@ __metadata: jsonwebtoken: "npm:^9.0.2" lodash: "npm:^4.17.21" morgan: "npm:^1.10.0" + neostandard: "npm:^0.11.5" object-hash: "npm:^3.0.0" openapi-types: "npm:^12.1.3" openid-client: "npm:^5.6.5" @@ -1008,6 +1064,13 @@ __metadata: languageName: node linkType: hard +"@humanwhocodes/gitignore-to-minimatch@npm:^1.0.2": + version: 1.0.2 + resolution: "@humanwhocodes/gitignore-to-minimatch@npm:1.0.2" + checksum: 10c0/f2d3325e506c9467b719ce4f0a5abf8ba0eae21e20ea504aa28702eb89e7a95d5bc77f897197ef5706d0b98362da896e1cf3b922c414fe684a5fb66f1ec50b27 + languageName: node + linkType: hard + "@humanwhocodes/module-importer@npm:^1.0.1": version: 1.0.1 resolution: "@humanwhocodes/module-importer@npm:1.0.1" @@ -1022,6 +1085,13 @@ __metadata: languageName: node linkType: hard +"@humanwhocodes/retry@npm:^0.3.0": + version: 0.3.0 + resolution: "@humanwhocodes/retry@npm:0.3.0" + checksum: 10c0/7111ec4e098b1a428459b4e3be5a5d2a13b02905f805a2468f4fa628d072f0de2da26a27d04f65ea2846f73ba51f4204661709f05bfccff645e3cedef8781bb6 + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -1800,6 +1870,21 @@ __metadata: languageName: node linkType: hard +"@stylistic/eslint-plugin@npm:^2.6.4": + version: 2.8.0 + resolution: "@stylistic/eslint-plugin@npm:2.8.0" + dependencies: + "@typescript-eslint/utils": "npm:^8.4.0" + eslint-visitor-keys: "npm:^4.0.0" + espree: "npm:^10.1.0" + estraverse: "npm:^5.3.0" + picomatch: "npm:^4.0.2" + peerDependencies: + eslint: ">=8.40.0" + checksum: 10c0/e85fc3ecad6df8b18e4c8e25ae4dfb330565efe5b91176fa84ec0fb636f07b1efa75eddc91fb36d146fc983a3538efc294f04d4b5636b3a708da123c70470671 + languageName: node + linkType: hard + "@tootallnate/once@npm:2": version: 2.0.0 resolution: "@tootallnate/once@npm:2.0.0" @@ -1993,6 +2078,47 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/eslint-plugin@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.6.0" + dependencies: + "@eslint-community/regexpp": "npm:^4.10.0" + "@typescript-eslint/scope-manager": "npm:8.6.0" + "@typescript-eslint/type-utils": "npm:8.6.0" + "@typescript-eslint/utils": "npm:8.6.0" + "@typescript-eslint/visitor-keys": "npm:8.6.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.3.1" + natural-compare: "npm:^1.4.0" + ts-api-utils: "npm:^1.3.0" + peerDependencies: + "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/c777f01535b896d3092f9886a67ccf9e50bf9e0f581ffab607c5e95dbf3092299b0d9f3e6041b134d69059a6fa5691785940b81015f73bb9a0e9d1605f6442ea + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/parser@npm:8.6.0" + dependencies: + "@typescript-eslint/scope-manager": "npm:8.6.0" + "@typescript-eslint/types": "npm:8.6.0" + "@typescript-eslint/typescript-estree": "npm:8.6.0" + "@typescript-eslint/visitor-keys": "npm:8.6.0" + debug: "npm:^4.3.4" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/3f280d289b486359194d422d89df9896b3f10a6d45cdf851d1d5f3200489271a31ab503c127cb5656f9b0ad6d795dd708b960f21fb105750aac19f41f8f815d1 + languageName: node + linkType: hard + "@typescript-eslint/scope-manager@npm:5.62.0": version: 5.62.0 resolution: "@typescript-eslint/scope-manager@npm:5.62.0" @@ -2013,6 +2139,31 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/scope-manager@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/scope-manager@npm:8.6.0" + dependencies: + "@typescript-eslint/types": "npm:8.6.0" + "@typescript-eslint/visitor-keys": "npm:8.6.0" + checksum: 10c0/37092ef70171c06854ac67ebfb2255063890c1c6133654e6b15b6adb6d2ab83de4feafd1599f4d02ed71a018226fcb3a389021758ec045e1904fb1798e90b4fe + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/type-utils@npm:8.6.0" + dependencies: + "@typescript-eslint/typescript-estree": "npm:8.6.0" + "@typescript-eslint/utils": "npm:8.6.0" + debug: "npm:^4.3.4" + ts-api-utils: "npm:^1.3.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/914b4637caa40c102117655a9b4451e0db611a61309ed39d6c57522655463c059f4dfd4e2d7ffdefcc9ab7533be21fb877b740c58f5be11f3530aa29f3d2cb62 + languageName: node + linkType: hard + "@typescript-eslint/types@npm:5.62.0": version: 5.62.0 resolution: "@typescript-eslint/types@npm:5.62.0" @@ -2027,6 +2178,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/types@npm:8.6.0" + checksum: 10c0/e7051d212252f7d1905b5527b211e335db4ec5bb1d3a52d73c8d2de6ddf5cbc981f2c92ca9ffcef35f7447bda635ea1ccce5f884ade7f243d14f2a254982c698 + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:5.62.0": version: 5.62.0 resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" @@ -2064,6 +2222,39 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/typescript-estree@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.6.0" + dependencies: + "@typescript-eslint/types": "npm:8.6.0" + "@typescript-eslint/visitor-keys": "npm:8.6.0" + debug: "npm:^4.3.4" + fast-glob: "npm:^3.3.2" + is-glob: "npm:^4.0.3" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^1.3.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/33ab8c03221a797865301f09d1d198c67f8b0e3dbf0d13e41f699dc2740242303a9fcfd7b38302cef318541fdedd832fd6e8ba34a5041a57e9114fa134045385 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:8.6.0, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0, @typescript-eslint/utils@npm:^8.4.0": + version: 8.6.0 + resolution: "@typescript-eslint/utils@npm:8.6.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.4.0" + "@typescript-eslint/scope-manager": "npm:8.6.0" + "@typescript-eslint/types": "npm:8.6.0" + "@typescript-eslint/typescript-estree": "npm:8.6.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + checksum: 10c0/5b615106342dfdf09f5a73e2554cc0c4d979c262a9a4548eb76ec7045768e0ff0bf0316cf8a5eb5404689cd476fcd335fc84f90eb985557559e42aeee33d687e + languageName: node + linkType: hard + "@typescript-eslint/utils@npm:^5.10.0": version: 5.62.0 resolution: "@typescript-eslint/utils@npm:5.62.0" @@ -2119,6 +2310,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.6.0" + dependencies: + "@typescript-eslint/types": "npm:8.6.0" + eslint-visitor-keys: "npm:^3.4.3" + checksum: 10c0/9bd5d5daee9de7e009fdd1b64b1eca685a699d1b2639373bc279c97e25e769fff56fffef708ef66a2b19bc8bb201d36daf9e7084f0e0872178bfcf9d923b41f3 + languageName: node + linkType: hard + "@ungap/structured-clone@npm:^1.2.0": version: 1.2.0 resolution: "@ungap/structured-clone@npm:1.2.0" @@ -2630,6 +2831,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.12.0": + version: 8.12.1 + resolution: "acorn@npm:8.12.1" + bin: + acorn: bin/acorn + checksum: 10c0/51fb26cd678f914e13287e886da2d7021f8c2bc0ccc95e03d3e0447ee278dd3b40b9c57dc222acd5881adcf26f3edc40901a4953403232129e3876793cd17386 + languageName: node + linkType: hard + "agent-base@npm:6, agent-base@npm:^6.0.2": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -2827,7 +3037,7 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.8": +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.8": version: 3.1.8 resolution: "array-includes@npm:3.1.8" dependencies: @@ -2848,6 +3058,20 @@ __metadata: languageName: node linkType: hard +"array.prototype.findlast@npm:^1.2.5": + version: 1.2.5 + resolution: "array.prototype.findlast@npm:1.2.5" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/ddc952b829145ab45411b9d6adcb51a8c17c76bf89c9dd64b52d5dffa65d033da8c076ed2e17091779e83bc892b9848188d7b4b33453c5565e65a92863cb2775 + languageName: node + linkType: hard + "array.prototype.findlastindex@npm:^1.2.5": version: 1.2.5 resolution: "array.prototype.findlastindex@npm:1.2.5" @@ -2862,7 +3086,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.flat@npm:^1.3.2": +"array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.2": version: 1.3.2 resolution: "array.prototype.flat@npm:1.3.2" dependencies: @@ -2886,6 +3110,19 @@ __metadata: languageName: node linkType: hard +"array.prototype.tosorted@npm:^1.1.4": + version: 1.1.4 + resolution: "array.prototype.tosorted@npm:1.1.4" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.3" + es-errors: "npm:^1.3.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/eb3c4c4fc0381b0bf6dba2ea4d48d367c2827a0d4236a5718d97caaccc6b78f11f4cadf090736e86301d295a6aa4967ed45568f92ced51be8cbbacd9ca410943 + languageName: node + linkType: hard + "arraybuffer.prototype.slice@npm:^1.0.3": version: 1.0.3 resolution: "arraybuffer.prototype.slice@npm:1.0.3" @@ -4123,6 +4360,16 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^5.17.0": + version: 5.17.1 + resolution: "enhanced-resolve@npm:5.17.1" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10c0/81a0515675eca17efdba2cf5bad87abc91a528fc1191aad50e275e74f045b41506167d420099022da7181c8d787170ea41e4a11a0b10b7a16f6237daecb15370 + languageName: node + linkType: hard + "entities@npm:^4.2.0, entities@npm:^4.4.0, entities@npm:^4.5.0": version: 4.5.0 resolution: "entities@npm:4.5.0" @@ -4153,6 +4400,60 @@ __metadata: languageName: node linkType: hard +"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.1, es-abstract@npm:^1.23.3": + version: 1.23.3 + resolution: "es-abstract@npm:1.23.3" + dependencies: + array-buffer-byte-length: "npm:^1.0.1" + arraybuffer.prototype.slice: "npm:^1.0.3" + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.7" + data-view-buffer: "npm:^1.0.1" + data-view-byte-length: "npm:^1.0.1" + data-view-byte-offset: "npm:^1.0.0" + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + es-set-tostringtag: "npm:^2.0.3" + es-to-primitive: "npm:^1.2.1" + function.prototype.name: "npm:^1.1.6" + get-intrinsic: "npm:^1.2.4" + get-symbol-description: "npm:^1.0.2" + globalthis: "npm:^1.0.3" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.0.3" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.2" + internal-slot: "npm:^1.0.7" + is-array-buffer: "npm:^3.0.4" + is-callable: "npm:^1.2.7" + is-data-view: "npm:^1.0.1" + is-negative-zero: "npm:^2.0.3" + is-regex: "npm:^1.1.4" + is-shared-array-buffer: "npm:^1.0.3" + is-string: "npm:^1.0.7" + is-typed-array: "npm:^1.1.13" + is-weakref: "npm:^1.0.2" + object-inspect: "npm:^1.13.1" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.5" + regexp.prototype.flags: "npm:^1.5.2" + safe-array-concat: "npm:^1.1.2" + safe-regex-test: "npm:^1.0.3" + string.prototype.trim: "npm:^1.2.9" + string.prototype.trimend: "npm:^1.0.8" + string.prototype.trimstart: "npm:^1.0.8" + typed-array-buffer: "npm:^1.0.2" + typed-array-byte-length: "npm:^1.0.1" + typed-array-byte-offset: "npm:^1.0.2" + typed-array-length: "npm:^1.0.6" + unbox-primitive: "npm:^1.0.2" + which-typed-array: "npm:^1.1.15" + checksum: 10c0/d27e9afafb225c6924bee9971a7f25f20c314f2d6cb93a63cada4ac11dcf42040896a6c22e5fb8f2a10767055ed4ddf400be3b1eb12297d281726de470b75666 + languageName: node + linkType: hard + "es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.2": version: 1.23.2 resolution: "es-abstract@npm:1.23.2" @@ -4223,6 +4524,28 @@ __metadata: languageName: node linkType: hard +"es-iterator-helpers@npm:^1.0.19": + version: 1.0.19 + resolution: "es-iterator-helpers@npm:1.0.19" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.3" + es-errors: "npm:^1.3.0" + es-set-tostringtag: "npm:^2.0.3" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + globalthis: "npm:^1.0.3" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.0.3" + has-symbols: "npm:^1.0.3" + internal-slot: "npm:^1.0.7" + iterator.prototype: "npm:^1.1.2" + safe-array-concat: "npm:^1.1.2" + checksum: 10c0/ae8f0241e383b3d197383b9842c48def7fce0255fb6ed049311b686ce295595d9e389b466f6a1b7d4e7bb92d82f5e716d6fae55e20c1040249bf976743b038c5 + languageName: node + linkType: hard + "es-object-atoms@npm:^1.0.0": version: 1.0.0 resolution: "es-object-atoms@npm:1.0.0" @@ -4378,6 +4701,17 @@ __metadata: languageName: node linkType: hard +"eslint-compat-utils@npm:^0.5.1": + version: 0.5.1 + resolution: "eslint-compat-utils@npm:0.5.1" + dependencies: + semver: "npm:^7.5.4" + peerDependencies: + eslint: ">=6.0.0" + checksum: 10c0/325e815205fab70ebcd379f6d4b5d44c7d791bb8dfe0c9888233f30ebabd9418422595b53a781b946c768d9244d858540e5e6129a6b3dd6d606f467d599edc6c + languageName: node + linkType: hard + "eslint-config-standard@npm:^17.1.0": version: 17.1.0 resolution: "eslint-config-standard@npm:17.1.0" @@ -4413,6 +4747,19 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-es-x@npm:^7.5.0": + version: 7.8.0 + resolution: "eslint-plugin-es-x@npm:7.8.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.1.2" + "@eslint-community/regexpp": "npm:^4.11.0" + eslint-compat-utils: "npm:^0.5.1" + peerDependencies: + eslint: ">=8" + checksum: 10c0/002fda8c029bc5da41e24e7ac11654062831d675fc4f5f20d0de460e24bf1e05cd559000678ef3e46c48641190f4fc07ae3d57aa5e8b085ef5f67e5f63742614 + languageName: node + linkType: hard + "eslint-plugin-es@npm:^4.1.0": version: 4.1.0 resolution: "eslint-plugin-es@npm:4.1.0" @@ -4481,6 +4828,35 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-jest@npm:^28.8.3": + version: 28.8.3 + resolution: "eslint-plugin-jest@npm:28.8.3" + dependencies: + "@typescript-eslint/utils": "npm:^6.0.0 || ^7.0.0 || ^8.0.0" + peerDependencies: + "@typescript-eslint/eslint-plugin": ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + jest: "*" + peerDependenciesMeta: + "@typescript-eslint/eslint-plugin": + optional: true + jest: + optional: true + checksum: 10c0/beacf85c2fbb39ef9b9839472a8a837cdbab6549b29abaff8999034ac41021e1f06d1779db3ea9d0f966be52e5daeacfd05c239d686370d8b8cb9c68d60e59b6 + languageName: node + linkType: hard + +"eslint-plugin-lodash@npm:^8.0.0": + version: 8.0.0 + resolution: "eslint-plugin-lodash@npm:8.0.0" + dependencies: + lodash: "npm:^4.17.21" + peerDependencies: + eslint: ">=9.0.0" + checksum: 10c0/7850aa39e44db6bf3590460b6b7fcdbb41dfbfcfda8f20d04d12e09127154e86811c8c9c291151d214422daa5aa50812525569ff58837c53c0e93c1ebb8cbc54 + languageName: node + linkType: hard + "eslint-plugin-n@npm:^15.7.0": version: 15.7.0 resolution: "eslint-plugin-n@npm:15.7.0" @@ -4499,6 +4875,24 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-n@npm:^17.10.2": + version: 17.10.3 + resolution: "eslint-plugin-n@npm:17.10.3" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.4.0" + enhanced-resolve: "npm:^5.17.0" + eslint-plugin-es-x: "npm:^7.5.0" + get-tsconfig: "npm:^4.7.0" + globals: "npm:^15.8.0" + ignore: "npm:^5.2.4" + minimatch: "npm:^9.0.5" + semver: "npm:^7.5.3" + peerDependencies: + eslint: ">=8.23.0" + checksum: 10c0/4da20f824327f244361dcc61d061e5621baafe48998e17fea5d749d9d96bd80fc39991effc39eb62fdbedddc04eac4e519a60adab4480f404469961ce888797d + languageName: node + linkType: hard + "eslint-plugin-promise@npm:^6.6.0": version: 6.6.0 resolution: "eslint-plugin-promise@npm:6.6.0" @@ -4508,6 +4902,43 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-promise@npm:^7.1.0": + version: 7.1.0 + resolution: "eslint-plugin-promise@npm:7.1.0" + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + checksum: 10c0/bbc3406139715dfa5f48d04f6d5b5e82f68929d954b0fa3821eb8cd6dc381b210512cedd2d874e5de5381005d316566f4ae046a4750ce3f5f5cbf28a14cc0ab2 + languageName: node + linkType: hard + +"eslint-plugin-react@npm:^7.35.0": + version: 7.36.1 + resolution: "eslint-plugin-react@npm:7.36.1" + dependencies: + array-includes: "npm:^3.1.8" + array.prototype.findlast: "npm:^1.2.5" + array.prototype.flatmap: "npm:^1.3.2" + array.prototype.tosorted: "npm:^1.1.4" + doctrine: "npm:^2.1.0" + es-iterator-helpers: "npm:^1.0.19" + estraverse: "npm:^5.3.0" + hasown: "npm:^2.0.2" + jsx-ast-utils: "npm:^2.4.1 || ^3.0.0" + minimatch: "npm:^3.1.2" + object.entries: "npm:^1.1.8" + object.fromentries: "npm:^2.0.8" + object.values: "npm:^1.2.0" + prop-types: "npm:^15.8.1" + resolve: "npm:^2.0.0-next.5" + semver: "npm:^6.3.1" + string.prototype.matchall: "npm:^4.0.11" + string.prototype.repeat: "npm:^1.0.0" + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + checksum: 10c0/8cb37f7fb351213bc44263580ff77627e14e27870fd81dae593e3de2826340b9bd8bbac7ae00fd5de69751a0660b2e51bd26760596f4ae85548f6b1bd76706e6 + languageName: node + linkType: hard + "eslint-plugin-security@npm:^3.0.1": version: 3.0.1 resolution: "eslint-plugin-security@npm:3.0.1" @@ -4572,6 +5003,16 @@ __metadata: languageName: node linkType: hard +"eslint-scope@npm:^8.0.2": + version: 8.0.2 + resolution: "eslint-scope@npm:8.0.2" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10c0/477f820647c8755229da913025b4567347fd1f0bf7cbdf3a256efff26a7e2e130433df052bd9e3d014025423dc00489bea47eb341002b15553673379c1a7dc36 + languageName: node + linkType: hard + "eslint-utils@npm:^2.0.0": version: 2.1.0 resolution: "eslint-utils@npm:2.1.0" @@ -4613,51 +5054,107 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8.57.0": - version: 8.57.0 - resolution: "eslint@npm:8.57.0" +"eslint-visitor-keys@npm:^4.0.0": + version: 4.0.0 + resolution: "eslint-visitor-keys@npm:4.0.0" + checksum: 10c0/76619f42cf162705a1515a6868e6fc7567e185c7063a05621a8ac4c3b850d022661262c21d9f1fc1d144ecf0d5d64d70a3f43c15c3fc969a61ace0fb25698cf5 + languageName: node + linkType: hard + +"eslint@npm:^8.57.0": + version: 8.57.0 + resolution: "eslint@npm:8.57.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.6.1" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.57.0" + "@humanwhocodes/config-array": "npm:^0.11.14" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" + bin: + eslint: bin/eslint.js + checksum: 10c0/00bb96fd2471039a312435a6776fe1fd557c056755eaa2b96093ef3a8508c92c8775d5f754768be6b1dddd09fdd3379ddb231eeb9b6c579ee17ea7d68000a529 + languageName: node + linkType: hard + +"eslint@npm:^9.11.0": + version: 9.11.0 + resolution: "eslint@npm:9.11.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.6.1" - "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.57.0" - "@humanwhocodes/config-array": "npm:^0.11.14" + "@eslint-community/regexpp": "npm:^4.11.0" + "@eslint/config-array": "npm:^0.18.0" + "@eslint/eslintrc": "npm:^3.1.0" + "@eslint/js": "npm:9.11.0" + "@eslint/plugin-kit": "npm:^0.2.0" "@humanwhocodes/module-importer": "npm:^1.0.1" + "@humanwhocodes/retry": "npm:^0.3.0" "@nodelib/fs.walk": "npm:^1.2.8" - "@ungap/structured-clone": "npm:^1.2.0" ajv: "npm:^6.12.4" chalk: "npm:^4.0.0" cross-spawn: "npm:^7.0.2" debug: "npm:^4.3.2" - doctrine: "npm:^3.0.0" escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^7.2.2" - eslint-visitor-keys: "npm:^3.4.3" - espree: "npm:^9.6.1" - esquery: "npm:^1.4.2" + eslint-scope: "npm:^8.0.2" + eslint-visitor-keys: "npm:^4.0.0" + espree: "npm:^10.1.0" + esquery: "npm:^1.5.0" esutils: "npm:^2.0.2" fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^6.0.1" + file-entry-cache: "npm:^8.0.0" find-up: "npm:^5.0.0" glob-parent: "npm:^6.0.2" - globals: "npm:^13.19.0" - graphemer: "npm:^1.4.0" ignore: "npm:^5.2.0" imurmurhash: "npm:^0.1.4" is-glob: "npm:^4.0.0" is-path-inside: "npm:^3.0.3" - js-yaml: "npm:^4.1.0" json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.4.1" lodash.merge: "npm:^4.6.2" minimatch: "npm:^3.1.2" natural-compare: "npm:^1.4.0" optionator: "npm:^0.9.3" strip-ansi: "npm:^6.0.1" text-table: "npm:^0.2.0" + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true bin: eslint: bin/eslint.js - checksum: 10c0/00bb96fd2471039a312435a6776fe1fd557c056755eaa2b96093ef3a8508c92c8775d5f754768be6b1dddd09fdd3379ddb231eeb9b6c579ee17ea7d68000a529 + checksum: 10c0/3438a78172bc667dc87bc4ad864671bd93231c82c9d366899ea3a77fc3444c8cdd158e7fe3ca1cfe4cb566045b1b36c0ccae9fc20efeb4b187f1a534075a1177 languageName: node linkType: hard @@ -4668,6 +5165,17 @@ __metadata: languageName: node linkType: hard +"espree@npm:^10.0.1, espree@npm:^10.1.0": + version: 10.1.0 + resolution: "espree@npm:10.1.0" + dependencies: + acorn: "npm:^8.12.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^4.0.0" + checksum: 10c0/52e6feaa77a31a6038f0c0e3fce93010a4625701925b0715cd54a2ae190b3275053a0717db698697b32653788ac04845e489d6773b508d6c2e8752f3c57470a0 + languageName: node + linkType: hard + "espree@npm:^9.3.1, espree@npm:^9.6.0, espree@npm:^9.6.1": version: 9.6.1 resolution: "espree@npm:9.6.1" @@ -4698,6 +5206,15 @@ __metadata: languageName: node linkType: hard +"esquery@npm:^1.5.0": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" + dependencies: + estraverse: "npm:^5.1.0" + checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 + languageName: node + linkType: hard + "esrecurse@npm:^4.3.0": version: 4.3.0 resolution: "esrecurse@npm:4.3.0" @@ -4714,7 +5231,7 @@ __metadata: languageName: node linkType: hard -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": version: 5.3.0 resolution: "estraverse@npm:5.3.0" checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 @@ -4963,6 +5480,15 @@ __metadata: languageName: node linkType: hard +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" + dependencies: + flat-cache: "npm:^4.0.0" + checksum: 10c0/9e2b5938b1cd9b6d7e3612bdc533afd4ac17b2fc646569e9a8abbf2eb48e5eb8e316bc38815a3ef6a1b456f4107f0d0f055a614ca613e75db6bf9ff4d72c1638 + languageName: node + linkType: hard + "fill-range@npm:^7.1.1": version: 7.1.1 resolution: "fill-range@npm:7.1.1" @@ -5018,7 +5544,17 @@ __metadata: languageName: node linkType: hard -"flatted@npm:^3.2.7, flatted@npm:^3.3.1": +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.4" + checksum: 10c0/2c59d93e9faa2523e4fda6b4ada749bed432cfa28c8e251f33b25795e426a1c6dbada777afb1f74fcfff33934fdbdea921ee738fcc33e71adc9d6eca984a1cfc + languageName: node + linkType: hard + +"flatted@npm:^3.2.7, flatted@npm:^3.2.9, flatted@npm:^3.3.1": version: 3.3.1 resolution: "flatted@npm:3.3.1" checksum: 10c0/324166b125ee07d4ca9bcf3a5f98d915d5db4f39d711fba640a3178b959919aae1f7cfd8aabcfef5826ed8aa8a2aa14cc85b2d7d18ff638ddf4ae3df39573eaf @@ -5308,6 +5844,15 @@ __metadata: languageName: node linkType: hard +"get-tsconfig@npm:^4.7.0": + version: 4.8.1 + resolution: "get-tsconfig@npm:4.8.1" + dependencies: + resolve-pkg-maps: "npm:^1.0.0" + checksum: 10c0/536ee85d202f604f4b5fb6be81bcd6e6d9a96846811e83e9acc6de4a04fb49506edea0e1b8cf1d5ee7af33e469916ec2809d4c5445ab8ae015a7a51fbd1572f9 + languageName: node + linkType: hard + "glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -5372,6 +5917,20 @@ __metadata: languageName: node linkType: hard +"globals@npm:^14.0.0": + version: 14.0.0 + resolution: "globals@npm:14.0.0" + checksum: 10c0/b96ff42620c9231ad468d4c58ff42afee7777ee1c963013ff8aabe095a451d0ceeb8dcd8ef4cbd64d2538cef45f787a78ba3a9574f4a634438963e334471302d + languageName: node + linkType: hard + +"globals@npm:^15.8.0, globals@npm:^15.9.0": + version: 15.9.0 + resolution: "globals@npm:15.9.0" + checksum: 10c0/de4b553e412e7e830998578d51b605c492256fb2a9273eaeec6ec9ee519f1c5aa50de57e3979911607fd7593a4066420e01d8c3d551e7a6a236e96c521aee36c + languageName: node + linkType: hard + "globalthis@npm:^1.0.3": version: 1.0.3 resolution: "globalthis@npm:1.0.3" @@ -5404,7 +5963,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 @@ -5655,6 +6214,13 @@ __metadata: languageName: node linkType: hard +"ignore@npm:^5.2.4, ignore@npm:^5.3.1": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 + languageName: node + linkType: hard + "immutable@npm:^4.0.0": version: 4.3.4 resolution: "immutable@npm:4.3.4" @@ -5764,6 +6330,15 @@ __metadata: languageName: node linkType: hard +"is-async-function@npm:^2.0.0": + version: 2.0.0 + resolution: "is-async-function@npm:2.0.0" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: 10c0/787bc931576aad525d751fc5ce211960fe91e49ac84a5c22d6ae0bc9541945fbc3f686dc590c3175722ce4f6d7b798a93f6f8ff4847fdb2199aea6f4baf5d668 + languageName: node + linkType: hard + "is-bigint@npm:^1.0.1": version: 1.0.4 resolution: "is-bigint@npm:1.0.4" @@ -5843,7 +6418,7 @@ __metadata: languageName: node linkType: hard -"is-date-object@npm:^1.0.1": +"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": version: 1.0.5 resolution: "is-date-object@npm:1.0.5" dependencies: @@ -5875,6 +6450,15 @@ __metadata: languageName: node linkType: hard +"is-finalizationregistry@npm:^1.0.2": + version: 1.0.2 + resolution: "is-finalizationregistry@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + checksum: 10c0/81caecc984d27b1a35c68741156fc651fb1fa5e3e6710d21410abc527eb226d400c0943a167922b2e920f6b3e58b0dede9aa795882b038b85f50b3a4b877db86 + languageName: node + linkType: hard + "is-fullwidth-code-point@npm:^3.0.0": version: 3.0.0 resolution: "is-fullwidth-code-point@npm:3.0.0" @@ -5889,6 +6473,15 @@ __metadata: languageName: node linkType: hard +"is-generator-function@npm:^1.0.10": + version: 1.0.10 + resolution: "is-generator-function@npm:1.0.10" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: 10c0/df03514df01a6098945b5a0cfa1abff715807c8e72f57c49a0686ad54b3b74d394e2d8714e6f709a71eb00c9630d48e73ca1796c1ccc84ac95092c1fecc0d98b + languageName: node + linkType: hard + "is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" @@ -5905,6 +6498,13 @@ __metadata: languageName: node linkType: hard +"is-map@npm:^2.0.3": + version: 2.0.3 + resolution: "is-map@npm:2.0.3" + checksum: 10c0/2c4d431b74e00fdda7162cd8e4b763d6f6f217edf97d4f8538b94b8702b150610e2c64961340015fe8df5b1fcee33ccd2e9b62619c4a8a3a155f8de6d6d355fc + languageName: node + linkType: hard + "is-named-css-color@npm:1.0.0": version: 1.0.0 resolution: "is-named-css-color@npm:1.0.0" @@ -5968,6 +6568,13 @@ __metadata: languageName: node linkType: hard +"is-set@npm:^2.0.3": + version: 2.0.3 + resolution: "is-set@npm:2.0.3" + checksum: 10c0/f73732e13f099b2dc879c2a12341cfc22ccaca8dd504e6edae26484bd5707a35d503fba5b4daad530a9b088ced1ae6c9d8200fd92e09b428fe14ea79ce8080b7 + languageName: node + linkType: hard + "is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.3": version: 1.0.3 resolution: "is-shared-array-buffer@npm:1.0.3" @@ -6018,6 +6625,13 @@ __metadata: languageName: node linkType: hard +"is-weakmap@npm:^2.0.2": + version: 2.0.2 + resolution: "is-weakmap@npm:2.0.2" + checksum: 10c0/443c35bb86d5e6cc5929cd9c75a4024bb0fff9586ed50b092f94e700b89c43a33b186b76dbc6d54f3d3d09ece689ab38dcdc1af6a482cbe79c0f2da0a17f1299 + languageName: node + linkType: hard + "is-weakref@npm:^1.0.2": version: 1.0.2 resolution: "is-weakref@npm:1.0.2" @@ -6027,6 +6641,16 @@ __metadata: languageName: node linkType: hard +"is-weakset@npm:^2.0.3": + version: 2.0.3 + resolution: "is-weakset@npm:2.0.3" + dependencies: + call-bind: "npm:^1.0.7" + get-intrinsic: "npm:^1.2.4" + checksum: 10c0/8ad6141b6a400e7ce7c7442a13928c676d07b1f315ab77d9912920bf5f4170622f43126f111615788f26c3b1871158a6797c862233124507db0bcc33a9537d1a + languageName: node + linkType: hard + "is-whitespace@npm:latest": version: 0.3.0 resolution: "is-whitespace@npm:0.3.0" @@ -6133,6 +6757,19 @@ __metadata: languageName: node linkType: hard +"iterator.prototype@npm:^1.1.2": + version: 1.1.2 + resolution: "iterator.prototype@npm:1.1.2" + dependencies: + define-properties: "npm:^1.2.1" + get-intrinsic: "npm:^1.2.1" + has-symbols: "npm:^1.0.3" + reflect.getprototypeof: "npm:^1.0.4" + set-function-name: "npm:^2.0.1" + checksum: 10c0/a32151326095e916f306990d909f6bbf23e3221999a18ba686419535dcd1749b10ded505e89334b77dc4c7a58a8508978f0eb16c2c8573e6d412eb7eb894ea79 + languageName: node + linkType: hard + "jackspeak@npm:^3.1.2": version: 3.4.3 resolution: "jackspeak@npm:3.4.3" @@ -6637,7 +7274,7 @@ __metadata: languageName: node linkType: hard -"js-tokens@npm:^4.0.0": +"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed @@ -6796,6 +7433,18 @@ __metadata: languageName: node linkType: hard +"jsx-ast-utils@npm:^2.4.1 || ^3.0.0": + version: 3.3.5 + resolution: "jsx-ast-utils@npm:3.3.5" + dependencies: + array-includes: "npm:^3.1.6" + array.prototype.flat: "npm:^1.3.1" + object.assign: "npm:^4.1.4" + object.values: "npm:^1.1.6" + checksum: 10c0/a32679e9cb55469cb6d8bbc863f7d631b2c98b7fc7bf172629261751a6e7bc8da6ae374ddb74d5fbd8b06cf0eb4572287b259813d92b36e384024ed35e4c13e1 + languageName: node + linkType: hard + "jwa@npm:^1.4.1": version: 1.4.1 resolution: "jwa@npm:1.4.1" @@ -6854,6 +7503,15 @@ __metadata: languageName: node linkType: hard +"keyv@npm:^4.5.4": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e + languageName: node + linkType: hard + "kleur@npm:^3.0.3": version: 3.0.3 resolution: "kleur@npm:3.0.3" @@ -6966,6 +7624,17 @@ __metadata: languageName: node linkType: hard +"loose-envify@npm:^1.4.0": + version: 1.4.0 + resolution: "loose-envify@npm:1.4.0" + dependencies: + js-tokens: "npm:^3.0.0 || ^4.0.0" + bin: + loose-envify: cli.js + checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e + languageName: node + linkType: hard + "loupe@npm:^3.1.0, loupe@npm:^3.1.1": version: 3.1.1 resolution: "loupe@npm:3.1.1" @@ -7208,7 +7877,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.4": +"minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": version: 9.0.5 resolution: "minimatch@npm:9.0.5" dependencies: @@ -7395,6 +8064,27 @@ __metadata: languageName: node linkType: hard +"neostandard@npm:^0.11.5": + version: 0.11.5 + resolution: "neostandard@npm:0.11.5" + dependencies: + "@humanwhocodes/gitignore-to-minimatch": "npm:^1.0.2" + "@stylistic/eslint-plugin": "npm:^2.6.4" + eslint-plugin-n: "npm:^17.10.2" + eslint-plugin-promise: "npm:^7.1.0" + eslint-plugin-react: "npm:^7.35.0" + find-up: "npm:^5.0.0" + globals: "npm:^15.9.0" + peowly: "npm:^1.3.2" + typescript-eslint: "npm:^8.0.0" + peerDependencies: + eslint: ^9.0.0 + bin: + neostandard: cli.mjs + checksum: 10c0/4c8254bec2205f70e795d79d42339123231e06848e97a2e55f51c0bf76c11c79836143f30872751f18e790e507f0cb2d503c88a585d64f27316ec35d847b259a + languageName: node + linkType: hard + "netmask@npm:^2.0.2": version: 2.0.2 resolution: "netmask@npm:2.0.2" @@ -7526,7 +8216,7 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4": +"object-assign@npm:^4, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 @@ -7561,7 +8251,7 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.5": +"object.assign@npm:^4.1.4, object.assign@npm:^4.1.5": version: 4.1.5 resolution: "object.assign@npm:4.1.5" dependencies: @@ -7573,6 +8263,17 @@ __metadata: languageName: node linkType: hard +"object.entries@npm:^1.1.8": + version: 1.1.8 + resolution: "object.entries@npm:1.1.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/db9ea979d2956a3bc26c262da4a4d212d36f374652cc4c13efdd069c1a519c16571c137e2893d1c46e1cb0e15c88fd6419eaf410c945f329f09835487d7e65d3 + languageName: node + linkType: hard + "object.fromentries@npm:^2.0.8": version: 2.0.8 resolution: "object.fromentries@npm:2.0.8" @@ -7596,7 +8297,7 @@ __metadata: languageName: node linkType: hard -"object.values@npm:^1.2.0": +"object.values@npm:^1.1.6, object.values@npm:^1.2.0": version: 1.2.0 resolution: "object.values@npm:1.2.0" dependencies: @@ -7935,6 +8636,13 @@ __metadata: languageName: node linkType: hard +"peowly@npm:^1.3.2": + version: 1.3.2 + resolution: "peowly@npm:1.3.2" + checksum: 10c0/92af395548a05f1ab909bad5a651a4daf02500bdb1fb636536f32770c9d69f35a6d1979575615a19363b0f3967b169f5d8e8fa7debbfb60deeea93ee382dcb9a + languageName: node + linkType: hard + "picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": version: 1.0.1 resolution: "picocolors@npm:1.0.1" @@ -7956,6 +8664,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^4.0.2": + version: 4.0.2 + resolution: "picomatch@npm:4.0.2" + checksum: 10c0/7c51f3ad2bb42c776f49ebf964c644958158be30d0a510efd5a395e8d49cb5acfed5b82c0c5b365523ce18e6ab85013c9ebe574f60305892ec3fa8eee8304ccc + languageName: node + linkType: hard + "pinia@npm:^2.1.7": version: 2.2.2 resolution: "pinia@npm:2.2.2" @@ -8078,6 +8793,17 @@ __metadata: languageName: node linkType: hard +"prop-types@npm:^15.8.1": + version: 15.8.1 + resolution: "prop-types@npm:15.8.1" + dependencies: + loose-envify: "npm:^1.4.0" + object-assign: "npm:^4.1.1" + react-is: "npm:^16.13.1" + checksum: 10c0/59ece7ca2fb9838031d73a48d4becb9a7cc1ed10e610517c7d8f19a1e02fa47f7c27d557d8a5702bec3cfeccddc853579832b43f449e54635803f277b1c78077 + languageName: node + linkType: hard + "proto-list@npm:~1.2.1": version: 1.2.4 resolution: "proto-list@npm:1.2.4" @@ -8167,6 +8893,13 @@ __metadata: languageName: node linkType: hard +"react-is@npm:^16.13.1": + version: 16.13.1 + resolution: "react-is@npm:16.13.1" + checksum: 10c0/33977da7a5f1a287936a0c85639fec6ca74f4f15ef1e59a6bc20338fc73dc69555381e211f7a3529b8150a1f71e4225525b41b60b52965bda53ce7d47377ada1 + languageName: node + linkType: hard + "react-is@npm:^18.0.0": version: 18.2.0 resolution: "react-is@npm:18.2.0" @@ -8201,6 +8934,21 @@ __metadata: languageName: node linkType: hard +"reflect.getprototypeof@npm:^1.0.4": + version: 1.0.6 + resolution: "reflect.getprototypeof@npm:1.0.6" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.1" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.4" + globalthis: "npm:^1.0.3" + which-builtin-type: "npm:^1.1.3" + checksum: 10c0/baf4ef8ee6ff341600f4720b251cf5a6cb552d6a6ab0fdc036988c451bf16f920e5feb0d46bd4f530a5cce568f1f7aca2d77447ca798920749cfc52783c39b55 + languageName: node + linkType: hard + "regexp-tree@npm:~0.1.1": version: 0.1.27 resolution: "regexp-tree@npm:0.1.27" @@ -8282,6 +9030,13 @@ __metadata: languageName: node linkType: hard +"resolve-pkg-maps@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-pkg-maps@npm:1.0.0" + checksum: 10c0/fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab + languageName: node + linkType: hard + "resolve.exports@npm:^2.0.0": version: 2.0.2 resolution: "resolve.exports@npm:2.0.2" @@ -8302,6 +9057,19 @@ __metadata: languageName: node linkType: hard +"resolve@npm:^2.0.0-next.5": + version: 2.0.0-next.5 + resolution: "resolve@npm:2.0.0-next.5" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/a6c33555e3482ea2ec4c6e3d3bf0d78128abf69dca99ae468e64f1e30acaa318fd267fb66c8836b04d558d3e2d6ed875fe388067e7d8e0de647d3c21af21c43a + languageName: node + linkType: hard + "resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": version: 1.22.6 resolution: "resolve@patch:resolve@npm%3A1.22.6#optional!builtin::version=1.22.6&hash=c3c19d" @@ -8315,6 +9083,19 @@ __metadata: languageName: node linkType: hard +"resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin": + version: 2.0.0-next.5 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/78ad6edb8309a2bfb720c2c1898f7907a37f858866ce11a5974643af1203a6a6e05b2fa9c53d8064a673a447b83d42569260c306d43628bff5bb101969708355 + languageName: node + linkType: hard + "response-time@npm:^2.3.2": version: 2.3.2 resolution: "response-time@npm:2.3.2" @@ -8639,7 +9420,7 @@ __metadata: languageName: node linkType: hard -"set-function-name@npm:^2.0.1": +"set-function-name@npm:^2.0.1, set-function-name@npm:^2.0.2": version: 2.0.2 resolution: "set-function-name@npm:2.0.2" dependencies: @@ -8958,6 +9739,36 @@ __metadata: languageName: node linkType: hard +"string.prototype.matchall@npm:^4.0.11": + version: 4.0.11 + resolution: "string.prototype.matchall@npm:4.0.11" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.4" + gopd: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + internal-slot: "npm:^1.0.7" + regexp.prototype.flags: "npm:^1.5.2" + set-function-name: "npm:^2.0.2" + side-channel: "npm:^1.0.6" + checksum: 10c0/915a2562ac9ab5e01b7be6fd8baa0b2b233a0a9aa975fcb2ec13cc26f08fb9a3e85d5abdaa533c99c6fc4c5b65b914eba3d80c4aff9792a4c9fed403f28f7d9d + languageName: node + linkType: hard + +"string.prototype.repeat@npm:^1.0.0": + version: 1.0.0 + resolution: "string.prototype.repeat@npm:1.0.0" + dependencies: + define-properties: "npm:^1.1.3" + es-abstract: "npm:^1.17.5" + checksum: 10c0/94c7978566cffa1327d470fd924366438af9b04b497c43a9805e476e2e908aa37a1fd34cc0911156c17556dab62159d12c7b92b3cc304c3e1281fe4c8e668f40 + languageName: node + linkType: hard + "string.prototype.trim@npm:^1.2.9": version: 1.2.9 resolution: "string.prototype.trim@npm:1.2.9" @@ -8992,6 +9803,17 @@ __metadata: languageName: node linkType: hard +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/d53af1899959e53c83b64a5fd120be93e067da740e7e75acb433849aa640782fb6c7d4cd5b84c954c84413745a3764df135a8afeb22908b86a835290788d8366 + languageName: node + linkType: hard + "string_decoder@npm:^1.1.1": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" @@ -9123,6 +9945,13 @@ __metadata: languageName: node linkType: hard +"tapable@npm:^2.2.0": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: 10c0/bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 + languageName: node + linkType: hard + "tar@npm:^6.1.11, tar@npm:^6.1.2": version: 6.2.1 resolution: "tar@npm:6.2.1" @@ -9268,7 +10097,7 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^1.0.1": +"ts-api-utils@npm:^1.0.1, ts-api-utils@npm:^1.3.0": version: 1.3.0 resolution: "ts-api-utils@npm:1.3.0" peerDependencies: @@ -9399,6 +10228,34 @@ __metadata: languageName: node linkType: hard +"typed-array-length@npm:^1.0.6": + version: 1.0.6 + resolution: "typed-array-length@npm:1.0.6" + dependencies: + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-proto: "npm:^1.0.3" + is-typed-array: "npm:^1.1.13" + possible-typed-array-names: "npm:^1.0.0" + checksum: 10c0/74253d7dc488eb28b6b2711cf31f5a9dcefc9c41b0681fd1c178ed0a1681b4468581a3626d39cd4df7aee3d3927ab62be06aa9ca74e5baf81827f61641445b77 + languageName: node + linkType: hard + +"typescript-eslint@npm:^8.0.0": + version: 8.6.0 + resolution: "typescript-eslint@npm:8.6.0" + dependencies: + "@typescript-eslint/eslint-plugin": "npm:8.6.0" + "@typescript-eslint/parser": "npm:8.6.0" + "@typescript-eslint/utils": "npm:8.6.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/d009170af1cffece3a63784c3f6d6f5074fd42d198540f3140dd0fed4f37b1888d59abb5992624099834cae2ea4863b6c526b5f11ecbfd105f41a87e300305db + languageName: node + linkType: hard + "unbox-primitive@npm:^1.0.2": version: 1.0.2 resolution: "unbox-primitive@npm:1.0.2" @@ -9970,6 +10827,38 @@ __metadata: languageName: node linkType: hard +"which-builtin-type@npm:^1.1.3": + version: 1.1.4 + resolution: "which-builtin-type@npm:1.1.4" + dependencies: + function.prototype.name: "npm:^1.1.6" + has-tostringtag: "npm:^1.0.2" + is-async-function: "npm:^2.0.0" + is-date-object: "npm:^1.0.5" + is-finalizationregistry: "npm:^1.0.2" + is-generator-function: "npm:^1.0.10" + is-regex: "npm:^1.1.4" + is-weakref: "npm:^1.0.2" + isarray: "npm:^2.0.5" + which-boxed-primitive: "npm:^1.0.2" + which-collection: "npm:^1.0.2" + which-typed-array: "npm:^1.1.15" + checksum: 10c0/a4a76d20d869a81b1dbb4adea31edc7e6c1a4466d3ab7c2cd757c9219d48d3723b04076c85583257b0f0f8e3ebe5af337248b8ceed57b9051cb97bce5bd881d1 + languageName: node + linkType: hard + +"which-collection@npm:^1.0.2": + version: 1.0.2 + resolution: "which-collection@npm:1.0.2" + dependencies: + is-map: "npm:^2.0.3" + is-set: "npm:^2.0.3" + is-weakmap: "npm:^2.0.2" + is-weakset: "npm:^2.0.3" + checksum: 10c0/3345fde20964525a04cdf7c4a96821f85f0cc198f1b2ecb4576e08096746d129eb133571998fe121c77782ac8f21cbd67745a3d35ce100d26d4e684c142ea1f2 + languageName: node + linkType: hard + "which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15": version: 1.1.15 resolution: "which-typed-array@npm:1.1.15"