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/,
},