Create your Link in Bio for Bluesky

lint導入

-84
.eslintrc.cjs
··· 1 - /** 2 - * This is intended to be a basic starting point for linting in your app. 3 - * It relies on recommended configs out of the box for simplicity, but you can 4 - * and should modify this configuration to best suit your team's needs. 5 - */ 6 - 7 - /** @type {import('eslint').Linter.Config} */ 8 - module.exports = { 9 - root: true, 10 - parserOptions: { 11 - ecmaVersion: "latest", 12 - sourceType: "module", 13 - ecmaFeatures: { 14 - jsx: true, 15 - }, 16 - }, 17 - env: { 18 - browser: true, 19 - commonjs: true, 20 - es6: true, 21 - }, 22 - ignorePatterns: ["!**/.server", "!**/.client"], 23 - 24 - // Base config 25 - extends: ["eslint:recommended"], 26 - 27 - overrides: [ 28 - // React 29 - { 30 - files: ["**/*.{js,jsx,ts,tsx}"], 31 - plugins: ["react", "jsx-a11y"], 32 - extends: [ 33 - "plugin:react/recommended", 34 - "plugin:react/jsx-runtime", 35 - "plugin:react-hooks/recommended", 36 - "plugin:jsx-a11y/recommended", 37 - ], 38 - settings: { 39 - react: { 40 - version: "detect", 41 - }, 42 - formComponents: ["Form"], 43 - linkComponents: [ 44 - { name: "Link", linkAttribute: "to" }, 45 - { name: "NavLink", linkAttribute: "to" }, 46 - ], 47 - "import/resolver": { 48 - typescript: {}, 49 - }, 50 - }, 51 - }, 52 - 53 - // Typescript 54 - { 55 - files: ["**/*.{ts,tsx}"], 56 - plugins: ["@typescript-eslint", "import"], 57 - parser: "@typescript-eslint/parser", 58 - settings: { 59 - "import/internal-regex": "^~/", 60 - "import/resolver": { 61 - node: { 62 - extensions: [".ts", ".tsx"], 63 - }, 64 - typescript: { 65 - alwaysTryTypes: true, 66 - }, 67 - }, 68 - }, 69 - extends: [ 70 - "plugin:@typescript-eslint/recommended", 71 - "plugin:import/recommended", 72 - "plugin:import/typescript", 73 - ], 74 - }, 75 - 76 - // Node 77 - { 78 - files: [".eslintrc.cjs"], 79 - env: { 80 - node: true, 81 - }, 82 - }, 83 - ], 84 - };
+1
.husky/pre-commit
··· 1 + pnpm lint-staged
+2
.prettierignore
··· 1 + pnpm-lock.yaml 2 + atproto/
+1 -1
app/.server/foo.ts
··· 1 - export const foo = 1 1 + export const foo = 1;
+1 -1
app/entry.client.tsx
··· 13 13 document, 14 14 <StrictMode> 15 15 <RemixBrowser /> 16 - </StrictMode> 16 + </StrictMode>, 17 17 ); 18 18 });
+13 -10
app/entry.server.tsx
··· 1 + /* eslint-disable no-console */ 1 2 /** 2 3 * By default, Remix will handle generating the HTTP Response for you. 3 4 * You are free to delete this file if you'd like to, but if you ever want it revealed again, you can run `npx remix reveal` ✨ ··· 21 22 remixContext: EntryContext, 22 23 // This is ignored so we can keep it in the template for visibility. Feel 23 24 // free to delete this parameter in your app if you're not using it! 24 - // eslint-disable-next-line @typescript-eslint/no-unused-vars 25 - loadContext: AppLoadContext 25 + 26 + loadContext: AppLoadContext, 26 27 ) { 27 28 return isbot(request.headers.get("user-agent") || "") 28 29 ? handleBotRequest( 29 30 request, 30 31 responseStatusCode, 31 32 responseHeaders, 32 - remixContext 33 + remixContext, 33 34 ) 34 35 : handleBrowserRequest( 35 36 request, 36 37 responseStatusCode, 37 38 responseHeaders, 38 - remixContext 39 + remixContext, 39 40 ); 40 41 } 41 42 ··· 43 44 request: Request, 44 45 responseStatusCode: number, 45 46 responseHeaders: Headers, 46 - remixContext: EntryContext 47 + remixContext: EntryContext, 47 48 ) { 48 49 return new Promise((resolve, reject) => { 49 50 let shellRendered = false; ··· 65 66 new Response(stream, { 66 67 headers: responseHeaders, 67 68 status: responseStatusCode, 68 - }) 69 + }), 69 70 ); 70 71 71 72 pipe(body); 72 73 }, 73 74 onShellError(error: unknown) { 75 + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors 74 76 reject(error); 75 77 }, 76 78 onError(error: unknown) { ··· 82 84 console.error(error); 83 85 } 84 86 }, 85 - } 87 + }, 86 88 ); 87 89 88 90 setTimeout(abort, ABORT_DELAY); ··· 93 95 request: Request, 94 96 responseStatusCode: number, 95 97 responseHeaders: Headers, 96 - remixContext: EntryContext 98 + remixContext: EntryContext, 97 99 ) { 98 100 return new Promise((resolve, reject) => { 99 101 let shellRendered = false; ··· 115 117 new Response(stream, { 116 118 headers: responseHeaders, 117 119 status: responseStatusCode, 118 - }) 120 + }), 119 121 ); 120 122 121 123 pipe(body); 122 124 }, 123 125 onShellError(error: unknown) { 126 + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors 124 127 reject(error); 125 128 }, 126 129 onError(error: unknown) { ··· 132 135 console.error(error); 133 136 } 134 137 }, 135 - } 138 + }, 136 139 ); 137 140 138 141 setTimeout(abort, ABORT_DELAY);
+2 -1
app/root.tsx
··· 1 + import "./tailwind.css"; 2 + 1 3 import { 2 4 Links, 3 5 Meta, ··· 5 7 Scripts, 6 8 ScrollRestoration, 7 9 } from "@remix-run/react"; 8 - import "./tailwind.css"; 9 10 10 11 export function Layout({ children }: { children: React.ReactNode }) { 11 12 return (
+2 -2
app/routes/_index.tsx
··· 9 9 10 10 export default function Index() { 11 11 return ( 12 - <div className="font-sans p-4"> 12 + <div className="p-4 font-sans"> 13 13 <h1 className="text-3xl">Welcome to Remix</h1> 14 - <ul className="list-disc mt-4 pl-6 space-y-2"> 14 + <ul className="mt-4 list-disc space-y-2 pl-6"> 15 15 <li> 16 16 <a 17 17 className="text-blue-700 underline visited:text-purple-900"
+15
eslint.config.mjs
··· 1 + import { configs } from "@mkizka/eslint-config"; 2 + import gitignore from "eslint-config-flat-gitignore"; 3 + 4 + export default [ 5 + gitignore(), 6 + ...configs.typescript(), 7 + ...configs.react(), 8 + ...configs.tailwind(), 9 + { 10 + files: ["**/*.spec.ts"], 11 + rules: { 12 + "@typescript-eslint/no-unsafe-assignment": "off", 13 + }, 14 + }, 15 + ];
+27 -9
package.json
··· 1 1 { 2 2 "name": "linkat", 3 + "type": "module", 3 4 "private": true, 4 - "sideEffects": false, 5 - "type": "module", 5 + "packageManager": "pnpm@8.15.7+sha256.50783dd0fa303852de2dd1557cd4b9f07cb5b018154a6e76d0f40635d6cee019", 6 + "engines": { 7 + "node": ">=20.0.0" 8 + }, 6 9 "scripts": { 10 + "_eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint .", 7 11 "build": "remix vite:build", 8 - "test": "vitest run", 9 12 "dev": "remix vite:dev", 10 - "lint": "eslint --ignore-path .gitignore --cache --cache-location ./node_modules/.cache/eslint .", 13 + "format": "pnpm _eslint --fix && prettier . --write", 14 + "lint": "pnpm _eslint && prettier . --check", 15 + "postinstall": "./scripts/postinstall.sh", 16 + "prepare": "husky", 11 17 "start": "remix-serve ./build/server/index.js", 12 - "typecheck": "tsc", 13 - "postinstall": "./scripts/postinstall.sh" 18 + "test": "vitest run", 19 + "typecheck": "tsc" 14 20 }, 15 21 "dependencies": { 16 22 "@prisma/client": "^5.17.0", ··· 23 29 }, 24 30 "devDependencies": { 25 31 "@atproto/lex-cli": "0.3.2", 32 + "@mkizka/eslint-config": "^5.2.1", 26 33 "@quramy/prisma-fabbrica": "^2.2.1", 27 34 "@remix-run/dev": "^2.11.0", 28 35 "@types/react": "^18.2.20", ··· 31 38 "@typescript-eslint/parser": "^6.7.4", 32 39 "autoprefixer": "^10.4.19", 33 40 "eslint": "^8.38.0", 41 + "eslint-config-flat-gitignore": "^0.1.8", 34 42 "eslint-import-resolver-typescript": "^3.6.1", 35 43 "eslint-plugin-import": "^2.28.1", 36 44 "eslint-plugin-jsx-a11y": "^6.7.1", 37 45 "eslint-plugin-react": "^7.33.2", 38 46 "eslint-plugin-react-hooks": "^4.6.0", 39 47 "giget": "^1.2.3", 48 + "husky": "^9.1.4", 49 + "lint-staged": "^15.2.8", 40 50 "msw": "^2.3.5", 41 51 "postcss": "^8.4.38", 52 + "prettier": "^3.3.3", 53 + "prettier-plugin-pkg": "^0.18.1", 42 54 "prisma": "^5.17.0", 43 55 "tailwindcss": "^3.4.4", 44 56 "typescript": "^5.1.6", ··· 47 59 "vitest": "^2.0.5", 48 60 "vitest-environment-vprisma": "^1.3.0" 49 61 }, 50 - "engines": { 51 - "node": ">=20.0.0" 62 + "sideEffects": false, 63 + "lint-staged": { 64 + "*.{js,mjs,ts,tsx}": "eslint --fix", 65 + "*": "prettier --ignore-unknown --write" 52 66 }, 53 - "packageManager": "pnpm@8.15.7+sha256.50783dd0fa303852de2dd1557cd4b9f07cb5b018154a6e76d0f40635d6cee019" 67 + "prettier": { 68 + "plugins": [ 69 + "prettier-plugin-pkg" 70 + ] 71 + } 54 72 }
+585
pnpm-lock.yaml
··· 31 31 '@atproto/lex-cli': 32 32 specifier: 0.3.2 33 33 version: 0.3.2 34 + '@mkizka/eslint-config': 35 + specifier: ^5.2.1 36 + version: 5.2.1(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.0)(tailwindcss@3.4.7)(typescript@5.5.4) 34 37 '@quramy/prisma-fabbrica': 35 38 specifier: ^2.2.1 36 39 version: 2.2.1(@prisma/client@5.17.0)(typescript@5.5.4) ··· 55 58 eslint: 56 59 specifier: ^8.38.0 57 60 version: 8.57.0 61 + eslint-config-flat-gitignore: 62 + specifier: ^0.1.8 63 + version: 0.1.8 58 64 eslint-import-resolver-typescript: 59 65 specifier: ^3.6.1 60 66 version: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) ··· 73 79 giget: 74 80 specifier: ^1.2.3 75 81 version: 1.2.3 82 + husky: 83 + specifier: ^9.1.4 84 + version: 9.1.4 85 + lint-staged: 86 + specifier: ^15.2.8 87 + version: 15.2.8 76 88 msw: 77 89 specifier: ^2.3.5 78 90 version: 2.3.5(typescript@5.5.4) 79 91 postcss: 80 92 specifier: ^8.4.38 81 93 version: 8.4.40 94 + prettier: 95 + specifier: ^3.3.3 96 + version: 3.3.3 97 + prettier-plugin-pkg: 98 + specifier: ^0.18.1 99 + version: 0.18.1(prettier@3.3.3) 82 100 prisma: 83 101 specifier: ^5.17.0 84 102 version: 5.17.0 ··· 606 624 tough-cookie: 4.1.4 607 625 dev: true 608 626 627 + /@dword-design/dedent@0.7.0: 628 + resolution: {integrity: sha512-OFmAmzKiDUh9m7WRMYcoEOPI7b5tS5hdqQmtKDwF+ZssVJv8a+GHo9VOtFsmlw3h8Roh/9QzFWIsjSFZyQUMdg==} 629 + dependencies: 630 + babel-plugin-add-module-exports: 1.0.4 631 + dev: true 632 + 633 + /@dword-design/endent@1.4.1: 634 + resolution: {integrity: sha512-e2sCTzth5kyRdM0o+yEb5wBVzUdJL8Y6HblRGRV0Bif0knf1ZjRLhUjdCrqM+Muirb68X/xJzgdRDJVmLqgXGA==} 635 + dependencies: 636 + '@dword-design/dedent': 0.7.0 637 + fast-json-parse: 1.0.3 638 + objectorarray: 1.0.5 639 + dev: true 640 + 641 + /@dword-design/eslint-plugin-import-alias@5.0.0: 642 + resolution: {integrity: sha512-QbY2hA+YvhKiPJnAd9fOwT7gNV8OvaGLHdUsC6uVtyoUVjzx55WbUlzlEZzurlwDamXDlIB81IxbHgHT32Lx0w==} 643 + engines: {node: '>=18'} 644 + dependencies: 645 + '@babel/core': 7.25.2 646 + '@dword-design/functions': 6.0.0 647 + babel-plugin-module-resolver: 5.0.2 648 + deepmerge: 4.3.1 649 + jiti: 1.21.6 650 + transitivePeerDependencies: 651 + - supports-color 652 + dev: true 653 + 654 + /@dword-design/functions@6.0.0: 655 + resolution: {integrity: sha512-22X9eviXAbaz8xdYrp5Tj6KjDPiT+m3fppAP+wEqA3gecAlCyExABesA1bEZ57aXrXrbhNk88M8PvdAO/PLg3A==} 656 + engines: {node: '>=18'} 657 + dependencies: 658 + '@dword-design/endent': 1.4.1 659 + delay: 6.0.0 660 + lodash: 4.17.21 661 + tinycolor2: 1.6.0 662 + dev: true 663 + 609 664 /@emotion/hash@0.9.2: 610 665 resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} 611 666 dev: true ··· 1030 1085 engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 1031 1086 dev: true 1032 1087 1088 + /@eslint/compat@1.1.1: 1089 + resolution: {integrity: sha512-lpHyRyplhGPL5mGEh6M9O5nnKk0Gz4bFI+Zu6tKlPpDUN7XshWvH9C/px4UVm87IAANE0W81CEsNGbS1KlzXpA==} 1090 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1091 + dev: true 1092 + 1033 1093 /@eslint/eslintrc@2.1.4: 1034 1094 resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 1035 1095 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} ··· 1050 1110 /@eslint/js@8.57.0: 1051 1111 resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} 1052 1112 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1113 + dev: true 1114 + 1115 + /@eslint/js@9.8.0: 1116 + resolution: {integrity: sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA==} 1117 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1053 1118 dev: true 1054 1119 1055 1120 /@humanwhocodes/config-array@0.11.14: ··· 1413 1478 - supports-color 1414 1479 dev: true 1415 1480 1481 + /@mkizka/eslint-config@5.2.1(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.0)(tailwindcss@3.4.7)(typescript@5.5.4): 1482 + resolution: {integrity: sha512-1uSMs9wV45VQnPl0AgTXIGjDClPIJ2+QcwE35Bo2Q4dm9DpVQxvVgO0d1YXn+t5+SXeAC4jfwzVXrjKL8YTshw==} 1483 + peerDependencies: 1484 + eslint: '>= 9' 1485 + dependencies: 1486 + '@dword-design/eslint-plugin-import-alias': 5.0.0 1487 + '@eslint/compat': 1.1.1 1488 + '@eslint/js': 9.8.0 1489 + eslint: 8.57.0 1490 + eslint-plugin-eqeqeq-fix: 1.0.3 1491 + eslint-plugin-react: 7.35.0(eslint@8.57.0) 1492 + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) 1493 + eslint-plugin-simple-import-sort: 12.1.1(eslint@8.57.0) 1494 + eslint-plugin-tailwindcss: 3.17.4(tailwindcss@3.4.7) 1495 + eslint-plugin-unused-imports: 3.2.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.0) 1496 + globals: 15.9.0 1497 + typescript-eslint: 7.18.0(eslint@8.57.0)(typescript@5.5.4) 1498 + transitivePeerDependencies: 1499 + - '@typescript-eslint/eslint-plugin' 1500 + - supports-color 1501 + - tailwindcss 1502 + - typescript 1503 + dev: true 1504 + 1416 1505 /@mswjs/interceptors@0.29.1: 1417 1506 resolution: {integrity: sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==} 1418 1507 engines: {node: '>=18'} ··· 2175 2264 - supports-color 2176 2265 dev: true 2177 2266 2267 + /@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.5.4): 2268 + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} 2269 + engines: {node: ^18.18.0 || >=20.0.0} 2270 + peerDependencies: 2271 + '@typescript-eslint/parser': ^7.0.0 2272 + eslint: ^8.56.0 2273 + typescript: '*' 2274 + peerDependenciesMeta: 2275 + typescript: 2276 + optional: true 2277 + dependencies: 2278 + '@eslint-community/regexpp': 4.11.0 2279 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) 2280 + '@typescript-eslint/scope-manager': 7.18.0 2281 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) 2282 + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) 2283 + '@typescript-eslint/visitor-keys': 7.18.0 2284 + eslint: 8.57.0 2285 + graphemer: 1.4.0 2286 + ignore: 5.3.1 2287 + natural-compare: 1.4.0 2288 + ts-api-utils: 1.3.0(typescript@5.5.4) 2289 + typescript: 5.5.4 2290 + transitivePeerDependencies: 2291 + - supports-color 2292 + dev: true 2293 + 2178 2294 /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4): 2179 2295 resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} 2180 2296 engines: {node: ^16.0.0 || >=18.0.0} ··· 2196 2312 - supports-color 2197 2313 dev: true 2198 2314 2315 + /@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4): 2316 + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} 2317 + engines: {node: ^18.18.0 || >=20.0.0} 2318 + peerDependencies: 2319 + eslint: ^8.56.0 2320 + typescript: '*' 2321 + peerDependenciesMeta: 2322 + typescript: 2323 + optional: true 2324 + dependencies: 2325 + '@typescript-eslint/scope-manager': 7.18.0 2326 + '@typescript-eslint/types': 7.18.0 2327 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) 2328 + '@typescript-eslint/visitor-keys': 7.18.0 2329 + debug: 4.3.6 2330 + eslint: 8.57.0 2331 + typescript: 5.5.4 2332 + transitivePeerDependencies: 2333 + - supports-color 2334 + dev: true 2335 + 2199 2336 /@typescript-eslint/scope-manager@6.21.0: 2200 2337 resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} 2201 2338 engines: {node: ^16.0.0 || >=18.0.0} 2202 2339 dependencies: 2203 2340 '@typescript-eslint/types': 6.21.0 2204 2341 '@typescript-eslint/visitor-keys': 6.21.0 2342 + dev: true 2343 + 2344 + /@typescript-eslint/scope-manager@7.18.0: 2345 + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} 2346 + engines: {node: ^18.18.0 || >=20.0.0} 2347 + dependencies: 2348 + '@typescript-eslint/types': 7.18.0 2349 + '@typescript-eslint/visitor-keys': 7.18.0 2205 2350 dev: true 2206 2351 2207 2352 /@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.5.4): ··· 2224 2369 - supports-color 2225 2370 dev: true 2226 2371 2372 + /@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.5.4): 2373 + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} 2374 + engines: {node: ^18.18.0 || >=20.0.0} 2375 + peerDependencies: 2376 + eslint: ^8.56.0 2377 + typescript: '*' 2378 + peerDependenciesMeta: 2379 + typescript: 2380 + optional: true 2381 + dependencies: 2382 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) 2383 + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) 2384 + debug: 4.3.6 2385 + eslint: 8.57.0 2386 + ts-api-utils: 1.3.0(typescript@5.5.4) 2387 + typescript: 5.5.4 2388 + transitivePeerDependencies: 2389 + - supports-color 2390 + dev: true 2391 + 2227 2392 /@typescript-eslint/types@6.21.0: 2228 2393 resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} 2229 2394 engines: {node: ^16.0.0 || >=18.0.0} 2230 2395 dev: true 2231 2396 2397 + /@typescript-eslint/types@7.18.0: 2398 + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} 2399 + engines: {node: ^18.18.0 || >=20.0.0} 2400 + dev: true 2401 + 2232 2402 /@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.4): 2233 2403 resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} 2234 2404 engines: {node: ^16.0.0 || >=18.0.0} ··· 2251 2421 - supports-color 2252 2422 dev: true 2253 2423 2424 + /@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4): 2425 + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} 2426 + engines: {node: ^18.18.0 || >=20.0.0} 2427 + peerDependencies: 2428 + typescript: '*' 2429 + peerDependenciesMeta: 2430 + typescript: 2431 + optional: true 2432 + dependencies: 2433 + '@typescript-eslint/types': 7.18.0 2434 + '@typescript-eslint/visitor-keys': 7.18.0 2435 + debug: 4.3.6 2436 + globby: 11.1.0 2437 + is-glob: 4.0.3 2438 + minimatch: 9.0.5 2439 + semver: 7.6.3 2440 + ts-api-utils: 1.3.0(typescript@5.5.4) 2441 + typescript: 5.5.4 2442 + transitivePeerDependencies: 2443 + - supports-color 2444 + dev: true 2445 + 2254 2446 /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.5.4): 2255 2447 resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} 2256 2448 engines: {node: ^16.0.0 || >=18.0.0} ··· 2270 2462 - typescript 2271 2463 dev: true 2272 2464 2465 + /@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.5.4): 2466 + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} 2467 + engines: {node: ^18.18.0 || >=20.0.0} 2468 + peerDependencies: 2469 + eslint: ^8.56.0 2470 + dependencies: 2471 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 2472 + '@typescript-eslint/scope-manager': 7.18.0 2473 + '@typescript-eslint/types': 7.18.0 2474 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) 2475 + eslint: 8.57.0 2476 + transitivePeerDependencies: 2477 + - supports-color 2478 + - typescript 2479 + dev: true 2480 + 2273 2481 /@typescript-eslint/visitor-keys@6.21.0: 2274 2482 resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} 2275 2483 engines: {node: ^16.0.0 || >=18.0.0} 2276 2484 dependencies: 2277 2485 '@typescript-eslint/types': 6.21.0 2486 + eslint-visitor-keys: 3.4.3 2487 + dev: true 2488 + 2489 + /@typescript-eslint/visitor-keys@7.18.0: 2490 + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} 2491 + engines: {node: ^18.18.0 || >=20.0.0} 2492 + dependencies: 2493 + '@typescript-eslint/types': 7.18.0 2278 2494 eslint-visitor-keys: 3.4.3 2279 2495 dev: true 2280 2496 ··· 2444 2660 type-fest: 0.21.3 2445 2661 dev: true 2446 2662 2663 + /ansi-escapes@7.0.0: 2664 + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} 2665 + engines: {node: '>=18'} 2666 + dependencies: 2667 + environment: 1.1.0 2668 + dev: true 2669 + 2447 2670 /ansi-regex@5.0.1: 2448 2671 resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 2449 2672 engines: {node: '>=8'} ··· 2675 2898 - supports-color 2676 2899 dev: true 2677 2900 2901 + /babel-plugin-add-module-exports@1.0.4: 2902 + resolution: {integrity: sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==} 2903 + dev: true 2904 + 2678 2905 /babel-plugin-istanbul@6.1.1: 2679 2906 resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} 2680 2907 engines: {node: '>=8'} ··· 2696 2923 '@babel/types': 7.25.2 2697 2924 '@types/babel__core': 7.20.5 2698 2925 '@types/babel__traverse': 7.20.6 2926 + dev: true 2927 + 2928 + /babel-plugin-module-resolver@5.0.2: 2929 + resolution: {integrity: sha512-9KtaCazHee2xc0ibfqsDeamwDps6FZNo5S0Q81dUqEuFzVwPhcT4J5jOqIVvgCA3Q/wO9hKYxN/Ds3tIsp5ygg==} 2930 + dependencies: 2931 + find-babel-config: 2.1.1 2932 + glob: 9.3.5 2933 + pkg-up: 3.1.0 2934 + reselect: 4.1.8 2935 + resolve: 1.22.8 2699 2936 dev: true 2700 2937 2701 2938 /babel-preset-current-node-syntax@1.0.1(@babel/core@7.25.2): ··· 3008 3245 restore-cursor: 3.1.0 3009 3246 dev: true 3010 3247 3248 + /cli-cursor@5.0.0: 3249 + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} 3250 + engines: {node: '>=18'} 3251 + dependencies: 3252 + restore-cursor: 5.1.0 3253 + dev: true 3254 + 3011 3255 /cli-spinners@2.9.2: 3012 3256 resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} 3013 3257 engines: {node: '>=6'} 3258 + dev: true 3259 + 3260 + /cli-truncate@4.0.0: 3261 + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} 3262 + engines: {node: '>=18'} 3263 + dependencies: 3264 + slice-ansi: 5.0.0 3265 + string-width: 7.2.0 3014 3266 dev: true 3015 3267 3016 3268 /cli-width@4.1.0: ··· 3066 3318 resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 3067 3319 dev: true 3068 3320 3321 + /colorette@2.0.20: 3322 + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} 3323 + dev: true 3324 + 3069 3325 /comma-separated-tokens@2.0.3: 3070 3326 resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} 3071 3327 dev: true 3072 3328 3329 + /commander@12.1.0: 3330 + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} 3331 + engines: {node: '>=18'} 3332 + dev: true 3333 + 3073 3334 /commander@4.1.1: 3074 3335 resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 3075 3336 engines: {node: '>= 6'} ··· 3342 3603 resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} 3343 3604 dev: true 3344 3605 3606 + /delay@6.0.0: 3607 + resolution: {integrity: sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==} 3608 + engines: {node: '>=16'} 3609 + dev: true 3610 + 3345 3611 /depd@2.0.0: 3346 3612 resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 3347 3613 engines: {node: '>= 0.8'} ··· 3429 3695 engines: {node: '>=12'} 3430 3696 dev: true 3431 3697 3698 + /emoji-regex@10.3.0: 3699 + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} 3700 + dev: true 3701 + 3432 3702 /emoji-regex@8.0.0: 3433 3703 resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 3434 3704 dev: true ··· 3453 3723 dependencies: 3454 3724 graceful-fs: 4.2.11 3455 3725 tapable: 2.2.1 3726 + dev: true 3727 + 3728 + /environment@1.1.0: 3729 + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} 3730 + engines: {node: '>=18'} 3456 3731 dev: true 3457 3732 3458 3733 /err-code@2.0.3: ··· 3692 3967 engines: {node: '>=10'} 3693 3968 dev: true 3694 3969 3970 + /eslint-config-flat-gitignore@0.1.8: 3971 + resolution: {integrity: sha512-OEUbS2wzzYtUfshjOqzFo4Bl4lHykXUdM08TCnYNl7ki+niW4Q1R0j0FDFDr0vjVsI5ZFOz5LvluxOP+Ew+dYw==} 3972 + dependencies: 3973 + find-up-simple: 1.0.0 3974 + parse-gitignore: 2.0.0 3975 + dev: true 3976 + 3695 3977 /eslint-import-resolver-node@0.3.9: 3696 3978 resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} 3697 3979 dependencies: ··· 3753 4035 eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) 3754 4036 transitivePeerDependencies: 3755 4037 - supports-color 4038 + dev: true 4039 + 4040 + /eslint-plugin-eqeqeq-fix@1.0.3: 4041 + resolution: {integrity: sha512-P1rvtn3iyMJGmF8zU6Q5+boNhYr+c+L4V3lLNGjNornLdZgXScekItxpxZdwKRXpZI30JmszVBH8U4hRj3Ly/Q==} 3756 4042 dev: true 3757 4043 3758 4044 /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): ··· 3851 4137 string.prototype.repeat: 1.0.0 3852 4138 dev: true 3853 4139 4140 + /eslint-plugin-simple-import-sort@12.1.1(eslint@8.57.0): 4141 + resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} 4142 + peerDependencies: 4143 + eslint: '>=5.0.0' 4144 + dependencies: 4145 + eslint: 8.57.0 4146 + dev: true 4147 + 4148 + /eslint-plugin-tailwindcss@3.17.4(tailwindcss@3.4.7): 4149 + resolution: {integrity: sha512-gJAEHmCq2XFfUP/+vwEfEJ9igrPeZFg+skeMtsxquSQdxba9XRk5bn0Bp9jxG1VV9/wwPKi1g3ZjItu6MIjhNg==} 4150 + engines: {node: '>=18.12.0'} 4151 + peerDependencies: 4152 + tailwindcss: ^3.4.0 4153 + dependencies: 4154 + fast-glob: 3.3.2 4155 + postcss: 8.4.40 4156 + tailwindcss: 3.4.7 4157 + dev: true 4158 + 4159 + /eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.0): 4160 + resolution: {integrity: sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==} 4161 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 4162 + peerDependencies: 4163 + '@typescript-eslint/eslint-plugin': 6 - 7 4164 + eslint: '8' 4165 + peerDependenciesMeta: 4166 + '@typescript-eslint/eslint-plugin': 4167 + optional: true 4168 + dependencies: 4169 + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.5.4) 4170 + eslint: 8.57.0 4171 + eslint-rule-composer: 0.3.0 4172 + dev: true 4173 + 4174 + /eslint-rule-composer@0.3.0: 4175 + resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} 4176 + engines: {node: '>=4.0.0'} 4177 + dev: true 4178 + 3854 4179 /eslint-scope@7.2.2: 3855 4180 resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 3856 4181 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} ··· 4016 4341 resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} 4017 4342 engines: {node: '>=6'} 4018 4343 4344 + /eventemitter3@5.0.1: 4345 + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} 4346 + dev: true 4347 + 4019 4348 /execa@5.1.1: 4020 4349 resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 4021 4350 engines: {node: '>=10'} ··· 4124 4453 micromatch: 4.0.7 4125 4454 dev: true 4126 4455 4456 + /fast-json-parse@1.0.3: 4457 + resolution: {integrity: sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==} 4458 + dev: true 4459 + 4127 4460 /fast-json-stable-stringify@2.1.0: 4128 4461 resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 4129 4462 dev: true ··· 4177 4510 transitivePeerDependencies: 4178 4511 - supports-color 4179 4512 4513 + /find-babel-config@2.1.1: 4514 + resolution: {integrity: sha512-5Ji+EAysHGe1OipH7GN4qDjok5Z1uw5KAwDCbicU/4wyTZY7CqOCzcWbG7J5ad9mazq67k89fXlbc1MuIfl9uA==} 4515 + dependencies: 4516 + json5: 2.2.3 4517 + path-exists: 4.0.0 4518 + dev: true 4519 + 4520 + /find-up-simple@1.0.0: 4521 + resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} 4522 + engines: {node: '>=18'} 4523 + dev: true 4524 + 4525 + /find-up@3.0.0: 4526 + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} 4527 + engines: {node: '>=6'} 4528 + dependencies: 4529 + locate-path: 3.0.0 4530 + dev: true 4531 + 4180 4532 /find-up@4.1.0: 4181 4533 resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 4182 4534 engines: {node: '>=8'} ··· 4316 4668 engines: {node: 6.* || 8.* || >= 10.*} 4317 4669 dev: true 4318 4670 4671 + /get-east-asian-width@1.2.0: 4672 + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} 4673 + engines: {node: '>=18'} 4674 + dev: true 4675 + 4319 4676 /get-func-name@2.0.2: 4320 4677 resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} 4321 4678 dev: true ··· 4415 4772 path-is-absolute: 1.0.1 4416 4773 dev: true 4417 4774 4775 + /glob@9.3.5: 4776 + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} 4777 + engines: {node: '>=16 || 14 >=14.17'} 4778 + dependencies: 4779 + fs.realpath: 1.0.0 4780 + minimatch: 8.0.4 4781 + minipass: 4.2.8 4782 + path-scurry: 1.11.1 4783 + dev: true 4784 + 4418 4785 /globals@11.12.0: 4419 4786 resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 4420 4787 engines: {node: '>=4'} ··· 4425 4792 engines: {node: '>=8'} 4426 4793 dependencies: 4427 4794 type-fest: 0.20.2 4795 + dev: true 4796 + 4797 + /globals@15.9.0: 4798 + resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} 4799 + engines: {node: '>=18'} 4428 4800 dev: true 4429 4801 4430 4802 /globalthis@1.0.4: ··· 4579 4951 /human-signals@5.0.0: 4580 4952 resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} 4581 4953 engines: {node: '>=16.17.0'} 4954 + dev: true 4955 + 4956 + /husky@9.1.4: 4957 + resolution: {integrity: sha512-bho94YyReb4JV7LYWRWxZ/xr6TtOTt8cMfmQ39MQYJ7f/YE268s3GdghGwi+y4zAeqewE5zYLvuhV0M0ijsDEA==} 4958 + engines: {node: '>=18'} 4959 + hasBin: true 4582 4960 dev: true 4583 4961 4584 4962 /iconv-lite@0.4.24: ··· 4768 5146 /is-fullwidth-code-point@3.0.0: 4769 5147 resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 4770 5148 engines: {node: '>=8'} 5149 + dev: true 5150 + 5151 + /is-fullwidth-code-point@4.0.0: 5152 + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} 5153 + engines: {node: '>=12'} 5154 + dev: true 5155 + 5156 + /is-fullwidth-code-point@5.0.0: 5157 + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} 5158 + engines: {node: '>=18'} 5159 + dependencies: 5160 + get-east-asian-width: 1.2.0 4771 5161 dev: true 4772 5162 4773 5163 /is-generator-fn@2.1.0: ··· 5574 5964 resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 5575 5965 dev: true 5576 5966 5967 + /lint-staged@15.2.8: 5968 + resolution: {integrity: sha512-PUWFf2zQzsd9EFU+kM1d7UP+AZDbKFKuj+9JNVTBkhUFhbg4MAt6WfyMMwBfM4lYqd4D2Jwac5iuTu9rVj4zCQ==} 5969 + engines: {node: '>=18.12.0'} 5970 + hasBin: true 5971 + dependencies: 5972 + chalk: 5.3.0 5973 + commander: 12.1.0 5974 + debug: 4.3.6 5975 + execa: 8.0.1 5976 + lilconfig: 3.1.2 5977 + listr2: 8.2.4 5978 + micromatch: 4.0.7 5979 + pidtree: 0.6.0 5980 + string-argv: 0.3.2 5981 + yaml: 2.5.0 5982 + transitivePeerDependencies: 5983 + - supports-color 5984 + dev: true 5985 + 5986 + /listr2@8.2.4: 5987 + resolution: {integrity: sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==} 5988 + engines: {node: '>=18.0.0'} 5989 + dependencies: 5990 + cli-truncate: 4.0.0 5991 + colorette: 2.0.20 5992 + eventemitter3: 5.0.1 5993 + log-update: 6.1.0 5994 + rfdc: 1.4.1 5995 + wrap-ansi: 9.0.0 5996 + dev: true 5997 + 5577 5998 /loader-utils@3.3.1: 5578 5999 resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} 5579 6000 engines: {node: '>= 12.13.0'} ··· 5585 6006 dependencies: 5586 6007 mlly: 1.7.1 5587 6008 pkg-types: 1.1.3 6009 + dev: true 6010 + 6011 + /locate-path@3.0.0: 6012 + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} 6013 + engines: {node: '>=6'} 6014 + dependencies: 6015 + p-locate: 3.0.0 6016 + path-exists: 3.0.0 5588 6017 dev: true 5589 6018 5590 6019 /locate-path@5.0.0: ··· 5625 6054 is-unicode-supported: 0.1.0 5626 6055 dev: true 5627 6056 6057 + /log-update@6.1.0: 6058 + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} 6059 + engines: {node: '>=18'} 6060 + dependencies: 6061 + ansi-escapes: 7.0.0 6062 + cli-cursor: 5.0.0 6063 + slice-ansi: 7.1.0 6064 + strip-ansi: 7.1.0 6065 + wrap-ansi: 9.0.0 6066 + dev: true 6067 + 5628 6068 /longest-streak@3.1.0: 5629 6069 resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} 5630 6070 dev: true ··· 6143 6583 engines: {node: '>=12'} 6144 6584 dev: true 6145 6585 6586 + /mimic-function@5.0.1: 6587 + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} 6588 + engines: {node: '>=18'} 6589 + dev: true 6590 + 6146 6591 /minimatch@3.1.2: 6147 6592 resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 6148 6593 dependencies: ··· 6152 6597 /minimatch@5.1.6: 6153 6598 resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 6154 6599 engines: {node: '>=10'} 6600 + dependencies: 6601 + brace-expansion: 2.0.1 6602 + dev: true 6603 + 6604 + /minimatch@8.0.4: 6605 + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} 6606 + engines: {node: '>=16 || 14 >=14.17'} 6155 6607 dependencies: 6156 6608 brace-expansion: 2.0.1 6157 6609 dev: true ··· 6200 6652 engines: {node: '>=8'} 6201 6653 dependencies: 6202 6654 yallist: 4.0.0 6655 + dev: true 6656 + 6657 + /minipass@4.2.8: 6658 + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} 6659 + engines: {node: '>=8'} 6203 6660 dev: true 6204 6661 6205 6662 /minipass@5.0.0: ··· 6500 6957 es-object-atoms: 1.0.0 6501 6958 dev: true 6502 6959 6960 + /objectorarray@1.0.5: 6961 + resolution: {integrity: sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==} 6962 + dev: true 6963 + 6503 6964 /ohash@1.1.3: 6504 6965 resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} 6505 6966 dev: true ··· 6540 7001 mimic-fn: 4.0.0 6541 7002 dev: true 6542 7003 7004 + /onetime@7.0.0: 7005 + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} 7006 + engines: {node: '>=18'} 7007 + dependencies: 7008 + mimic-function: 5.0.1 7009 + dev: true 7010 + 6543 7011 /optionator@0.9.4: 6544 7012 resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 6545 7013 engines: {node: '>= 0.8.0'} ··· 6587 7055 engines: {node: '>=10'} 6588 7056 dependencies: 6589 7057 yocto-queue: 0.1.0 7058 + dev: true 7059 + 7060 + /p-locate@3.0.0: 7061 + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} 7062 + engines: {node: '>=6'} 7063 + dependencies: 7064 + p-limit: 2.3.0 6590 7065 dev: true 6591 7066 6592 7067 /p-locate@4.1.0: ··· 6643 7118 is-hexadecimal: 2.0.1 6644 7119 dev: true 6645 7120 7121 + /parse-gitignore@2.0.0: 7122 + resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} 7123 + engines: {node: '>=14'} 7124 + dev: true 7125 + 6646 7126 /parse-json@5.2.0: 6647 7127 resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 6648 7128 engines: {node: '>=8'} ··· 6664 7144 6665 7145 /path-browserify@1.0.1: 6666 7146 resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} 7147 + dev: true 7148 + 7149 + /path-exists@3.0.0: 7150 + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} 7151 + engines: {node: '>=4'} 6667 7152 dev: true 6668 7153 6669 7154 /path-exists@4.0.0: ··· 6772 7257 confbox: 0.1.7 6773 7258 mlly: 1.7.1 6774 7259 pathe: 1.1.2 7260 + dev: true 7261 + 7262 + /pkg-up@3.1.0: 7263 + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} 7264 + engines: {node: '>=8'} 7265 + dependencies: 7266 + find-up: 3.0.0 6775 7267 dev: true 6776 7268 6777 7269 /possible-typed-array-names@1.0.0: ··· 6919 7411 engines: {node: '>= 0.8.0'} 6920 7412 dev: true 6921 7413 7414 + /prettier-plugin-pkg@0.18.1(prettier@3.3.3): 7415 + resolution: {integrity: sha512-FuUxvsYZR/8rsLH8s/jbPQmgYvv0yxW8LoIHCy6+Q7p4FBjjdP3DNKx8fMTOsc0SlEB1skB4o1LcahRceIh87A==} 7416 + engines: {node: ^14.18.0 || >=16.0.0} 7417 + peerDependencies: 7418 + prettier: ^3.0.3 7419 + dependencies: 7420 + prettier: 3.3.3 7421 + dev: true 7422 + 6922 7423 /prettier@2.8.8: 6923 7424 resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 6924 7425 engines: {node: '>=10.13.0'} 7426 + hasBin: true 7427 + dev: true 7428 + 7429 + /prettier@3.3.3: 7430 + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} 7431 + engines: {node: '>=14'} 6925 7432 hasBin: true 6926 7433 dev: true 6927 7434 ··· 7233 7740 resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} 7234 7741 dev: true 7235 7742 7743 + /reselect@4.1.8: 7744 + resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} 7745 + dev: true 7746 + 7236 7747 /resolve-cwd@3.0.0: 7237 7748 resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 7238 7749 engines: {node: '>=8'} ··· 7285 7796 signal-exit: 3.0.7 7286 7797 dev: true 7287 7798 7799 + /restore-cursor@5.1.0: 7800 + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} 7801 + engines: {node: '>=18'} 7802 + dependencies: 7803 + onetime: 7.0.0 7804 + signal-exit: 4.1.0 7805 + dev: true 7806 + 7288 7807 /retry@0.12.0: 7289 7808 resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} 7290 7809 engines: {node: '>= 4'} ··· 7293 7812 /reusify@1.0.4: 7294 7813 resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 7295 7814 engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 7815 + dev: true 7816 + 7817 + /rfdc@1.4.1: 7818 + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} 7296 7819 dev: true 7297 7820 7298 7821 /rimraf@3.0.2: ··· 7495 8018 engines: {node: '>=8'} 7496 8019 dev: true 7497 8020 8021 + /slice-ansi@5.0.0: 8022 + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} 8023 + engines: {node: '>=12'} 8024 + dependencies: 8025 + ansi-styles: 6.2.1 8026 + is-fullwidth-code-point: 4.0.0 8027 + dev: true 8028 + 8029 + /slice-ansi@7.1.0: 8030 + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} 8031 + engines: {node: '>=18'} 8032 + dependencies: 8033 + ansi-styles: 6.2.1 8034 + is-fullwidth-code-point: 5.0.0 8035 + dev: true 8036 + 7498 8037 /source-map-js@1.2.0: 7499 8038 resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 7500 8039 engines: {node: '>=0.10.0'} ··· 7595 8134 resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} 7596 8135 dev: true 7597 8136 8137 + /string-argv@0.3.2: 8138 + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} 8139 + engines: {node: '>=0.6.19'} 8140 + dev: true 8141 + 7598 8142 /string-hash@1.1.3: 7599 8143 resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==} 7600 8144 dev: true ··· 7625 8169 strip-ansi: 7.1.0 7626 8170 dev: true 7627 8171 8172 + /string-width@7.2.0: 8173 + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} 8174 + engines: {node: '>=18'} 8175 + dependencies: 8176 + emoji-regex: 10.3.0 8177 + get-east-asian-width: 1.2.0 8178 + strip-ansi: 7.1.0 8179 + dev: true 8180 + 7628 8181 /string.prototype.includes@2.0.0: 7629 8182 resolution: {integrity: sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==} 7630 8183 dependencies: ··· 7901 8454 resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 7902 8455 dev: true 7903 8456 8457 + /tinycolor2@1.6.0: 8458 + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} 8459 + dev: true 8460 + 7904 8461 /tinypool@1.0.0: 7905 8462 resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} 7906 8463 engines: {node: ^18.0.0 || >=20.0.0} ··· 8087 8644 has-proto: 1.0.3 8088 8645 is-typed-array: 1.1.13 8089 8646 possible-typed-array-names: 1.0.0 8647 + dev: true 8648 + 8649 + /typescript-eslint@7.18.0(eslint@8.57.0)(typescript@5.5.4): 8650 + resolution: {integrity: sha512-PonBkP603E3tt05lDkbOMyaxJjvKqQrXsnow72sVeOFINDE/qNmnnd+f9b4N+U7W6MXnnYyrhtmF2t08QWwUbA==} 8651 + engines: {node: ^18.18.0 || >=20.0.0} 8652 + peerDependencies: 8653 + eslint: ^8.56.0 8654 + typescript: '*' 8655 + peerDependenciesMeta: 8656 + typescript: 8657 + optional: true 8658 + dependencies: 8659 + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.5.4) 8660 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) 8661 + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) 8662 + eslint: 8.57.0 8663 + typescript: 5.5.4 8664 + transitivePeerDependencies: 8665 + - supports-color 8090 8666 dev: true 8091 8667 8092 8668 /typescript@5.5.4: ··· 8595 9171 dependencies: 8596 9172 ansi-styles: 6.2.1 8597 9173 string-width: 5.1.2 9174 + strip-ansi: 7.1.0 9175 + dev: true 9176 + 9177 + /wrap-ansi@9.0.0: 9178 + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} 9179 + engines: {node: '>=18'} 9180 + dependencies: 9181 + ansi-styles: 6.2.1 9182 + string-width: 7.2.0 8598 9183 strip-ansi: 7.1.0 8599 9184 dev: true 8600 9185
+6 -1
tsconfig.json
··· 9 9 ], 10 10 "compilerOptions": { 11 11 "lib": ["DOM", "DOM.Iterable", "ES2022"], 12 - "types": ["@remix-run/node", "vite/client"], 12 + "types": [ 13 + "@remix-run/node", 14 + "vite/client", 15 + "vitest/globals", 16 + "vitest-environment-vprisma" 17 + ], 13 18 "isolatedModules": true, 14 19 "esModuleInterop": true, 15 20 "jsx": "react-jsx",