diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d6b8377c8..b636d15a1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -75,6 +75,9 @@ jobs: stack --allow-different-user build fourmolu stack --allow-different-user build hpc-lcov + - name: Run TypeScript typecheck + run: pnpm run typecheck + - name: Run Frontend Tests and Generate Coverage run: | pnpm test --coverage --maxWorkers=4 diff --git a/CHANGELOG.md b/CHANGELOG.md index 894b74332..05f432b96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ - Fixed dynamic graph centering bug by updating `parseTransform` in `app/Svg/Parser.hs` to parse multiple transform functions and removing `getShapesMinXY` in `js/components/graph/Graph.js` - Switched CI provider from CircleCI to GitHub Actions - Cleared up documentation for various graph-related front-end functions +- Adopted TypeScript v7 into build and CI pipelines and converted `js/components/graph/Button.js` to `Button.tsx` as a proof of concept ## [0.8.1] - 2026-08-10 diff --git a/README.md b/README.md index 2a3e40156..9aef5c4ed 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,10 @@ $ stack build # Compile Courseography and all Haskell dependencies (this will When running in production you should run `$ pnpm run build` instead of `$ pnpm run watch` to build the web assets. This will take longer but results in smaller asset files. +#### Typechecking + +Run `$ pnpm run typecheck`, which uses [Typescript](https://www.typescriptlang.org/) to typecheck our codebase. Only `.ts`/`.tsx` files are checked; existing `.js`/`.jsx` files are ignored. + #### Running front-end tests To run all tests, run `$ pnpm test`. However, if you need to run a specific file or folder of tests, diff --git a/babel.config.json b/babel.config.json index 228c47b47..4b679fdd4 100644 --- a/babel.config.json +++ b/babel.config.json @@ -6,7 +6,8 @@ { "runtime": "automatic" } - ] + ], + "@babel/preset-typescript" ], "plugins": [ [ diff --git a/eslint.config.cjs b/eslint.config.cjs index 98eb2983c..f647ee750 100644 --- a/eslint.config.cjs +++ b/eslint.config.cjs @@ -42,6 +42,18 @@ module.exports = [ }, }, }, + { + // @babel/eslint-parser converts TypeScript syntax to an ESTree-shaped + // AST that core rules don't fully understand, so `no-undef` flags + // type-only identifiers as undefined. + // TypeScript's own compiler (`pnpm run typecheck`) already catches + // genuine undefined-reference errors, so disable the rule here — this + // is the same guidance typescript-eslint gives for `.ts`/`.tsx` files. + files: ["**/*.ts", "**/*.tsx"], + rules: { + "no-undef": "off", + }, + }, { files: ["cypress/**/*.js"], languageOptions: { diff --git a/jest.config.js b/jest.config.js index 4c82a6985..300aff997 100644 --- a/jest.config.js +++ b/jest.config.js @@ -185,7 +185,7 @@ const config = { // A map from regular expressions to paths to transformers transform: { - "\\.jsx?$": "babel-jest", + "\\.[jt]sx?$": "babel-jest", }, // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation diff --git a/js/components/graph/Button.js b/js/components/graph/Button.js deleted file mode 100644 index 60d2c4ef5..000000000 --- a/js/components/graph/Button.js +++ /dev/null @@ -1,30 +0,0 @@ -import React from "react" -import PropTypes from "prop-types" - -export default function Button(props) { - return ( - - ) -} - -Button.propTypes = { - divId: PropTypes.string, - mouseDown: PropTypes.func, - mouseUp: PropTypes.func, - onMouseEnter: PropTypes.func, - onMouseLeave: PropTypes.func, - disabled: PropTypes.bool, - text: PropTypes.string, - children: PropTypes.node, -} diff --git a/js/components/graph/Button.tsx b/js/components/graph/Button.tsx new file mode 100644 index 000000000..722df1678 --- /dev/null +++ b/js/components/graph/Button.tsx @@ -0,0 +1,38 @@ +import React from "react" + +interface ButtonProps { + divId?: string + mouseDown?: () => void + mouseUp?: () => void + onMouseEnter?: () => void + onMouseLeave?: () => void + disabled?: boolean + text?: string + children?: React.ReactNode +} + +export default function Button({ + divId, + mouseDown, + mouseUp, + onMouseEnter, + onMouseLeave, + disabled, + text, + children, +}: ButtonProps) { + return ( + + ) +} diff --git a/package.json b/package.json index 28c90a900..258f6b747 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "watch": "webpack --watch --config webpack.dev.js --disable-interpret", "build": "cross-env NODE_ENV=production webpack --config webpack.prod.js --disable-interpret", "test": "jest", + "typecheck": "tsc", "prettier": "prettier --write .", "eslint": "eslint --fix js" }, @@ -19,7 +20,7 @@ "browserslist": "defaults", "lint-staged": { "*": "pnpm prettier --ignore-unknown --write", - "*.js": "pnpm run eslint --cache --fix js", + "*.{js,ts,tsx}": "pnpm run eslint --cache --fix js", "*.css": "pnpm run stylelint --fix", "*.scss": "pnpm run stylelint --fix", "*.hs": [ @@ -56,11 +57,14 @@ "@babel/eslint-parser": "^8.0.1", "@babel/preset-env": "^8.0.2", "@babel/preset-react": "^8.0.1", + "@babel/preset-typescript": "^8.0.1", "@eslint/compat": "^2.1.0", "@eslint/js": "^10.0.0", "@testing-library/dom": "^10.4.0", "@testing-library/react": "^16.0.1", "@testing-library/user-event": "^14.6.1", + "@types/jest": "^30.0.0", + "@types/node": "^22.20.2", "babel-jest": "^30.4.1", "babel-loader": "^10.1.1", "babel-plugin-polyfill-corejs3": "^1.0.0", @@ -90,6 +94,7 @@ "style-loader": "^4.0.0", "stylelint": "^17.14.1", "stylelint-config-standard-scss": "^17.0.0", + "typescript": "^7.0.2", "webpack": "^5.105.3", "webpack-cli": "^6.0.1", "webpack-dev-server": "^5.2.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b17dd240e..90493bb75 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -89,6 +89,9 @@ importers: "@babel/preset-react": specifier: ^8.0.1 version: 8.0.1(@babel/core@8.0.1) + "@babel/preset-typescript": + specifier: ^8.0.1 + version: 8.0.1(@babel/core@8.0.1) "@eslint/compat": specifier: ^2.1.0 version: 2.1.0(eslint@10.8.0(supports-color@8.1.1)) @@ -104,6 +107,12 @@ importers: "@testing-library/user-event": specifier: ^14.6.1 version: 14.6.1(@testing-library/dom@10.4.1) + "@types/jest": + specifier: ^30.0.0 + version: 30.0.0 + "@types/node": + specifier: ^22.20.2 + version: 22.20.2 babel-jest: specifier: ^30.4.1 version: 30.4.1(@babel/core@8.0.1)(supports-color@8.1.1) @@ -148,7 +157,7 @@ importers: version: 9.1.7 jest: specifier: ^30.4.2 - version: 30.4.2(@types/node@24.3.0)(babel-plugin-macros@3.1.0)(supports-color@8.1.1) + version: 30.4.2(@types/node@22.20.2)(babel-plugin-macros@3.1.0)(supports-color@8.1.1) jest-environment-jsdom: specifier: ^30.4.1 version: 30.4.1(supports-color@8.1.1) @@ -187,10 +196,13 @@ importers: version: 4.0.0(webpack@5.105.3) stylelint: specifier: ^17.14.1 - version: 17.14.1(supports-color@8.1.1) + version: 17.14.1(supports-color@8.1.1)(typescript@7.0.2) stylelint-config-standard-scss: specifier: ^17.0.0 - version: 17.0.0(postcss@8.5.25)(stylelint@17.14.1(supports-color@8.1.1)) + version: 17.0.0(postcss@8.5.25)(stylelint@17.14.1(supports-color@8.1.1)(typescript@7.0.2)) + typescript: + specifier: ^7.0.2 + version: 7.0.2 webpack: specifier: ^5.105.3 version: 5.105.3(uglify-js@3.19.3)(webpack-cli@6.0.1) @@ -270,10 +282,10 @@ packages: } engines: { node: ">=6.9.0" } - "@babel/generator@8.0.0": + "@babel/generator@8.0.5": resolution: { - integrity: sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==, + integrity: sha512-f/TuhuMAxJqhwxEGNsJrswuG9VHmh0oNFoQoo6TbpgtFAz9wYZXcTAcWZMHfp7ljesr0RG04bp3Aos9GI59L7w==, } engines: { node: ^22.18.0 || >=24.11.0 } @@ -298,10 +310,10 @@ packages: } engines: { node: ^22.18.0 || >=24.11.0 } - "@babel/helper-create-class-features-plugin@8.0.1": + "@babel/helper-create-class-features-plugin@8.0.5": resolution: { - integrity: sha512-++t3ZktzlLmASAxIlxeXQK9Z2YwUafYGYcvGBFevqOqt16HozVHStUoQvWD09fzAZOb/uJGpUTBuGK41AJAuOA==, + integrity: sha512-ckUE7tmolBbW4QV02lD874sWSPy8da2A09i/h0qS+IWolR+WiNhpq7C/rHZm00uOIkUb0Cp6+0Cy1ku/wj5uQQ==, } engines: { node: ^22.18.0 || >=24.11.0 } peerDependencies: @@ -339,10 +351,10 @@ packages: } engines: { node: ^22.18.0 || >=24.11.0 } - "@babel/helper-member-expression-to-functions@8.0.0": + "@babel/helper-member-expression-to-functions@8.0.5": resolution: { - integrity: sha512-xkXrMbtk87Gk7+oKBVmBc6EORg/Qwx++AHESldmHkpvG8wgccdhJJFwrzqlF382Fk8wfXhJHWE/g/43QvEGNPQ==, + integrity: sha512-GLe05QD98BkNFTkjaqeqF9QSRoHLKrrB4tpoplyQuuPrQJ72rtmkM4wvqJLX/sjZPqkbK5MUYSsuUTqdJoOVjA==, } engines: { node: ^22.18.0 || >=24.11.0 } @@ -447,10 +459,10 @@ packages: } engines: { node: ">=6.9.0" } - "@babel/helper-validator-identifier@8.0.2": + "@babel/helper-validator-identifier@8.0.4": resolution: { - integrity: sha512-9Fr9QeyCAyi1BR1jKZ6uYQ24EIhQUx5ReHfQU7drOE+TPOb+w11/dsqLkMOT2U29OdCT71XajrOT8xDc1C7orA==, + integrity: sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==, } engines: { node: ^22.18.0 || >=24.11.0 } @@ -497,10 +509,10 @@ packages: engines: { node: ">=6.0.0" } hasBin: true - "@babel/parser@8.0.0": + "@babel/parser@8.0.5": resolution: { - integrity: sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ==, + integrity: sha512-51RXvQNFakaS0bTpYiGkxNbUVwkPO4kONv6EVLorZABxsx+KZ6Z7uSYvi/wmKS/+X+rfj9RvOw0/ZNh+cmI0Rw==, } engines: { node: ^22.18.0 || >=24.11.0 } hasBin: true @@ -710,6 +722,15 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 + "@babel/plugin-syntax-typescript@8.0.3": + resolution: + { + integrity: sha512-jmTPwps7oSQSZaV1SxkQ3C12UWyufGysGc5OzDpZzvPAIX4mO7dJT3hoqkWVrSImvkcMiknir1iLN1SNV/CZzg==, + } + engines: { node: ^22.18.0 || >=24.11.0 } + peerDependencies: + "@babel/core": ^8.0.0 + "@babel/plugin-transform-arrow-functions@8.0.1": resolution: { @@ -1169,6 +1190,15 @@ packages: peerDependencies: "@babel/core": ^8.0.0 + "@babel/plugin-transform-typescript@8.0.5": + resolution: + { + integrity: sha512-o6XW6OngFfpEQat3J1MxUDEd94Rjh80BZQqWmOXa9YTtoyDnk8Zim3NXcx3RTgGiOgkoayCMYp+Xk5NxEmzoMg==, + } + engines: { node: ^22.18.0 || >=24.11.0 } + peerDependencies: + "@babel/core": ^8.0.0 + "@babel/plugin-transform-unicode-escapes@8.0.1": resolution: { @@ -1231,6 +1261,15 @@ packages: peerDependencies: "@babel/core": ^8.0.0 + "@babel/preset-typescript@8.0.1": + resolution: + { + integrity: sha512-qrPhQIN1NLrPmzgazF9XKQqXrOcp/WJly+K+6ReFonn24FZqRJO7clxOJo6Ni75L+2vAqI3cHVU2OJLBxoPp5A==, + } + engines: { node: ^22.18.0 || >=24.11.0 } + peerDependencies: + "@babel/core": ^8.0.0 + "@babel/runtime@7.29.7": resolution: { @@ -1265,10 +1304,10 @@ packages: } engines: { node: ">=6.9.0" } - "@babel/traverse@8.0.0": + "@babel/traverse@8.0.5": resolution: { - integrity: sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw==, + integrity: sha512-XFfnuvapSc/vJOcUO7kwORSvpBIvraofKEZ2dhT0PjiF21BRCD7YbAFC8UEeDJNeLoQz82/gVqzgX5hCzkCbdg==, } engines: { node: ^22.18.0 || >=24.11.0 } @@ -1279,10 +1318,10 @@ packages: } engines: { node: ">=6.9.0" } - "@babel/types@8.0.0": + "@babel/types@8.0.5": resolution: { - integrity: sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw==, + integrity: sha512-eVdMqi3ej5aHhyQ2Si6yD2cAWeV8FJK9UrhK5aL0Sd8hu5GhT+YswhVNbVheOGVYMg8kuGuMaUpkB3stjj4z8A==, } engines: { node: ^22.18.0 || >=24.11.0 } @@ -1891,6 +1930,12 @@ packages: integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==, } + "@jridgewell/gen-mapping@0.4.0-beta.0": + resolution: + { + integrity: sha512-JdGNkbE4GlNPYQhM0L95fBQr7ctLZJ276QXQLTad4t1oSdnnCI3fDq9DW3BqYAWv8Wc3+HS+4Gsii1oPMCfz1w==, + } + "@jridgewell/remapping@2.3.5": resolution: { @@ -1916,10 +1961,16 @@ packages: integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==, } - "@jridgewell/trace-mapping@0.3.30": + "@jridgewell/sourcemap-codec@1.6.0-beta.0": resolution: { - integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==, + integrity: sha512-JH8NJ34vK04ttiUpAP2gG+HFrLzijNYDKXab+cP4vWR0KwMEN23SOivFo4SbnoQJO/L4qVcImGxAGx28zrPy7g==, + } + + "@jridgewell/trace-mapping@0.3.31": + resolution: + { + integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==, } "@jsonjoy.com/base64@1.1.2": @@ -2570,6 +2621,12 @@ packages: integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, } + "@types/jest@30.0.0": + resolution: + { + integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==, + } + "@types/jsdom@21.1.7": resolution: { @@ -2594,10 +2651,10 @@ packages: integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==, } - "@types/node@24.3.0": + "@types/node@22.20.2": resolution: { - integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==, + integrity: sha512-xlvWf4Vs9n1PEVYwP1n4vvG07M6y8WgvJ2t0vbrWTmijsIHp1cS+uJ2kMIRdY3nHZK0nCYKrPeD171+SzF4/zw==, } "@types/parse-json@4.0.2": @@ -2716,6 +2773,186 @@ packages: integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==, } + "@typescript/typescript-aix-ppc64@7.0.2": + resolution: + { + integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==, + } + engines: { node: ">=16.20.0" } + cpu: [ppc64] + os: [aix] + + "@typescript/typescript-darwin-arm64@7.0.2": + resolution: + { + integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==, + } + engines: { node: ">=16.20.0" } + cpu: [arm64] + os: [darwin] + + "@typescript/typescript-darwin-x64@7.0.2": + resolution: + { + integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==, + } + engines: { node: ">=16.20.0" } + cpu: [x64] + os: [darwin] + + "@typescript/typescript-freebsd-arm64@7.0.2": + resolution: + { + integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==, + } + engines: { node: ">=16.20.0" } + cpu: [arm64] + os: [freebsd] + + "@typescript/typescript-freebsd-x64@7.0.2": + resolution: + { + integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==, + } + engines: { node: ">=16.20.0" } + cpu: [x64] + os: [freebsd] + + "@typescript/typescript-linux-arm64@7.0.2": + resolution: + { + integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==, + } + engines: { node: ">=16.20.0" } + cpu: [arm64] + os: [linux] + + "@typescript/typescript-linux-arm@7.0.2": + resolution: + { + integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==, + } + engines: { node: ">=16.20.0" } + cpu: [arm] + os: [linux] + + "@typescript/typescript-linux-loong64@7.0.2": + resolution: + { + integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==, + } + engines: { node: ">=16.20.0" } + cpu: [loong64] + os: [linux] + + "@typescript/typescript-linux-mips64el@7.0.2": + resolution: + { + integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==, + } + engines: { node: ">=16.20.0" } + cpu: [mips64el] + os: [linux] + + "@typescript/typescript-linux-ppc64@7.0.2": + resolution: + { + integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==, + } + engines: { node: ">=16.20.0" } + cpu: [ppc64] + os: [linux] + + "@typescript/typescript-linux-riscv64@7.0.2": + resolution: + { + integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==, + } + engines: { node: ">=16.20.0" } + cpu: [riscv64] + os: [linux] + + "@typescript/typescript-linux-s390x@7.0.2": + resolution: + { + integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==, + } + engines: { node: ">=16.20.0" } + cpu: [s390x] + os: [linux] + + "@typescript/typescript-linux-x64@7.0.2": + resolution: + { + integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==, + } + engines: { node: ">=16.20.0" } + cpu: [x64] + os: [linux] + + "@typescript/typescript-netbsd-arm64@7.0.2": + resolution: + { + integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==, + } + engines: { node: ">=16.20.0" } + cpu: [arm64] + os: [netbsd] + + "@typescript/typescript-netbsd-x64@7.0.2": + resolution: + { + integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==, + } + engines: { node: ">=16.20.0" } + cpu: [x64] + os: [netbsd] + + "@typescript/typescript-openbsd-arm64@7.0.2": + resolution: + { + integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==, + } + engines: { node: ">=16.20.0" } + cpu: [arm64] + os: [openbsd] + + "@typescript/typescript-openbsd-x64@7.0.2": + resolution: + { + integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==, + } + engines: { node: ">=16.20.0" } + cpu: [x64] + os: [openbsd] + + "@typescript/typescript-sunos-x64@7.0.2": + resolution: + { + integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==, + } + engines: { node: ">=16.20.0" } + cpu: [x64] + os: [sunos] + + "@typescript/typescript-win32-arm64@7.0.2": + resolution: + { + integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==, + } + engines: { node: ">=16.20.0" } + cpu: [arm64] + os: [win32] + + "@typescript/typescript-win32-x64@7.0.2": + resolution: + { + integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==, + } + engines: { node: ">=16.20.0" } + cpu: [x64] + os: [win32] + "@ungap/structured-clone@1.3.0": resolution: { @@ -8870,6 +9107,14 @@ packages: } engines: { node: ">= 0.4" } + typescript@7.0.2: + resolution: + { + integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==, + } + engines: { node: ">=16.20.0" } + hasBin: true + uglify-js@3.19.3: resolution: { @@ -8885,10 +9130,10 @@ packages: } engines: { node: ">= 0.4" } - undici-types@7.10.0: + undici-types@6.21.0: resolution: { - integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==, + integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==, } unicode-canonical-property-names-ecmascript@2.0.1: @@ -9003,6 +9248,13 @@ packages: } engines: { node: ">= 0.8" } + verkit@0.3.2: + resolution: + { + integrity: sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==, + } + engines: { node: ">=18.12.0" } + verror@1.10.0: resolution: { @@ -9399,7 +9651,7 @@ snapshots: "@babel/code-frame@8.0.0": dependencies: - "@babel/helper-validator-identifier": 8.0.2 + "@babel/helper-validator-identifier": 8.0.4 js-tokens: 10.0.0 "@babel/compat-data@7.29.7": {} @@ -9429,13 +9681,13 @@ snapshots: "@babel/core@8.0.1": dependencies: "@babel/code-frame": 8.0.0 - "@babel/generator": 8.0.0 + "@babel/generator": 8.0.5 "@babel/helper-compilation-targets": 8.0.0 "@babel/helpers": 8.0.0 - "@babel/parser": 8.0.0 + "@babel/parser": 8.0.5 "@babel/template": 8.0.0 - "@babel/traverse": 8.0.0 - "@babel/types": 8.0.0 + "@babel/traverse": 8.0.5 + "@babel/types": 8.0.5 "@types/gensync": 1.0.5 convert-source-map: 2.0.0 empathic: 2.0.1 @@ -9458,21 +9710,21 @@ snapshots: "@babel/parser": 7.29.7 "@babel/types": 7.29.7 "@jridgewell/gen-mapping": 0.3.13 - "@jridgewell/trace-mapping": 0.3.30 + "@jridgewell/trace-mapping": 0.3.31 jsesc: 3.1.0 - "@babel/generator@8.0.0": + "@babel/generator@8.0.5": dependencies: - "@babel/parser": 8.0.0 - "@babel/types": 8.0.0 - "@jridgewell/gen-mapping": 0.3.13 - "@jridgewell/trace-mapping": 0.3.30 + "@babel/parser": 8.0.5 + "@babel/types": 8.0.5 + "@jridgewell/gen-mapping": 0.4.0-beta.0 + "@jridgewell/trace-mapping": 0.3.31 "@types/jsesc": 2.5.1 jsesc: 3.1.0 "@babel/helper-annotate-as-pure@8.0.0": dependencies: - "@babel/types": 8.0.0 + "@babel/types": 8.0.5 "@babel/helper-compilation-targets@7.29.7": dependencies: @@ -9490,16 +9742,16 @@ snapshots: lru-cache: 11.5.1 semver: 7.8.5 - "@babel/helper-create-class-features-plugin@8.0.1(@babel/core@8.0.1)": + "@babel/helper-create-class-features-plugin@8.0.5(@babel/core@8.0.1)": dependencies: "@babel/core": 8.0.1 "@babel/helper-annotate-as-pure": 8.0.0 - "@babel/helper-member-expression-to-functions": 8.0.0 + "@babel/helper-member-expression-to-functions": 8.0.5 "@babel/helper-optimise-call-expression": 8.0.0 "@babel/helper-replace-supers": 8.0.1(@babel/core@8.0.1) "@babel/helper-skip-transparent-expression-wrappers": 8.0.0 - "@babel/traverse": 8.0.0 - semver: 7.8.5 + "@babel/traverse": 8.0.5 + verkit: 0.3.2 "@babel/helper-create-regexp-features-plugin@8.0.1(@babel/core@8.0.1)": dependencies: @@ -9519,10 +9771,10 @@ snapshots: "@babel/helper-globals@8.0.0": {} - "@babel/helper-member-expression-to-functions@8.0.0": + "@babel/helper-member-expression-to-functions@8.0.5": dependencies: - "@babel/traverse": 8.0.0 - "@babel/types": 8.0.0 + "@babel/traverse": 8.0.5 + "@babel/types": 8.0.5 "@babel/helper-module-imports@7.29.7(supports-color@8.1.1)": dependencies: @@ -9533,8 +9785,8 @@ snapshots: "@babel/helper-module-imports@8.0.0": dependencies: - "@babel/traverse": 8.0.0 - "@babel/types": 8.0.0 + "@babel/traverse": 8.0.5 + "@babel/types": 8.0.5 "@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)": dependencies: @@ -9549,12 +9801,12 @@ snapshots: dependencies: "@babel/core": 8.0.1 "@babel/helper-module-imports": 8.0.0 - "@babel/helper-validator-identifier": 8.0.2 - "@babel/traverse": 8.0.0 + "@babel/helper-validator-identifier": 8.0.4 + "@babel/traverse": 8.0.5 "@babel/helper-optimise-call-expression@8.0.0": dependencies: - "@babel/types": 8.0.0 + "@babel/types": 8.0.5 "@babel/helper-plugin-utils@7.29.7": {} @@ -9567,19 +9819,19 @@ snapshots: "@babel/core": 8.0.1 "@babel/helper-annotate-as-pure": 8.0.0 "@babel/helper-wrap-function": 8.0.0 - "@babel/traverse": 8.0.0 + "@babel/traverse": 8.0.5 "@babel/helper-replace-supers@8.0.1(@babel/core@8.0.1)": dependencies: "@babel/core": 8.0.1 - "@babel/helper-member-expression-to-functions": 8.0.0 + "@babel/helper-member-expression-to-functions": 8.0.5 "@babel/helper-optimise-call-expression": 8.0.0 - "@babel/traverse": 8.0.0 + "@babel/traverse": 8.0.5 "@babel/helper-skip-transparent-expression-wrappers@8.0.0": dependencies: - "@babel/traverse": 8.0.0 - "@babel/types": 8.0.0 + "@babel/traverse": 8.0.5 + "@babel/types": 8.0.5 "@babel/helper-string-parser@7.29.7": {} @@ -9587,7 +9839,7 @@ snapshots: "@babel/helper-validator-identifier@7.29.7": {} - "@babel/helper-validator-identifier@8.0.2": {} + "@babel/helper-validator-identifier@8.0.4": {} "@babel/helper-validator-option@7.29.7": {} @@ -9596,8 +9848,8 @@ snapshots: "@babel/helper-wrap-function@8.0.0": dependencies: "@babel/template": 8.0.0 - "@babel/traverse": 8.0.0 - "@babel/types": 8.0.0 + "@babel/traverse": 8.0.5 + "@babel/types": 8.0.5 "@babel/helpers@7.29.7": dependencies: @@ -9607,15 +9859,15 @@ snapshots: "@babel/helpers@8.0.0": dependencies: "@babel/template": 8.0.0 - "@babel/types": 8.0.0 + "@babel/types": 8.0.5 "@babel/parser@7.29.7": dependencies: "@babel/types": 7.29.7 - "@babel/parser@8.0.0": + "@babel/parser@8.0.5": dependencies: - "@babel/types": 8.0.0 + "@babel/types": 8.0.5 "@babel/plugin-bugfix-firefox-class-in-computed-class-key@8.0.1(@babel/core@8.0.1)": dependencies: @@ -9815,6 +10067,11 @@ snapshots: "@babel/core": 7.29.7(supports-color@8.1.1) "@babel/helper-plugin-utils": 7.29.7 + "@babel/plugin-syntax-typescript@8.0.3(@babel/core@8.0.1)": + dependencies: + "@babel/core": 8.0.1 + "@babel/helper-plugin-utils": 8.0.1(@babel/core@8.0.1) + "@babel/plugin-transform-arrow-functions@8.0.1(@babel/core@8.0.1)": dependencies: "@babel/core": 8.0.1 @@ -9825,7 +10082,7 @@ snapshots: "@babel/core": 8.0.1 "@babel/helper-plugin-utils": 8.0.1(@babel/core@8.0.1) "@babel/helper-remap-async-to-generator": 8.0.1(@babel/core@8.0.1) - "@babel/traverse": 8.0.0 + "@babel/traverse": 8.0.5 "@babel/plugin-transform-async-to-generator@8.0.1(@babel/core@8.0.1)": dependencies: @@ -9847,13 +10104,13 @@ snapshots: "@babel/plugin-transform-class-properties@8.0.1(@babel/core@8.0.1)": dependencies: "@babel/core": 8.0.1 - "@babel/helper-create-class-features-plugin": 8.0.1(@babel/core@8.0.1) + "@babel/helper-create-class-features-plugin": 8.0.5(@babel/core@8.0.1) "@babel/helper-plugin-utils": 8.0.1(@babel/core@8.0.1) "@babel/plugin-transform-class-static-block@8.0.1(@babel/core@8.0.1)": dependencies: "@babel/core": 8.0.1 - "@babel/helper-create-class-features-plugin": 8.0.1(@babel/core@8.0.1) + "@babel/helper-create-class-features-plugin": 8.0.5(@babel/core@8.0.1) "@babel/helper-plugin-utils": 8.0.1(@babel/core@8.0.1) "@babel/plugin-transform-classes@8.0.1(@babel/core@8.0.1)": @@ -9864,7 +10121,7 @@ snapshots: "@babel/helper-globals": 8.0.0 "@babel/helper-plugin-utils": 8.0.1(@babel/core@8.0.1) "@babel/helper-replace-supers": 8.0.1(@babel/core@8.0.1) - "@babel/traverse": 8.0.0 + "@babel/traverse": 8.0.5 "@babel/plugin-transform-computed-properties@8.0.1(@babel/core@8.0.1)": dependencies: @@ -9963,7 +10220,7 @@ snapshots: "@babel/core": 8.0.1 "@babel/helper-module-transforms": 8.0.1(@babel/core@8.0.1) "@babel/helper-plugin-utils": 8.0.1(@babel/core@8.0.1) - "@babel/helper-validator-identifier": 8.0.2 + "@babel/helper-validator-identifier": 8.0.4 "@babel/plugin-transform-modules-umd@8.0.1(@babel/core@8.0.1)": dependencies: @@ -10025,14 +10282,14 @@ snapshots: "@babel/plugin-transform-private-methods@8.0.1(@babel/core@8.0.1)": dependencies: "@babel/core": 8.0.1 - "@babel/helper-create-class-features-plugin": 8.0.1(@babel/core@8.0.1) + "@babel/helper-create-class-features-plugin": 8.0.5(@babel/core@8.0.1) "@babel/helper-plugin-utils": 8.0.1(@babel/core@8.0.1) "@babel/plugin-transform-private-property-in-object@8.0.1(@babel/core@8.0.1)": dependencies: "@babel/core": 8.0.1 "@babel/helper-annotate-as-pure": 8.0.0 - "@babel/helper-create-class-features-plugin": 8.0.1(@babel/core@8.0.1) + "@babel/helper-create-class-features-plugin": 8.0.5(@babel/core@8.0.1) "@babel/helper-plugin-utils": 8.0.1(@babel/core@8.0.1) "@babel/plugin-transform-property-literals@8.0.1(@babel/core@8.0.1)": @@ -10057,7 +10314,7 @@ snapshots: "@babel/helper-module-imports": 8.0.0 "@babel/helper-plugin-utils": 8.0.1(@babel/core@8.0.1) "@babel/plugin-syntax-jsx": 8.0.1(@babel/core@8.0.1) - "@babel/types": 8.0.0 + "@babel/types": 8.0.5 "@babel/plugin-transform-react-pure-annotations@8.0.1(@babel/core@8.0.1)": dependencies: @@ -10107,6 +10364,15 @@ snapshots: "@babel/core": 8.0.1 "@babel/helper-plugin-utils": 8.0.1(@babel/core@8.0.1) + "@babel/plugin-transform-typescript@8.0.5(@babel/core@8.0.1)": + dependencies: + "@babel/core": 8.0.1 + "@babel/helper-annotate-as-pure": 8.0.0 + "@babel/helper-create-class-features-plugin": 8.0.5(@babel/core@8.0.1) + "@babel/helper-plugin-utils": 8.0.1(@babel/core@8.0.1) + "@babel/helper-skip-transparent-expression-wrappers": 8.0.0 + "@babel/plugin-syntax-typescript": 8.0.3(@babel/core@8.0.1) + "@babel/plugin-transform-unicode-escapes@8.0.1(@babel/core@8.0.1)": dependencies: "@babel/core": 8.0.1 @@ -10205,7 +10471,7 @@ snapshots: "@babel/helper-plugin-utils": 8.0.1(@babel/core@8.0.1) "@babel/plugin-transform-dotall-regex": 8.0.1(@babel/core@8.0.1) "@babel/plugin-transform-unicode-property-regex": 8.0.1(@babel/core@8.0.1) - "@babel/types": 8.0.0 + "@babel/types": 8.0.5 esutils: 2.0.3 "@babel/preset-react@8.0.1(@babel/core@8.0.1)": @@ -10218,6 +10484,14 @@ snapshots: "@babel/plugin-transform-react-jsx-development": 8.0.1(@babel/core@8.0.1) "@babel/plugin-transform-react-pure-annotations": 8.0.1(@babel/core@8.0.1) + "@babel/preset-typescript@8.0.1(@babel/core@8.0.1)": + dependencies: + "@babel/core": 8.0.1 + "@babel/helper-plugin-utils": 8.0.1(@babel/core@8.0.1) + "@babel/helper-validator-option": 8.0.0 + "@babel/plugin-transform-modules-commonjs": 8.0.1(@babel/core@8.0.1) + "@babel/plugin-transform-typescript": 8.0.5(@babel/core@8.0.1) + "@babel/runtime@7.29.7": {} "@babel/runtime@8.0.0": {} @@ -10231,8 +10505,8 @@ snapshots: "@babel/template@8.0.0": dependencies: "@babel/code-frame": 8.0.0 - "@babel/parser": 8.0.0 - "@babel/types": 8.0.0 + "@babel/parser": 8.0.5 + "@babel/types": 8.0.5 "@babel/traverse@7.29.7(supports-color@8.1.1)": dependencies: @@ -10246,14 +10520,14 @@ snapshots: transitivePeerDependencies: - supports-color - "@babel/traverse@8.0.0": + "@babel/traverse@8.0.5": dependencies: "@babel/code-frame": 8.0.0 - "@babel/generator": 8.0.0 + "@babel/generator": 8.0.5 "@babel/helper-globals": 8.0.0 - "@babel/parser": 8.0.0 + "@babel/parser": 8.0.5 "@babel/template": 8.0.0 - "@babel/types": 8.0.0 + "@babel/types": 8.0.5 obug: 2.1.3 "@babel/types@7.29.7": @@ -10261,10 +10535,10 @@ snapshots: "@babel/helper-string-parser": 7.29.7 "@babel/helper-validator-identifier": 7.29.7 - "@babel/types@8.0.0": + "@babel/types@8.0.5": dependencies: "@babel/helper-string-parser": 8.0.0 - "@babel/helper-validator-identifier": 8.0.2 + "@babel/helper-validator-identifier": 8.0.4 "@bcoe/v8-coverage@0.2.3": {} @@ -10563,7 +10837,7 @@ snapshots: "@jest/console@30.4.1": dependencies: "@jest/types": 30.4.1 - "@types/node": 24.3.0 + "@types/node": 22.20.2 chalk: 4.1.2 jest-message-util: 30.4.1 jest-util: 30.4.1 @@ -10577,7 +10851,7 @@ snapshots: "@jest/test-result": 30.4.1 "@jest/transform": 30.4.1(supports-color@8.1.1) "@jest/types": 30.4.1 - "@types/node": 24.3.0 + "@types/node": 22.20.2 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 4.3.0 @@ -10585,7 +10859,7 @@ snapshots: fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 jest-changed-files: 30.4.1 - jest-config: 30.4.2(@types/node@24.3.0)(babel-plugin-macros@3.1.0)(supports-color@8.1.1) + jest-config: 30.4.2(@types/node@22.20.2)(babel-plugin-macros@3.1.0)(supports-color@8.1.1) jest-haste-map: 30.4.1 jest-message-util: 30.4.1 jest-regex-util: 30.4.0 @@ -10613,7 +10887,7 @@ snapshots: "@jest/fake-timers": 30.4.1 "@jest/types": 30.4.1 "@types/jsdom": 21.1.7 - "@types/node": 24.3.0 + "@types/node": 22.20.2 jest-mock: 30.4.1 jest-util: 30.4.1 jsdom: 26.1.0(supports-color@8.1.1) @@ -10622,7 +10896,7 @@ snapshots: dependencies: "@jest/fake-timers": 30.4.1 "@jest/types": 30.4.1 - "@types/node": 24.3.0 + "@types/node": 22.20.2 jest-mock: 30.4.1 "@jest/expect-utils@30.4.1": @@ -10640,7 +10914,7 @@ snapshots: dependencies: "@jest/types": 30.4.1 "@sinonjs/fake-timers": 15.4.0 - "@types/node": 24.3.0 + "@types/node": 22.20.2 jest-message-util: 30.4.1 jest-mock: 30.4.1 jest-util: 30.4.1 @@ -10658,7 +10932,7 @@ snapshots: "@jest/pattern@30.4.0": dependencies: - "@types/node": 24.3.0 + "@types/node": 22.20.2 jest-regex-util: 30.4.0 "@jest/reporters@30.4.1(supports-color@8.1.1)": @@ -10668,8 +10942,8 @@ snapshots: "@jest/test-result": 30.4.1 "@jest/transform": 30.4.1(supports-color@8.1.1) "@jest/types": 30.4.1 - "@jridgewell/trace-mapping": 0.3.30 - "@types/node": 24.3.0 + "@jridgewell/trace-mapping": 0.3.31 + "@types/node": 22.20.2 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit-x: 0.2.2 @@ -10702,7 +10976,7 @@ snapshots: "@jest/source-map@30.0.1": dependencies: - "@jridgewell/trace-mapping": 0.3.30 + "@jridgewell/trace-mapping": 0.3.31 callsites: 3.1.0 graceful-fs: 4.2.11 @@ -10724,7 +10998,7 @@ snapshots: dependencies: "@babel/core": 7.29.7(supports-color@8.1.1) "@jest/types": 30.4.1 - "@jridgewell/trace-mapping": 0.3.30 + "@jridgewell/trace-mapping": 0.3.31 babel-plugin-istanbul: 7.0.1(supports-color@8.1.1) chalk: 4.1.2 convert-source-map: 2.0.0 @@ -10745,30 +11019,37 @@ snapshots: "@jest/schemas": 30.4.1 "@types/istanbul-lib-coverage": 2.0.6 "@types/istanbul-reports": 3.0.4 - "@types/node": 24.3.0 + "@types/node": 22.20.2 "@types/yargs": 17.0.33 chalk: 4.1.2 "@jridgewell/gen-mapping@0.3.13": dependencies: "@jridgewell/sourcemap-codec": 1.5.5 - "@jridgewell/trace-mapping": 0.3.30 + "@jridgewell/trace-mapping": 0.3.31 + + "@jridgewell/gen-mapping@0.4.0-beta.0": + dependencies: + "@jridgewell/sourcemap-codec": 1.6.0-beta.0 + "@jridgewell/trace-mapping": 0.3.31 "@jridgewell/remapping@2.3.5": dependencies: "@jridgewell/gen-mapping": 0.3.13 - "@jridgewell/trace-mapping": 0.3.30 + "@jridgewell/trace-mapping": 0.3.31 "@jridgewell/resolve-uri@3.1.2": {} "@jridgewell/source-map@0.3.11": dependencies: "@jridgewell/gen-mapping": 0.3.13 - "@jridgewell/trace-mapping": 0.3.30 + "@jridgewell/trace-mapping": 0.3.31 "@jridgewell/sourcemap-codec@1.5.5": {} - "@jridgewell/trace-mapping@0.3.30": + "@jridgewell/sourcemap-codec@1.6.0-beta.0": {} + + "@jridgewell/trace-mapping@0.3.31": dependencies: "@jridgewell/resolve-uri": 3.1.2 "@jridgewell/sourcemap-codec": 1.5.5 @@ -11148,20 +11429,20 @@ snapshots: "@types/body-parser@1.19.6": dependencies: "@types/connect": 3.4.38 - "@types/node": 24.3.0 + "@types/node": 22.20.2 "@types/bonjour@3.5.13": dependencies: - "@types/node": 24.3.0 + "@types/node": 22.20.2 "@types/connect-history-api-fallback@1.5.4": dependencies: "@types/express-serve-static-core": 5.0.7 - "@types/node": 24.3.0 + "@types/node": 22.20.2 "@types/connect@3.4.38": dependencies: - "@types/node": 24.3.0 + "@types/node": 22.20.2 "@types/eslint-scope@3.7.7": dependencies: @@ -11179,14 +11460,14 @@ snapshots: "@types/express-serve-static-core@4.19.6": dependencies: - "@types/node": 24.3.0 + "@types/node": 22.20.2 "@types/qs": 6.14.0 "@types/range-parser": 1.2.7 "@types/send": 0.17.6 "@types/express-serve-static-core@5.0.7": dependencies: - "@types/node": 24.3.0 + "@types/node": 22.20.2 "@types/qs": 6.14.0 "@types/range-parser": 1.2.7 "@types/send": 0.17.6 @@ -11215,7 +11496,7 @@ snapshots: "@types/http-proxy@1.17.16": dependencies: - "@types/node": 24.3.0 + "@types/node": 22.20.2 "@types/istanbul-lib-coverage@2.0.6": {} @@ -11227,9 +11508,14 @@ snapshots: dependencies: "@types/istanbul-lib-report": 3.0.3 + "@types/jest@30.0.0": + dependencies: + expect: 30.4.1 + pretty-format: 30.4.1 + "@types/jsdom@21.1.7": dependencies: - "@types/node": 24.3.0 + "@types/node": 22.20.2 "@types/tough-cookie": 4.0.5 parse5: 7.3.0 @@ -11239,9 +11525,9 @@ snapshots: "@types/mime@1.3.5": {} - "@types/node@24.3.0": + "@types/node@22.20.2": dependencies: - undici-types: 7.10.0 + undici-types: 6.21.0 "@types/parse-json@4.0.2": {} @@ -11264,7 +11550,7 @@ snapshots: "@types/send@0.17.6": dependencies: "@types/mime": 1.3.5 - "@types/node": 24.3.0 + "@types/node": 22.20.2 "@types/serve-index@1.9.4": dependencies: @@ -11273,7 +11559,7 @@ snapshots: "@types/serve-static@1.15.10": dependencies: "@types/http-errors": 2.0.5 - "@types/node": 24.3.0 + "@types/node": 22.20.2 "@types/send": 0.17.6 "@types/sinonjs__fake-timers@8.1.1": {} @@ -11282,7 +11568,7 @@ snapshots: "@types/sockjs@0.3.36": dependencies: - "@types/node": 24.3.0 + "@types/node": 22.20.2 "@types/stack-utils@2.0.3": {} @@ -11290,7 +11576,7 @@ snapshots: "@types/ws@8.18.1": dependencies: - "@types/node": 24.3.0 + "@types/node": 22.20.2 "@types/yargs-parser@21.0.3": {} @@ -11300,7 +11586,67 @@ snapshots: "@types/yauzl@2.10.3": dependencies: - "@types/node": 24.3.0 + "@types/node": 22.20.2 + optional: true + + "@typescript/typescript-aix-ppc64@7.0.2": + optional: true + + "@typescript/typescript-darwin-arm64@7.0.2": + optional: true + + "@typescript/typescript-darwin-x64@7.0.2": + optional: true + + "@typescript/typescript-freebsd-arm64@7.0.2": + optional: true + + "@typescript/typescript-freebsd-x64@7.0.2": + optional: true + + "@typescript/typescript-linux-arm64@7.0.2": + optional: true + + "@typescript/typescript-linux-arm@7.0.2": + optional: true + + "@typescript/typescript-linux-loong64@7.0.2": + optional: true + + "@typescript/typescript-linux-mips64el@7.0.2": + optional: true + + "@typescript/typescript-linux-ppc64@7.0.2": + optional: true + + "@typescript/typescript-linux-riscv64@7.0.2": + optional: true + + "@typescript/typescript-linux-s390x@7.0.2": + optional: true + + "@typescript/typescript-linux-x64@7.0.2": + optional: true + + "@typescript/typescript-netbsd-arm64@7.0.2": + optional: true + + "@typescript/typescript-netbsd-x64@7.0.2": + optional: true + + "@typescript/typescript-openbsd-arm64@7.0.2": + optional: true + + "@typescript/typescript-openbsd-x64@7.0.2": + optional: true + + "@typescript/typescript-sunos-x64@7.0.2": + optional: true + + "@typescript/typescript-win32-arm64@7.0.2": + optional: true + + "@typescript/typescript-win32-x64@7.0.2": optional: true "@ungap/structured-clone@1.3.0": {} @@ -12076,12 +12422,14 @@ snapshots: path-type: 4.0.0 yaml: 1.10.3 - cosmiconfig@9.0.2: + cosmiconfig@9.0.2(typescript@7.0.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 + optionalDependencies: + typescript: 7.0.2 cross-env@10.1.0: dependencies: @@ -13389,7 +13737,7 @@ snapshots: istanbul-lib-source-maps@5.0.6(supports-color@8.1.1): dependencies: - "@jridgewell/trace-mapping": 0.3.30 + "@jridgewell/trace-mapping": 0.3.31 debug: 4.4.3(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: @@ -13427,7 +13775,7 @@ snapshots: "@jest/expect": 30.4.1(supports-color@8.1.1) "@jest/test-result": 30.4.1 "@jest/types": 30.4.1 - "@types/node": 24.3.0 + "@types/node": 22.20.2 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.0(babel-plugin-macros@3.1.0) @@ -13447,7 +13795,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.4.2(@types/node@24.3.0)(babel-plugin-macros@3.1.0)(supports-color@8.1.1): + jest-cli@30.4.2(@types/node@22.20.2)(babel-plugin-macros@3.1.0)(supports-color@8.1.1): dependencies: "@jest/core": 30.4.2(babel-plugin-macros@3.1.0)(supports-color@8.1.1) "@jest/test-result": 30.4.1 @@ -13455,7 +13803,7 @@ snapshots: chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.4.2(@types/node@24.3.0)(babel-plugin-macros@3.1.0)(supports-color@8.1.1) + jest-config: 30.4.2(@types/node@22.20.2)(babel-plugin-macros@3.1.0)(supports-color@8.1.1) jest-util: 30.4.1 jest-validate: 30.4.1 yargs: 17.7.2 @@ -13466,7 +13814,7 @@ snapshots: - supports-color - ts-node - jest-config@30.4.2(@types/node@24.3.0)(babel-plugin-macros@3.1.0)(supports-color@8.1.1): + jest-config@30.4.2(@types/node@22.20.2)(babel-plugin-macros@3.1.0)(supports-color@8.1.1): dependencies: "@babel/core": 7.29.7(supports-color@8.1.1) "@jest/get-type": 30.1.0 @@ -13492,7 +13840,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - "@types/node": 24.3.0 + "@types/node": 22.20.2 transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -13531,7 +13879,7 @@ snapshots: "@jest/environment": 30.4.1 "@jest/fake-timers": 30.4.1 "@jest/types": 30.4.1 - "@types/node": 24.3.0 + "@types/node": 22.20.2 jest-mock: 30.4.1 jest-util: 30.4.1 jest-validate: 30.4.1 @@ -13539,7 +13887,7 @@ snapshots: jest-haste-map@30.4.1: dependencies: "@jest/types": 30.4.1 - "@types/node": 24.3.0 + "@types/node": 22.20.2 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -13579,7 +13927,7 @@ snapshots: jest-mock@30.4.1: dependencies: "@jest/types": 30.4.1 - "@types/node": 24.3.0 + "@types/node": 22.20.2 jest-util: 30.4.1 jest-pnp-resolver@1.2.3(jest-resolve@30.4.1): @@ -13613,7 +13961,7 @@ snapshots: "@jest/test-result": 30.4.1 "@jest/transform": 30.4.1(supports-color@8.1.1) "@jest/types": 30.4.1 - "@types/node": 24.3.0 + "@types/node": 22.20.2 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 @@ -13642,7 +13990,7 @@ snapshots: "@jest/test-result": 30.4.1 "@jest/transform": 30.4.1(supports-color@8.1.1) "@jest/types": 30.4.1 - "@types/node": 24.3.0 + "@types/node": 22.20.2 chalk: 4.1.2 cjs-module-lexer: 2.1.0 collect-v8-coverage: 1.0.2 @@ -13689,7 +14037,7 @@ snapshots: jest-util@30.4.1: dependencies: "@jest/types": 30.4.1 - "@types/node": 24.3.0 + "@types/node": 22.20.2 chalk: 4.1.2 ci-info: 4.3.0 graceful-fs: 4.2.11 @@ -13708,7 +14056,7 @@ snapshots: dependencies: "@jest/test-result": 30.4.1 "@jest/types": 30.4.1 - "@types/node": 24.3.0 + "@types/node": 22.20.2 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -13717,24 +14065,24 @@ snapshots: jest-worker@27.5.1: dependencies: - "@types/node": 24.3.0 + "@types/node": 22.20.2 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@30.4.1: dependencies: - "@types/node": 24.3.0 + "@types/node": 22.20.2 "@ungap/structured-clone": 1.3.0 jest-util: 30.4.1 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.4.2(@types/node@24.3.0)(babel-plugin-macros@3.1.0)(supports-color@8.1.1): + jest@30.4.2(@types/node@22.20.2)(babel-plugin-macros@3.1.0)(supports-color@8.1.1): dependencies: "@jest/core": 30.4.2(babel-plugin-macros@3.1.0)(supports-color@8.1.1) "@jest/types": 30.4.1 import-local: 3.2.0 - jest-cli: 30.4.2(@types/node@24.3.0)(babel-plugin-macros@3.1.0)(supports-color@8.1.1) + jest-cli: 30.4.2(@types/node@22.20.2)(babel-plugin-macros@3.1.0)(supports-color@8.1.1) transitivePeerDependencies: - "@types/node" - babel-plugin-macros @@ -15029,33 +15377,33 @@ snapshots: dependencies: webpack: 5.105.3(uglify-js@3.19.3)(webpack-cli@6.0.1) - stylelint-config-recommended-scss@17.0.0(postcss@8.5.25)(stylelint@17.14.1(supports-color@8.1.1)): + stylelint-config-recommended-scss@17.0.0(postcss@8.5.25)(stylelint@17.14.1(supports-color@8.1.1)(typescript@7.0.2)): dependencies: postcss-scss: 4.0.9(postcss@8.5.25) - stylelint: 17.14.1(supports-color@8.1.1) - stylelint-config-recommended: 18.0.0(stylelint@17.14.1(supports-color@8.1.1)) - stylelint-scss: 7.0.0(stylelint@17.14.1(supports-color@8.1.1)) + stylelint: 17.14.1(supports-color@8.1.1)(typescript@7.0.2) + stylelint-config-recommended: 18.0.0(stylelint@17.14.1(supports-color@8.1.1)(typescript@7.0.2)) + stylelint-scss: 7.0.0(stylelint@17.14.1(supports-color@8.1.1)(typescript@7.0.2)) optionalDependencies: postcss: 8.5.25 - stylelint-config-recommended@18.0.0(stylelint@17.14.1(supports-color@8.1.1)): + stylelint-config-recommended@18.0.0(stylelint@17.14.1(supports-color@8.1.1)(typescript@7.0.2)): dependencies: - stylelint: 17.14.1(supports-color@8.1.1) + stylelint: 17.14.1(supports-color@8.1.1)(typescript@7.0.2) - stylelint-config-standard-scss@17.0.0(postcss@8.5.25)(stylelint@17.14.1(supports-color@8.1.1)): + stylelint-config-standard-scss@17.0.0(postcss@8.5.25)(stylelint@17.14.1(supports-color@8.1.1)(typescript@7.0.2)): dependencies: - stylelint: 17.14.1(supports-color@8.1.1) - stylelint-config-recommended-scss: 17.0.0(postcss@8.5.25)(stylelint@17.14.1(supports-color@8.1.1)) - stylelint-config-standard: 40.0.0(stylelint@17.14.1(supports-color@8.1.1)) + stylelint: 17.14.1(supports-color@8.1.1)(typescript@7.0.2) + stylelint-config-recommended-scss: 17.0.0(postcss@8.5.25)(stylelint@17.14.1(supports-color@8.1.1)(typescript@7.0.2)) + stylelint-config-standard: 40.0.0(stylelint@17.14.1(supports-color@8.1.1)(typescript@7.0.2)) optionalDependencies: postcss: 8.5.25 - stylelint-config-standard@40.0.0(stylelint@17.14.1(supports-color@8.1.1)): + stylelint-config-standard@40.0.0(stylelint@17.14.1(supports-color@8.1.1)(typescript@7.0.2)): dependencies: - stylelint: 17.14.1(supports-color@8.1.1) - stylelint-config-recommended: 18.0.0(stylelint@17.14.1(supports-color@8.1.1)) + stylelint: 17.14.1(supports-color@8.1.1)(typescript@7.0.2) + stylelint-config-recommended: 18.0.0(stylelint@17.14.1(supports-color@8.1.1)(typescript@7.0.2)) - stylelint-scss@7.0.0(stylelint@17.14.1(supports-color@8.1.1)): + stylelint-scss@7.0.0(stylelint@17.14.1(supports-color@8.1.1)(typescript@7.0.2)): dependencies: css-tree: 3.2.1 is-plain-object: 5.0.0 @@ -15065,9 +15413,9 @@ snapshots: postcss-resolve-nested-selector: 0.1.6 postcss-selector-parser: 7.1.4 postcss-value-parser: 4.2.0 - stylelint: 17.14.1(supports-color@8.1.1) + stylelint: 17.14.1(supports-color@8.1.1)(typescript@7.0.2) - stylelint@17.14.1(supports-color@8.1.1): + stylelint@17.14.1(supports-color@8.1.1)(typescript@7.0.2): dependencies: "@csstools/css-calc": 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) "@csstools/css-parser-algorithms": 4.0.0(@csstools/css-tokenizer@4.0.0) @@ -15077,7 +15425,7 @@ snapshots: "@csstools/selector-resolve-nested": 4.0.0(postcss-selector-parser@7.1.4) "@csstools/selector-specificity": 6.0.0(postcss-selector-parser@7.1.4) colord: 2.9.3 - cosmiconfig: 9.0.2 + cosmiconfig: 9.0.2(typescript@7.0.2) css-functions-list: 3.3.3 css-tree: 3.2.1 debug: 4.4.3(supports-color@8.1.1) @@ -15151,7 +15499,7 @@ snapshots: terser-webpack-plugin@5.3.16(uglify-js@3.19.3)(webpack@5.105.3): dependencies: - "@jridgewell/trace-mapping": 0.3.30 + "@jridgewell/trace-mapping": 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 @@ -15279,6 +15627,29 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 + typescript@7.0.2: + optionalDependencies: + "@typescript/typescript-aix-ppc64": 7.0.2 + "@typescript/typescript-darwin-arm64": 7.0.2 + "@typescript/typescript-darwin-x64": 7.0.2 + "@typescript/typescript-freebsd-arm64": 7.0.2 + "@typescript/typescript-freebsd-x64": 7.0.2 + "@typescript/typescript-linux-arm": 7.0.2 + "@typescript/typescript-linux-arm64": 7.0.2 + "@typescript/typescript-linux-loong64": 7.0.2 + "@typescript/typescript-linux-mips64el": 7.0.2 + "@typescript/typescript-linux-ppc64": 7.0.2 + "@typescript/typescript-linux-riscv64": 7.0.2 + "@typescript/typescript-linux-s390x": 7.0.2 + "@typescript/typescript-linux-x64": 7.0.2 + "@typescript/typescript-netbsd-arm64": 7.0.2 + "@typescript/typescript-netbsd-x64": 7.0.2 + "@typescript/typescript-openbsd-arm64": 7.0.2 + "@typescript/typescript-openbsd-x64": 7.0.2 + "@typescript/typescript-sunos-x64": 7.0.2 + "@typescript/typescript-win32-arm64": 7.0.2 + "@typescript/typescript-win32-x64": 7.0.2 + uglify-js@3.19.3: optional: true @@ -15289,7 +15660,7 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@7.10.0: {} + undici-types@6.21.0: {} unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -15352,12 +15723,14 @@ snapshots: v8-to-istanbul@9.3.0: dependencies: - "@jridgewell/trace-mapping": 0.3.30 + "@jridgewell/trace-mapping": 0.3.31 "@types/istanbul-lib-coverage": 2.0.6 convert-source-map: 2.0.0 vary@1.1.2: {} + verkit@0.3.2: {} + verror@1.10.0: dependencies: assert-plus: 1.0.0 diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..7fd7238b0 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2023", + "lib": ["ES2023", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "allowJs": true, + "checkJs": false, + "strict": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "isolatedModules": true, + "skipLibCheck": true, + "noEmit": true + }, + "include": ["js/**/*"], + "exclude": ["node_modules", "public"] +} diff --git a/webpack.common.js b/webpack.common.js index 560bc8be5..425322b4c 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -19,10 +19,13 @@ module.exports = { publicPath: "./public", filename: "[name].js", }, + resolve: { + extensions: [".js", ".jsx", ".ts", ".tsx", "..."], + }, module: { rules: [ { - test: /\.jsx?$/, + test: /\.[jt]sx?$/, use: "babel-loader", exclude: /node_modules/, },