diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 6cbaf5ca..00000000 --- a/.eslintrc +++ /dev/null @@ -1,106 +0,0 @@ -{ - "root": true, - "reportUnusedDisableDirectives": true, - "ignorePatterns": ["**/build", "**/dist"], - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint", "import"], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/stylistic", - "plugin:import/recommended", - "plugin:import/typescript", - "prettier", - ], - "env": { - "browser": true, - "es2020": true, - }, - "parserOptions": { - "tsconfigRootDir": ".", - "project": true, - "sourceType": "module", - "ecmaVersion": 2020, - }, - "settings": { - "import/parsers": { - "@typescript-eslint/parser": [".ts", ".tsx"], - }, - "import/resolver": { - "typescript": true, - }, - "react": { - "version": "detect", - }, - }, - "rules": { - "@typescript-eslint/array-type": "error", - "@typescript-eslint/no-wrapper-object-types": "error", - "@typescript-eslint/no-empty-object-type": "error", - "@typescript-eslint/no-unsafe-function-type": "error", - "@typescript-eslint/ban-ts-comment": "error", - "@typescript-eslint/consistent-type-definitions": "error", - "@typescript-eslint/consistent-type-imports": [ - "error", - { "prefer": "type-imports" }, - ], - "@typescript-eslint/explicit-module-boundary-types": "error", - "@typescript-eslint/method-signature-style": ["error", "property"], - "@typescript-eslint/naming-convention": [ - "error", - { - "selector": "typeParameter", - "format": ["PascalCase"], - "leadingUnderscore": "forbid", - "trailingUnderscore": "forbid", - "custom": { - "regex": "^(T|T[A-Z][A-Za-z]+)$", - "match": true, - }, - }, - ], - "@typescript-eslint/no-deprecated": "error", - "@typescript-eslint/no-empty-function": "error", - "@typescript-eslint/no-empty-interface": "error", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-non-null-assertion": "error", - "@typescript-eslint/no-unnecessary-condition": "error", - "@typescript-eslint/no-unnecessary-type-assertion": "error", - "@typescript-eslint/no-unused-vars": "error", - "@typescript-eslint/explicit-function-return-type": "error", - "@typescript-eslint/no-inferrable-types": [ - "error", - { "ignoreParameters": true }, - ], - "import/default": "error", - "import/export": "error", - "import/namespace": "error", - "import/newline-after-import": "error", - "import/no-cycle": "error", - "import/no-duplicates": "off", - "import/no-named-as-default-member": "error", - "import/no-unused-modules": "error", - "import/order": [ - "off", - { - "groups": [ - "builtin", - "external", - "internal", - "parent", - "sibling", - "index", - "object", - "type", - ], - }, - ], - "no-case-declarations": "error", - "no-empty": "error", - "no-prototype-builtins": "error", - "no-redeclare": "error", - "no-shadow": "error", - "no-undef": "off", - "sort-imports": "off", - }, -} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000..d8f20c23 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,131 @@ +import eslint from '@eslint/js' +import tseslint from 'typescript-eslint' +// @ts-expect-error no types are available for this plugin +import eslintPluginImport from 'eslint-plugin-import' + +export default tseslint.config( + { + ignores: [ + // #region shared + '**/build', + '**/dist', + '**/vite.config.ts.timestamp**', + // #endregion shared + + // #region package-specific + 'packages/fs-router-vite-plugin/tests/generator/**', + + 'packages/tuono/bin/**', + // #endregion package-specific + ], + }, + { + linterOptions: { + reportUnusedDisableDirectives: 'error', + }, + }, + eslint.configs.recommended, + eslintPluginImport.flatConfigs.recommended, + eslintPluginImport.flatConfigs.typescript, + tseslint.configs.recommendedTypeChecked, + { + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + settings: { + 'import/parsers': { + '@typescript-eslint/parser': ['.ts', '.tsx'], + }, + 'import/resolver': { + typescript: true, + }, + react: { + version: 'detect', + }, + }, + rules: { + // #region @typescript-eslint + '@typescript-eslint/array-type': 'error', + '@typescript-eslint/no-wrapper-object-types': 'error', + '@typescript-eslint/no-empty-object-type': 'error', + '@typescript-eslint/no-unsafe-function-type': 'error', + '@typescript-eslint/ban-ts-comment': 'error', + '@typescript-eslint/consistent-type-definitions': 'error', + '@typescript-eslint/consistent-type-imports': [ + 'error', + { prefer: 'type-imports' }, + ], + '@typescript-eslint/explicit-module-boundary-types': 'error', + '@typescript-eslint/method-signature-style': ['error', 'property'], + '@typescript-eslint/naming-convention': [ + 'error', + { + selector: 'typeParameter', + format: ['PascalCase'], + leadingUnderscore: 'forbid', + trailingUnderscore: 'forbid', + custom: { + regex: '^(T|T[A-Z][A-Za-z]+)$', + match: true, + }, + }, + ], + '@typescript-eslint/no-deprecated': 'error', + '@typescript-eslint/no-empty-function': 'error', + '@typescript-eslint/no-empty-interface': 'error', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-non-null-assertion': 'error', + '@typescript-eslint/no-unnecessary-condition': 'error', + '@typescript-eslint/no-unnecessary-type-assertion': 'error', + '@typescript-eslint/no-unused-vars': 'error', + '@typescript-eslint/explicit-function-return-type': 'error', + '@typescript-eslint/no-inferrable-types': [ + 'error', + { ignoreParameters: true }, + ], + // #endregion @typescript-eslint + + // #region import + 'import/default': 'error', + 'import/export': 'error', + 'import/namespace': 'error', + 'import/newline-after-import': 'error', + 'import/no-cycle': 'error', + 'import/no-duplicates': 'error', + 'import/no-named-as-default-member': 'error', + 'import/no-unused-modules': 'error', + 'import/order': [ + 'error', + { + 'newlines-between': 'always-and-inside-groups', + groups: [ + 'builtin', + 'external', + 'internal', + 'parent', + 'sibling', + 'index', + 'object', + ], + }, + ], + // #endregion import + + // #region misc + /** + * @todo some of this might be removed. + * They are handled by other plugin and / or typescript + */ + 'no-case-declarations': 'error', + 'no-empty': 'error', + 'no-prototype-builtins': 'error', + 'no-redeclare': 'error', + 'no-shadow': 'error', + 'no-undef': 'off', + 'sort-imports': 'off', + }, + }, +) diff --git a/package.json b/package.json index 8861837b..ea1d4d54 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,7 @@ { "name": "workspace", + "private": true, + "type": "module", "packageManager": "pnpm@9.14.2+sha512.6e2baf77d06b9362294152c851c4f278ede37ab1eba3a55fda317a4a17b209f4dbb973fb250a77abc463a341fcb1f17f17cfa24091c4eb319cda0d9b84278387", "scripts": { "dev": "turbo dev --filter=./packages/*", @@ -21,24 +23,21 @@ "author": "Valerio Ageno", "license": "MIT", "devDependencies": { + "@eslint/js": "9.15.0", "@tanstack/config": "^0.7.0", "@types/node": "^22.0.0", "@types/react": "^18.3.1", - "@typescript-eslint/eslint-plugin": "^8.0.0", - "@typescript-eslint/parser": "^8.0.0", "@vitejs/plugin-react": "^4.2.1", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", + "eslint": "^9.15.0", "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-import": "^2.29.1", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^5.0.0", "prettier": "^3.2.4", - "typescript": "^5.4.5", + "turbo": "^2.2.3", + "typescript": "^5.6.3", + "typescript-eslint": "8.15.0", "vite": "^5.2.11", "vitest": "^2.0.0" - }, - "dependencies": { - "turbo": "^2.2.3" } } diff --git a/packages/fs-router-vite-plugin/package.json b/packages/fs-router-vite-plugin/package.json index 4689f15e..faa926b4 100644 --- a/packages/fs-router-vite-plugin/package.json +++ b/packages/fs-router-vite-plugin/package.json @@ -6,7 +6,7 @@ "scripts": { "dev": "vite build --watch", "build": "vite build", - "lint": "eslint --ext .ts,.tsx ./src -c ../../.eslintrc", + "lint": "eslint .", "format": "prettier -u --write --ignore-unknown '**/*'", "format:check": "prettier --check --ignore-unknown '**/*'", "types": "tsc --noEmit", diff --git a/packages/fs-router-vite-plugin/src/build-route-config.spec.ts b/packages/fs-router-vite-plugin/src/build-route-config.spec.ts index 327fb421..c4509488 100644 --- a/packages/fs-router-vite-plugin/src/build-route-config.spec.ts +++ b/packages/fs-router-vite-plugin/src/build-route-config.spec.ts @@ -1,4 +1,5 @@ import { describe, it, expect } from 'vitest' + import { buildRouteConfig } from './build-route-config' const routes = [ @@ -61,11 +62,11 @@ const routes = [ }, ] -describe('buildRouteConfig works', async () => { +describe('buildRouteConfig works', () => { it('Should build the correct config', () => { - const expectedConfig = - 'PostsMyPostRoute,PostsIndexRoute,PostspostIndexRoute' const config = buildRouteConfig(routes) - expect(config).toStrictEqual(expectedConfig) + expect(config).toStrictEqual( + 'PostsMyPostRoute,PostsIndexRoute,PostspostIndexRoute', + ) }) }) diff --git a/packages/fs-router-vite-plugin/src/generator.ts b/packages/fs-router-vite-plugin/src/generator.ts index b31b63b4..3fc56301 100644 --- a/packages/fs-router-vite-plugin/src/generator.ts +++ b/packages/fs-router-vite-plugin/src/generator.ts @@ -1,8 +1,10 @@ import * as fsp from 'fs/promises' import path from 'path' + +import { format } from 'prettier' + import { buildRouteConfig } from './build-route-config' import { hasParentRoute } from './has-parent-route' - import { cleanPath, determineNodePath, @@ -19,7 +21,6 @@ import { import type { Config, RouteNode } from './types' import { ROUTES_FOLDER, ROOT_PATH_ID, GENERATED_ROUTE_TREE } from './constants' -import { format } from 'prettier' import { sortRouteNodes } from './sort-route-nodes' import isDefaultExported from './utils/is-default-exported' @@ -130,7 +131,7 @@ export async function routeGenerator(config = defaultConfig): Promise { // Loop over the flat list of routeNodes and // build up a tree based on the routeNodes' routePath - const handleNode = async (node: RouteNode): Promise => { + const handleNode = (node: RouteNode): void => { const parentRoute = hasParentRoute(routeNodes, node, node.routePath) if (parentRoute) node.parent = parentRoute @@ -149,7 +150,7 @@ export async function routeGenerator(config = defaultConfig): Promise { } for (const node of preRouteNodes) { - await handleNode(node) + handleNode(node) } const routeConfigChildrenText = buildRouteConfig(routeNodes) @@ -237,7 +238,8 @@ export async function routeGenerator(config = defaultConfig): Promise { const routeTreeContent = await fsp .readFile(path.resolve(config.generatedRouteTree), 'utf-8') - .catch((err: any) => { + .catch((e) => { + const err = e as Error & { code?: string } if (err.code === 'ENOENT') { return undefined } diff --git a/packages/fs-router-vite-plugin/src/has-parent-route.spec.ts b/packages/fs-router-vite-plugin/src/has-parent-route.spec.ts index 615a9f30..eedeb2b7 100644 --- a/packages/fs-router-vite-plugin/src/has-parent-route.spec.ts +++ b/packages/fs-router-vite-plugin/src/has-parent-route.spec.ts @@ -1,4 +1,5 @@ import { describe, it, expect } from 'vitest' + import { hasParentRoute } from './has-parent-route' const routes = [ @@ -70,7 +71,7 @@ const dynamicRoute = { cleanedPath: '/posts/[post]', } -describe('hasParentRoute works', async () => { +describe('hasParentRoute works', () => { it('Should detect parent route', () => { const parentRoute = hasParentRoute(routes, myPost, myPost.path) expect(parentRoute).toStrictEqual(parent) diff --git a/packages/fs-router-vite-plugin/src/index.ts b/packages/fs-router-vite-plugin/src/index.ts index 4b1ade18..c1ae2402 100644 --- a/packages/fs-router-vite-plugin/src/index.ts +++ b/packages/fs-router-vite-plugin/src/index.ts @@ -1,9 +1,9 @@ -import { routeGenerator } from './generator' - import { normalize } from 'path' import type { Plugin } from 'vite' +import { routeGenerator } from './generator' + const ROUTES_DIRECTORY_PATH = './src/routes' let lock = false diff --git a/packages/fs-router-vite-plugin/src/sort-route-nodes.spec.ts b/packages/fs-router-vite-plugin/src/sort-route-nodes.spec.ts index 6a0ccb69..e7c440ee 100644 --- a/packages/fs-router-vite-plugin/src/sort-route-nodes.spec.ts +++ b/packages/fs-router-vite-plugin/src/sort-route-nodes.spec.ts @@ -1,4 +1,5 @@ import { describe, it, expect } from 'vitest' + import { sortRouteNodes } from './sort-route-nodes' const routes = [ @@ -106,7 +107,7 @@ const expectedSorting = [ }, ] -describe('sortRouteNodes works', async () => { +describe('sortRouteNodes works', () => { it('Should correctly sort the nodes', () => { const sorted = sortRouteNodes(routes) expect(sorted).toStrictEqual(expectedSorting) diff --git a/packages/fs-router-vite-plugin/src/utils.ts b/packages/fs-router-vite-plugin/src/utils.ts index b21e3912..e6a5daf2 100644 --- a/packages/fs-router-vite-plugin/src/utils.ts +++ b/packages/fs-router-vite-plugin/src/utils.ts @@ -35,7 +35,7 @@ export function routePathToVariable(routePath: string): string { export function multiSortBy( arr: T[], - accessors: ((item: T) => any)[] = [(d): any => d], + accessors: ((item: T) => unknown)[] = [(d): unknown => d], ): T[] { return arr .map((d, i) => [d, i] as const) @@ -55,7 +55,7 @@ export function multiSortBy( continue } - return ao > bo ? 1 : -1 + return (ao as number) > (bo as number) ? 1 : -1 } return ai - bi @@ -81,8 +81,8 @@ export function removeTrailingUnderscores(s?: string): string | undefined { /** * Removes all segments from a given path that start with an underscore ('_'). * - * @param {string} routePath - The path from which to remove segments. Defaults to '/'. - * @returns {string} The path with all underscore-prefixed segments removed. + * @param routePath - The path from which to remove segments. Defaults to '/'. + * @returns The path with all underscore-prefixed segments removed. * @example * removeLayoutSegments('/workspace/_auth/foo') // '/workspace/foo' */ @@ -101,8 +101,9 @@ export function trimPathLeft(pathToTrim: string): string { } export function removeLastSlash(str: string): string { - if (str.length > 1 && str.endsWith('/')) + if (str.length > 1 && str.endsWith('/')) { return str.substring(0, str.length - 1) + } return str } diff --git a/packages/fs-router-vite-plugin/tests/generator.spec.ts b/packages/fs-router-vite-plugin/tests/generator.spec.ts index a0883c25..fddf73ad 100644 --- a/packages/fs-router-vite-plugin/tests/generator.spec.ts +++ b/packages/fs-router-vite-plugin/tests/generator.spec.ts @@ -1,5 +1,7 @@ import fs from 'fs/promises' + import { describe, it, expect } from 'vitest' + import { routeGenerator } from '../src/generator' describe('generator works', async () => { diff --git a/packages/fs-router-vite-plugin/tsconfig.json b/packages/fs-router-vite-plugin/tsconfig.json index b36d1bf9..1a15b18d 100644 --- a/packages/fs-router-vite-plugin/tsconfig.json +++ b/packages/fs-router-vite-plugin/tsconfig.json @@ -1,4 +1,5 @@ { "extends": "../../tsconfig.json", - "include": ["src", "vite.config.ts"] + "include": ["src", "tests", "vite.config.ts"], + "exclude": ["tests/generator/**"] } diff --git a/packages/lazy-fn-vite-plugin/package.json b/packages/lazy-fn-vite-plugin/package.json index 9ca7b4f8..6845c972 100644 --- a/packages/lazy-fn-vite-plugin/package.json +++ b/packages/lazy-fn-vite-plugin/package.json @@ -6,7 +6,7 @@ "scripts": { "dev": "vite build --watch", "build": "vite build", - "lint": "eslint --ext .ts,.tsx ./src -c ../../.eslintrc", + "lint": "eslint .", "format": "prettier -u --write --ignore-unknown '**/*'", "format:check": "prettier --check --ignore-unknown '**/*'", "types": "tsc --noEmit", diff --git a/packages/lazy-fn-vite-plugin/src/index.ts b/packages/lazy-fn-vite-plugin/src/index.ts index 699e1f25..7a7c8a5b 100644 --- a/packages/lazy-fn-vite-plugin/src/index.ts +++ b/packages/lazy-fn-vite-plugin/src/index.ts @@ -1,16 +1,7 @@ -import type { Plugin } from 'vite' import * as babel from '@babel/core' -import type { PluginItem } from '@babel/core' -import { isTuonoDynamicFnImported } from './utils' - -import { - TUONO_MAIN_PACKAGE, - TUONO_DYNAMIC_FN_ID, - TUONO_LAZY_FN_ID, -} from './constants' - import * as t from '@babel/types' - +import type { Plugin } from 'vite' +import type { PluginItem } from '@babel/core' import type { Identifier, CallExpression, @@ -18,6 +9,13 @@ import type { StringLiteral, } from '@babel/types' +import { + TUONO_MAIN_PACKAGE, + TUONO_DYNAMIC_FN_ID, + TUONO_LAZY_FN_ID, +} from './constants' +import { isTuonoDynamicFnImported } from './utils' + /** * [SERVER build] * This plugin just removes the `dynamic` imported function from any tuono import diff --git a/packages/lazy-fn-vite-plugin/src/utils.ts b/packages/lazy-fn-vite-plugin/src/utils.ts index 1bf269a8..e24ab46b 100644 --- a/packages/lazy-fn-vite-plugin/src/utils.ts +++ b/packages/lazy-fn-vite-plugin/src/utils.ts @@ -1,10 +1,13 @@ -import { TUONO_MAIN_PACKAGE, TUONO_DYNAMIC_FN_ID } from './constants' -import type * as t from '@babel/types' +import type { + Identifier, + ImportDeclaration, + ImportSpecifier, +} from '@babel/types' -import type { Identifier, ImportDeclaration } from '@babel/types' +import { TUONO_MAIN_PACKAGE, TUONO_DYNAMIC_FN_ID } from './constants' export const isTuonoDynamicFnImported = ( - path: babel.NodePath, + path: babel.NodePath, ): boolean => { if ((path.node.imported as Identifier).name !== TUONO_DYNAMIC_FN_ID) { return false diff --git a/packages/lazy-fn-vite-plugin/test/transpileSource.test.ts b/packages/lazy-fn-vite-plugin/tests/transpileSource.test.ts similarity index 70% rename from packages/lazy-fn-vite-plugin/test/transpileSource.test.ts rename to packages/lazy-fn-vite-plugin/tests/transpileSource.test.ts index c2efc6b7..025b4300 100644 --- a/packages/lazy-fn-vite-plugin/test/transpileSource.test.ts +++ b/packages/lazy-fn-vite-plugin/tests/transpileSource.test.ts @@ -1,4 +1,6 @@ import { it, expect, describe } from 'vitest' +import type { Plugin } from 'vite' + import { LazyLoadingPlugin } from '../src' const SOURCE_CODE = ` @@ -20,9 +22,21 @@ const PokemonspokemonImport = dynamic( ) ` +type ViteTransformHandler = Exclude< + Plugin['transform'], + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type + Function | undefined +>['handler'] + +// Create a type-safe transform method +function getTransform(): (...args: Parameters) => string { + return LazyLoadingPlugin().transform as never +} + describe('Transpile tuono source', () => { it('Into the client bundle', () => { - const bundle = LazyLoadingPlugin().transform?.(SOURCE_CODE, 'id') + const pluginTransform = getTransform() + const bundle = pluginTransform(SOURCE_CODE, 'id') expect(bundle) .toBe(`import { createRoute, lazyLoadComponent as dynamic } from 'tuono'; const IndexImport = dynamic(() => import('./../src/routes/index')); @@ -30,7 +44,8 @@ const PokemonspokemonImport = dynamic(() => import('./../src/routes/pokemons/[po }) it('Into the server bundle', () => { - const bundle = LazyLoadingPlugin().transform?.(SOURCE_CODE, 'id', { + const pluginTransform = getTransform() + const bundle = pluginTransform(SOURCE_CODE, 'id', { ssr: true, }) expect(bundle).toBe(`import { createRoute } from 'tuono'; @@ -41,7 +56,8 @@ import PokemonspokemonImport from "./../src/routes/pokemons/[pokemon]";`) describe('Non tuono dynamic function', () => { it('Into the client bundle', () => { - const bundle = LazyLoadingPlugin().transform?.(NON_DYNAMIC_SOURCE, 'id') + const pluginTransform = getTransform() + const bundle = pluginTransform(NON_DYNAMIC_SOURCE, 'id') expect(bundle).toBe(`import { createRoute } from 'tuono'; import { dynamic } from 'external-lib'; const IndexImport = dynamic(() => import('./../src/routes/index')); @@ -49,7 +65,8 @@ const PokemonspokemonImport = dynamic(() => import('./../src/routes/pokemons/[po }) it('Into the server bundle', () => { - const bundle = LazyLoadingPlugin().transform?.(NON_DYNAMIC_SOURCE, 'id', { + const pluginTransform = getTransform() + const bundle = pluginTransform(NON_DYNAMIC_SOURCE, 'id', { ssr: true, }) expect(bundle).toBe(`import { createRoute } from 'tuono'; diff --git a/packages/lazy-fn-vite-plugin/tsconfig.json b/packages/lazy-fn-vite-plugin/tsconfig.json index b36d1bf9..05056167 100644 --- a/packages/lazy-fn-vite-plugin/tsconfig.json +++ b/packages/lazy-fn-vite-plugin/tsconfig.json @@ -1,4 +1,4 @@ { "extends": "../../tsconfig.json", - "include": ["src", "vite.config.ts"] + "include": ["src", "tests", "vite.config.ts"] } diff --git a/packages/router/package.json b/packages/router/package.json index f7b1382d..d50899a6 100644 --- a/packages/router/package.json +++ b/packages/router/package.json @@ -6,7 +6,7 @@ "scripts": { "dev": "vite build --watch", "build": "vite build", - "lint": "eslint --ext .ts,.tsx ./src -c ../../.eslintrc", + "lint": "eslint .", "format": "prettier -u --write --ignore-unknown '**/*'", "format:check": "prettier --check --ignore-unknown '**/*'", "types": "tsc --noEmit", diff --git a/packages/router/src/components/Link.tsx b/packages/router/src/components/Link.tsx index d6570c84..606e54f3 100644 --- a/packages/router/src/components/Link.tsx +++ b/packages/router/src/components/Link.tsx @@ -1,9 +1,10 @@ import * as React from 'react' -import { useRouter } from '../hooks/useRouter' -import type { AnchorHTMLAttributes, MouseEvent } from 'react' -import useRoute from '../hooks/useRoute' +import type { AnchorHTMLAttributes } from 'react' import { useInView } from 'react-intersection-observer' +import { useRouter } from '../hooks/useRouter' +import useRoute from '../hooks/useRoute' + interface TuonoLinkProps { /** * If "true" the route gets loaded when the link enters the viewport. Default "true" @@ -28,7 +29,7 @@ export default function Link( triggerOnce: true, }) - const handleTransition = (e: MouseEvent): void => { + const handleTransition: React.MouseEventHandler = (e) => { e.preventDefault() props.onClick?.(e) diff --git a/packages/router/src/components/Matches.tsx b/packages/router/src/components/Matches.tsx index 3710ea42..2cf9d06b 100644 --- a/packages/router/src/components/Matches.tsx +++ b/packages/router/src/components/Matches.tsx @@ -1,12 +1,14 @@ import * as React from 'react' + import { useRouterStore } from '../hooks/useRouterStore' -import { RouteMatch } from './RouteMatch' -import NotFound from './NotFound' import useRoute from '../hooks/useRoute' -interface MatchesProps { +import { RouteMatch } from './RouteMatch' +import NotFound from './NotFound' + +interface MatchesProps { // user defined props - serverSideProps: any + serverSideProps: TServerSideProps } export function Matches({ serverSideProps }: MatchesProps): React.JSX.Element { diff --git a/packages/router/src/components/NotFound.tsx b/packages/router/src/components/NotFound.tsx index 1513fd92..9ba27eba 100644 --- a/packages/router/src/components/NotFound.tsx +++ b/packages/router/src/components/NotFound.tsx @@ -1,7 +1,9 @@ import * as React from 'react' + +import { useInternalRouter } from '../hooks/useInternalRouter' + import { RouteMatch } from './RouteMatch' import Link from './Link' -import { useInternalRouter } from '../hooks/useInternalRouter' export default function NotFound(): React.JSX.Element { const router = useInternalRouter() diff --git a/packages/router/src/components/RouteMatch.spec.tsx b/packages/router/src/components/RouteMatch.spec.tsx index 7d96ea21..09971be5 100644 --- a/packages/router/src/components/RouteMatch.spec.tsx +++ b/packages/router/src/components/RouteMatch.spec.tsx @@ -1,8 +1,11 @@ import * as React from 'react' import { afterEach, describe, expect, test, vi } from 'vitest' -import { RouteMatch } from './RouteMatch' + import { cleanup, render, screen } from '@testing-library/react' + import type { Route } from '../route' + +import { RouteMatch } from './RouteMatch' import '@testing-library/jest-dom' interface Props { diff --git a/packages/router/src/components/RouteMatch.tsx b/packages/router/src/components/RouteMatch.tsx index 6534f659..21c9f6da 100644 --- a/packages/router/src/components/RouteMatch.tsx +++ b/packages/router/src/components/RouteMatch.tsx @@ -1,11 +1,12 @@ import * as React from 'react' + import type { Route } from '../route' import { useServerSideProps } from '../hooks/useServerSideProps' -interface MatchProps { +interface RouteMatchProps { route: Route // User defined server side props - serverSideProps: any + serverSideProps: TServerSideProps } /** @@ -16,7 +17,7 @@ interface MatchProps { export const RouteMatch = ({ route, serverSideProps, -}: MatchProps): React.JSX.Element => { +}: RouteMatchProps): React.JSX.Element => { const { data, isLoading } = useServerSideProps(route, serverSideProps) const routes = React.useMemo(() => loadParentComponents(route), [route.id]) @@ -28,20 +29,20 @@ export const RouteMatch = ({ ) } -interface TraverseRootComponentsProps { +interface ParentProps { + children: React.ReactNode + data: TData + isLoading: boolean +} + +interface TraverseRootComponentsProps { routes: Route[] - data: any + data: TData isLoading: boolean children?: React.ReactNode index?: number } -interface ParentProps { - children: React.ReactNode - data: any - isLoading: boolean -} - /* * This component traverses and renders * all the components that wraps the selected route (__root). @@ -84,7 +85,7 @@ const TraverseRootComponents = React.memo( ) const loadParentComponents = (route: Route, loader: Route[] = []): Route[] => { - const parentComponent = route.options?.getParentRoute?.() + const parentComponent = route.options.getParentRoute?.() as Route loader.push(parentComponent) diff --git a/packages/router/src/components/RouterContext.tsx b/packages/router/src/components/RouterContext.tsx index 22609f5f..7d5456dc 100644 --- a/packages/router/src/components/RouterContext.tsx +++ b/packages/router/src/components/RouterContext.tsx @@ -1,21 +1,22 @@ -import * as React from 'react' +import React from 'react' + import type { Router } from '../router' // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const routerContext = React.createContext(null!) -const TUONO_CONTEXT = '__TUONO_CONTEXT__' +const TUONO_CONTEXT_GLOBAL_NAME = '__TUONO_CONTEXT__' -export function getRouterContext(): any { +export function getRouterContext(): React.Context { if (typeof document === 'undefined') { return routerContext } - if (window[TUONO_CONTEXT as any]) { - return window[TUONO_CONTEXT as any] + if (window[TUONO_CONTEXT_GLOBAL_NAME]) { + return window[TUONO_CONTEXT_GLOBAL_NAME] } - window[TUONO_CONTEXT as any] = routerContext as any + window[TUONO_CONTEXT_GLOBAL_NAME] = routerContext return routerContext } diff --git a/packages/router/src/components/RouterProvider.tsx b/packages/router/src/components/RouterProvider.tsx index 1a2e947e..208ae562 100644 --- a/packages/router/src/components/RouterProvider.tsx +++ b/packages/router/src/components/RouterProvider.tsx @@ -1,23 +1,19 @@ import React from 'react' import type { ReactNode, JSX } from 'react' + import { useListenBrowserUrlUpdates } from '../hooks/useListenBrowserUrlUpdates' import { initRouterStore } from '../hooks/useRouterStore' import type { ServerProps } from '../types' +import type { Router } from '../router' + import { getRouterContext } from './RouterContext' import { Matches } from './Matches' -type Router = any - interface RouterContextProviderProps { router: Router children: ReactNode } -interface RouterProviderProps { - router: Router - serverProps?: ServerProps -} - function RouterContextProvider({ router, children, @@ -27,7 +23,11 @@ function RouterContextProvider({ router.update({ ...router.options, ...rest, + // @ts-expect-error router options do not have context as property and I was unable to find any usage of it, + // so is this spread required? + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment context: { + // @ts-expect-error see previous ...router.options.context, }, }) @@ -41,6 +41,11 @@ function RouterContextProvider({ ) } +interface RouterProviderProps { + router: Router + serverProps?: ServerProps +} + export function RouterProvider({ router, serverProps, diff --git a/packages/router/src/dynamic.tsx b/packages/router/src/dynamic.tsx index bb1c5388..6285bf89 100644 --- a/packages/router/src/dynamic.tsx +++ b/packages/router/src/dynamic.tsx @@ -1,5 +1,6 @@ import * as React from 'react' import type { ReactElement, ComponentType } from 'react' + import type { RouteComponent } from './types' type ImportFn = () => Promise<{ default: React.ComponentType }> diff --git a/packages/router/src/globals.ts b/packages/router/src/globals.ts new file mode 100644 index 00000000..0de11a90 --- /dev/null +++ b/packages/router/src/globals.ts @@ -0,0 +1,14 @@ +import type React from 'react' + +import type { Router } from './router' + +declare global { + interface Window { + __TUONO__ROUTER__: Router + __TUONO_SSR_PROPS__?: { + props?: unknown + } + + __TUONO_CONTEXT__?: React.Context + } +} diff --git a/packages/router/src/hooks/useInternalRouter.tsx b/packages/router/src/hooks/useInternalRouter.tsx index 08f659b6..35852f5e 100644 --- a/packages/router/src/hooks/useInternalRouter.tsx +++ b/packages/router/src/hooks/useInternalRouter.tsx @@ -1,4 +1,5 @@ import * as React from 'react' + import { getRouterContext } from '../components/RouterContext' import type { Router } from '../router' diff --git a/packages/router/src/hooks/useListenBrowserUrlUpdates.tsx b/packages/router/src/hooks/useListenBrowserUrlUpdates.tsx index f87a8245..3343d9fd 100644 --- a/packages/router/src/hooks/useListenBrowserUrlUpdates.tsx +++ b/packages/router/src/hooks/useListenBrowserUrlUpdates.tsx @@ -1,6 +1,7 @@ -import { useRouterStore } from './useRouterStore' import { useEffect } from 'react' +import { useRouterStore } from './useRouterStore' + /** * This hook is meant to handle just browser related location updates * like the back and forward buttons. @@ -8,8 +9,9 @@ import { useEffect } from 'react' export const useListenBrowserUrlUpdates = (): void => { const updateLocation = useRouterStore((st) => st.updateLocation) - const updateLocationOnPopStateChange = ({ target }: any): void => { - const { pathname, hash, href, search } = target.location + const updateLocationOnPopStateChange = ({ target }: PopStateEvent): void => { + const { pathname, hash, href, search } = (target as typeof window).location + updateLocation({ pathname, hash, @@ -18,8 +20,10 @@ export const useListenBrowserUrlUpdates = (): void => { search: Object.fromEntries(new URLSearchParams(search)), }) } + useEffect(() => { window.addEventListener('popstate', updateLocationOnPopStateChange) + return (): void => { window.removeEventListener('popstate', updateLocationOnPopStateChange) } diff --git a/packages/router/src/hooks/useRoute.spec.tsx b/packages/router/src/hooks/useRoute.spec.tsx index 37017d5c..60c5dbfa 100644 --- a/packages/router/src/hooks/useRoute.spec.tsx +++ b/packages/router/src/hooks/useRoute.spec.tsx @@ -1,11 +1,10 @@ import { afterEach, describe, expect, test, vi } from 'vitest' -import useRoute from './useRoute' import { cleanup } from '@testing-library/react' +import useRoute from './useRoute' + describe('Test useRoute fn', () => { - afterEach(() => { - cleanup() - }) + afterEach(cleanup) test('match routes by ids', () => { vi.mock('./useInternalRouter.tsx', () => ({ diff --git a/packages/router/src/hooks/useRoute.tsx b/packages/router/src/hooks/useRoute.tsx index 8f48a24a..538097d4 100644 --- a/packages/router/src/hooks/useRoute.tsx +++ b/packages/router/src/hooks/useRoute.tsx @@ -1,4 +1,5 @@ import type { Route } from '../route' + import { useInternalRouter } from './useInternalRouter' const DYNAMIC_PATH_REGEX = /\[(.*?)\]/ diff --git a/packages/router/src/hooks/useServerSideProps.tsx b/packages/router/src/hooks/useServerSideProps.tsx index e2b370eb..77030d22 100644 --- a/packages/router/src/hooks/useServerSideProps.tsx +++ b/packages/router/src/hooks/useServerSideProps.tsx @@ -1,21 +1,17 @@ import { useState, useEffect, useRef } from 'react' + import type { Route } from '../route' -import { useRouterStore } from './useRouterStore' import { fromUrlToParsedLocation } from '../utils/from-url-to-parsed-location' +import { useRouterStore } from './useRouterStore' + const isServer = typeof document === 'undefined' -interface UseServerSidePropsReturn { - data: any +interface UseServerSidePropsReturn { + data: TData isLoading: boolean } -declare global { - interface Window { - __TUONO_SSR_PROPS__: any - } -} - interface TuonoApi { data?: any info: { @@ -26,7 +22,7 @@ interface TuonoApi { const fetchClientSideData = async (): Promise => { const slash = location.pathname.endsWith('/') ? '' : '/' const res = await fetch(`/__tuono/data${location.pathname}${slash}data.json`) - const data: TuonoApi = await res.json() + const data = (await res.json()) as TuonoApi return data } @@ -40,7 +36,7 @@ export function useServerSideProps( route: Route, // User defined props serverSideProps: T, -): UseServerSidePropsReturn { +): UseServerSidePropsReturn { const isFirstRendering = useRef(true) const [location, updateLocation] = useRouterStore((st) => [ st.location, @@ -48,15 +44,15 @@ export function useServerSideProps( ]) const [isLoading, setIsLoading] = useState( // Force loading if has handler - route.options.hasHandler && + !!route.options.hasHandler && // Avoid loading on the server !isServer && // Avoid loading if first rendering !isFirstRendering.current, ) - const [data, setData] = useState( - serverSideProps ?? window.__TUONO_SSR_PROPS__?.props, + const [data, setData] = useState( + (serverSideProps ?? window.__TUONO_SSR_PROPS__?.props) as T, ) useEffect(() => { @@ -68,6 +64,8 @@ export function useServerSideProps( } // After client side routing load again the remote data if (route.options.hasHandler) { + // The error management is already handled inside the IIFE + // eslint-disable-next-line @typescript-eslint/no-floating-promises ;(async (): Promise => { setIsLoading(true) try { @@ -86,7 +84,7 @@ export function useServerSideProps( updateLocation(parsedLocation) return } - setData(response.data) + setData(response.data as T) } catch (error) { throw Error('Failed loading Server Side Data', { cause: error }) } finally { @@ -101,5 +99,5 @@ export function useServerSideProps( } }, [location.pathname]) - return { isLoading, data } + return { isLoading, data: data as T } } diff --git a/packages/router/src/route.ts b/packages/router/src/route.ts index ae6665d8..67ca8007 100644 --- a/packages/router/src/route.ts +++ b/packages/router/src/route.ts @@ -3,35 +3,41 @@ import type { RouteComponent } from './types' import { trimPathLeft, joinPaths } from './utils' interface RouteOptions { + id?: string isRoot?: boolean getParentRoute?: () => Route path?: string component: RouteComponent + hasHandler?: boolean } export function createRoute(options: RouteOptions): Route { return new Route(options) } -export const rootRouteId = '__root__' +const rootRouteId = '__root__' export class Route { - parentRoute!: any + options: RouteOptions + id?: string - fullPath!: string + isRoot: boolean path?: string - options: any + fullPath!: string children?: Route[] + parentRoute!: any + /** @todo check if this is required */ router: RouterType - isRoot: boolean originalIndex?: number component: RouteComponent + '$$typeof': symbol + constructor(options: RouteOptions) { this.isRoot = options.isRoot ?? typeof options.getParentRoute !== 'function' this.options = options - ;(this as any).$$typeof = Symbol.for('react.memo') + this.$$typeof = Symbol.for('react.memo') this.component = options.component } @@ -39,9 +45,9 @@ export class Route { init = (originalIndex: number): void => { this.originalIndex = originalIndex - const isRoot = !this.options?.path && !this.options?.id + const isRoot = !this.options.path && !this.options.id - this.parentRoute = this.options?.getParentRoute?.() + this.parentRoute = this.options.getParentRoute?.() if (isRoot) { this.path = rootRouteId @@ -54,7 +60,7 @@ export class Route { path = trimPathLeft(path) } - const customId = this.options?.id || path + const customId = this.options.id || path // Strip the parentId prefix from the first level of children let id = isRoot ? rootRouteId : joinPaths([customId]) diff --git a/packages/router/src/router.ts b/packages/router/src/router.ts index e3045c9a..dab93d4e 100644 --- a/packages/router/src/router.ts +++ b/packages/router/src/router.ts @@ -3,15 +3,15 @@ import type { ComponentType as ReactComponentType } from 'react' import { trimPath, trimPathRight } from './utils' import type { Route } from './route' -type RouteTree = any +type RouteTree = Route -interface CreateRouter { +interface CreateRouterOptions { routeTree: RouteTree basePath?: string - options?: RouteOptions + options?: RouterOptions } -interface RouteOptions { +interface RouterOptions { component?: ReactComponentType hasHandler?: boolean routeTree?: RouteTree @@ -19,32 +19,39 @@ interface RouteOptions { export type RouterType = any -export function createRouter(options: CreateRouter): Router { +export function createRouter(options: CreateRouterOptions): Router { return new Router(options) } export class Router { - options?: RouteOptions + options?: RouterOptions basePath = '/' - routeTree: any + routeTree?: RouteTree + + /** Not used */ history: any + isServer = typeof document === 'undefined' + routesById: Record = {} - // Not used + + /** Not used */ routesByPath: Record = {} + + /** Not used */ flatRoutes: any - constructor(options: CreateRouter) { + constructor(options: CreateRouterOptions) { this.update({ ...options, }) if (!this.isServer) { - ;(window as any).__TSR__ROUTER__ = this + window.__TUONO__ROUTER__ = this } } - update = (newOptions: CreateRouter): void => { + update = (newOptions: CreateRouterOptions): void => { this.options = { ...this.options, ...newOptions, @@ -82,7 +89,7 @@ export class Router { }) } - recurseRoutes([this.routeTree]) + recurseRoutes([this.routeTree as Route]) } #updateBasePath = (basePath?: string): void => { diff --git a/packages/router/src/types.ts b/packages/router/src/types.ts index 9321df2e..d9894c49 100644 --- a/packages/router/src/types.ts +++ b/packages/router/src/types.ts @@ -5,17 +5,17 @@ export interface Segment { value: string } -export interface ServerProps { +export interface ServerProps { router: { href: string pathname: string searchStr: string } - props: any + props: TProps } -export interface RouteProps { - data: any +export interface RouteProps { + data: TData isLoading: boolean } diff --git a/packages/tuono/package.json b/packages/tuono/package.json index 79b2620f..a7c67188 100644 --- a/packages/tuono/package.json +++ b/packages/tuono/package.json @@ -6,7 +6,7 @@ "scripts": { "dev": "vite build --watch", "build": "vite build", - "lint": "eslint --ext .ts,.tsx ./src -c ../../.eslintrc", + "lint": "eslint .", "format": "prettier -u --write --ignore-unknown '**/*'", "format:check": "prettier --check --ignore-unknown '**/*'", "types": "tsc --noEmit", diff --git a/packages/tuono/src/hydration/index.tsx b/packages/tuono/src/hydration/index.tsx index 1d413d9d..0193bb20 100644 --- a/packages/tuono/src/hydration/index.tsx +++ b/packages/tuono/src/hydration/index.tsx @@ -1,9 +1,10 @@ import React from 'react' import { hydrateRoot } from 'react-dom/client' import { RouterProvider, createRouter } from 'tuono-router' +import type { createRoute } from 'tuono-router' import { HelmetProvider } from 'react-helmet-async' -type RouteTree = any +type RouteTree = ReturnType export function hydrate(routeTree: RouteTree): void { // Create a new router instance diff --git a/packages/tuono/src/ssr/index.tsx b/packages/tuono/src/ssr/index.tsx index fad2a21f..fb89d2af 100644 --- a/packages/tuono/src/ssr/index.tsx +++ b/packages/tuono/src/ssr/index.tsx @@ -4,8 +4,9 @@ import { renderToString, renderToStaticMarkup } from 'react-dom/server' import type { HelmetServerState } from 'react-helmet-async' import { HelmetProvider } from 'react-helmet-async' import { RouterProvider, createRouter } from 'tuono-router' +import type { createRoute } from 'tuono-router' -type RouteTree = any +type RouteTree = ReturnType type Mode = 'Dev' | 'Prod' const TUONO_DEV_SERVER_PORT = 3000 @@ -37,17 +38,20 @@ function generateJsScripts(jsBundles: string[], mode: Mode): string { export function serverSideRendering(routeTree: RouteTree) { return function render(payload: string | undefined): string { - const props = payload ? JSON.parse(payload) : {} + const serverProps = (payload ? JSON.parse(payload) : {}) as Record< + string, + unknown + > - const mode = props.mode as Mode - const jsBundles = props.jsBundles as string[] - const cssBundles = props.cssBundles as string[] + const mode = serverProps.mode as Mode + const jsBundles = serverProps.jsBundles as string[] + const cssBundles = serverProps.cssBundles as string[] const router = createRouter({ routeTree }) // Render the app const helmetContext = {} const app = renderToString( - + , ) diff --git a/packages/tuono/tsconfig.json b/packages/tuono/tsconfig.json index f5b6e800..d4961d20 100644 --- a/packages/tuono/tsconfig.json +++ b/packages/tuono/tsconfig.json @@ -3,6 +3,5 @@ "compilerOptions": { "jsx": "react" }, - "include": ["src", "tests", "vite.config.ts"], - "exclude": ["vite.config.ts"] + "include": ["src", "tests", "vite.config.ts"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6b94bc41..40b536a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,53 +7,49 @@ settings: importers: .: - dependencies: - turbo: - specifier: ^2.2.3 - version: 2.3.3 devDependencies: + '@eslint/js': + specifier: 9.15.0 + version: 9.15.0 '@tanstack/config': specifier: ^0.7.0 - version: 0.7.13(@types/node@22.10.0)(esbuild@0.21.5)(rollup@4.25.0)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.0)(sugarss@4.0.1(postcss@8.4.49))) + version: 0.7.13(@types/node@22.10.0)(esbuild@0.21.5)(rollup@4.25.0)(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.0)(sugarss@4.0.1(postcss@8.4.49))) '@types/node': specifier: ^22.0.0 version: 22.10.0 '@types/react': specifier: ^18.3.1 version: 18.3.12 - '@typescript-eslint/eslint-plugin': - specifier: ^8.0.0 - version: 8.15.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) - '@typescript-eslint/parser': - specifier: ^8.0.0 - version: 8.15.0(eslint@8.57.1)(typescript@5.7.2) '@vitejs/plugin-react': specifier: ^4.2.1 version: 4.3.4(vite@5.4.11(@types/node@22.10.0)(sugarss@4.0.1(postcss@8.4.49))) eslint: - specifier: ^8.56.0 - version: 8.57.1 - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.1) + specifier: ^9.15.0 + version: 9.15.0 eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.1) + version: 3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@9.15.0) eslint-plugin-import: - specifier: ^2.29.1 - version: 2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + specifier: ^2.31.0 + version: 2.31.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.15.0) eslint-plugin-react: specifier: ^7.33.2 - version: 7.37.2(eslint@8.57.1) + version: 7.37.2(eslint@9.15.0) eslint-plugin-react-hooks: specifier: ^5.0.0 - version: 5.0.0(eslint@8.57.1) + version: 5.0.0(eslint@9.15.0) prettier: specifier: ^3.2.4 version: 3.4.1 + turbo: + specifier: ^2.2.3 + version: 2.3.3 typescript: - specifier: ^5.4.5 - version: 5.7.2 + specifier: ^5.6.3 + version: 5.6.3 + typescript-eslint: + specifier: 8.15.0 + version: 8.15.0(eslint@9.15.0)(typescript@5.6.3) vite: specifier: ^5.2.11 version: 5.4.11(@types/node@22.10.0)(sugarss@4.0.1(postcss@8.4.49)) @@ -651,13 +647,29 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-array@0.19.0': + resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/core@0.9.0': + resolution: {integrity: sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.2.0': + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.15.0': + resolution: {integrity: sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.3': + resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@floating-ui/core@1.6.8': resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} @@ -680,18 +692,25 @@ packages: '@floating-ui/utils@0.2.8': resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.1': + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + engines: {node: '>=18.18'} '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} @@ -1057,6 +1076,9 @@ packages: '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@ -1554,10 +1576,6 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -1637,12 +1655,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} @@ -1702,9 +1714,9 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} @@ -1714,15 +1726,19 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + eslint@9.15.0: + resolution: {integrity: sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} @@ -1798,9 +1814,9 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -1822,9 +1838,9 @@ packages: resolution: {integrity: sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==} engines: {node: '>= 10.13.0'} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} @@ -1848,9 +1864,6 @@ packages: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1897,10 +1910,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - global-modules@1.0.0: resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} engines: {node: '>=0.10.0'} @@ -1913,9 +1922,9 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} @@ -2016,13 +2025,6 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} @@ -2131,10 +2133,6 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -2551,9 +2549,6 @@ packages: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -2853,11 +2848,6 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rollup-plugin-preserve-directives@0.4.0: resolution: {integrity: sha512-gx4nBxYm5BysmEQS+e2tAMrtFxrGvk+Pe5ppafRibQi0zlW7VYAbEGk6IKDw9sJGPdFWgVTE0o4BU4cdG0Fylg==} peerDependencies: @@ -2999,10 +2989,6 @@ packages: stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -3057,9 +3043,6 @@ packages: resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -3185,10 +3168,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-fest@4.28.0: resolution: {integrity: sha512-jXMwges/FVbFRe5lTMJZVEZCrO9kI9c8k0PA/z7nF3bo0JSCCLysvokFjNPIUK/itEMas10MQM+AiHoHt/T/XA==} engines: {node: '>=16'} @@ -3209,11 +3188,26 @@ packages: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} + typescript-eslint@8.15.0: + resolution: {integrity: sha512-wY4FRGl0ZI+ZU4Jo/yjdBu0lVTSML58pu6PgGtJmCufvzfV565pUF6iACQt092uFOd49iLOTX/sEVmHtbSrS+w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + typescript@5.4.2: resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} engines: {node: '>=14.17'} hasBin: true + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + typescript@5.7.2: resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} engines: {node: '>=14.17'} @@ -3478,9 +3472,6 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -3815,19 +3806,29 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.4.1(eslint@9.15.0)': dependencies: - eslint: 8.57.1 + eslint: 9.15.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/eslintrc@2.1.4': + '@eslint/config-array@0.19.0': + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.7 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/core@0.9.0': {} + + '@eslint/eslintrc@3.2.0': dependencies: ajv: 6.12.6 debug: 4.3.7 - espree: 9.6.1 - globals: 13.24.0 + espree: 10.3.0 + globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -3836,7 +3837,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} + '@eslint/js@9.15.0': {} + + '@eslint/object-schema@2.1.4': {} + + '@eslint/plugin-kit@0.2.3': + dependencies: + levn: 0.4.1 '@floating-ui/core@1.6.8': dependencies: @@ -3863,17 +3870,18 @@ snapshots: '@floating-ui/utils@0.2.8': {} - '@humanwhocodes/config-array@0.13.0': + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.1': {} '@jridgewell/gen-mapping@0.3.5': dependencies: @@ -4178,6 +4186,31 @@ snapshots: '@tabler/icons@3.22.0': {} + '@tanstack/config@0.7.13(@types/node@22.10.0)(esbuild@0.21.5)(rollup@4.25.0)(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.0)(sugarss@4.0.1(postcss@8.4.49)))': + dependencies: + '@commitlint/parse': 19.5.0 + commander: 12.1.0 + current-git-branch: 1.1.0 + esbuild-register: 3.6.0(esbuild@0.21.5) + interpret: 3.1.1 + jsonfile: 6.1.0 + liftoff: 5.0.0 + minimist: 1.2.8 + rollup-plugin-preserve-directives: 0.4.0(rollup@4.25.0) + semver: 7.6.3 + simple-git: 3.27.0 + v8flags: 4.0.1 + vite-plugin-dts: 3.9.1(@types/node@22.10.0)(rollup@4.25.0)(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.0)(sugarss@4.0.1(postcss@8.4.49))) + vite-plugin-externalize-deps: 0.8.0(vite@5.4.11(@types/node@22.10.0)(sugarss@4.0.1(postcss@8.4.49))) + vite-tsconfig-paths: 4.3.2(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.0)(sugarss@4.0.1(postcss@8.4.49))) + transitivePeerDependencies: + - '@types/node' + - esbuild + - rollup + - supports-color + - typescript + - vite + '@tanstack/config@0.7.13(@types/node@22.10.0)(esbuild@0.21.5)(rollup@4.25.0)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.0)(sugarss@4.0.1(postcss@8.4.49)))': dependencies: '@commitlint/parse': 19.5.0 @@ -4287,6 +4320,8 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/json-schema@7.0.15': {} + '@types/json5@0.0.29': {} '@types/mdast@4.0.4': @@ -4316,34 +4351,34 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint@9.15.0)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.15.0(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/parser': 8.15.0(eslint@9.15.0)(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/type-utils': 8.15.0(eslint@8.57.1)(typescript@5.7.2) - '@typescript-eslint/utils': 8.15.0(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/type-utils': 8.15.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.15.0(eslint@9.15.0)(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.15.0 - eslint: 8.57.1 + eslint: 9.15.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.0(typescript@5.7.2) + ts-api-utils: 1.4.0(typescript@5.6.3) optionalDependencies: - typescript: 5.7.2 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2)': + '@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 8.15.0 '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.7.2) + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.15.0 debug: 4.3.7 - eslint: 8.57.1 + eslint: 9.15.0 optionalDependencies: - typescript: 5.7.2 + typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -4352,21 +4387,21 @@ snapshots: '@typescript-eslint/types': 8.15.0 '@typescript-eslint/visitor-keys': 8.15.0 - '@typescript-eslint/type-utils@8.15.0(eslint@8.57.1)(typescript@5.7.2)': + '@typescript-eslint/type-utils@8.15.0(eslint@9.15.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.7.2) - '@typescript-eslint/utils': 8.15.0(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.15.0(eslint@9.15.0)(typescript@5.6.3) debug: 4.3.7 - eslint: 8.57.1 - ts-api-utils: 1.4.0(typescript@5.7.2) + eslint: 9.15.0 + ts-api-utils: 1.4.0(typescript@5.6.3) optionalDependencies: - typescript: 5.7.2 + typescript: 5.6.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.15.0': {} - '@typescript-eslint/typescript-estree@8.15.0(typescript@5.7.2)': + '@typescript-eslint/typescript-estree@8.15.0(typescript@5.6.3)': dependencies: '@typescript-eslint/types': 8.15.0 '@typescript-eslint/visitor-keys': 8.15.0 @@ -4375,21 +4410,21 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.4.0(typescript@5.7.2) + ts-api-utils: 1.4.0(typescript@5.6.3) optionalDependencies: - typescript: 5.7.2 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.15.0(eslint@8.57.1)(typescript@5.7.2)': + '@typescript-eslint/utils@8.15.0(eslint@9.15.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0) '@typescript-eslint/scope-manager': 8.15.0 '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.7.2) - eslint: 8.57.1 + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) + eslint: 9.15.0 optionalDependencies: - typescript: 5.7.2 + typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -4484,6 +4519,20 @@ snapshots: '@vue/compiler-core': 3.5.12 '@vue/shared': 3.5.12 + '@vue/language-core@1.8.27(typescript@5.6.3)': + dependencies: + '@volar/language-core': 1.11.1 + '@volar/source-map': 1.11.1 + '@vue/compiler-dom': 3.5.12 + '@vue/shared': 3.5.12 + computeds: 0.0.1 + minimatch: 9.0.5 + muggle-string: 0.3.1 + path-browserify: 1.0.1 + vue-template-compiler: 2.7.16 + optionalDependencies: + typescript: 5.6.3 + '@vue/language-core@1.8.27(typescript@5.7.2)': dependencies: '@volar/language-core': 1.11.1 @@ -4841,10 +4890,6 @@ snapshots: dependencies: esutils: 2.0.3 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dom-accessibility-api@0.5.16: {} dom-accessibility-api@0.6.3: {} @@ -5008,10 +5053,6 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@9.1.0(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 @@ -5020,37 +5061,37 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@9.15.0): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7 enhanced-resolve: 5.17.1 - eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint: 9.15.0 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.15.0) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.15.0) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.15.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.15.0(eslint@8.57.1)(typescript@5.7.2) - eslint: 8.57.1 + '@typescript-eslint/parser': 8.15.0(eslint@9.15.0)(typescript@5.6.3) + eslint: 9.15.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@9.15.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.15.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -5059,9 +5100,9 @@ snapshots: array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.57.1 + eslint: 9.15.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.15.0) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -5073,17 +5114,17 @@ snapshots: string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.15.0(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/parser': 8.15.0(eslint@9.15.0)(typescript@5.6.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-react-hooks@5.0.0(eslint@8.57.1): + eslint-plugin-react-hooks@5.0.0(eslint@9.15.0): dependencies: - eslint: 8.57.1 + eslint: 9.15.0 - eslint-plugin-react@7.37.2(eslint@8.57.1): + eslint-plugin-react@7.37.2(eslint@9.15.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -5091,7 +5132,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.0 - eslint: 8.57.1 + eslint: 9.15.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -5105,7 +5146,7 @@ snapshots: string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 - eslint-scope@7.2.2: + eslint-scope@8.2.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 @@ -5114,54 +5155,50 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@8.57.1: + eslint@9.15.0: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 + '@eslint/config-array': 0.19.0 + '@eslint/core': 0.9.0 + '@eslint/eslintrc': 3.2.0 + '@eslint/js': 9.15.0 + '@eslint/plugin-kit': 0.2.3 + '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 + '@humanwhocodes/retry': 0.4.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.5 debug: 4.3.7 - doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 transitivePeerDependencies: - supports-color - espree@9.6.1: + espree@10.3.0: dependencies: acorn: 8.14.0 acorn-jsx: 5.3.2(acorn@8.14.0) - eslint-visitor-keys: 3.4.3 + eslint-visitor-keys: 4.2.0 esquery@1.6.0: dependencies: @@ -5248,9 +5285,9 @@ snapshots: dependencies: reusify: 1.0.4 - file-entry-cache@6.0.1: + file-entry-cache@8.0.0: dependencies: - flat-cache: 3.2.0 + flat-cache: 4.0.1 fill-range@7.1.1: dependencies: @@ -5278,11 +5315,10 @@ snapshots: flagged-respawn@2.0.0: {} - flat-cache@3.2.0: + flat-cache@4.0.1: dependencies: flatted: 3.3.1 keyv: 4.5.4 - rimraf: 3.0.2 flatted@3.3.1: {} @@ -5308,8 +5344,6 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true @@ -5356,15 +5390,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - global-modules@1.0.0: dependencies: global-prefix: 1.0.2 @@ -5381,9 +5406,7 @@ snapshots: globals@11.12.0: {} - globals@13.24.0: - dependencies: - type-fest: 0.20.2 + globals@14.0.0: {} globalthis@1.0.4: dependencies: @@ -5508,13 +5531,6 @@ snapshots: indent-string@4.0.0: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - ini@1.3.8: {} inline-style-parser@0.1.1: {} @@ -5616,8 +5632,6 @@ snapshots: is-obj@2.0.0: {} - is-path-inside@3.0.3: {} - is-plain-obj@4.1.0: {} is-plain-object@5.0.0: {} @@ -6228,10 +6242,6 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 - once@1.4.0: - dependencies: - wrappy: 1.0.2 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -6562,10 +6572,6 @@ snapshots: reusify@1.0.4: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - rollup-plugin-preserve-directives@0.4.0(rollup@4.25.0): dependencies: '@rollup/pluginutils': 5.1.3(rollup@4.25.0) @@ -6744,10 +6750,6 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - strip-bom@3.0.0: {} strip-eof@1.0.0: {} @@ -6788,8 +6790,6 @@ snapshots: text-extensions@2.4.0: {} - text-table@0.2.0: {} - through@2.3.8: {} tinybench@2.9.0: {} @@ -6824,9 +6824,13 @@ snapshots: trough@2.2.0: {} - ts-api-utils@1.4.0(typescript@5.7.2): + ts-api-utils@1.4.0(typescript@5.6.3): dependencies: - typescript: 5.7.2 + typescript: 5.6.3 + + tsconfck@3.1.4(typescript@5.6.3): + optionalDependencies: + typescript: 5.6.3 tsconfck@3.1.4(typescript@5.7.2): optionalDependencies: @@ -6962,8 +6966,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@0.20.2: {} - type-fest@4.28.0: {} typed-array-buffer@1.0.2: @@ -6998,8 +7000,21 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 + typescript-eslint@8.15.0(eslint@9.15.0)(typescript@5.6.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.15.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.15.0(eslint@9.15.0)(typescript@5.6.3) + eslint: 9.15.0 + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + typescript@5.4.2: {} + typescript@5.6.3: {} + typescript@5.7.2: {} unbox-primitive@1.0.2: @@ -7134,6 +7149,23 @@ snapshots: - supports-color - terser + vite-plugin-dts@3.9.1(@types/node@22.10.0)(rollup@4.25.0)(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.0)(sugarss@4.0.1(postcss@8.4.49))): + dependencies: + '@microsoft/api-extractor': 7.43.0(@types/node@22.10.0) + '@rollup/pluginutils': 5.1.3(rollup@4.25.0) + '@vue/language-core': 1.8.27(typescript@5.6.3) + debug: 4.3.7 + kolorist: 1.8.0 + magic-string: 0.30.12 + typescript: 5.6.3 + vue-tsc: 1.8.27(typescript@5.6.3) + optionalDependencies: + vite: 5.4.11(@types/node@22.10.0)(sugarss@4.0.1(postcss@8.4.49)) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + vite-plugin-dts@3.9.1(@types/node@22.10.0)(rollup@4.25.0)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.0)(sugarss@4.0.1(postcss@8.4.49))): dependencies: '@microsoft/api-extractor': 7.43.0(@types/node@22.10.0) @@ -7155,6 +7187,17 @@ snapshots: dependencies: vite: 5.4.11(@types/node@22.10.0)(sugarss@4.0.1(postcss@8.4.49)) + vite-tsconfig-paths@4.3.2(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.0)(sugarss@4.0.1(postcss@8.4.49))): + dependencies: + debug: 4.3.7 + globrex: 0.1.2 + tsconfck: 3.1.4(typescript@5.6.3) + optionalDependencies: + vite: 5.4.11(@types/node@22.10.0)(sugarss@4.0.1(postcss@8.4.49)) + transitivePeerDependencies: + - supports-color + - typescript + vite-tsconfig-paths@4.3.2(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.0)(sugarss@4.0.1(postcss@8.4.49))): dependencies: debug: 4.3.7 @@ -7217,6 +7260,13 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 + vue-tsc@1.8.27(typescript@5.6.3): + dependencies: + '@volar/typescript': 1.11.1 + '@vue/language-core': 1.8.27(typescript@5.6.3) + semver: 7.6.3 + typescript: 5.6.3 + vue-tsc@1.8.27(typescript@5.7.2): dependencies: '@volar/typescript': 1.11.1 @@ -7294,8 +7344,6 @@ snapshots: word-wrap@1.2.5: {} - wrappy@1.0.2: {} - ws@8.18.0: {} xml-name-validator@5.0.0: {} diff --git a/tsconfig.json b/tsconfig.json index a21b9d6d..35390a85 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,28 +1,39 @@ { "$schema": "https://json.schemastore.org/tsconfig", "compilerOptions": { - "allowJs": true, - "allowSyntheticDefaultImports": true, + // Typechecking + "strict": true, "allowUnreachableCode": false, "allowUnusedLabels": false, - "checkJs": true, - "declaration": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "isolatedModules": true, - "lib": ["DOM", "DOM.Iterable", "ES2022"], - "module": "ES2022", - "moduleResolution": "Bundler", - "noEmit": true, "noImplicitReturns": true, - "noUncheckedIndexedAccess": true, "noUnusedLocals": false, "noUnusedParameters": false, + "noUncheckedIndexedAccess": true, + + // Modules + "module": "ES2022", + "moduleResolution": "Bundler", "resolveJsonModule": true, - "skipLibCheck": true, - "strict": true, - "target": "ES2020" - }, - "include": [".eslintrc.cjs", "prettier.config.js"], - "exclude": ["node_modules"] + + // Emit + "noEmit": true, + "declaration": true, + + // JavaScript Support + "allowJs": true, + "checkJs": true, + + // Interop Constraints + "allowSyntheticDefaultImports": true, + "isolatedModules": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + + // Language and Environment + "target": "ES2020", + "lib": ["DOM", "DOM.Iterable", "ES2022"], + + // Completeness + "skipLibCheck": true + } } diff --git a/turbo.json b/turbo.json index 9fd1bcb6..702cb040 100644 --- a/turbo.json +++ b/turbo.json @@ -1,5 +1,6 @@ { "$schema": "https://turbo.build/schema.json", + "globalDependencies": ["eslint.config.js"], "tasks": { "lint": { "dependsOn": ["^build"]