├── .gitignore ├── LICENSE ├── README.md ├── package.json ├── packages └── remix-to-react-router │ ├── .codemodrc.json │ ├── .gitignore │ ├── README.md │ ├── __testfixtures__ │ ├── entry.client.remix.tsx │ ├── entry.client.rr7.tsx │ ├── entry.server.remix.tsx │ ├── entry.server.rr7.tsx │ ├── imports.remix.tsx │ ├── imports.rr7.tsx │ ├── nochange.tsx │ ├── package.nochange.json │ ├── package.remix.json │ ├── package.rr7.json │ ├── server.remix.ts │ ├── server.rr7.ts │ ├── testing.remix.tsx │ ├── testing.rr7.tsx │ ├── tsconfig.remix.json │ ├── tsconfig.rr7.json │ ├── vite.config.remix.ts │ └── vite.config.rr7.ts │ ├── package.json │ ├── src │ ├── config.ts │ ├── index.ts │ ├── transformers │ │ ├── function-params.ts │ │ ├── imports.ts │ │ ├── package-json.ts │ │ ├── rename-remix.ts │ │ ├── rename-server-build.ts │ │ └── tsconfig.ts │ ├── types.ts │ └── utils │ │ ├── dependencies.ts │ │ ├── line-terminator.ts │ │ └── quote-style.ts │ ├── test │ └── transformers.ts │ ├── tsconfig.json │ └── vitest.config.ts ├── pnpm-lock.yaml └── pnpm-workspace.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | .DS_Store 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2024 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # react-router-codemods 2 | 3 | This repo provides codemods for migrating from Remix to React Router v7. 4 | 5 | See the README at [remix-to-react-router/README.md](./packages/remix-to-react-router/README.md) for details. 6 | 7 | ## Example 8 | 9 | Please see the commit [here](https://github.com/jrestall/epic-stack/commit/3fac92aed4c4a987b5b00e33257d3a3d9bc61372) that uses the `epic-stack` as an example of the changes the codemod `remix/2/react-router/upgrade` will make. 10 | 11 | ## Running 12 | 13 | 1. Install Codemod: https://docs.codemod.com/deploying-codemods/cli#installation 14 | 2. Run `codemod remix/2/react-router/upgrade` on the path you want to modify. 15 | 16 | ## Publishing 17 | 18 | ```bash 19 | cd packages/remix-to-react-router 20 | codemod login 21 | codemod publish 22 | ``` 23 | 24 | ## License 25 | 26 | This project is licensed under the [MIT License](LICENSE). 27 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-router-codemods", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "Codemods for migrating from Remix to React Router v7", 6 | "scripts": { 7 | "test": "vitest" 8 | }, 9 | "keywords": [ 10 | "codemod", 11 | "remix", 12 | "react-router", 13 | "migration" 14 | ], 15 | "author": "James Restall", 16 | "license": "MIT", 17 | "devDependencies": { 18 | "@types/jscodeshift": "^0.11.10", 19 | "@vitest/coverage-v8": "^2.1.4", 20 | "codemod": "^0.14.1", 21 | "jscodeshift": "^0.15.1", 22 | "ts-node": "^10.9.1", 23 | "typescript": "^5.6.3", 24 | "vitest": "^2.1.4" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/.codemodrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://codemod-utils.s3.us-west-1.amazonaws.com/configuration_schema.json", 3 | "name": "remix/2/react-router/upgrade", 4 | "description": "Migrates Remix to React Router v7", 5 | "version": "1.2.0", 6 | "engine": "jscodeshift", 7 | "private": false, 8 | "include": [ 9 | "**/*.js", 10 | "**/*.cjs", 11 | "**/*.mjs", 12 | "**/*.ts", 13 | "**/*.jsx", 14 | "**/*.tsx", 15 | "**/package.json", 16 | "**/vite.config.ts", 17 | "**/tsconfig.json", 18 | "**/tsconfig.base.json" 19 | ], 20 | "applicability": { 21 | "from": [ 22 | [ 23 | "@remix-run/react", 24 | ">=", 25 | "2.0.0" 26 | ] 27 | ] 28 | }, 29 | "arguments": [], 30 | "meta": { 31 | "tags": [ 32 | "migration", 33 | "remix", 34 | "react-router", 35 | "v7" 36 | ], 37 | "git": "https://github.com/jrestall/react-router-codemods/tree/main/packages/remix-to-react-router" 38 | } 39 | } -------------------------------------------------------------------------------- /packages/remix-to-react-router/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist -------------------------------------------------------------------------------- /packages/remix-to-react-router/README.md: -------------------------------------------------------------------------------- 1 | # Remix to React Router 2 | 3 | This codemod automates most of the manual steps outlined in the Remix to React Router upgrade guide. 4 | 5 | https://github.com/remix-run/react-router/blob/dev/docs/upgrading/remix.md 6 | 7 | - It updates your dependencies from the @remix-run/* packages to react-router and @react-router/* packages in package.json. 8 | - It updates both static and dynamic imports from @remix-run/* and react-router-dom to react-router. 9 | - It handles moving removed imports from the host specific packages like @remix-run/architect, @remix-run/cloudflare etc and moving them to react-router. 10 | - It updates any vi.mock module calls to the correct package name. 11 | - It updates the scripts in your package.json if you are using the basic scripts from the Remix templates, otherwise it won't change the scripts. 12 | - It updates the import and renames the plugin in your vite.config.ts. 13 | - If you have an entry.server.tsx and/or an entry.client.tsx file in your application, it will update the main components and imports in these files, including renaming remixContext to reactRouterContext. 14 | - It renames your server file's server build import from virtual:remix/server-build to virtual:react-router/server-build. 15 | - It updates package names in compilerOptions.types in tsconfig.json files. 16 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/__testfixtures__/entry.client.remix.tsx: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | 3 | /** 4 | * By default, Remix will handle hydrating your app on the client for you. 5 | * 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` ✨ 6 | * For more information, see https://remix.run/file-conventions/entry.client 7 | */ 8 | 9 | import { RemixBrowser } from "@remix-run/react"; 10 | import { startTransition, StrictMode } from "react"; 11 | import { hydrateRoot } from "react-dom/client"; 12 | 13 | startTransition(() => { 14 | hydrateRoot( 15 | document, 16 | 17 | 18 | 19 | ); 20 | }); 21 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/__testfixtures__/entry.client.rr7.tsx: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | 3 | /** 4 | * By default, Remix will handle hydrating your app on the client for you. 5 | * 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` ✨ 6 | * For more information, see https://remix.run/file-conventions/entry.client 7 | */ 8 | 9 | import { HydratedRouter } from "react-router/dom"; 10 | import { startTransition, StrictMode } from "react"; 11 | import { hydrateRoot } from "react-dom/client"; 12 | 13 | startTransition(() => { 14 | hydrateRoot( 15 | document, 16 | 17 | 18 | 19 | ); 20 | }); 21 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/__testfixtures__/entry.server.remix.tsx: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | 3 | /** 4 | * By default, Remix will handle generating the HTTP Response for you. 5 | * 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` ✨ 6 | * For more information, see https://remix.run/file-conventions/entry.server 7 | */ 8 | 9 | import { PassThrough } from 'node:stream'; 10 | 11 | import type { AppLoadContext, EntryContext } from '@remix-run/node'; 12 | import { createReadableStreamFromReadable } from '@remix-run/node'; 13 | import { RemixServer } from '@remix-run/react'; 14 | import { isbot } from 'isbot'; 15 | import { renderToPipeableStream } from 'react-dom/server'; 16 | 17 | const ABORT_DELAY = 5_000; 18 | 19 | export default function handleRequest( 20 | request: Request, 21 | responseStatusCode: number, 22 | responseHeaders: Headers, 23 | remixContext: EntryContext, 24 | // This is ignored so we can keep it in the template for visibility. Feel 25 | // free to delete this parameter in your app if you're not using it! 26 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 27 | loadContext: AppLoadContext 28 | ) { 29 | return isbot(request.headers.get('user-agent') || '') 30 | ? handleBotRequest( 31 | request, 32 | responseStatusCode, 33 | responseHeaders, 34 | remixContext 35 | ) 36 | : handleBrowserRequest( 37 | request, 38 | responseStatusCode, 39 | responseHeaders, 40 | remixContext 41 | ); 42 | } 43 | 44 | function handleBotRequest( 45 | request: Request, 46 | responseStatusCode: number, 47 | responseHeaders: Headers, 48 | remixContext: EntryContext 49 | ) { 50 | return new Promise((resolve, reject) => { 51 | let shellRendered = false; 52 | const { pipe, abort } = renderToPipeableStream( 53 | , 58 | { 59 | onAllReady() { 60 | shellRendered = true; 61 | const body = new PassThrough(); 62 | const stream = createReadableStreamFromReadable(body); 63 | 64 | responseHeaders.set('Content-Type', 'text/html'); 65 | 66 | resolve( 67 | new Response(stream, { 68 | headers: responseHeaders, 69 | status: responseStatusCode, 70 | }) 71 | ); 72 | 73 | pipe(body); 74 | }, 75 | onShellError(error: unknown) { 76 | reject(error); 77 | }, 78 | onError(error: unknown) { 79 | responseStatusCode = 500; 80 | // Log streaming rendering errors from inside the shell. Don't log 81 | // errors encountered during initial shell rendering since they'll 82 | // reject and get logged in handleDocumentRequest. 83 | if (shellRendered) { 84 | console.error(error); 85 | } 86 | }, 87 | } 88 | ); 89 | 90 | setTimeout(abort, ABORT_DELAY); 91 | }); 92 | } 93 | 94 | function handleBrowserRequest( 95 | request: Request, 96 | responseStatusCode: number, 97 | responseHeaders: Headers, 98 | remixContext: EntryContext 99 | ) { 100 | return new Promise((resolve, reject) => { 101 | let shellRendered = false; 102 | const { pipe, abort } = renderToPipeableStream( 103 | , 108 | { 109 | onShellReady() { 110 | shellRendered = true; 111 | const body = new PassThrough(); 112 | const stream = createReadableStreamFromReadable(body); 113 | 114 | responseHeaders.set('Content-Type', 'text/html'); 115 | 116 | resolve( 117 | new Response(stream, { 118 | headers: responseHeaders, 119 | status: responseStatusCode, 120 | }) 121 | ); 122 | 123 | pipe(body); 124 | }, 125 | onShellError(error: unknown) { 126 | reject(error); 127 | }, 128 | onError(error: unknown) { 129 | responseStatusCode = 500; 130 | // Log streaming rendering errors from inside the shell. Don't log 131 | // errors encountered during initial shell rendering since they'll 132 | // reject and get logged in handleDocumentRequest. 133 | if (shellRendered) { 134 | console.error(error); 135 | } 136 | }, 137 | } 138 | ); 139 | 140 | setTimeout(abort, ABORT_DELAY); 141 | }); 142 | } 143 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/__testfixtures__/entry.server.rr7.tsx: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | 3 | /** 4 | * By default, Remix will handle generating the HTTP Response for you. 5 | * 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` ✨ 6 | * For more information, see https://remix.run/file-conventions/entry.server 7 | */ 8 | 9 | import { PassThrough } from 'node:stream'; 10 | 11 | import type { AppLoadContext, EntryContext } from 'react-router'; 12 | import { createReadableStreamFromReadable } from '@react-router/node'; 13 | import { ServerRouter } from 'react-router'; 14 | import { isbot } from 'isbot'; 15 | import { renderToPipeableStream } from 'react-dom/server'; 16 | 17 | const ABORT_DELAY = 5_000; 18 | 19 | export default function handleRequest( 20 | request: Request, 21 | responseStatusCode: number, 22 | responseHeaders: Headers, 23 | reactRouterContext: EntryContext, 24 | // This is ignored so we can keep it in the template for visibility. Feel 25 | // free to delete this parameter in your app if you're not using it! 26 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 27 | loadContext: AppLoadContext 28 | ) { 29 | return isbot(request.headers.get('user-agent') || '') 30 | ? handleBotRequest( 31 | request, 32 | responseStatusCode, 33 | responseHeaders, 34 | reactRouterContext 35 | ) 36 | : handleBrowserRequest( 37 | request, 38 | responseStatusCode, 39 | responseHeaders, 40 | reactRouterContext 41 | ); 42 | } 43 | 44 | function handleBotRequest( 45 | request: Request, 46 | responseStatusCode: number, 47 | responseHeaders: Headers, 48 | reactRouterContext: EntryContext 49 | ) { 50 | return new Promise((resolve, reject) => { 51 | let shellRendered = false; 52 | const { pipe, abort } = renderToPipeableStream( 53 | , 58 | { 59 | onAllReady() { 60 | shellRendered = true; 61 | const body = new PassThrough(); 62 | const stream = createReadableStreamFromReadable(body); 63 | 64 | responseHeaders.set('Content-Type', 'text/html'); 65 | 66 | resolve( 67 | new Response(stream, { 68 | headers: responseHeaders, 69 | status: responseStatusCode, 70 | }) 71 | ); 72 | 73 | pipe(body); 74 | }, 75 | onShellError(error: unknown) { 76 | reject(error); 77 | }, 78 | onError(error: unknown) { 79 | responseStatusCode = 500; 80 | // Log streaming rendering errors from inside the shell. Don't log 81 | // errors encountered during initial shell rendering since they'll 82 | // reject and get logged in handleDocumentRequest. 83 | if (shellRendered) { 84 | console.error(error); 85 | } 86 | }, 87 | } 88 | ); 89 | 90 | setTimeout(abort, ABORT_DELAY); 91 | }); 92 | } 93 | 94 | function handleBrowserRequest( 95 | request: Request, 96 | responseStatusCode: number, 97 | responseHeaders: Headers, 98 | reactRouterContext: EntryContext 99 | ) { 100 | return new Promise((resolve, reject) => { 101 | let shellRendered = false; 102 | const { pipe, abort } = renderToPipeableStream( 103 | , 108 | { 109 | onShellReady() { 110 | shellRendered = true; 111 | const body = new PassThrough(); 112 | const stream = createReadableStreamFromReadable(body); 113 | 114 | responseHeaders.set('Content-Type', 'text/html'); 115 | 116 | resolve( 117 | new Response(stream, { 118 | headers: responseHeaders, 119 | status: responseStatusCode, 120 | }) 121 | ); 122 | 123 | pipe(body); 124 | }, 125 | onShellError(error: unknown) { 126 | reject(error); 127 | }, 128 | onError(error: unknown) { 129 | responseStatusCode = 500; 130 | // Log streaming rendering errors from inside the shell. Don't log 131 | // errors encountered during initial shell rendering since they'll 132 | // reject and get logged in handleDocumentRequest. 133 | if (shellRendered) { 134 | console.error(error); 135 | } 136 | }, 137 | } 138 | ); 139 | 140 | setTimeout(abort, ABORT_DELAY); 141 | }); 142 | } 143 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/__testfixtures__/imports.remix.tsx: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | 3 | import { redirect } from '@remix-run/node'; 4 | import type { AppLoadContext, EntryContext } from '@remix-run/cloudflare'; 5 | import { 6 | createSession, 7 | createFileSessionStorage, 8 | createCookieSessionStorage, 9 | createRequestHandler as nodeCreateRequestHandler, 10 | type ActionFunctionArgs, 11 | writeReadableStreamToWritable, 12 | } from '@remix-run/node'; 13 | import { 14 | json, 15 | type LoaderFunctionArgs, 16 | type HeadersFunction, 17 | type LinksFunction, 18 | type MetaFunction, 19 | } from '@remix-run/node'; 20 | import { getDomainUrl } from '#app/utils/misc.tsx'; 21 | import { 22 | Form, 23 | Link, 24 | Links, 25 | Meta, 26 | Outlet, 27 | Scripts, 28 | ScrollRestoration, 29 | useLoaderData, 30 | useMatches, 31 | useSubmit, 32 | } from '@remix-run/react'; 33 | import { createRequestHandler } from '@remix-run/express'; 34 | import { createRemixStub } from '@remix-run/testing'; 35 | import { createRemixStub as aliasedRenamedImport } from '@remix-run/testing'; 36 | import { useLocation, useNavigate, Route, Switch } from 'react-router-dom'; 37 | import { flatRoutes } from "@remix-run/fs-routes"; 38 | import type { RouteConfig } from "@remix-run/route-config"; 39 | import { remixRoutesOptionAdapter } from '@remix-run/routes-option-adapter'; 40 | const { createRoutesFromFolders } = require("@remix-run/v1-route-convention"); 41 | import createRoutesFromFolders2 from "@remix-run/v1-route-convention"; 42 | 43 | export const routes: RouteConfig = flatRoutes(); 44 | 45 | export function loader() { 46 | createRemixStub(); 47 | aliasedRenamedImport(); 48 | return json({ message: 'hello' }); 49 | } 50 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/__testfixtures__/imports.rr7.tsx: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | 3 | import { redirect } from 'react-router'; 4 | 5 | import type { AppLoadContext, EntryContext } from 'react-router'; 6 | 7 | import { 8 | createSession, 9 | createCookieSessionStorage, 10 | createRequestHandler as nodeCreateRequestHandler, 11 | type ActionFunctionArgs, 12 | } from 'react-router'; 13 | 14 | import { createFileSessionStorage, writeReadableStreamToWritable } from '@react-router/node'; 15 | 16 | import { 17 | json, 18 | type LoaderFunctionArgs, 19 | type HeadersFunction, 20 | type LinksFunction, 21 | type MetaFunction, 22 | } from 'react-router'; 23 | 24 | import { getDomainUrl } from '#app/utils/misc.tsx'; 25 | 26 | import { 27 | Form, 28 | Link, 29 | Links, 30 | Meta, 31 | Outlet, 32 | Scripts, 33 | ScrollRestoration, 34 | useLoaderData, 35 | useMatches, 36 | useSubmit, 37 | } from 'react-router'; 38 | 39 | import { createRequestHandler } from '@react-router/express'; 40 | import { createRoutesStub } from 'react-router'; 41 | import { createRoutesStub as aliasedRenamedImport } from 'react-router'; 42 | import { useLocation, useNavigate, Route, Switch } from 'react-router'; 43 | import { flatRoutes } from '@react-router/fs-routes'; 44 | import type { RouteConfig } from '@react-router/dev/routes'; 45 | import { remixRoutesOptionAdapter } from '@react-router/remix-routes-option-adapter'; 46 | const { createRoutesFromFolders } = require("@remix-run/v1-route-convention"); 47 | import createRoutesFromFolders2 from "@remix-run/v1-route-convention"; 48 | 49 | export const routes: RouteConfig = flatRoutes(); 50 | 51 | export function loader() { 52 | createRoutesStub(); 53 | aliasedRenamedImport(); 54 | return json({ message: 'hello' }); 55 | } 56 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/__testfixtures__/nochange.tsx: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | // Taken from https://github.com/epicweb-dev/epic-stack/blob/main/tests/setup/custom-matchers.ts 3 | // Copyright (c) Kent C. Dodds 4 | 5 | import * as setCookieParser from 'set-cookie-parser' 6 | import { expect } from 'vitest' 7 | import { sessionKey } from '#app/utils/auth.server.ts' 8 | import { prisma } from '#app/utils/db.server.ts' 9 | import { authSessionStorage } from '#app/utils/session.server.ts' 10 | import { 11 | type ToastInput, 12 | toastSessionStorage, 13 | toastKey, 14 | } from '#app/utils/toast.server.ts' 15 | import { convertSetCookieToCookie } from '#tests/utils.ts' 16 | 17 | import '@testing-library/jest-dom/vitest' 18 | 19 | expect.extend({ 20 | toHaveRedirect(response: unknown, redirectTo?: string) { 21 | if (!(response instanceof Response)) { 22 | throw new Error('toHaveRedirect must be called with a Response') 23 | } 24 | const location = response.headers.get('location') 25 | const redirectToSupplied = redirectTo !== undefined 26 | if (redirectToSupplied !== Boolean(location)) { 27 | return { 28 | pass: Boolean(location), 29 | message: () => 30 | `Expected response to ${this.isNot ? 'not ' : ''}redirect${ 31 | redirectToSupplied 32 | ? ` to ${this.utils.printExpected(redirectTo)}` 33 | : '' 34 | } but got ${ 35 | location ? 'no redirect' : this.utils.printReceived(location) 36 | }`, 37 | } 38 | } 39 | const isRedirectStatusCode = response.status >= 300 && response.status < 400 40 | if (!isRedirectStatusCode) { 41 | return { 42 | pass: false, 43 | message: () => 44 | `Expected redirect to ${ 45 | this.isNot ? 'not ' : '' 46 | }be ${this.utils.printExpected( 47 | '>= 300 && < 400', 48 | )} but got ${this.utils.printReceived(response.status)}`, 49 | } 50 | } 51 | 52 | function toUrl(s?: string | null) { 53 | s ??= '' 54 | return s.startsWith('http') 55 | ? new URL(s) 56 | : new URL(s, 'https://example.com') 57 | } 58 | 59 | function urlsMatch(u1: URL, u2: URL) { 60 | const u1SP = new URL(u1).searchParams 61 | u1SP.sort() 62 | const u2SP = new URL(u2).searchParams 63 | u2SP.sort() 64 | return ( 65 | u1.origin === u2.origin && 66 | u1.pathname === u2.pathname && 67 | u1SP.toString() === u2SP.toString() && 68 | u1.hash === u2.hash 69 | ) 70 | } 71 | 72 | return { 73 | pass: 74 | location == redirectTo || urlsMatch(toUrl(location), toUrl(redirectTo)), 75 | message: () => 76 | `Expected response to ${ 77 | this.isNot ? 'not ' : '' 78 | }redirect to ${this.utils.printExpected( 79 | redirectTo, 80 | )} but got ${this.utils.printReceived(location)}`, 81 | } 82 | }, 83 | async toHaveSessionForUser(response: Response, userId: string) { 84 | const setCookies = response.headers.getSetCookie() 85 | const sessionSetCookie = setCookies.find( 86 | (c) => setCookieParser.parseString(c).name === 'en_session', 87 | ) 88 | 89 | if (!sessionSetCookie) { 90 | return { 91 | pass: false, 92 | message: () => 93 | `The en_session set-cookie header was${ 94 | this.isNot ? '' : ' not' 95 | } defined`, 96 | } 97 | } 98 | 99 | const authSession = await authSessionStorage.getSession( 100 | convertSetCookieToCookie(sessionSetCookie), 101 | ) 102 | const sessionValue = authSession.get(sessionKey) 103 | 104 | if (!sessionValue) { 105 | return { 106 | pass: false, 107 | message: () => `A session was${this.isNot ? '' : ' not'} set in cookie`, 108 | } 109 | } 110 | 111 | const session = await prisma.session.findUnique({ 112 | select: { id: true }, 113 | where: { userId, id: sessionValue }, 114 | }) 115 | 116 | return { 117 | pass: Boolean(session), 118 | message: () => 119 | `A session was${ 120 | this.isNot ? ' not' : '' 121 | } created in the database for ${userId}`, 122 | } 123 | }, 124 | async toSendToast(response: Response, toast: ToastInput) { 125 | const setCookies = response.headers.getSetCookie() 126 | const toastSetCookie = setCookies.find( 127 | (c) => setCookieParser.parseString(c).name === 'en_toast', 128 | ) 129 | 130 | if (!toastSetCookie) { 131 | return { 132 | pass: false, 133 | message: () => 134 | `en_toast set-cookie header was${this.isNot ? '' : ' not'} defined`, 135 | } 136 | } 137 | 138 | const toastSession = await toastSessionStorage.getSession( 139 | convertSetCookieToCookie(toastSetCookie), 140 | ) 141 | const toastValue = toastSession.get(toastKey) 142 | 143 | if (!toastValue) { 144 | return { 145 | pass: false, 146 | message: () => `toast was${this.isNot ? '' : ' not'} set in session`, 147 | } 148 | } 149 | 150 | const pass = this.equals(toastValue, toast) 151 | 152 | const diff = pass ? null : `\n${this.utils.diff(toastValue, toast)}` 153 | 154 | return { 155 | pass, 156 | message: () => 157 | `toast in the response ${ 158 | this.isNot ? 'does not match' : 'matches' 159 | } the expected toast${diff}`, 160 | } 161 | }, 162 | }) 163 | 164 | interface CustomMatchers { 165 | toHaveRedirect(redirectTo: string | null): R 166 | toHaveSessionForUser(userId: string): Promise 167 | toSendToast(toast: ToastInput): Promise 168 | } 169 | 170 | declare module 'vitest' { 171 | interface Assertion extends CustomMatchers {} 172 | interface AsymmetricMatchersContaining extends CustomMatchers {} 173 | } -------------------------------------------------------------------------------- /packages/remix-to-react-router/__testfixtures__/package.nochange.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "sideEffects": false, 4 | "type": "module", 5 | "scripts": { 6 | "test": "vitest" 7 | }, 8 | "dependencies": { 9 | "isbot": "^4.1.0", 10 | "react": "^18.2.0", 11 | "react-dom": "^18.2.0" 12 | }, 13 | "devDependencies": { 14 | "@remix-run/eslint-config": "*", 15 | "@types/react": "^18.2.20", 16 | "@types/react-dom": "^18.2.7", 17 | "@typescript-eslint/eslint-plugin": "^6.7.4", 18 | "@typescript-eslint/parser": "^6.7.4", 19 | "autoprefixer": "^10.4.19", 20 | "eslint": "^8.38.0", 21 | "eslint-import-resolver-typescript": "^3.6.1", 22 | "eslint-plugin-import": "^2.28.1", 23 | "eslint-plugin-jsx-a11y": "^6.7.1", 24 | "eslint-plugin-react": "^7.33.2", 25 | "eslint-plugin-react-hooks": "^4.6.0", 26 | "postcss": "^8.4.38", 27 | "tailwindcss": "^3.4.4", 28 | "typescript": "^5.1.6", 29 | "vite": "^5.1.0", 30 | "vite-tsconfig-paths": "^4.2.1" 31 | }, 32 | "engines": { 33 | "node": ">=20.0.0" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/__testfixtures__/package.remix.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "sideEffects": false, 4 | "type": "module", 5 | "scripts": { 6 | "build": "remix vite:build", 7 | "dev": "remix vite:dev", 8 | "lint": "eslint --ignore-path .gitignore --cache --cache-location ./node_modules/.cache/eslint .", 9 | "start": "remix-serve ./build/server/index.js", 10 | "typecheck": "tsc" 11 | }, 12 | "dependencies": { 13 | "@remix-run/node": "*", 14 | "@remix-run/react": "^2.14.0", 15 | "@remix-run/serve": "workspace:*", 16 | "@remix-run/express": "^2.14.0", 17 | "@remix-run/router": "^2.14.0", 18 | "isbot": "^4.1.0", 19 | "react": "^18.2.0", 20 | "react-dom": "^18.2.0", 21 | "react-router-dom": "^6.2.1" 22 | }, 23 | "devDependencies": { 24 | "@remix-run/eslint-config": "*", 25 | "@remix-run/dev": "*", 26 | "@remix-run/fs-routes": "^2.14.0", 27 | "@remix-run/route-config": "^2.14.0", 28 | "@remix-run/routes-option-adapter": "2.14.0", 29 | "@types/react": "^18.2.20", 30 | "@types/react-dom": "^18.2.7", 31 | "@typescript-eslint/eslint-plugin": "^6.7.4", 32 | "@typescript-eslint/parser": "^6.7.4", 33 | "autoprefixer": "^10.4.19", 34 | "eslint": "^8.38.0", 35 | "eslint-import-resolver-typescript": "^3.6.1", 36 | "eslint-plugin-import": "^2.28.1", 37 | "eslint-plugin-jsx-a11y": "^6.7.1", 38 | "eslint-plugin-react": "^7.33.2", 39 | "eslint-plugin-react-hooks": "^4.6.0", 40 | "postcss": "^8.4.38", 41 | "tailwindcss": "^3.4.4", 42 | "typescript": "^5.1.6", 43 | "vite": "^5.1.0", 44 | "vite-tsconfig-paths": "^4.2.1" 45 | }, 46 | "engines": { 47 | "node": ">=20.0.0" 48 | } 49 | } -------------------------------------------------------------------------------- /packages/remix-to-react-router/__testfixtures__/package.rr7.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "sideEffects": false, 4 | "type": "module", 5 | "scripts": { 6 | "build": "react-router build", 7 | "dev": "react-router dev", 8 | "lint": "eslint --ignore-path .gitignore --cache --cache-location ./node_modules/.cache/eslint .", 9 | "start": "react-router-serve ./build/server/index.js", 10 | "typecheck": "react-router typegen && tsc" 11 | }, 12 | "dependencies": { 13 | "@react-router/express": "^7.0.0", 14 | "@react-router/node": "*", 15 | "@react-router/serve": "workspace:*", 16 | "isbot": "^4.1.0", 17 | "react": "^18.2.0", 18 | "react-dom": "^18.2.0", 19 | "react-router": "^7.0.0" 20 | }, 21 | "devDependencies": { 22 | "@react-router/dev": "*", 23 | "@react-router/fs-routes": "^7.0.0", 24 | "@react-router/remix-routes-option-adapter": "^7.0.0", 25 | "@remix-run/eslint-config": "*", 26 | "@types/react": "^18.2.20", 27 | "@types/react-dom": "^18.2.7", 28 | "@typescript-eslint/eslint-plugin": "^6.7.4", 29 | "@typescript-eslint/parser": "^6.7.4", 30 | "autoprefixer": "^10.4.19", 31 | "eslint": "^8.38.0", 32 | "eslint-import-resolver-typescript": "^3.6.1", 33 | "eslint-plugin-import": "^2.28.1", 34 | "eslint-plugin-jsx-a11y": "^6.7.1", 35 | "eslint-plugin-react": "^7.33.2", 36 | "eslint-plugin-react-hooks": "^4.6.0", 37 | "postcss": "^8.4.38", 38 | "tailwindcss": "^3.4.4", 39 | "typescript": "^5.1.6", 40 | "vite": "^5.1.0", 41 | "vite-tsconfig-paths": "^4.2.1" 42 | }, 43 | "engines": { 44 | "node": ">=20.0.0" 45 | } 46 | } -------------------------------------------------------------------------------- /packages/remix-to-react-router/__testfixtures__/server.remix.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | 3 | import { createRequestHandler } from '@remix-run/express'; 4 | import express from 'express'; 5 | 6 | const viteDevServer = 7 | process.env.NODE_ENV === 'production' 8 | ? undefined 9 | : await import('vite').then((vite) => 10 | vite.createServer({ 11 | server: { middlewareMode: true }, 12 | }) 13 | ); 14 | 15 | const app = express(); 16 | 17 | // handle asset requests 18 | if (viteDevServer) { 19 | app.use(viteDevServer.middlewares); 20 | } else { 21 | app.use( 22 | '/assets', 23 | express.static('build/client/assets', { 24 | immutable: true, 25 | maxAge: '1y', 26 | }) 27 | ); 28 | } 29 | app.use(express.static('build/client', { maxAge: '1h' })); 30 | 31 | // handle SSR requests 32 | app.all( 33 | '*', 34 | createRequestHandler({ 35 | build: viteDevServer 36 | ? () => viteDevServer.ssrLoadModule('virtual:remix/server-build') 37 | : await import('./build/server/index.js'), 38 | }) 39 | ); 40 | 41 | const port = 3000; 42 | app.listen(port, () => console.log('http://localhost:' + port)); 43 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/__testfixtures__/server.rr7.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | 3 | import { createRequestHandler } from '@react-router/express'; 4 | import express from 'express'; 5 | 6 | const viteDevServer = 7 | process.env.NODE_ENV === 'production' 8 | ? undefined 9 | : await import('vite').then((vite) => 10 | vite.createServer({ 11 | server: { middlewareMode: true }, 12 | }) 13 | ); 14 | 15 | const app = express(); 16 | 17 | // handle asset requests 18 | if (viteDevServer) { 19 | app.use(viteDevServer.middlewares); 20 | } else { 21 | app.use( 22 | '/assets', 23 | express.static('build/client/assets', { 24 | immutable: true, 25 | maxAge: '1y', 26 | }) 27 | ); 28 | } 29 | app.use(express.static('build/client', { maxAge: '1h' })); 30 | 31 | // handle SSR requests 32 | app.all( 33 | '*', 34 | createRequestHandler({ 35 | build: viteDevServer 36 | ? () => viteDevServer.ssrLoadModule('virtual:react-router/server-build') 37 | : await import('./build/server/index.js'), 38 | }) 39 | ); 40 | 41 | const port = 3000; 42 | app.listen(port, () => console.log('http://localhost:' + port)); 43 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/__testfixtures__/testing.remix.tsx: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | 3 | // Taken from epic-stack (c) Kent C. Dodds 4 | // https://github.com/epicweb-dev/epic-stack/blob/6c7eb1d529a15e0d32c49b310e8b0a7711aa01f9/app/routes/users%2B/%24username.test.tsx 5 | 6 | /** 7 | * @vitest-environment jsdom 8 | */ 9 | import { faker } from '@faker-js/faker'; 10 | import { createRemixStub } from '@remix-run/testing'; 11 | import { render, screen } from '@testing-library/react'; 12 | import setCookieParser from 'set-cookie-parser'; 13 | import { test } from 'vitest'; 14 | import { loader as rootLoader } from '#app/root.tsx'; 15 | import { 16 | getSessionExpirationDate, 17 | sessionKey, 18 | } from '#app/utils/auth.server.ts'; 19 | import { prisma } from '#app/utils/db.server.ts'; 20 | import { authSessionStorage } from '#app/utils/session.server.ts'; 21 | import { createUser, getUserImages } from '#tests/db-utils.ts'; 22 | import { default as UsernameRoute, loader } from './$username.tsx'; 23 | import { vi } from 'vitest'; 24 | import type * as remix from '@remix-run/react'; 25 | 26 | test('The user profile when not logged in as self', async () => { 27 | vi.mock('@remix-run/react', async () => { 28 | const remixActual = await import('@remix-run/react'); 29 | return remixActual; 30 | }); 31 | vi.mock('@remix-run/node', async () => { 32 | const remixActual = await import('@remix-run/node'); 33 | return remixActual; 34 | }); 35 | const userImages = await getUserImages(); 36 | const userImage = 37 | userImages[faker.number.int({ min: 0, max: userImages.length - 1 })]; 38 | const user = await prisma.user.create({ 39 | select: { id: true, username: true, name: true }, 40 | data: { ...createUser(), image: { create: userImage } }, 41 | }); 42 | const App = createRemixStub([ 43 | { 44 | path: '/users/:username', 45 | Component: UsernameRoute, 46 | loader, 47 | }, 48 | ]); 49 | 50 | const routeUrl = `/users/${user.username}`; 51 | render(); 52 | 53 | await screen.findByRole('heading', { level: 1, name: user.name! }); 54 | await screen.findByRole('img', { name: user.name! }); 55 | await screen.findByRole('link', { name: `${user.name}'s notes` }); 56 | }); 57 | 58 | test('The user profile when logged in as self', async () => { 59 | const userImages = await getUserImages(); 60 | const userImage = 61 | userImages[faker.number.int({ min: 0, max: userImages.length - 1 })]; 62 | const user = await prisma.user.create({ 63 | select: { id: true, username: true, name: true }, 64 | data: { ...createUser(), image: { create: userImage } }, 65 | }); 66 | const session = await prisma.session.create({ 67 | select: { id: true }, 68 | data: { 69 | expirationDate: getSessionExpirationDate(), 70 | userId: user.id, 71 | }, 72 | }); 73 | 74 | const authSession = await authSessionStorage.getSession(); 75 | authSession.set(sessionKey, session.id); 76 | const setCookieHeader = await authSessionStorage.commitSession(authSession); 77 | const parsedCookie = setCookieParser.parseString(setCookieHeader); 78 | const cookieHeader = new URLSearchParams({ 79 | [parsedCookie.name]: parsedCookie.value, 80 | }).toString(); 81 | 82 | const App = createRemixStub([ 83 | { 84 | id: 'root', 85 | path: '/', 86 | loader: async (args) => { 87 | // add the cookie header to the request 88 | args.request.headers.set('cookie', cookieHeader); 89 | return rootLoader(args); 90 | }, 91 | children: [ 92 | { 93 | path: 'users/:username', 94 | Component: UsernameRoute, 95 | loader: async (args) => { 96 | // add the cookie header to the request 97 | args.request.headers.set('cookie', cookieHeader); 98 | return loader(args); 99 | }, 100 | }, 101 | ], 102 | }, 103 | ]); 104 | 105 | const routeUrl = `/users/${user.username}`; 106 | await render(); 107 | 108 | await screen.findByRole('heading', { level: 1, name: user.name! }); 109 | await screen.findByRole('img', { name: user.name! }); 110 | await screen.findByRole('button', { name: /logout/i }); 111 | await screen.findByRole('link', { name: /my notes/i }); 112 | await screen.findByRole('link', { name: /edit profile/i }); 113 | }); 114 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/__testfixtures__/testing.rr7.tsx: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | 3 | // Taken from epic-stack (c) Kent C. Dodds 4 | // https://github.com/epicweb-dev/epic-stack/blob/6c7eb1d529a15e0d32c49b310e8b0a7711aa01f9/app/routes/users%2B/%24username.test.tsx 5 | 6 | /** 7 | * @vitest-environment jsdom 8 | */ 9 | import { faker } from '@faker-js/faker'; 10 | import { createRoutesStub } from 'react-router'; 11 | import { render, screen } from '@testing-library/react'; 12 | import setCookieParser from 'set-cookie-parser'; 13 | import { test } from 'vitest'; 14 | import { loader as rootLoader } from '#app/root.tsx'; 15 | import { 16 | getSessionExpirationDate, 17 | sessionKey, 18 | } from '#app/utils/auth.server.ts'; 19 | import { prisma } from '#app/utils/db.server.ts'; 20 | import { authSessionStorage } from '#app/utils/session.server.ts'; 21 | import { createUser, getUserImages } from '#tests/db-utils.ts'; 22 | import { default as UsernameRoute, loader } from './$username.tsx'; 23 | import { vi } from 'vitest'; 24 | import type * as remix from 'react-router'; 25 | 26 | test('The user profile when not logged in as self', async () => { 27 | vi.mock('react-router', async () => { 28 | const remixActual = await import('react-router'); 29 | return remixActual; 30 | }); 31 | vi.mock('@react-router/node', async () => { 32 | const remixActual = await import('@react-router/node'); 33 | return remixActual; 34 | }); 35 | const userImages = await getUserImages(); 36 | const userImage = 37 | userImages[faker.number.int({ min: 0, max: userImages.length - 1 })]; 38 | const user = await prisma.user.create({ 39 | select: { id: true, username: true, name: true }, 40 | data: { ...createUser(), image: { create: userImage } }, 41 | }); 42 | const App = createRoutesStub([ 43 | { 44 | path: '/users/:username', 45 | Component: UsernameRoute, 46 | loader, 47 | }, 48 | ]); 49 | 50 | const routeUrl = `/users/${user.username}`; 51 | render(); 52 | 53 | await screen.findByRole('heading', { level: 1, name: user.name! }); 54 | await screen.findByRole('img', { name: user.name! }); 55 | await screen.findByRole('link', { name: `${user.name}'s notes` }); 56 | }); 57 | 58 | test('The user profile when logged in as self', async () => { 59 | const userImages = await getUserImages(); 60 | const userImage = 61 | userImages[faker.number.int({ min: 0, max: userImages.length - 1 })]; 62 | const user = await prisma.user.create({ 63 | select: { id: true, username: true, name: true }, 64 | data: { ...createUser(), image: { create: userImage } }, 65 | }); 66 | const session = await prisma.session.create({ 67 | select: { id: true }, 68 | data: { 69 | expirationDate: getSessionExpirationDate(), 70 | userId: user.id, 71 | }, 72 | }); 73 | 74 | const authSession = await authSessionStorage.getSession(); 75 | authSession.set(sessionKey, session.id); 76 | const setCookieHeader = await authSessionStorage.commitSession(authSession); 77 | const parsedCookie = setCookieParser.parseString(setCookieHeader); 78 | const cookieHeader = new URLSearchParams({ 79 | [parsedCookie.name]: parsedCookie.value, 80 | }).toString(); 81 | 82 | const App = createRoutesStub([ 83 | { 84 | id: 'root', 85 | path: '/', 86 | loader: async (args) => { 87 | // add the cookie header to the request 88 | args.request.headers.set('cookie', cookieHeader); 89 | return rootLoader(args); 90 | }, 91 | children: [ 92 | { 93 | path: 'users/:username', 94 | Component: UsernameRoute, 95 | loader: async (args) => { 96 | // add the cookie header to the request 97 | args.request.headers.set('cookie', cookieHeader); 98 | return loader(args); 99 | }, 100 | }, 101 | ], 102 | }, 103 | ]); 104 | 105 | const routeUrl = `/users/${user.username}`; 106 | await render(); 107 | 108 | await screen.findByRole('heading', { level: 1, name: user.name! }); 109 | await screen.findByRole('img', { name: user.name! }); 110 | await screen.findByRole('button', { name: /logout/i }); 111 | await screen.findByRole('link', { name: /my notes/i }); 112 | await screen.findByRole('link', { name: /edit profile/i }); 113 | }); 114 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/__testfixtures__/tsconfig.remix.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": [ 3 | "**/*.ts", 4 | "**/*.tsx", 5 | "**/.server/**/*.ts", 6 | "**/.server/**/*.tsx", 7 | "**/.client/**/*.ts", 8 | "**/.client/**/*.tsx" 9 | ], 10 | "compilerOptions": { 11 | "lib": ["DOM", "DOM.Iterable", "ES2022"], 12 | "types": ["@remix-run/node", "vite/client"], 13 | "isolatedModules": true, 14 | "esModuleInterop": true, 15 | "jsx": "react-jsx", 16 | "module": "ESNext", 17 | "moduleResolution": "Bundler", 18 | "resolveJsonModule": true, 19 | "target": "ES2022", 20 | "strict": true, 21 | "allowJs": true, 22 | "skipLibCheck": true, 23 | "forceConsistentCasingInFileNames": true, 24 | "baseUrl": ".", 25 | "paths": { 26 | "~/*": ["./app/*"] 27 | }, 28 | "noEmit": true 29 | } 30 | } -------------------------------------------------------------------------------- /packages/remix-to-react-router/__testfixtures__/tsconfig.rr7.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": [ 3 | "**/*.ts", 4 | "**/*.tsx", 5 | "**/.server/**/*.ts", 6 | "**/.server/**/*.tsx", 7 | "**/.client/**/*.ts", 8 | "**/.client/**/*.tsx" 9 | ], 10 | "compilerOptions": { 11 | "lib": [ 12 | "DOM", 13 | "DOM.Iterable", 14 | "ES2022" 15 | ], 16 | "types": [ 17 | "@react-router/node", 18 | "vite/client" 19 | ], 20 | "isolatedModules": true, 21 | "esModuleInterop": true, 22 | "jsx": "react-jsx", 23 | "module": "ESNext", 24 | "moduleResolution": "Bundler", 25 | "resolveJsonModule": true, 26 | "target": "ES2022", 27 | "strict": true, 28 | "allowJs": true, 29 | "skipLibCheck": true, 30 | "forceConsistentCasingInFileNames": true, 31 | "baseUrl": ".", 32 | "paths": { 33 | "~/*": [ 34 | "./app/*" 35 | ] 36 | }, 37 | "noEmit": true 38 | } 39 | } -------------------------------------------------------------------------------- /packages/remix-to-react-router/__testfixtures__/vite.config.remix.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | 3 | import { vitePlugin as remix } from '@remix-run/dev'; 4 | import { vitePlugin } from '@remix-run/dev'; 5 | import { defineConfig } from 'vite'; 6 | import tsconfigPaths from 'vite-tsconfig-paths'; 7 | 8 | const myRemix = remix({}); 9 | 10 | export default defineConfig({ 11 | plugins: [remix(), vitePlugin(), myRemix, tsconfigPaths()], 12 | }); 13 | 14 | export default defineConfig({ 15 | plugins: [ 16 | remix({ 17 | future: { 18 | v3_fetcherPersist: true, 19 | v3_relativeSplatPath: true, 20 | v3_throwAbortReason: true, 21 | v3_singleFetch: true, 22 | v3_lazyRouteDiscovery: true, 23 | }, 24 | }), 25 | tsconfigPaths(), 26 | ], 27 | }); 28 | 29 | export default defineConfig({ 30 | plugins: [ 31 | remix({ 32 | future: { 33 | v3_fetcherPersist: true, 34 | v3_relativeSplatPath: true, 35 | v3_throwAbortReason: true, 36 | v3_singleFetch: true, 37 | v3_lazyRouteDiscovery: true, 38 | }, 39 | basename: '/test' 40 | }), 41 | tsconfigPaths(), 42 | ], 43 | }); 44 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/__testfixtures__/vite.config.rr7.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | 3 | import { reactRouter } from '@react-router/dev/vite'; 4 | import { reactRouter } from '@react-router/dev/vite'; 5 | import { defineConfig } from 'vite'; 6 | import tsconfigPaths from 'vite-tsconfig-paths'; 7 | 8 | const myRemix = reactRouter({}); 9 | 10 | export default defineConfig({ 11 | plugins: [reactRouter(), reactRouter(), myRemix, tsconfigPaths()], 12 | }); 13 | 14 | export default defineConfig({ 15 | plugins: [ 16 | reactRouter({ 17 | future: { 18 | v3_fetcherPersist: true, 19 | v3_relativeSplatPath: true, 20 | v3_throwAbortReason: true, 21 | v3_singleFetch: true, 22 | v3_lazyRouteDiscovery: true, 23 | }, 24 | }), 25 | tsconfigPaths(), 26 | ], 27 | }); 28 | 29 | export default defineConfig({ 30 | plugins: [ 31 | reactRouter({ 32 | future: { 33 | v3_fetcherPersist: true, 34 | v3_relativeSplatPath: true, 35 | v3_throwAbortReason: true, 36 | v3_singleFetch: true, 37 | v3_lazyRouteDiscovery: true, 38 | }, 39 | basename: '/test' 40 | }), 41 | tsconfigPaths(), 42 | ], 43 | }); 44 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "remix-imports-to-react-router", 3 | "license": "MIT", 4 | "devDependencies": { 5 | "@codemod.com/codemod-utils": "1.0.0", 6 | "@types/jscodeshift": "catalog:", 7 | "@types/node": "22.9.0", 8 | "esbuild": "^0.24.0", 9 | "jscodeshift": "catalog:", 10 | "typescript": "^5.6.3", 11 | "vitest": "^2.1.4" 12 | }, 13 | "main": "./dist/index.cjs", 14 | "scripts": { 15 | "test": "vitest run", 16 | "test:watch": "vitest watch", 17 | "build": "esbuild src/index.ts --outdir=dist --format=cjs --bundle --out-extension:.js=.cjs", 18 | "publish": "codemod login && codemod publish" 19 | }, 20 | "files": [ 21 | "README.md", 22 | ".codemodrc.json", 23 | "/dist/index.cjs" 24 | ], 25 | "type": "module", 26 | "dependencies": { 27 | "json5": "^2.2.3" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/src/config.ts: -------------------------------------------------------------------------------- 1 | import type { PackageChange } from './types.js'; 2 | 3 | export const PACKAGE_CHANGES: Record = { 4 | '^@remix-run/react$': { 5 | source: 'react-router', 6 | imports: { 7 | RemixBrowser: { 8 | name: 'HydratedRouter', 9 | source: 'react-router/dom', 10 | }, 11 | RemixServer: { name: 'ServerRouter' }, 12 | }, 13 | packageRemoved: true, 14 | }, 15 | '^@remix-run/testing$': { 16 | source: 'react-router', 17 | imports: { 18 | createRemixStub: { name: 'createRoutesStub' }, 19 | }, 20 | packageRemoved: true, 21 | }, 22 | '^@remix-run/server-runtime$': { 23 | source: 'react-router', 24 | packageRemoved: true, 25 | }, 26 | '^@remix-run/router$': { 27 | source: 'react-router', 28 | packageRemoved: true, 29 | }, 30 | '^@remix-run/dev$': { 31 | source: '@react-router/dev', 32 | imports: { 33 | vitePlugin: { 34 | name: 'reactRouter', 35 | source: '@react-router/dev/vite', 36 | removeAlias: true, 37 | }, 38 | }, 39 | }, 40 | '^@remix-run/route-config$': { 41 | source: '@react-router/dev/routes', 42 | packageRemoved: true, 43 | }, 44 | '^@remix-run/routes-option-adapter$': { 45 | source: '@react-router/remix-routes-option-adapter', 46 | }, 47 | '^@remix-run/cloudflare$': { 48 | source: 'react-router', 49 | imports: { 50 | createWorkersKVSessionStorage: { source: '@react-router/cloudflare' }, 51 | createPagesFunctionHandlerParams: { source: '@react-router/cloudflare' }, 52 | GetLoadContextFunction: { source: '@react-router/cloudflare' }, 53 | RequestHandler: { source: '@react-router/cloudflare' }, 54 | createPagesFunctionHandler: { source: '@react-router/cloudflare' }, 55 | createRequestHandler: { source: '@react-router/cloudflare' }, 56 | }, 57 | packageSource: '@react-router/cloudflare', 58 | }, 59 | '^@remix-run/node$': { 60 | source: 'react-router', 61 | imports: { 62 | createFileSessionStorage: { source: '@react-router/node' }, 63 | createReadableStreamFromReadable: { source: '@react-router/node' }, 64 | readableStreamToString: { source: '@react-router/node' }, 65 | writeAsyncIterableToWritable: { source: '@react-router/node' }, 66 | writeReadableStreamToWritable: { source: '@react-router/node' }, 67 | }, 68 | packageSource: '@react-router/node', 69 | }, 70 | '^@remix-run/architect$': { 71 | source: 'react-router', 72 | imports: { 73 | createFileSessionStorage: { source: '@react-router/architect' }, 74 | createArcTableSessionStorage: { source: '@react-router/architect' }, 75 | GetLoadContextFunction: { source: '@react-router/architect' }, 76 | RequestHandler: { source: '@react-router/architect' }, 77 | createRequestHandler: { source: '@react-router/architect' }, 78 | }, 79 | packageSource: '@react-router/architect', 80 | }, 81 | '^@remix-run/(?!eslint-config|v1-route-convention)(.*)$': { 82 | source: '@react-router/$1', 83 | }, 84 | '^react-router-dom$': { 85 | source: 'react-router', 86 | packageRemoved: true, 87 | }, 88 | }; 89 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/src/index.ts: -------------------------------------------------------------------------------- 1 | import type { API, FileInfo, JSCodeshift } from 'jscodeshift'; 2 | import detectLineTerminator from './utils/line-terminator.js'; 3 | import detectQuoteStyle from './utils/quote-style.js'; 4 | import { transformPackageJson } from './transformers/package-json.js'; 5 | import { transformImports } from './transformers/imports.js'; 6 | import { transformRemixNames } from './transformers/rename-remix.js'; 7 | import { transformRenameServerBuild } from './transformers/rename-server-build.js'; 8 | import { transformTsconfig } from './transformers/tsconfig.js'; 9 | import { transformFunctionParams } from './transformers/function-params.js'; 10 | 11 | export default function transformer(file: FileInfo, api: API) { 12 | // Automates the manual steps from the Remix to React Router upgrade guide 13 | // https://github.com/remix-run/react-router/blob/dev/docs/upgrading/remix.md 14 | 15 | // Step 2 - Update dependencies in package.json 16 | // Step 3 - Change scripts in package.json 17 | if (file.path.endsWith('package.json')) { 18 | return transformPackageJson(file); 19 | } 20 | 21 | // Step X - Update compilerOptions.types in tsconfig.json 22 | if ( 23 | file.path.endsWith('tsconfig.json') || 24 | file.path.endsWith('tsconfig.base.json') 25 | ) { 26 | return transformTsconfig(file); 27 | } 28 | 29 | const j: JSCodeshift = api.jscodeshift; 30 | const root = j(file.source); 31 | 32 | // Try to detect the original quoting and line terminator before changes are made 33 | const quote = detectQuoteStyle(j, root) || 'single'; 34 | const lineTerminator = detectLineTerminator(file.source); 35 | 36 | // Step 2 - Update dependencies in code 37 | // Step 4 - Rename plugin in vite.config 38 | // Step 6 - Rename components in entry files 39 | let dirtyFlag = transformImports(j, root); 40 | 41 | // Step X - Update vi.mock("@remix-run/react", () => ...) and import("@remix-run/react") 42 | dirtyFlag = transformFunctionParams(j, root) || dirtyFlag; 43 | 44 | // Step X - Rename virtual:remix/server-build in server files 45 | dirtyFlag = transformRenameServerBuild(j, root) || dirtyFlag; 46 | 47 | // Step X - Rename instances of remix to reactRouter in server entry files 48 | if (file.path.endsWith('entry.server.tsx')) { 49 | dirtyFlag = transformRemixNames(j, root) || dirtyFlag; 50 | } 51 | 52 | return dirtyFlag ? root.toSource({ quote, lineTerminator }) : undefined; 53 | } 54 | 55 | export const parser = 'tsx'; 56 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/src/transformers/function-params.ts: -------------------------------------------------------------------------------- 1 | import type { 2 | JSCodeshift, 3 | Collection, 4 | ASTPath, 5 | CallExpression, 6 | } from 'jscodeshift'; 7 | import { PACKAGE_CHANGES } from '../config.js'; 8 | 9 | export function transformFunctionParams( 10 | j: JSCodeshift, 11 | root: Collection 12 | ): boolean { 13 | let dirtyFlag = false; 14 | 15 | // Helper function to replace package names 16 | const replacePackageName = (name: string): string => { 17 | for (const [pattern, { source, packageSource }] of Object.entries( 18 | PACKAGE_CHANGES 19 | )) { 20 | const regex = new RegExp(pattern); 21 | if (regex.test(name)) { 22 | dirtyFlag = true; 23 | return name.replace(regex, packageSource || source); 24 | } 25 | } 26 | return name; 27 | }; 28 | 29 | // Transform the first string arg of specified functions 30 | const transformFunction = (path: ASTPath) => { 31 | const arg = path.node.arguments[0]; 32 | if (arg && arg.type === 'StringLiteral') { 33 | arg.value = replacePackageName(arg.value); 34 | } 35 | }; 36 | 37 | // Transform vi.mock calls 38 | root 39 | .find(j.CallExpression, { 40 | callee: { object: { name: 'vi' }, property: { name: 'mock' } }, 41 | }) 42 | .forEach(transformFunction); 43 | 44 | // Transform dynamic imports 45 | root 46 | .find(j.CallExpression, { callee: { type: 'Import' } }) 47 | .forEach(transformFunction); 48 | 49 | return dirtyFlag; 50 | } 51 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/src/transformers/imports.ts: -------------------------------------------------------------------------------- 1 | import type { Collection, ImportDeclaration, JSCodeshift } from 'jscodeshift'; 2 | import { PACKAGE_CHANGES } from '../config.js'; 3 | 4 | export function transformImports( 5 | j: JSCodeshift, 6 | root: Collection 7 | ): boolean { 8 | let dirtyFlag = false; 9 | 10 | root.find(j.ImportDeclaration).forEach((path) => { 11 | const importDeclaration = path.node; 12 | const importPackage = importDeclaration.source.value; 13 | 14 | // Check if the import package matches any pattern in the PACKAGE_CHANGES 15 | for (const [pattern, { source, imports }] of Object.entries( 16 | PACKAGE_CHANGES 17 | )) { 18 | const regex = new RegExp(pattern); 19 | if (typeof importPackage === 'string' && regex.test(importPackage)) { 20 | const newpackage = importPackage.replace(regex, source); 21 | const newImports: Record = {}; 22 | 23 | // Iterate over each specifier in the import declaration 24 | if (importDeclaration.specifiers) { 25 | importDeclaration.specifiers.forEach((specifier) => { 26 | if ( 27 | imports && 28 | j.ImportSpecifier.check(specifier) && 29 | imports[specifier.imported.name] 30 | ) { 31 | const oldName = specifier.imported.name; 32 | const newImport = imports[oldName]; 33 | const newName = newImport?.name || oldName; 34 | const newSource = newImport?.source || newpackage; 35 | 36 | // Create a new import declaration if it doesn't exist 37 | if (!newImports[newSource]) { 38 | newImports[newSource] = j.importDeclaration( 39 | [], 40 | j.stringLiteral(newSource) 41 | ); 42 | } 43 | 44 | // Add the specifier to the new import declaration 45 | const newSpecifier = j.importSpecifier( 46 | j.identifier(newName), 47 | !newImport?.removeAlias && 48 | specifier.local && 49 | specifier.local.name && 50 | specifier.local?.name !== specifier.imported.name 51 | ? j.identifier(specifier.local.name) 52 | : null 53 | ); 54 | 55 | newImports[newSource].specifiers?.push(newSpecifier); 56 | 57 | // Update all occurrences of the old specifier in the code 58 | // keeping any existing aliases unless explicitly removed 59 | if (newName && oldName !== newName) { 60 | const hasAlias = 61 | specifier.local?.name && 62 | specifier.local?.name !== specifier.imported.name; 63 | const aliasedOldName = hasAlias 64 | ? specifier.local?.name 65 | : oldName; 66 | const updatedName = 67 | (hasAlias && 68 | !newImport?.removeAlias && 69 | specifier.local?.name) || 70 | newName; 71 | root 72 | .find(j.Identifier, { name: aliasedOldName }) 73 | .forEach((idPath) => { 74 | idPath.node.name = updatedName; 75 | }); 76 | } 77 | 78 | dirtyFlag = true; 79 | } else { 80 | // Create a new import declaration if it doesn't exist 81 | if (!newImports[newpackage]) { 82 | newImports[newpackage] = j.importDeclaration( 83 | [], 84 | j.stringLiteral(newpackage) 85 | ); 86 | } 87 | 88 | // Add the specifier to the new import declaration 89 | newImports[newpackage].specifiers?.push(specifier); 90 | newImports[newpackage].importKind = importDeclaration.importKind; 91 | 92 | dirtyFlag = true; 93 | } 94 | }); 95 | } 96 | 97 | // Preserve comments from the original import declaration 98 | const comments = importDeclaration.comments; 99 | 100 | // Replace the original import declaration with the new ones 101 | const newImportDeclarations = Object.values(newImports); 102 | if ( 103 | comments && 104 | newImportDeclarations.length > 0 && 105 | newImportDeclarations[0] 106 | ) { 107 | newImportDeclarations[0].comments = comments; 108 | } 109 | 110 | path.replace(...newImportDeclarations); 111 | 112 | break; 113 | } 114 | } 115 | }); 116 | 117 | return dirtyFlag; 118 | } 119 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/src/transformers/package-json.ts: -------------------------------------------------------------------------------- 1 | import type { FileInfo } from 'jscodeshift'; 2 | import { PACKAGE_CHANGES } from '../config.js'; 3 | import { updateDependencies, sortDependencies } from '../utils/dependencies.js'; 4 | 5 | const SCRIPT_CHANGES: Record = { 6 | dev: 'react-router dev', 7 | build: 'react-router build', 8 | start: 'react-router-serve ./build/server/index.js', 9 | typecheck: 'react-router typegen && tsc', 10 | }; 11 | 12 | const OLD_SCRIPTS: Record = { 13 | dev: 'remix vite:dev', 14 | build: 'remix vite:build', 15 | start: 'remix-serve ./build/server/index.js', 16 | typecheck: 'tsc', 17 | }; 18 | 19 | export function transformPackageJson(file: FileInfo): string | undefined { 20 | let dirtyFlag = false; 21 | 22 | const packageJson = JSON.parse(file.source); 23 | 24 | // Step 2 - Update dependencies in package.json 25 | for (const [pattern, change] of Object.entries(PACKAGE_CHANGES)) { 26 | const regex = new RegExp(pattern); 27 | 28 | const dependencies = packageJson.dependencies; 29 | dirtyFlag = updateDependencies(dependencies, regex, change) || dirtyFlag; 30 | 31 | const devDependencies = packageJson.devDependencies; 32 | dirtyFlag = updateDependencies(devDependencies, regex, change) || dirtyFlag; 33 | } 34 | 35 | // Add "react-router" dependency if it doesn't exist and we've updated a remix dependency 36 | if (dirtyFlag && !packageJson.dependencies['react-router']) { 37 | packageJson.dependencies['react-router'] = '^7.0.0'; 38 | dirtyFlag = true; 39 | } 40 | 41 | // Step 3 - Change scripts in package.json 42 | if (packageJson.scripts) { 43 | for (const [script, newCommand] of Object.entries(SCRIPT_CHANGES)) { 44 | if (packageJson.scripts[script] === OLD_SCRIPTS[script]) { 45 | // When updating any typecheck script, make sure the package.json also has an 46 | // updated react-router "build" script so we don't modify non-remix package.json files. 47 | if ( 48 | script === 'typecheck' && 49 | packageJson.scripts['build'] !== SCRIPT_CHANGES['build'] 50 | ) { 51 | continue; 52 | } 53 | packageJson.scripts[script] = newCommand; 54 | dirtyFlag = true; 55 | } 56 | } 57 | } 58 | 59 | // Before returning the updated package.json, sort the dependencies and devDependencies. 60 | packageJson.dependencies = sortDependencies(packageJson.dependencies); 61 | packageJson.devDependencies = sortDependencies(packageJson.devDependencies); 62 | 63 | return dirtyFlag ? JSON.stringify(packageJson, null, 2) : undefined; 64 | } 65 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/src/transformers/rename-remix.ts: -------------------------------------------------------------------------------- 1 | import type { Collection, JSCodeshift } from 'jscodeshift'; 2 | 3 | export function transformRemixNames(j: JSCodeshift, root: Collection) { 4 | let dirtyFlag = false; 5 | root.find(j.Identifier, { name: 'remixContext' }).forEach((path) => { 6 | path.node.name = 'reactRouterContext'; 7 | dirtyFlag = true; 8 | }); 9 | 10 | return dirtyFlag; 11 | } 12 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/src/transformers/rename-server-build.ts: -------------------------------------------------------------------------------- 1 | import type { Collection, JSCodeshift } from 'jscodeshift'; 2 | 3 | export function transformRenameServerBuild( 4 | j: JSCodeshift, 5 | root: Collection 6 | ) { 7 | let dirtyFlag = false; 8 | 9 | // Change the string "virtual:remix/server-build" to "virtual:react-router/server-build" 10 | root 11 | .find(j.StringLiteral, { value: 'virtual:remix/server-build' }) 12 | .forEach((path) => { 13 | path.node.value = 'virtual:react-router/server-build'; 14 | dirtyFlag = true; 15 | }); 16 | 17 | return dirtyFlag; 18 | } 19 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/src/transformers/tsconfig.ts: -------------------------------------------------------------------------------- 1 | import type { FileInfo } from 'jscodeshift'; 2 | import { PACKAGE_CHANGES } from '../config.js'; 3 | 4 | export function transformTsconfig(file: FileInfo): string | undefined { 5 | let dirtyFlag = false; 6 | 7 | const tsconfigJson = JSON.parse(file.source); 8 | 9 | // Convert all compilerOptions.types string array values in tsconfig.json to new package names 10 | if (tsconfigJson.compilerOptions?.types) { 11 | tsconfigJson.compilerOptions.types = tsconfigJson.compilerOptions.types.map( 12 | (type: string) => { 13 | for (const [pattern, { source, packageSource }] of Object.entries( 14 | PACKAGE_CHANGES 15 | )) { 16 | const regex = new RegExp(pattern); 17 | if (regex.test(type)) { 18 | dirtyFlag = true; 19 | return type.replace(regex, packageSource || source); 20 | } 21 | } 22 | return type; 23 | } 24 | ); 25 | } 26 | 27 | return dirtyFlag ? JSON.stringify(tsconfigJson, null, 2) : undefined; 28 | } 29 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/src/types.ts: -------------------------------------------------------------------------------- 1 | export type PackageChange = { 2 | source: string; 3 | imports?: Record< 4 | string, 5 | { name?: string; source?: string; removeAlias?: true } 6 | >; 7 | packageSource?: string; 8 | packageRemoved?: boolean; 9 | }; 10 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/src/utils/dependencies.ts: -------------------------------------------------------------------------------- 1 | import { PackageChange } from '../types.js'; 2 | 3 | export function sortDependencies( 4 | dependencies: Record 5 | ): Record { 6 | if (!dependencies) return dependencies; 7 | return Object.fromEntries(Object.entries(dependencies || {}).sort()); 8 | } 9 | 10 | export function updateDependencies( 11 | dependencies: Record, 12 | regex: RegExp, 13 | packageChange: PackageChange 14 | ): boolean { 15 | let dirtyFlag = false; 16 | if (!dependencies) return dirtyFlag; 17 | for (const [oldPackage, version] of Object.entries(dependencies)) { 18 | if (regex.test(oldPackage)) { 19 | if (!packageChange.packageRemoved) { 20 | const newPackageName = oldPackage.replace( 21 | regex, 22 | packageChange.packageSource || packageChange.source 23 | ); 24 | // Set the version to ^7.0.0 if the current version is semver compatible 25 | if (/^\^?\d+\.\d+\.\d+/.test(version)) { 26 | dependencies[newPackageName] = '^7.0.0'; 27 | } else { 28 | dependencies[newPackageName] = version; 29 | } 30 | } 31 | 32 | delete dependencies[oldPackage]; 33 | dirtyFlag = true; 34 | } 35 | } 36 | return dirtyFlag; 37 | } 38 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/src/utils/line-terminator.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * By default, Recast uses the line terminator of the OS the code runs on. 3 | * This is often not desired, so we instead try to detect it from the input. 4 | * If there is at least one Windows-style linebreak (CRLF) in the input, use that. 5 | * In all other cases, use Unix-style (LF). 6 | * @return '\n' or '\r\n' 7 | */ 8 | export default function detectLineTerminator(source: string) { 9 | return source && source.includes('\r\n') ? '\r\n' : '\n'; 10 | } 11 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/src/utils/quote-style.ts: -------------------------------------------------------------------------------- 1 | import type { Collection, JSCodeshift } from 'jscodeshift'; 2 | 3 | /** 4 | * As Recast is not preserving original quoting, we try to detect it. 5 | * See https://github.com/benjamn/recast/issues/171 6 | * and https://github.com/facebook/jscodeshift/issues/143 7 | * @return 'double', 'single' or null 8 | */ 9 | export default function detectQuoteStyle(j: JSCodeshift, ast: Collection) { 10 | let doubles = 0; 11 | let singles = 0; 12 | 13 | ast.find(j.ImportDeclaration).forEach((p) => { 14 | // The raw value is from the original babel source 15 | // @ts-expect-error 16 | const quote = p.value.source?.extra?.raw[0]; 17 | if (quote === '"') { 18 | doubles += 1; 19 | } 20 | if (quote === "'") { 21 | singles += 1; 22 | } 23 | }); 24 | 25 | if (doubles === singles) { 26 | return null; 27 | } 28 | return doubles > singles ? 'double' : 'single'; 29 | } 30 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/test/transformers.ts: -------------------------------------------------------------------------------- 1 | import { describe, it } from 'vitest'; 2 | import jscodeshift, { type API } from 'jscodeshift'; 3 | import transform from '../src/index.js'; 4 | import assert from 'node:assert'; 5 | import { readFile } from 'node:fs/promises'; 6 | import { join } from 'node:path'; 7 | 8 | function buildApi(parser: string | undefined): API { 9 | return { 10 | j: parser ? jscodeshift.withParser(parser) : jscodeshift, 11 | jscodeshift: parser ? jscodeshift.withParser(parser) : jscodeshift, 12 | stats: () => { 13 | console.error( 14 | 'The stats function was called, which is not supported on purpose' 15 | ); 16 | }, 17 | report: () => { 18 | console.error( 19 | 'The report function was called, which is not supported on purpose' 20 | ); 21 | }, 22 | }; 23 | } 24 | 25 | async function readTestFile(filePath: string): Promise { 26 | return await readFile( 27 | join(__dirname, '..', '__testfixtures__', filePath), 28 | 'utf-8' 29 | ); 30 | } 31 | 32 | async function testTransformation( 33 | inputFile: string, 34 | outputFile: string | undefined, 35 | filePath: string = 'test.tsx' 36 | ) { 37 | const INPUT = await readTestFile(inputFile); 38 | const OUTPUT = outputFile ? await readTestFile(outputFile) : undefined; 39 | 40 | const actualOutput = transform( 41 | { 42 | path: filePath, 43 | source: INPUT, 44 | }, 45 | buildApi('tsx') 46 | ); 47 | 48 | assert.deepEqual(actualOutput, OUTPUT); 49 | } 50 | 51 | describe('remix-to-react-router', () => { 52 | it('migrates package.json dependencies and scripts', async () => { 53 | await testTransformation( 54 | 'package.remix.json', 55 | 'package.rr7.json', 56 | 'package.json' 57 | ); 58 | }); 59 | 60 | it('migrates entry.client.tsx', async () => { 61 | await testTransformation( 62 | 'entry.client.remix.tsx', 63 | 'entry.client.rr7.tsx', 64 | 'entry.client.tsx' 65 | ); 66 | }); 67 | 68 | it('migrates entry.server.tsx', async () => { 69 | await testTransformation( 70 | 'entry.server.remix.tsx', 71 | 'entry.server.rr7.tsx', 72 | 'entry.server.tsx' 73 | ); 74 | }); 75 | 76 | it('migrates @remix-run/testing', async () => { 77 | await testTransformation( 78 | 'testing.remix.tsx', 79 | 'testing.rr7.tsx', 80 | '$username.test.tsx' 81 | ); 82 | }); 83 | 84 | it('migrates vite.config.ts', async () => { 85 | await testTransformation( 86 | 'vite.config.remix.ts', 87 | 'vite.config.rr7.ts', 88 | 'vite.config.ts' 89 | ); 90 | }); 91 | 92 | it('migrates changed imports', async () => { 93 | await testTransformation('imports.remix.tsx', 'imports.rr7.tsx'); 94 | }); 95 | 96 | it('migrates virtual:remix/server-build in server', async () => { 97 | await testTransformation('server.remix.ts', 'server.rr7.ts'); 98 | }); 99 | 100 | it('only modifies package.json that had remix packages', async () => { 101 | await testTransformation( 102 | 'package.nochange.json', 103 | undefined, 104 | 'package.json' 105 | ); 106 | }); 107 | 108 | it('updates package names in tsconfig types', async () => { 109 | await testTransformation( 110 | 'tsconfig.remix.json', 111 | 'tsconfig.rr7.json', 112 | 'tsconfig.json' 113 | ); 114 | }); 115 | 116 | it("doesn't modify files without remix", async () => { 117 | await testTransformation('nochange.tsx', undefined); 118 | }); 119 | }); 120 | -------------------------------------------------------------------------------- /packages/remix-to-react-router/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "NodeNext", 4 | "target": "ESNext", 5 | "moduleResolution": "NodeNext", 6 | "lib": [ 7 | "ESNext", 8 | "DOM" 9 | ], 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "resolveJsonModule": true, 13 | "allowSyntheticDefaultImports": true, 14 | "isolatedModules": true, 15 | "jsx": "react-jsx", 16 | "useDefineForClassFields": true, 17 | "noFallthroughCasesInSwitch": true, 18 | "noUnusedLocals": false, 19 | "noUnusedParameters": false, 20 | "preserveWatchOutput": true, 21 | "strict": true, 22 | "strictNullChecks": true, 23 | "incremental": true, 24 | "noUncheckedIndexedAccess": true, 25 | "noPropertyAccessFromIndexSignature": false, 26 | "allowJs": true, 27 | }, 28 | "include": [ 29 | "./src/**/*.ts", 30 | "./src/**/*.js", 31 | "./test/**/*.ts", 32 | "./test/**/*.js" 33 | ], 34 | "exclude": ["node_modules", "./dist/**/*"], 35 | "ts-node": { 36 | "transpileOnly": true 37 | } 38 | } -------------------------------------------------------------------------------- /packages/remix-to-react-router/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { configDefaults, defineConfig } from 'vitest/config'; 2 | 3 | export default defineConfig({ 4 | test: { 5 | include: [...configDefaults.include, '**/test/*.ts'], 6 | }, 7 | }); -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | catalogs: 8 | default: 9 | '@types/jscodeshift': 10 | specifier: ^0.11.10 11 | version: 0.11.11 12 | jscodeshift: 13 | specifier: ^17.1.1 14 | version: 17.1.1 15 | 16 | importers: 17 | 18 | .: 19 | devDependencies: 20 | '@types/jscodeshift': 21 | specifier: ^0.11.10 22 | version: 0.11.11 23 | '@vitest/coverage-v8': 24 | specifier: ^2.1.4 25 | version: 2.1.4(vitest@2.1.4(@types/node@22.9.0)) 26 | codemod: 27 | specifier: ^0.14.1 28 | version: 0.14.1 29 | jscodeshift: 30 | specifier: ^0.15.1 31 | version: 0.15.2 32 | ts-node: 33 | specifier: ^10.9.1 34 | version: 10.9.2(@types/node@22.9.0)(typescript@5.6.3) 35 | typescript: 36 | specifier: ^5.6.3 37 | version: 5.6.3 38 | vitest: 39 | specifier: ^2.1.4 40 | version: 2.1.4(@types/node@22.9.0) 41 | 42 | packages/remix-to-react-router: 43 | dependencies: 44 | json5: 45 | specifier: ^2.2.3 46 | version: 2.2.3 47 | devDependencies: 48 | '@codemod.com/codemod-utils': 49 | specifier: 1.0.0 50 | version: 1.0.0 51 | '@types/jscodeshift': 52 | specifier: 'catalog:' 53 | version: 0.11.11 54 | '@types/node': 55 | specifier: 22.9.0 56 | version: 22.9.0 57 | esbuild: 58 | specifier: ^0.24.0 59 | version: 0.24.0 60 | jscodeshift: 61 | specifier: 'catalog:' 62 | version: 17.1.1 63 | typescript: 64 | specifier: ^5.6.3 65 | version: 5.6.3 66 | vitest: 67 | specifier: ^2.1.4 68 | version: 2.1.4(@types/node@22.9.0) 69 | 70 | packages: 71 | 72 | '@ampproject/remapping@2.3.0': 73 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 74 | engines: {node: '>=6.0.0'} 75 | 76 | '@ast-grep/cli-darwin-arm64@0.25.7': 77 | resolution: {integrity: sha512-dkj8hy32mWuQwCJUEpnKwTS8tLE+e7dhvu6is+v5Q6AumOVlcL6PJWQsyaA4vedDm6XOGK9+WnyFpCnV3b5ouA==} 78 | engines: {node: '>= 10'} 79 | cpu: [arm64] 80 | os: [darwin] 81 | 82 | '@ast-grep/cli-darwin-x64@0.25.7': 83 | resolution: {integrity: sha512-FBdv7GH3llH5LI0S2yeqgQM5QEUHeoYMhw1pv+C439UeL5BBFFjI+LYVALciwsYzuq/DQDTnT2cM0JhYGajDLQ==} 84 | engines: {node: '>= 10'} 85 | cpu: [x64] 86 | os: [darwin] 87 | 88 | '@ast-grep/cli-linux-arm64-gnu@0.25.7': 89 | resolution: {integrity: sha512-lsE+cSe4rFO8rvLhMM7PM3T83LlmV60H9dOH+1hq8thkWhLCL6vAJijEVWgAQDDvvZf3xnNVgG2GG4jOMfTuTQ==} 90 | engines: {node: '>= 10'} 91 | cpu: [arm64] 92 | os: [linux] 93 | 94 | '@ast-grep/cli-linux-x64-gnu@0.25.7': 95 | resolution: {integrity: sha512-uuF5GXgeUZtBrftJJYuQU7PvDT7Q9fJkKKwpIscEfQqLndri1tdYzzT9jKj2taWFlhiCVqLaDEHsdfTeWaVjZQ==} 96 | engines: {node: '>= 10'} 97 | cpu: [x64] 98 | os: [linux] 99 | 100 | '@ast-grep/cli-win32-arm64-msvc@0.25.7': 101 | resolution: {integrity: sha512-GSWRjOnWybzNP5rnvPb6lQ7lSPoEIl64gk4uHE1h+a2nnFhT9REWTKFcmNB2aG8VmKEz1gu0pxpg9HmBe2OUBA==} 102 | engines: {node: '>= 10'} 103 | cpu: [arm64] 104 | os: [win32] 105 | 106 | '@ast-grep/cli-win32-ia32-msvc@0.25.7': 107 | resolution: {integrity: sha512-5p9PWbTeXaivQYixB+JkkpFKgY7G1Tm6R46Dhq6cHvKksiQ6lWlTOOmhl0QARtY7y3XP0MWuvjDEWCYrvYtO4A==} 108 | engines: {node: '>= 10'} 109 | cpu: [ia32] 110 | os: [win32] 111 | 112 | '@ast-grep/cli-win32-x64-msvc@0.25.7': 113 | resolution: {integrity: sha512-WjsRuyKTCeGWpMhvobzU/6HaWbseENPl5mNMZIKs8gsCpkUyTUfvV8/A2W29oHCgbDWRtixYppWtd87Qjpm6cg==} 114 | engines: {node: '>= 10'} 115 | cpu: [x64] 116 | os: [win32] 117 | 118 | '@ast-grep/cli@0.25.7': 119 | resolution: {integrity: sha512-vklcPRFHPHkwHq05nb2Fuaj4BYNWxhr8GIdB6la090jWob9FdbM/Jz86vlQp2tRELb2rKzuHeksG8qDrbX4REg==} 120 | engines: {node: '>= 12.0.0'} 121 | hasBin: true 122 | 123 | '@ast-grep/napi-darwin-arm64@0.25.7': 124 | resolution: {integrity: sha512-qqI1JvB6ULgOUOVE3YviQNQ6KAYOnkiE8W5fNwVJGUgMkUuM8tUm1Nal3vfKCI7dnYgpcNlKxdTWGlbt7aHKNg==} 125 | engines: {node: '>= 10'} 126 | cpu: [arm64] 127 | os: [darwin] 128 | 129 | '@ast-grep/napi-darwin-x64@0.25.7': 130 | resolution: {integrity: sha512-gq1Cf7US322ZJYPrVnAnn6eBLS6xi5catb5t99Wu6Rbm67XadEc81gtPTbPeNIu8FGgPjvKUc010rts2ZZbJeA==} 131 | engines: {node: '>= 10'} 132 | cpu: [x64] 133 | os: [darwin] 134 | 135 | '@ast-grep/napi-linux-arm64-gnu@0.25.7': 136 | resolution: {integrity: sha512-q+BzEC7wB7pkK+pQKbn4TVJThrEtvxjObz0okscPtxTNYvSJGv9jr3Nde5SYjdkfk8Ab4NgDMshVjKWVz2TSbQ==} 137 | engines: {node: '>= 10'} 138 | cpu: [arm64] 139 | os: [linux] 140 | 141 | '@ast-grep/napi-linux-arm64-musl@0.25.7': 142 | resolution: {integrity: sha512-SEqZ6y0UhzmvZS938jIgR04kgHAW70hJ8yF4x9AkcqEhbeyqgElxIE7ve50ukDzs70fAKccdV8zYmebYN/7iPg==} 143 | engines: {node: '>= 10'} 144 | cpu: [arm64] 145 | os: [linux] 146 | 147 | '@ast-grep/napi-linux-x64-gnu@0.25.7': 148 | resolution: {integrity: sha512-8YuE/zTywTBb/iTm601JXTdWV2Redy9L9ab27aRD0hwX8FLmKUy8gK0fSo3xx+FyvSET49xkoR9tYdNaG2Wrkw==} 149 | engines: {node: '>= 10'} 150 | cpu: [x64] 151 | os: [linux] 152 | 153 | '@ast-grep/napi-linux-x64-musl@0.25.7': 154 | resolution: {integrity: sha512-sT3eslR50IU6lHfqvq/c7vpxksJiB3h1NjEy1LpG+CYPuoLsQaB8j9OQlX8TqgVlDty/d/13cSls1Y3n/pm9xw==} 155 | engines: {node: '>= 10'} 156 | cpu: [x64] 157 | os: [linux] 158 | 159 | '@ast-grep/napi-win32-arm64-msvc@0.25.7': 160 | resolution: {integrity: sha512-pDi9vyXzUbpiRwFTif6+R7ZIIVB1ZKcRUJLKSIPyYb39DcSX7aOuxQcSZderWnBrwPGxZKzdgztdQ16TuAz2IQ==} 161 | engines: {node: '>= 10'} 162 | cpu: [arm64] 163 | os: [win32] 164 | 165 | '@ast-grep/napi-win32-ia32-msvc@0.25.7': 166 | resolution: {integrity: sha512-WFSNDMI5L9N9dK5zFQ6N900nhraOSYtKns/2p/EKZIKPBDXJSzzhT/jBakCSDix1GUs8K0XgkDoq2rXmuiBqXA==} 167 | engines: {node: '>= 10'} 168 | cpu: [ia32] 169 | os: [win32] 170 | 171 | '@ast-grep/napi-win32-x64-msvc@0.25.7': 172 | resolution: {integrity: sha512-HlsoVwQ9XrgNZ0JAmXgV5t8Ltx9tGyWZNS2UMY/2cvNU/SG9EpJLm1Bu9Mlk5seiJLbl28QTTbhZdfPKBzGTVQ==} 173 | engines: {node: '>= 10'} 174 | cpu: [x64] 175 | os: [win32] 176 | 177 | '@ast-grep/napi@0.25.7': 178 | resolution: {integrity: sha512-kDw/JNyOLttVbm2hl+55C9lXuUcuIFt31LQIpSptUkyTgI+2Cdqdeah2bNPe4/GQM2ysDjBDS4y1+9iQxMdJiw==} 179 | engines: {node: '>= 10'} 180 | 181 | '@babel/code-frame@7.26.2': 182 | resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} 183 | engines: {node: '>=6.9.0'} 184 | 185 | '@babel/compat-data@7.26.2': 186 | resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} 187 | engines: {node: '>=6.9.0'} 188 | 189 | '@babel/core@7.26.0': 190 | resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} 191 | engines: {node: '>=6.9.0'} 192 | 193 | '@babel/generator@7.26.2': 194 | resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} 195 | engines: {node: '>=6.9.0'} 196 | 197 | '@babel/helper-annotate-as-pure@7.25.9': 198 | resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} 199 | engines: {node: '>=6.9.0'} 200 | 201 | '@babel/helper-compilation-targets@7.25.9': 202 | resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} 203 | engines: {node: '>=6.9.0'} 204 | 205 | '@babel/helper-create-class-features-plugin@7.25.9': 206 | resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} 207 | engines: {node: '>=6.9.0'} 208 | peerDependencies: 209 | '@babel/core': ^7.0.0 210 | 211 | '@babel/helper-member-expression-to-functions@7.25.9': 212 | resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} 213 | engines: {node: '>=6.9.0'} 214 | 215 | '@babel/helper-module-imports@7.25.9': 216 | resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} 217 | engines: {node: '>=6.9.0'} 218 | 219 | '@babel/helper-module-transforms@7.26.0': 220 | resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} 221 | engines: {node: '>=6.9.0'} 222 | peerDependencies: 223 | '@babel/core': ^7.0.0 224 | 225 | '@babel/helper-optimise-call-expression@7.25.9': 226 | resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} 227 | engines: {node: '>=6.9.0'} 228 | 229 | '@babel/helper-plugin-utils@7.25.9': 230 | resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} 231 | engines: {node: '>=6.9.0'} 232 | 233 | '@babel/helper-replace-supers@7.25.9': 234 | resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} 235 | engines: {node: '>=6.9.0'} 236 | peerDependencies: 237 | '@babel/core': ^7.0.0 238 | 239 | '@babel/helper-simple-access@7.25.9': 240 | resolution: {integrity: sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==} 241 | engines: {node: '>=6.9.0'} 242 | 243 | '@babel/helper-skip-transparent-expression-wrappers@7.25.9': 244 | resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} 245 | engines: {node: '>=6.9.0'} 246 | 247 | '@babel/helper-string-parser@7.25.9': 248 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 249 | engines: {node: '>=6.9.0'} 250 | 251 | '@babel/helper-validator-identifier@7.25.9': 252 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 253 | engines: {node: '>=6.9.0'} 254 | 255 | '@babel/helper-validator-option@7.25.9': 256 | resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} 257 | engines: {node: '>=6.9.0'} 258 | 259 | '@babel/helpers@7.26.0': 260 | resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} 261 | engines: {node: '>=6.9.0'} 262 | 263 | '@babel/parser@7.26.2': 264 | resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} 265 | engines: {node: '>=6.0.0'} 266 | hasBin: true 267 | 268 | '@babel/plugin-syntax-flow@7.26.0': 269 | resolution: {integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==} 270 | engines: {node: '>=6.9.0'} 271 | peerDependencies: 272 | '@babel/core': ^7.0.0-0 273 | 274 | '@babel/plugin-syntax-jsx@7.25.9': 275 | resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} 276 | engines: {node: '>=6.9.0'} 277 | peerDependencies: 278 | '@babel/core': ^7.0.0-0 279 | 280 | '@babel/plugin-syntax-typescript@7.25.9': 281 | resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} 282 | engines: {node: '>=6.9.0'} 283 | peerDependencies: 284 | '@babel/core': ^7.0.0-0 285 | 286 | '@babel/plugin-transform-class-properties@7.25.9': 287 | resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} 288 | engines: {node: '>=6.9.0'} 289 | peerDependencies: 290 | '@babel/core': ^7.0.0-0 291 | 292 | '@babel/plugin-transform-flow-strip-types@7.25.9': 293 | resolution: {integrity: sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==} 294 | engines: {node: '>=6.9.0'} 295 | peerDependencies: 296 | '@babel/core': ^7.0.0-0 297 | 298 | '@babel/plugin-transform-modules-commonjs@7.25.9': 299 | resolution: {integrity: sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==} 300 | engines: {node: '>=6.9.0'} 301 | peerDependencies: 302 | '@babel/core': ^7.0.0-0 303 | 304 | '@babel/plugin-transform-nullish-coalescing-operator@7.25.9': 305 | resolution: {integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==} 306 | engines: {node: '>=6.9.0'} 307 | peerDependencies: 308 | '@babel/core': ^7.0.0-0 309 | 310 | '@babel/plugin-transform-optional-chaining@7.25.9': 311 | resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} 312 | engines: {node: '>=6.9.0'} 313 | peerDependencies: 314 | '@babel/core': ^7.0.0-0 315 | 316 | '@babel/plugin-transform-private-methods@7.25.9': 317 | resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} 318 | engines: {node: '>=6.9.0'} 319 | peerDependencies: 320 | '@babel/core': ^7.0.0-0 321 | 322 | '@babel/plugin-transform-typescript@7.25.9': 323 | resolution: {integrity: sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==} 324 | engines: {node: '>=6.9.0'} 325 | peerDependencies: 326 | '@babel/core': ^7.0.0-0 327 | 328 | '@babel/preset-flow@7.25.9': 329 | resolution: {integrity: sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ==} 330 | engines: {node: '>=6.9.0'} 331 | peerDependencies: 332 | '@babel/core': ^7.0.0-0 333 | 334 | '@babel/preset-typescript@7.26.0': 335 | resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} 336 | engines: {node: '>=6.9.0'} 337 | peerDependencies: 338 | '@babel/core': ^7.0.0-0 339 | 340 | '@babel/register@7.25.9': 341 | resolution: {integrity: sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA==} 342 | engines: {node: '>=6.9.0'} 343 | peerDependencies: 344 | '@babel/core': ^7.0.0-0 345 | 346 | '@babel/template@7.25.9': 347 | resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} 348 | engines: {node: '>=6.9.0'} 349 | 350 | '@babel/traverse@7.25.9': 351 | resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} 352 | engines: {node: '>=6.9.0'} 353 | 354 | '@babel/types@7.26.0': 355 | resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} 356 | engines: {node: '>=6.9.0'} 357 | 358 | '@bcoe/v8-coverage@0.2.3': 359 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 360 | 361 | '@codemod.com/codemod-utils@1.0.0': 362 | resolution: {integrity: sha512-Uo7oA2kgpfRJS5LFL9ARdsaeenRyEsRHINoTcIsHeBFBce+imLhrkYlEhXcrNYuTLVXmlGx2Mdn6NeUio4wpfw==} 363 | 364 | '@codemod.com/workflow@0.0.31': 365 | resolution: {integrity: sha512-8xmbxwjxr6d0ZUm3RS/eQqud2mUGXwQgf2v+YEjwQQVwOse6yShgoFljrg7ujvJlhzymivYloL0T0VSS9YubNw==} 366 | 367 | '@cspotcode/source-map-support@0.8.1': 368 | resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 369 | engines: {node: '>=12'} 370 | 371 | '@esbuild/aix-ppc64@0.21.5': 372 | resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} 373 | engines: {node: '>=12'} 374 | cpu: [ppc64] 375 | os: [aix] 376 | 377 | '@esbuild/aix-ppc64@0.23.1': 378 | resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} 379 | engines: {node: '>=18'} 380 | cpu: [ppc64] 381 | os: [aix] 382 | 383 | '@esbuild/aix-ppc64@0.24.0': 384 | resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} 385 | engines: {node: '>=18'} 386 | cpu: [ppc64] 387 | os: [aix] 388 | 389 | '@esbuild/android-arm64@0.21.5': 390 | resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 391 | engines: {node: '>=12'} 392 | cpu: [arm64] 393 | os: [android] 394 | 395 | '@esbuild/android-arm64@0.23.1': 396 | resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} 397 | engines: {node: '>=18'} 398 | cpu: [arm64] 399 | os: [android] 400 | 401 | '@esbuild/android-arm64@0.24.0': 402 | resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} 403 | engines: {node: '>=18'} 404 | cpu: [arm64] 405 | os: [android] 406 | 407 | '@esbuild/android-arm@0.21.5': 408 | resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} 409 | engines: {node: '>=12'} 410 | cpu: [arm] 411 | os: [android] 412 | 413 | '@esbuild/android-arm@0.23.1': 414 | resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} 415 | engines: {node: '>=18'} 416 | cpu: [arm] 417 | os: [android] 418 | 419 | '@esbuild/android-arm@0.24.0': 420 | resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} 421 | engines: {node: '>=18'} 422 | cpu: [arm] 423 | os: [android] 424 | 425 | '@esbuild/android-x64@0.21.5': 426 | resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 427 | engines: {node: '>=12'} 428 | cpu: [x64] 429 | os: [android] 430 | 431 | '@esbuild/android-x64@0.23.1': 432 | resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} 433 | engines: {node: '>=18'} 434 | cpu: [x64] 435 | os: [android] 436 | 437 | '@esbuild/android-x64@0.24.0': 438 | resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} 439 | engines: {node: '>=18'} 440 | cpu: [x64] 441 | os: [android] 442 | 443 | '@esbuild/darwin-arm64@0.21.5': 444 | resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 445 | engines: {node: '>=12'} 446 | cpu: [arm64] 447 | os: [darwin] 448 | 449 | '@esbuild/darwin-arm64@0.23.1': 450 | resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} 451 | engines: {node: '>=18'} 452 | cpu: [arm64] 453 | os: [darwin] 454 | 455 | '@esbuild/darwin-arm64@0.24.0': 456 | resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} 457 | engines: {node: '>=18'} 458 | cpu: [arm64] 459 | os: [darwin] 460 | 461 | '@esbuild/darwin-x64@0.21.5': 462 | resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 463 | engines: {node: '>=12'} 464 | cpu: [x64] 465 | os: [darwin] 466 | 467 | '@esbuild/darwin-x64@0.23.1': 468 | resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} 469 | engines: {node: '>=18'} 470 | cpu: [x64] 471 | os: [darwin] 472 | 473 | '@esbuild/darwin-x64@0.24.0': 474 | resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} 475 | engines: {node: '>=18'} 476 | cpu: [x64] 477 | os: [darwin] 478 | 479 | '@esbuild/freebsd-arm64@0.21.5': 480 | resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 481 | engines: {node: '>=12'} 482 | cpu: [arm64] 483 | os: [freebsd] 484 | 485 | '@esbuild/freebsd-arm64@0.23.1': 486 | resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} 487 | engines: {node: '>=18'} 488 | cpu: [arm64] 489 | os: [freebsd] 490 | 491 | '@esbuild/freebsd-arm64@0.24.0': 492 | resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} 493 | engines: {node: '>=18'} 494 | cpu: [arm64] 495 | os: [freebsd] 496 | 497 | '@esbuild/freebsd-x64@0.21.5': 498 | resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 499 | engines: {node: '>=12'} 500 | cpu: [x64] 501 | os: [freebsd] 502 | 503 | '@esbuild/freebsd-x64@0.23.1': 504 | resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} 505 | engines: {node: '>=18'} 506 | cpu: [x64] 507 | os: [freebsd] 508 | 509 | '@esbuild/freebsd-x64@0.24.0': 510 | resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} 511 | engines: {node: '>=18'} 512 | cpu: [x64] 513 | os: [freebsd] 514 | 515 | '@esbuild/linux-arm64@0.21.5': 516 | resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 517 | engines: {node: '>=12'} 518 | cpu: [arm64] 519 | os: [linux] 520 | 521 | '@esbuild/linux-arm64@0.23.1': 522 | resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} 523 | engines: {node: '>=18'} 524 | cpu: [arm64] 525 | os: [linux] 526 | 527 | '@esbuild/linux-arm64@0.24.0': 528 | resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} 529 | engines: {node: '>=18'} 530 | cpu: [arm64] 531 | os: [linux] 532 | 533 | '@esbuild/linux-arm@0.21.5': 534 | resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 535 | engines: {node: '>=12'} 536 | cpu: [arm] 537 | os: [linux] 538 | 539 | '@esbuild/linux-arm@0.23.1': 540 | resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} 541 | engines: {node: '>=18'} 542 | cpu: [arm] 543 | os: [linux] 544 | 545 | '@esbuild/linux-arm@0.24.0': 546 | resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} 547 | engines: {node: '>=18'} 548 | cpu: [arm] 549 | os: [linux] 550 | 551 | '@esbuild/linux-ia32@0.21.5': 552 | resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 553 | engines: {node: '>=12'} 554 | cpu: [ia32] 555 | os: [linux] 556 | 557 | '@esbuild/linux-ia32@0.23.1': 558 | resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} 559 | engines: {node: '>=18'} 560 | cpu: [ia32] 561 | os: [linux] 562 | 563 | '@esbuild/linux-ia32@0.24.0': 564 | resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} 565 | engines: {node: '>=18'} 566 | cpu: [ia32] 567 | os: [linux] 568 | 569 | '@esbuild/linux-loong64@0.21.5': 570 | resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} 571 | engines: {node: '>=12'} 572 | cpu: [loong64] 573 | os: [linux] 574 | 575 | '@esbuild/linux-loong64@0.23.1': 576 | resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} 577 | engines: {node: '>=18'} 578 | cpu: [loong64] 579 | os: [linux] 580 | 581 | '@esbuild/linux-loong64@0.24.0': 582 | resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} 583 | engines: {node: '>=18'} 584 | cpu: [loong64] 585 | os: [linux] 586 | 587 | '@esbuild/linux-mips64el@0.21.5': 588 | resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 589 | engines: {node: '>=12'} 590 | cpu: [mips64el] 591 | os: [linux] 592 | 593 | '@esbuild/linux-mips64el@0.23.1': 594 | resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} 595 | engines: {node: '>=18'} 596 | cpu: [mips64el] 597 | os: [linux] 598 | 599 | '@esbuild/linux-mips64el@0.24.0': 600 | resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} 601 | engines: {node: '>=18'} 602 | cpu: [mips64el] 603 | os: [linux] 604 | 605 | '@esbuild/linux-ppc64@0.21.5': 606 | resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 607 | engines: {node: '>=12'} 608 | cpu: [ppc64] 609 | os: [linux] 610 | 611 | '@esbuild/linux-ppc64@0.23.1': 612 | resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} 613 | engines: {node: '>=18'} 614 | cpu: [ppc64] 615 | os: [linux] 616 | 617 | '@esbuild/linux-ppc64@0.24.0': 618 | resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} 619 | engines: {node: '>=18'} 620 | cpu: [ppc64] 621 | os: [linux] 622 | 623 | '@esbuild/linux-riscv64@0.21.5': 624 | resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 625 | engines: {node: '>=12'} 626 | cpu: [riscv64] 627 | os: [linux] 628 | 629 | '@esbuild/linux-riscv64@0.23.1': 630 | resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} 631 | engines: {node: '>=18'} 632 | cpu: [riscv64] 633 | os: [linux] 634 | 635 | '@esbuild/linux-riscv64@0.24.0': 636 | resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} 637 | engines: {node: '>=18'} 638 | cpu: [riscv64] 639 | os: [linux] 640 | 641 | '@esbuild/linux-s390x@0.21.5': 642 | resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 643 | engines: {node: '>=12'} 644 | cpu: [s390x] 645 | os: [linux] 646 | 647 | '@esbuild/linux-s390x@0.23.1': 648 | resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} 649 | engines: {node: '>=18'} 650 | cpu: [s390x] 651 | os: [linux] 652 | 653 | '@esbuild/linux-s390x@0.24.0': 654 | resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} 655 | engines: {node: '>=18'} 656 | cpu: [s390x] 657 | os: [linux] 658 | 659 | '@esbuild/linux-x64@0.21.5': 660 | resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 661 | engines: {node: '>=12'} 662 | cpu: [x64] 663 | os: [linux] 664 | 665 | '@esbuild/linux-x64@0.23.1': 666 | resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} 667 | engines: {node: '>=18'} 668 | cpu: [x64] 669 | os: [linux] 670 | 671 | '@esbuild/linux-x64@0.24.0': 672 | resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} 673 | engines: {node: '>=18'} 674 | cpu: [x64] 675 | os: [linux] 676 | 677 | '@esbuild/netbsd-x64@0.21.5': 678 | resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 679 | engines: {node: '>=12'} 680 | cpu: [x64] 681 | os: [netbsd] 682 | 683 | '@esbuild/netbsd-x64@0.23.1': 684 | resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} 685 | engines: {node: '>=18'} 686 | cpu: [x64] 687 | os: [netbsd] 688 | 689 | '@esbuild/netbsd-x64@0.24.0': 690 | resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} 691 | engines: {node: '>=18'} 692 | cpu: [x64] 693 | os: [netbsd] 694 | 695 | '@esbuild/openbsd-arm64@0.23.1': 696 | resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} 697 | engines: {node: '>=18'} 698 | cpu: [arm64] 699 | os: [openbsd] 700 | 701 | '@esbuild/openbsd-arm64@0.24.0': 702 | resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} 703 | engines: {node: '>=18'} 704 | cpu: [arm64] 705 | os: [openbsd] 706 | 707 | '@esbuild/openbsd-x64@0.21.5': 708 | resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 709 | engines: {node: '>=12'} 710 | cpu: [x64] 711 | os: [openbsd] 712 | 713 | '@esbuild/openbsd-x64@0.23.1': 714 | resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} 715 | engines: {node: '>=18'} 716 | cpu: [x64] 717 | os: [openbsd] 718 | 719 | '@esbuild/openbsd-x64@0.24.0': 720 | resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} 721 | engines: {node: '>=18'} 722 | cpu: [x64] 723 | os: [openbsd] 724 | 725 | '@esbuild/sunos-x64@0.21.5': 726 | resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 727 | engines: {node: '>=12'} 728 | cpu: [x64] 729 | os: [sunos] 730 | 731 | '@esbuild/sunos-x64@0.23.1': 732 | resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} 733 | engines: {node: '>=18'} 734 | cpu: [x64] 735 | os: [sunos] 736 | 737 | '@esbuild/sunos-x64@0.24.0': 738 | resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} 739 | engines: {node: '>=18'} 740 | cpu: [x64] 741 | os: [sunos] 742 | 743 | '@esbuild/win32-arm64@0.21.5': 744 | resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 745 | engines: {node: '>=12'} 746 | cpu: [arm64] 747 | os: [win32] 748 | 749 | '@esbuild/win32-arm64@0.23.1': 750 | resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} 751 | engines: {node: '>=18'} 752 | cpu: [arm64] 753 | os: [win32] 754 | 755 | '@esbuild/win32-arm64@0.24.0': 756 | resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} 757 | engines: {node: '>=18'} 758 | cpu: [arm64] 759 | os: [win32] 760 | 761 | '@esbuild/win32-ia32@0.21.5': 762 | resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 763 | engines: {node: '>=12'} 764 | cpu: [ia32] 765 | os: [win32] 766 | 767 | '@esbuild/win32-ia32@0.23.1': 768 | resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} 769 | engines: {node: '>=18'} 770 | cpu: [ia32] 771 | os: [win32] 772 | 773 | '@esbuild/win32-ia32@0.24.0': 774 | resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} 775 | engines: {node: '>=18'} 776 | cpu: [ia32] 777 | os: [win32] 778 | 779 | '@esbuild/win32-x64@0.21.5': 780 | resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} 781 | engines: {node: '>=12'} 782 | cpu: [x64] 783 | os: [win32] 784 | 785 | '@esbuild/win32-x64@0.23.1': 786 | resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} 787 | engines: {node: '>=18'} 788 | cpu: [x64] 789 | os: [win32] 790 | 791 | '@esbuild/win32-x64@0.24.0': 792 | resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} 793 | engines: {node: '>=18'} 794 | cpu: [x64] 795 | os: [win32] 796 | 797 | '@inquirer/figures@1.0.7': 798 | resolution: {integrity: sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw==} 799 | engines: {node: '>=18'} 800 | 801 | '@isaacs/cliui@8.0.2': 802 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 803 | engines: {node: '>=12'} 804 | 805 | '@istanbuljs/schema@0.1.3': 806 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 807 | engines: {node: '>=8'} 808 | 809 | '@jridgewell/gen-mapping@0.3.5': 810 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 811 | engines: {node: '>=6.0.0'} 812 | 813 | '@jridgewell/resolve-uri@3.1.2': 814 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 815 | engines: {node: '>=6.0.0'} 816 | 817 | '@jridgewell/set-array@1.2.1': 818 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 819 | engines: {node: '>=6.0.0'} 820 | 821 | '@jridgewell/sourcemap-codec@1.5.0': 822 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 823 | 824 | '@jridgewell/trace-mapping@0.3.25': 825 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 826 | 827 | '@jridgewell/trace-mapping@0.3.9': 828 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 829 | 830 | '@kwsites/file-exists@1.1.1': 831 | resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} 832 | 833 | '@kwsites/promise-deferred@1.1.1': 834 | resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} 835 | 836 | '@octokit/auth-token@4.0.0': 837 | resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} 838 | engines: {node: '>= 18'} 839 | 840 | '@octokit/core@5.2.0': 841 | resolution: {integrity: sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==} 842 | engines: {node: '>= 18'} 843 | 844 | '@octokit/endpoint@9.0.5': 845 | resolution: {integrity: sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==} 846 | engines: {node: '>= 18'} 847 | 848 | '@octokit/graphql@7.1.0': 849 | resolution: {integrity: sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==} 850 | engines: {node: '>= 18'} 851 | 852 | '@octokit/openapi-types@22.2.0': 853 | resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==} 854 | 855 | '@octokit/plugin-paginate-rest@11.3.1': 856 | resolution: {integrity: sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g==} 857 | engines: {node: '>= 18'} 858 | peerDependencies: 859 | '@octokit/core': '5' 860 | 861 | '@octokit/plugin-request-log@4.0.1': 862 | resolution: {integrity: sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==} 863 | engines: {node: '>= 18'} 864 | peerDependencies: 865 | '@octokit/core': '5' 866 | 867 | '@octokit/plugin-rest-endpoint-methods@13.2.2': 868 | resolution: {integrity: sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==} 869 | engines: {node: '>= 18'} 870 | peerDependencies: 871 | '@octokit/core': ^5 872 | 873 | '@octokit/request-error@5.1.0': 874 | resolution: {integrity: sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==} 875 | engines: {node: '>= 18'} 876 | 877 | '@octokit/request@8.4.0': 878 | resolution: {integrity: sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==} 879 | engines: {node: '>= 18'} 880 | 881 | '@octokit/rest@20.1.1': 882 | resolution: {integrity: sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw==} 883 | engines: {node: '>= 18'} 884 | 885 | '@octokit/types@13.6.1': 886 | resolution: {integrity: sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g==} 887 | 888 | '@pkgjs/parseargs@0.11.0': 889 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 890 | engines: {node: '>=14'} 891 | 892 | '@rollup/rollup-android-arm-eabi@4.24.4': 893 | resolution: {integrity: sha512-jfUJrFct/hTA0XDM5p/htWKoNNTbDLY0KRwEt6pyOA6k2fmk0WVwl65PdUdJZgzGEHWx+49LilkcSaumQRyNQw==} 894 | cpu: [arm] 895 | os: [android] 896 | 897 | '@rollup/rollup-android-arm64@4.24.4': 898 | resolution: {integrity: sha512-j4nrEO6nHU1nZUuCfRKoCcvh7PIywQPUCBa2UsootTHvTHIoIu2BzueInGJhhvQO/2FTRdNYpf63xsgEqH9IhA==} 899 | cpu: [arm64] 900 | os: [android] 901 | 902 | '@rollup/rollup-darwin-arm64@4.24.4': 903 | resolution: {integrity: sha512-GmU/QgGtBTeraKyldC7cDVVvAJEOr3dFLKneez/n7BvX57UdhOqDsVwzU7UOnYA7AAOt+Xb26lk79PldDHgMIQ==} 904 | cpu: [arm64] 905 | os: [darwin] 906 | 907 | '@rollup/rollup-darwin-x64@4.24.4': 908 | resolution: {integrity: sha512-N6oDBiZCBKlwYcsEPXGDE4g9RoxZLK6vT98M8111cW7VsVJFpNEqvJeIPfsCzbf0XEakPslh72X0gnlMi4Ddgg==} 909 | cpu: [x64] 910 | os: [darwin] 911 | 912 | '@rollup/rollup-freebsd-arm64@4.24.4': 913 | resolution: {integrity: sha512-py5oNShCCjCyjWXCZNrRGRpjWsF0ic8f4ieBNra5buQz0O/U6mMXCpC1LvrHuhJsNPgRt36tSYMidGzZiJF6mw==} 914 | cpu: [arm64] 915 | os: [freebsd] 916 | 917 | '@rollup/rollup-freebsd-x64@4.24.4': 918 | resolution: {integrity: sha512-L7VVVW9FCnTTp4i7KrmHeDsDvjB4++KOBENYtNYAiYl96jeBThFfhP6HVxL74v4SiZEVDH/1ILscR5U9S4ms4g==} 919 | cpu: [x64] 920 | os: [freebsd] 921 | 922 | '@rollup/rollup-linux-arm-gnueabihf@4.24.4': 923 | resolution: {integrity: sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA==} 924 | cpu: [arm] 925 | os: [linux] 926 | 927 | '@rollup/rollup-linux-arm-musleabihf@4.24.4': 928 | resolution: {integrity: sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw==} 929 | cpu: [arm] 930 | os: [linux] 931 | 932 | '@rollup/rollup-linux-arm64-gnu@4.24.4': 933 | resolution: {integrity: sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg==} 934 | cpu: [arm64] 935 | os: [linux] 936 | 937 | '@rollup/rollup-linux-arm64-musl@4.24.4': 938 | resolution: {integrity: sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA==} 939 | cpu: [arm64] 940 | os: [linux] 941 | 942 | '@rollup/rollup-linux-powerpc64le-gnu@4.24.4': 943 | resolution: {integrity: sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA==} 944 | cpu: [ppc64] 945 | os: [linux] 946 | 947 | '@rollup/rollup-linux-riscv64-gnu@4.24.4': 948 | resolution: {integrity: sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw==} 949 | cpu: [riscv64] 950 | os: [linux] 951 | 952 | '@rollup/rollup-linux-s390x-gnu@4.24.4': 953 | resolution: {integrity: sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ==} 954 | cpu: [s390x] 955 | os: [linux] 956 | 957 | '@rollup/rollup-linux-x64-gnu@4.24.4': 958 | resolution: {integrity: sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA==} 959 | cpu: [x64] 960 | os: [linux] 961 | 962 | '@rollup/rollup-linux-x64-musl@4.24.4': 963 | resolution: {integrity: sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q==} 964 | cpu: [x64] 965 | os: [linux] 966 | 967 | '@rollup/rollup-win32-arm64-msvc@4.24.4': 968 | resolution: {integrity: sha512-ku2GvtPwQfCqoPFIJCqZ8o7bJcj+Y54cZSr43hHca6jLwAiCbZdBUOrqE6y29QFajNAzzpIOwsckaTFmN6/8TA==} 969 | cpu: [arm64] 970 | os: [win32] 971 | 972 | '@rollup/rollup-win32-ia32-msvc@4.24.4': 973 | resolution: {integrity: sha512-V3nCe+eTt/W6UYNr/wGvO1fLpHUrnlirlypZfKCT1fG6hWfqhPgQV/K/mRBXBpxc0eKLIF18pIOFVPh0mqHjlg==} 974 | cpu: [ia32] 975 | os: [win32] 976 | 977 | '@rollup/rollup-win32-x64-msvc@4.24.4': 978 | resolution: {integrity: sha512-LTw1Dfd0mBIEqUVCxbvTE/LLo+9ZxVC9k99v1v4ahg9Aak6FpqOfNu5kRkeTAn0wphoC4JU7No1/rL+bBCEwhg==} 979 | cpu: [x64] 980 | os: [win32] 981 | 982 | '@sindresorhus/slugify@2.2.1': 983 | resolution: {integrity: sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==} 984 | engines: {node: '>=12'} 985 | 986 | '@sindresorhus/transliterate@1.6.0': 987 | resolution: {integrity: sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==} 988 | engines: {node: '>=12'} 989 | 990 | '@tsconfig/node10@1.0.11': 991 | resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} 992 | 993 | '@tsconfig/node12@1.0.11': 994 | resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} 995 | 996 | '@tsconfig/node14@1.0.3': 997 | resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} 998 | 999 | '@tsconfig/node16@1.0.4': 1000 | resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} 1001 | 1002 | '@types/estree@1.0.6': 1003 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 1004 | 1005 | '@types/jscodeshift@0.11.11': 1006 | resolution: {integrity: sha512-d7CAfFGOupj5qCDqMODXxNz2/NwCv/Lha78ZFbnr6qpk3K98iSB8I+ig9ERE2+EeYML352VMRsjPyOpeA+04eQ==} 1007 | 1008 | '@types/node-fetch@2.6.11': 1009 | resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} 1010 | 1011 | '@types/node@18.19.64': 1012 | resolution: {integrity: sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==} 1013 | 1014 | '@types/node@22.9.0': 1015 | resolution: {integrity: sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==} 1016 | 1017 | '@vitest/coverage-v8@2.1.4': 1018 | resolution: {integrity: sha512-FPKQuJfR6VTfcNMcGpqInmtJuVXFSCd9HQltYncfR01AzXhLucMEtQ5SinPdZxsT5x/5BK7I5qFJ5/ApGCmyTQ==} 1019 | peerDependencies: 1020 | '@vitest/browser': 2.1.4 1021 | vitest: 2.1.4 1022 | peerDependenciesMeta: 1023 | '@vitest/browser': 1024 | optional: true 1025 | 1026 | '@vitest/expect@2.1.4': 1027 | resolution: {integrity: sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA==} 1028 | 1029 | '@vitest/mocker@2.1.4': 1030 | resolution: {integrity: sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ==} 1031 | peerDependencies: 1032 | msw: ^2.4.9 1033 | vite: ^5.0.0 1034 | peerDependenciesMeta: 1035 | msw: 1036 | optional: true 1037 | vite: 1038 | optional: true 1039 | 1040 | '@vitest/pretty-format@2.1.4': 1041 | resolution: {integrity: sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==} 1042 | 1043 | '@vitest/runner@2.1.4': 1044 | resolution: {integrity: sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA==} 1045 | 1046 | '@vitest/snapshot@2.1.4': 1047 | resolution: {integrity: sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q==} 1048 | 1049 | '@vitest/spy@2.1.4': 1050 | resolution: {integrity: sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg==} 1051 | 1052 | '@vitest/utils@2.1.4': 1053 | resolution: {integrity: sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==} 1054 | 1055 | abort-controller@3.0.0: 1056 | resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} 1057 | engines: {node: '>=6.5'} 1058 | 1059 | acorn-walk@8.3.4: 1060 | resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} 1061 | engines: {node: '>=0.4.0'} 1062 | 1063 | acorn@8.14.0: 1064 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 1065 | engines: {node: '>=0.4.0'} 1066 | hasBin: true 1067 | 1068 | agentkeepalive@4.5.0: 1069 | resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} 1070 | engines: {node: '>= 8.0.0'} 1071 | 1072 | ansi-escapes@4.3.2: 1073 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 1074 | engines: {node: '>=8'} 1075 | 1076 | ansi-regex@5.0.1: 1077 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 1078 | engines: {node: '>=8'} 1079 | 1080 | ansi-regex@6.1.0: 1081 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 1082 | engines: {node: '>=12'} 1083 | 1084 | ansi-styles@4.3.0: 1085 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 1086 | engines: {node: '>=8'} 1087 | 1088 | ansi-styles@6.2.1: 1089 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 1090 | engines: {node: '>=12'} 1091 | 1092 | arg@4.1.3: 1093 | resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} 1094 | 1095 | assertion-error@2.0.1: 1096 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 1097 | engines: {node: '>=12'} 1098 | 1099 | ast-types@0.14.2: 1100 | resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==} 1101 | engines: {node: '>=4'} 1102 | 1103 | ast-types@0.16.1: 1104 | resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} 1105 | engines: {node: '>=4'} 1106 | 1107 | asynckit@0.4.0: 1108 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 1109 | 1110 | babel-core@7.0.0-bridge.0: 1111 | resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} 1112 | peerDependencies: 1113 | '@babel/core': ^7.0.0-0 1114 | 1115 | balanced-match@1.0.2: 1116 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 1117 | 1118 | base-64@0.1.0: 1119 | resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==} 1120 | 1121 | base64-js@1.5.1: 1122 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 1123 | 1124 | before-after-hook@2.2.3: 1125 | resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} 1126 | 1127 | bl@4.1.0: 1128 | resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} 1129 | 1130 | blessed@0.1.81: 1131 | resolution: {integrity: sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==} 1132 | engines: {node: '>= 0.8.0'} 1133 | hasBin: true 1134 | 1135 | brace-expansion@1.1.11: 1136 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 1137 | 1138 | brace-expansion@2.0.1: 1139 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 1140 | 1141 | braces@3.0.3: 1142 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 1143 | engines: {node: '>=8'} 1144 | 1145 | browserslist@4.24.2: 1146 | resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} 1147 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 1148 | hasBin: true 1149 | 1150 | buffer-from@1.1.2: 1151 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 1152 | 1153 | buffer@5.7.1: 1154 | resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 1155 | 1156 | cac@6.7.14: 1157 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 1158 | engines: {node: '>=8'} 1159 | 1160 | caniuse-lite@1.0.30001679: 1161 | resolution: {integrity: sha512-j2YqID/YwpLnKzCmBOS4tlZdWprXm3ZmQLBH9ZBXFOhoxLA46fwyBvx6toCBWBmnuwUY/qB3kEU6gFx8qgCroA==} 1162 | 1163 | chai@5.1.2: 1164 | resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} 1165 | engines: {node: '>=12'} 1166 | 1167 | chalk@4.1.2: 1168 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 1169 | engines: {node: '>=10'} 1170 | 1171 | chardet@0.7.0: 1172 | resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} 1173 | 1174 | charenc@0.0.2: 1175 | resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} 1176 | 1177 | check-error@2.1.1: 1178 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 1179 | engines: {node: '>= 16'} 1180 | 1181 | chownr@1.1.4: 1182 | resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} 1183 | 1184 | cli-cursor@3.1.0: 1185 | resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} 1186 | engines: {node: '>=8'} 1187 | 1188 | cli-spinners@2.9.2: 1189 | resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} 1190 | engines: {node: '>=6'} 1191 | 1192 | cli-width@4.1.0: 1193 | resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} 1194 | engines: {node: '>= 12'} 1195 | 1196 | clone-deep@4.0.1: 1197 | resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} 1198 | engines: {node: '>=6'} 1199 | 1200 | clone@1.0.4: 1201 | resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} 1202 | engines: {node: '>=0.8'} 1203 | 1204 | codemod@0.14.1: 1205 | resolution: {integrity: sha512-6AG8qJCYm7g2ex8hPrHZH7CU/W9R+0USHXXTO7ZEzs6HkMq55hNMuNgJ272pSMw9FWA0MFcuIL7si8mn0UJWBg==} 1206 | engines: {node: '>=18.5.0'} 1207 | hasBin: true 1208 | 1209 | color-convert@2.0.1: 1210 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1211 | engines: {node: '>=7.0.0'} 1212 | 1213 | color-name@1.1.4: 1214 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1215 | 1216 | colors-cli@1.0.33: 1217 | resolution: {integrity: sha512-PWGsmoJFdOB0t+BeHgmtuoRZUQucOLl5ii81NBzOOGVxlgE04muFNHlR5j8i8MKbOPELBl3243AI6lGBTj5ICQ==} 1218 | hasBin: true 1219 | 1220 | combined-stream@1.0.8: 1221 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 1222 | engines: {node: '>= 0.8'} 1223 | 1224 | commondir@1.0.1: 1225 | resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} 1226 | 1227 | concat-map@0.0.1: 1228 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1229 | 1230 | convert-source-map@2.0.0: 1231 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 1232 | 1233 | create-require@1.1.1: 1234 | resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} 1235 | 1236 | cross-spawn@7.0.5: 1237 | resolution: {integrity: sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==} 1238 | engines: {node: '>= 8'} 1239 | 1240 | crypt@0.0.2: 1241 | resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} 1242 | 1243 | debug@4.3.7: 1244 | resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} 1245 | engines: {node: '>=6.0'} 1246 | peerDependencies: 1247 | supports-color: '*' 1248 | peerDependenciesMeta: 1249 | supports-color: 1250 | optional: true 1251 | 1252 | decompress-response@6.0.0: 1253 | resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} 1254 | engines: {node: '>=10'} 1255 | 1256 | deep-eql@5.0.2: 1257 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 1258 | engines: {node: '>=6'} 1259 | 1260 | deep-extend@0.6.0: 1261 | resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 1262 | engines: {node: '>=4.0.0'} 1263 | 1264 | defaults@1.0.4: 1265 | resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} 1266 | 1267 | delayed-stream@1.0.0: 1268 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 1269 | engines: {node: '>=0.4.0'} 1270 | 1271 | deprecation@2.3.1: 1272 | resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} 1273 | 1274 | detect-indent@7.0.1: 1275 | resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} 1276 | engines: {node: '>=12.20'} 1277 | 1278 | detect-libc@2.0.3: 1279 | resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} 1280 | engines: {node: '>=8'} 1281 | 1282 | detect-newline@4.0.1: 1283 | resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} 1284 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1285 | 1286 | diff@4.0.2: 1287 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 1288 | engines: {node: '>=0.3.1'} 1289 | 1290 | diff@5.2.0: 1291 | resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} 1292 | engines: {node: '>=0.3.1'} 1293 | 1294 | digest-fetch@1.3.0: 1295 | resolution: {integrity: sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==} 1296 | 1297 | eastasianwidth@0.2.0: 1298 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 1299 | 1300 | electron-to-chromium@1.5.55: 1301 | resolution: {integrity: sha512-6maZ2ASDOTBtjt9FhqYPRnbvKU5tjG0IN9SztUOWYw2AzNDNpKJYLJmlK0/En4Hs/aiWnB+JZ+gW19PIGszgKg==} 1302 | 1303 | emoji-regex@8.0.0: 1304 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1305 | 1306 | emoji-regex@9.2.2: 1307 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 1308 | 1309 | end-of-stream@1.4.4: 1310 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 1311 | 1312 | esbuild@0.21.5: 1313 | resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} 1314 | engines: {node: '>=12'} 1315 | hasBin: true 1316 | 1317 | esbuild@0.23.1: 1318 | resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} 1319 | engines: {node: '>=18'} 1320 | hasBin: true 1321 | 1322 | esbuild@0.24.0: 1323 | resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} 1324 | engines: {node: '>=18'} 1325 | hasBin: true 1326 | 1327 | escalade@3.2.0: 1328 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 1329 | engines: {node: '>=6'} 1330 | 1331 | escape-string-regexp@5.0.0: 1332 | resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 1333 | engines: {node: '>=12'} 1334 | 1335 | esprima@4.0.1: 1336 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 1337 | engines: {node: '>=4'} 1338 | hasBin: true 1339 | 1340 | estree-walker@3.0.3: 1341 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 1342 | 1343 | event-target-shim@5.0.1: 1344 | resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} 1345 | engines: {node: '>=6'} 1346 | 1347 | expand-template@2.0.3: 1348 | resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} 1349 | engines: {node: '>=6'} 1350 | 1351 | expect-type@1.1.0: 1352 | resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} 1353 | engines: {node: '>=12.0.0'} 1354 | 1355 | external-editor@3.1.0: 1356 | resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} 1357 | engines: {node: '>=4'} 1358 | 1359 | filename-reserved-regex@3.0.0: 1360 | resolution: {integrity: sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==} 1361 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1362 | 1363 | filenamify@6.0.0: 1364 | resolution: {integrity: sha512-vqIlNogKeyD3yzrm0yhRMQg8hOVwYcYRfjEoODd49iCprMn4HL85gK3HcykQE53EPIpX3HcAbGA5ELQv216dAQ==} 1365 | engines: {node: '>=16'} 1366 | 1367 | fill-range@7.1.1: 1368 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 1369 | engines: {node: '>=8'} 1370 | 1371 | find-cache-dir@2.1.0: 1372 | resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} 1373 | engines: {node: '>=6'} 1374 | 1375 | find-up@3.0.0: 1376 | resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} 1377 | engines: {node: '>=6'} 1378 | 1379 | flow-parser@0.252.0: 1380 | resolution: {integrity: sha512-z8hKPUjZ33VLn4HVntifqmEhmolUMopysnMNzazoDqo1GLUkBsreLNsxETlKJMPotUWStQnen6SGvUNe1j4Hlg==} 1381 | engines: {node: '>=0.4.0'} 1382 | 1383 | foreground-child@3.3.0: 1384 | resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} 1385 | engines: {node: '>=14'} 1386 | 1387 | form-data-encoder@1.7.2: 1388 | resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} 1389 | 1390 | form-data@4.0.1: 1391 | resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} 1392 | engines: {node: '>= 6'} 1393 | 1394 | formdata-node@4.4.1: 1395 | resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} 1396 | engines: {node: '>= 12.20'} 1397 | 1398 | fs-constants@1.0.0: 1399 | resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} 1400 | 1401 | fs.realpath@1.0.0: 1402 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1403 | 1404 | fsevents@2.3.3: 1405 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1406 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1407 | os: [darwin] 1408 | 1409 | gensync@1.0.0-beta.2: 1410 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1411 | engines: {node: '>=6.9.0'} 1412 | 1413 | git-up@7.0.0: 1414 | resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} 1415 | 1416 | git-url-parse@14.1.0: 1417 | resolution: {integrity: sha512-8xg65dTxGHST3+zGpycMMFZcoTzAdZ2dOtu4vmgIfkTFnVHBxHMzBC2L1k8To7EmrSiHesT8JgPLT91VKw1B5g==} 1418 | 1419 | github-from-package@0.0.0: 1420 | resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} 1421 | 1422 | glob@10.4.5: 1423 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 1424 | hasBin: true 1425 | 1426 | glob@7.2.3: 1427 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1428 | deprecated: Glob versions prior to v9 are no longer supported 1429 | 1430 | globals@11.12.0: 1431 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1432 | engines: {node: '>=4'} 1433 | 1434 | graceful-fs@4.2.11: 1435 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1436 | 1437 | has-flag@4.0.0: 1438 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1439 | engines: {node: '>=8'} 1440 | 1441 | html-escaper@2.0.2: 1442 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 1443 | 1444 | humanize-ms@1.2.1: 1445 | resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} 1446 | 1447 | iconv-lite@0.4.24: 1448 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 1449 | engines: {node: '>=0.10.0'} 1450 | 1451 | ieee754@1.2.1: 1452 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 1453 | 1454 | imurmurhash@0.1.4: 1455 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1456 | engines: {node: '>=0.8.19'} 1457 | 1458 | inflight@1.0.6: 1459 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1460 | 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. 1461 | 1462 | inherits@2.0.4: 1463 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1464 | 1465 | ini@1.3.8: 1466 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 1467 | 1468 | inquirer@9.3.7: 1469 | resolution: {integrity: sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w==} 1470 | engines: {node: '>=18'} 1471 | 1472 | is-buffer@1.1.6: 1473 | resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} 1474 | 1475 | is-fullwidth-code-point@3.0.0: 1476 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1477 | engines: {node: '>=8'} 1478 | 1479 | is-interactive@1.0.0: 1480 | resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} 1481 | engines: {node: '>=8'} 1482 | 1483 | is-number@7.0.0: 1484 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1485 | engines: {node: '>=0.12.0'} 1486 | 1487 | is-plain-object@2.0.4: 1488 | resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} 1489 | engines: {node: '>=0.10.0'} 1490 | 1491 | is-ssh@1.4.0: 1492 | resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} 1493 | 1494 | is-unicode-supported@0.1.0: 1495 | resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} 1496 | engines: {node: '>=10'} 1497 | 1498 | isexe@2.0.0: 1499 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1500 | 1501 | isobject@3.0.1: 1502 | resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} 1503 | engines: {node: '>=0.10.0'} 1504 | 1505 | istanbul-lib-coverage@3.2.2: 1506 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 1507 | engines: {node: '>=8'} 1508 | 1509 | istanbul-lib-report@3.0.1: 1510 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 1511 | engines: {node: '>=10'} 1512 | 1513 | istanbul-lib-source-maps@5.0.6: 1514 | resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} 1515 | engines: {node: '>=10'} 1516 | 1517 | istanbul-reports@3.1.7: 1518 | resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} 1519 | engines: {node: '>=8'} 1520 | 1521 | jackspeak@3.4.3: 1522 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 1523 | 1524 | js-tokens@4.0.0: 1525 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1526 | 1527 | jscodeshift@0.15.2: 1528 | resolution: {integrity: sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==} 1529 | hasBin: true 1530 | peerDependencies: 1531 | '@babel/preset-env': ^7.1.6 1532 | peerDependenciesMeta: 1533 | '@babel/preset-env': 1534 | optional: true 1535 | 1536 | jscodeshift@0.16.1: 1537 | resolution: {integrity: sha512-oMQXySazy63awNBzMpXbbVv73u3irdxTeX2L5ueRyFRxi32qb9uzdZdOY5fTBYADBG19l5M/wnGknZSV1dzCdA==} 1538 | hasBin: true 1539 | peerDependencies: 1540 | '@babel/preset-env': ^7.1.6 1541 | peerDependenciesMeta: 1542 | '@babel/preset-env': 1543 | optional: true 1544 | 1545 | jscodeshift@17.1.1: 1546 | resolution: {integrity: sha512-4vq5B1sD37aa9qed3zWq2XQPun5XjxebIv+Folr57lt8B4HLGDHEz1UG7pfcxzSaelzPbcY7yZSs033/S0i6wQ==} 1547 | engines: {node: '>=16'} 1548 | hasBin: true 1549 | peerDependencies: 1550 | '@babel/preset-env': ^7.1.6 1551 | peerDependenciesMeta: 1552 | '@babel/preset-env': 1553 | optional: true 1554 | 1555 | jsesc@3.0.2: 1556 | resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} 1557 | engines: {node: '>=6'} 1558 | hasBin: true 1559 | 1560 | json5@2.2.3: 1561 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1562 | engines: {node: '>=6'} 1563 | hasBin: true 1564 | 1565 | keytar@7.9.0: 1566 | resolution: {integrity: sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==} 1567 | 1568 | kind-of@6.0.3: 1569 | resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} 1570 | engines: {node: '>=0.10.0'} 1571 | 1572 | locate-path@3.0.0: 1573 | resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} 1574 | engines: {node: '>=6'} 1575 | 1576 | lodash-es@4.17.21: 1577 | resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} 1578 | 1579 | log-symbols@4.1.0: 1580 | resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} 1581 | engines: {node: '>=10'} 1582 | 1583 | loupe@3.1.2: 1584 | resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} 1585 | 1586 | lru-cache@10.4.3: 1587 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 1588 | 1589 | lru-cache@5.1.1: 1590 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1591 | 1592 | magic-string@0.30.12: 1593 | resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} 1594 | 1595 | magicast@0.3.5: 1596 | resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} 1597 | 1598 | make-dir@2.1.0: 1599 | resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} 1600 | engines: {node: '>=6'} 1601 | 1602 | make-dir@4.0.0: 1603 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 1604 | engines: {node: '>=10'} 1605 | 1606 | make-error@1.3.6: 1607 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 1608 | 1609 | md5@2.3.0: 1610 | resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} 1611 | 1612 | micromatch@4.0.8: 1613 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1614 | engines: {node: '>=8.6'} 1615 | 1616 | mime-db@1.52.0: 1617 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1618 | engines: {node: '>= 0.6'} 1619 | 1620 | mime-types@2.1.35: 1621 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1622 | engines: {node: '>= 0.6'} 1623 | 1624 | mimic-fn@2.1.0: 1625 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 1626 | engines: {node: '>=6'} 1627 | 1628 | mimic-response@3.1.0: 1629 | resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} 1630 | engines: {node: '>=10'} 1631 | 1632 | minimatch@3.1.2: 1633 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1634 | 1635 | minimatch@9.0.5: 1636 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1637 | engines: {node: '>=16 || 14 >=14.17'} 1638 | 1639 | minimist@1.2.8: 1640 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1641 | 1642 | minipass@7.1.2: 1643 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1644 | engines: {node: '>=16 || 14 >=14.17'} 1645 | 1646 | mkdirp-classic@0.5.3: 1647 | resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} 1648 | 1649 | mkdirp@0.5.6: 1650 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 1651 | hasBin: true 1652 | 1653 | ms@2.1.3: 1654 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1655 | 1656 | mute-stream@1.0.0: 1657 | resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} 1658 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 1659 | 1660 | nanoid@3.3.7: 1661 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 1662 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1663 | hasBin: true 1664 | 1665 | napi-build-utils@1.0.2: 1666 | resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} 1667 | 1668 | neo-async@2.6.2: 1669 | resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} 1670 | 1671 | node-abi@3.71.0: 1672 | resolution: {integrity: sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==} 1673 | engines: {node: '>=10'} 1674 | 1675 | node-addon-api@4.3.0: 1676 | resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} 1677 | 1678 | node-dir@0.1.17: 1679 | resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} 1680 | engines: {node: '>= 0.10.5'} 1681 | 1682 | node-domexception@1.0.0: 1683 | resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} 1684 | engines: {node: '>=10.5.0'} 1685 | 1686 | node-fetch@2.7.0: 1687 | resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} 1688 | engines: {node: 4.x || >=6.0.0} 1689 | peerDependencies: 1690 | encoding: ^0.1.0 1691 | peerDependenciesMeta: 1692 | encoding: 1693 | optional: true 1694 | 1695 | node-releases@2.0.18: 1696 | resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} 1697 | 1698 | once@1.4.0: 1699 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1700 | 1701 | onetime@5.1.2: 1702 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1703 | engines: {node: '>=6'} 1704 | 1705 | openai@4.23.0: 1706 | resolution: {integrity: sha512-ey2CXh1OTcTUa0AWZWuTpgA9t5GuAG3DVU1MofCRUI7fQJij8XJ3Sr0VtgxoAE69C9wbHBMCux8Z/IQZfSwHiA==} 1707 | hasBin: true 1708 | 1709 | ora@5.4.1: 1710 | resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} 1711 | engines: {node: '>=10'} 1712 | 1713 | os-tmpdir@1.0.2: 1714 | resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} 1715 | engines: {node: '>=0.10.0'} 1716 | 1717 | p-limit@2.3.0: 1718 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1719 | engines: {node: '>=6'} 1720 | 1721 | p-locate@3.0.0: 1722 | resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} 1723 | engines: {node: '>=6'} 1724 | 1725 | p-try@2.2.0: 1726 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1727 | engines: {node: '>=6'} 1728 | 1729 | package-json-from-dist@1.0.1: 1730 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 1731 | 1732 | parse-path@7.0.0: 1733 | resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} 1734 | 1735 | parse-url@8.1.0: 1736 | resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} 1737 | 1738 | path-exists@3.0.0: 1739 | resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} 1740 | engines: {node: '>=4'} 1741 | 1742 | path-is-absolute@1.0.1: 1743 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1744 | engines: {node: '>=0.10.0'} 1745 | 1746 | path-key@3.1.1: 1747 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1748 | engines: {node: '>=8'} 1749 | 1750 | path-scurry@1.11.1: 1751 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 1752 | engines: {node: '>=16 || 14 >=14.18'} 1753 | 1754 | pathe@1.1.2: 1755 | resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} 1756 | 1757 | pathval@2.0.0: 1758 | resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 1759 | engines: {node: '>= 14.16'} 1760 | 1761 | picocolors@1.1.1: 1762 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1763 | 1764 | picomatch@2.3.1: 1765 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1766 | engines: {node: '>=8.6'} 1767 | 1768 | pify@4.0.1: 1769 | resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} 1770 | engines: {node: '>=6'} 1771 | 1772 | pirates@4.0.6: 1773 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1774 | engines: {node: '>= 6'} 1775 | 1776 | pkg-dir@3.0.0: 1777 | resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} 1778 | engines: {node: '>=6'} 1779 | 1780 | postcss@8.4.47: 1781 | resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} 1782 | engines: {node: ^10 || ^12 || >=14} 1783 | 1784 | prebuild-install@7.1.2: 1785 | resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} 1786 | engines: {node: '>=10'} 1787 | hasBin: true 1788 | 1789 | prettier@3.3.3: 1790 | resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} 1791 | engines: {node: '>=14'} 1792 | hasBin: true 1793 | 1794 | protocols@2.0.1: 1795 | resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} 1796 | 1797 | pump@3.0.2: 1798 | resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} 1799 | 1800 | rc@1.2.8: 1801 | resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} 1802 | hasBin: true 1803 | 1804 | readable-stream@3.6.2: 1805 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 1806 | engines: {node: '>= 6'} 1807 | 1808 | recast@0.20.5: 1809 | resolution: {integrity: sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ==} 1810 | engines: {node: '>= 4'} 1811 | 1812 | recast@0.23.9: 1813 | resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} 1814 | engines: {node: '>= 4'} 1815 | 1816 | restore-cursor@3.1.0: 1817 | resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} 1818 | engines: {node: '>=8'} 1819 | 1820 | rimraf@2.6.3: 1821 | resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} 1822 | deprecated: Rimraf versions prior to v4 are no longer supported 1823 | hasBin: true 1824 | 1825 | rollup@4.24.4: 1826 | resolution: {integrity: sha512-vGorVWIsWfX3xbcyAS+I047kFKapHYivmkaT63Smj77XwvLSJos6M1xGqZnBPFQFBRZDOcG1QnYEIxAvTr/HjA==} 1827 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1828 | hasBin: true 1829 | 1830 | run-async@3.0.0: 1831 | resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} 1832 | engines: {node: '>=0.12.0'} 1833 | 1834 | rxjs@7.8.1: 1835 | resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} 1836 | 1837 | safe-buffer@5.2.1: 1838 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1839 | 1840 | safer-buffer@2.1.2: 1841 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1842 | 1843 | semver@5.7.2: 1844 | resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} 1845 | hasBin: true 1846 | 1847 | semver@6.3.1: 1848 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1849 | hasBin: true 1850 | 1851 | semver@7.6.3: 1852 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 1853 | engines: {node: '>=10'} 1854 | hasBin: true 1855 | 1856 | shallow-clone@3.0.1: 1857 | resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} 1858 | engines: {node: '>=8'} 1859 | 1860 | shebang-command@2.0.0: 1861 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1862 | engines: {node: '>=8'} 1863 | 1864 | shebang-regex@3.0.0: 1865 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1866 | engines: {node: '>=8'} 1867 | 1868 | siginfo@2.0.0: 1869 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 1870 | 1871 | signal-exit@3.0.7: 1872 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1873 | 1874 | signal-exit@4.1.0: 1875 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1876 | engines: {node: '>=14'} 1877 | 1878 | simple-concat@1.0.1: 1879 | resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} 1880 | 1881 | simple-get@4.0.1: 1882 | resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} 1883 | 1884 | simple-git@3.27.0: 1885 | resolution: {integrity: sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==} 1886 | 1887 | source-map-js@1.2.1: 1888 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1889 | engines: {node: '>=0.10.0'} 1890 | 1891 | source-map-support@0.5.21: 1892 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1893 | 1894 | source-map@0.6.1: 1895 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1896 | engines: {node: '>=0.10.0'} 1897 | 1898 | stackback@0.0.2: 1899 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 1900 | 1901 | std-env@3.8.0: 1902 | resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} 1903 | 1904 | string-width@4.2.3: 1905 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1906 | engines: {node: '>=8'} 1907 | 1908 | string-width@5.1.2: 1909 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1910 | engines: {node: '>=12'} 1911 | 1912 | string_decoder@1.3.0: 1913 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1914 | 1915 | strip-ansi@6.0.1: 1916 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1917 | engines: {node: '>=8'} 1918 | 1919 | strip-ansi@7.1.0: 1920 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1921 | engines: {node: '>=12'} 1922 | 1923 | strip-json-comments@2.0.1: 1924 | resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} 1925 | engines: {node: '>=0.10.0'} 1926 | 1927 | supports-color@7.2.0: 1928 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1929 | engines: {node: '>=8'} 1930 | 1931 | tar-fs@2.1.1: 1932 | resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} 1933 | 1934 | tar-stream@2.2.0: 1935 | resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} 1936 | engines: {node: '>=6'} 1937 | 1938 | temp@0.8.4: 1939 | resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} 1940 | engines: {node: '>=6.0.0'} 1941 | 1942 | temp@0.9.4: 1943 | resolution: {integrity: sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==} 1944 | engines: {node: '>=6.0.0'} 1945 | 1946 | test-exclude@7.0.1: 1947 | resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} 1948 | engines: {node: '>=18'} 1949 | 1950 | tiny-invariant@1.3.3: 1951 | resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} 1952 | 1953 | tinybench@2.9.0: 1954 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 1955 | 1956 | tinyexec@0.3.1: 1957 | resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} 1958 | 1959 | tinypool@1.0.1: 1960 | resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} 1961 | engines: {node: ^18.0.0 || >=20.0.0} 1962 | 1963 | tinyrainbow@1.2.0: 1964 | resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} 1965 | engines: {node: '>=14.0.0'} 1966 | 1967 | tinyspy@3.0.2: 1968 | resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} 1969 | engines: {node: '>=14.0.0'} 1970 | 1971 | tmp@0.0.33: 1972 | resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} 1973 | engines: {node: '>=0.6.0'} 1974 | 1975 | tmp@0.2.3: 1976 | resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} 1977 | engines: {node: '>=14.14'} 1978 | 1979 | to-regex-range@5.0.1: 1980 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1981 | engines: {node: '>=8.0'} 1982 | 1983 | tr46@0.0.3: 1984 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 1985 | 1986 | tree-kill@1.2.2: 1987 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1988 | hasBin: true 1989 | 1990 | ts-invariant@0.10.3: 1991 | resolution: {integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==} 1992 | engines: {node: '>=8'} 1993 | 1994 | ts-node@10.9.2: 1995 | resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} 1996 | hasBin: true 1997 | peerDependencies: 1998 | '@swc/core': '>=1.2.50' 1999 | '@swc/wasm': '>=1.2.50' 2000 | '@types/node': '*' 2001 | typescript: '>=2.7' 2002 | peerDependenciesMeta: 2003 | '@swc/core': 2004 | optional: true 2005 | '@swc/wasm': 2006 | optional: true 2007 | 2008 | tslib@2.8.1: 2009 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 2010 | 2011 | tunnel-agent@0.6.0: 2012 | resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} 2013 | 2014 | type-fest@0.21.3: 2015 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 2016 | engines: {node: '>=10'} 2017 | 2018 | typescript@5.6.3: 2019 | resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} 2020 | engines: {node: '>=14.17'} 2021 | hasBin: true 2022 | 2023 | undici-types@5.26.5: 2024 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 2025 | 2026 | undici-types@6.19.8: 2027 | resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 2028 | 2029 | universal-user-agent@6.0.1: 2030 | resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} 2031 | 2032 | update-browserslist-db@1.1.1: 2033 | resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} 2034 | hasBin: true 2035 | peerDependencies: 2036 | browserslist: '>= 4.21.0' 2037 | 2038 | util-deprecate@1.0.2: 2039 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2040 | 2041 | v8-compile-cache-lib@3.0.1: 2042 | resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} 2043 | 2044 | vite-node@2.1.4: 2045 | resolution: {integrity: sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==} 2046 | engines: {node: ^18.0.0 || >=20.0.0} 2047 | hasBin: true 2048 | 2049 | vite@5.4.10: 2050 | resolution: {integrity: sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==} 2051 | engines: {node: ^18.0.0 || >=20.0.0} 2052 | hasBin: true 2053 | peerDependencies: 2054 | '@types/node': ^18.0.0 || >=20.0.0 2055 | less: '*' 2056 | lightningcss: ^1.21.0 2057 | sass: '*' 2058 | sass-embedded: '*' 2059 | stylus: '*' 2060 | sugarss: '*' 2061 | terser: ^5.4.0 2062 | peerDependenciesMeta: 2063 | '@types/node': 2064 | optional: true 2065 | less: 2066 | optional: true 2067 | lightningcss: 2068 | optional: true 2069 | sass: 2070 | optional: true 2071 | sass-embedded: 2072 | optional: true 2073 | stylus: 2074 | optional: true 2075 | sugarss: 2076 | optional: true 2077 | terser: 2078 | optional: true 2079 | 2080 | vitest@2.1.4: 2081 | resolution: {integrity: sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==} 2082 | engines: {node: ^18.0.0 || >=20.0.0} 2083 | hasBin: true 2084 | peerDependencies: 2085 | '@edge-runtime/vm': '*' 2086 | '@types/node': ^18.0.0 || >=20.0.0 2087 | '@vitest/browser': 2.1.4 2088 | '@vitest/ui': 2.1.4 2089 | happy-dom: '*' 2090 | jsdom: '*' 2091 | peerDependenciesMeta: 2092 | '@edge-runtime/vm': 2093 | optional: true 2094 | '@types/node': 2095 | optional: true 2096 | '@vitest/browser': 2097 | optional: true 2098 | '@vitest/ui': 2099 | optional: true 2100 | happy-dom: 2101 | optional: true 2102 | jsdom: 2103 | optional: true 2104 | 2105 | wcwidth@1.0.1: 2106 | resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} 2107 | 2108 | web-streams-polyfill@3.3.3: 2109 | resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} 2110 | engines: {node: '>= 8'} 2111 | 2112 | web-streams-polyfill@4.0.0-beta.3: 2113 | resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} 2114 | engines: {node: '>= 14'} 2115 | 2116 | webidl-conversions@3.0.1: 2117 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 2118 | 2119 | whatwg-url@5.0.0: 2120 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 2121 | 2122 | which@2.0.2: 2123 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2124 | engines: {node: '>= 8'} 2125 | hasBin: true 2126 | 2127 | why-is-node-running@2.3.0: 2128 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 2129 | engines: {node: '>=8'} 2130 | hasBin: true 2131 | 2132 | wrap-ansi@6.2.0: 2133 | resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} 2134 | engines: {node: '>=8'} 2135 | 2136 | wrap-ansi@7.0.0: 2137 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2138 | engines: {node: '>=10'} 2139 | 2140 | wrap-ansi@8.1.0: 2141 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 2142 | engines: {node: '>=12'} 2143 | 2144 | wrappy@1.0.2: 2145 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2146 | 2147 | write-file-atomic@2.4.3: 2148 | resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} 2149 | 2150 | write-file-atomic@5.0.1: 2151 | resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} 2152 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 2153 | 2154 | yallist@3.1.1: 2155 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 2156 | 2157 | yaml@2.6.0: 2158 | resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} 2159 | engines: {node: '>= 14'} 2160 | hasBin: true 2161 | 2162 | yn@3.1.1: 2163 | resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} 2164 | engines: {node: '>=6'} 2165 | 2166 | yoctocolors-cjs@2.1.2: 2167 | resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} 2168 | engines: {node: '>=18'} 2169 | 2170 | snapshots: 2171 | 2172 | '@ampproject/remapping@2.3.0': 2173 | dependencies: 2174 | '@jridgewell/gen-mapping': 0.3.5 2175 | '@jridgewell/trace-mapping': 0.3.25 2176 | 2177 | '@ast-grep/cli-darwin-arm64@0.25.7': 2178 | optional: true 2179 | 2180 | '@ast-grep/cli-darwin-x64@0.25.7': 2181 | optional: true 2182 | 2183 | '@ast-grep/cli-linux-arm64-gnu@0.25.7': 2184 | optional: true 2185 | 2186 | '@ast-grep/cli-linux-x64-gnu@0.25.7': 2187 | optional: true 2188 | 2189 | '@ast-grep/cli-win32-arm64-msvc@0.25.7': 2190 | optional: true 2191 | 2192 | '@ast-grep/cli-win32-ia32-msvc@0.25.7': 2193 | optional: true 2194 | 2195 | '@ast-grep/cli-win32-x64-msvc@0.25.7': 2196 | optional: true 2197 | 2198 | '@ast-grep/cli@0.25.7': 2199 | dependencies: 2200 | detect-libc: 2.0.3 2201 | optionalDependencies: 2202 | '@ast-grep/cli-darwin-arm64': 0.25.7 2203 | '@ast-grep/cli-darwin-x64': 0.25.7 2204 | '@ast-grep/cli-linux-arm64-gnu': 0.25.7 2205 | '@ast-grep/cli-linux-x64-gnu': 0.25.7 2206 | '@ast-grep/cli-win32-arm64-msvc': 0.25.7 2207 | '@ast-grep/cli-win32-ia32-msvc': 0.25.7 2208 | '@ast-grep/cli-win32-x64-msvc': 0.25.7 2209 | 2210 | '@ast-grep/napi-darwin-arm64@0.25.7': 2211 | optional: true 2212 | 2213 | '@ast-grep/napi-darwin-x64@0.25.7': 2214 | optional: true 2215 | 2216 | '@ast-grep/napi-linux-arm64-gnu@0.25.7': 2217 | optional: true 2218 | 2219 | '@ast-grep/napi-linux-arm64-musl@0.25.7': 2220 | optional: true 2221 | 2222 | '@ast-grep/napi-linux-x64-gnu@0.25.7': 2223 | optional: true 2224 | 2225 | '@ast-grep/napi-linux-x64-musl@0.25.7': 2226 | optional: true 2227 | 2228 | '@ast-grep/napi-win32-arm64-msvc@0.25.7': 2229 | optional: true 2230 | 2231 | '@ast-grep/napi-win32-ia32-msvc@0.25.7': 2232 | optional: true 2233 | 2234 | '@ast-grep/napi-win32-x64-msvc@0.25.7': 2235 | optional: true 2236 | 2237 | '@ast-grep/napi@0.25.7': 2238 | optionalDependencies: 2239 | '@ast-grep/napi-darwin-arm64': 0.25.7 2240 | '@ast-grep/napi-darwin-x64': 0.25.7 2241 | '@ast-grep/napi-linux-arm64-gnu': 0.25.7 2242 | '@ast-grep/napi-linux-arm64-musl': 0.25.7 2243 | '@ast-grep/napi-linux-x64-gnu': 0.25.7 2244 | '@ast-grep/napi-linux-x64-musl': 0.25.7 2245 | '@ast-grep/napi-win32-arm64-msvc': 0.25.7 2246 | '@ast-grep/napi-win32-ia32-msvc': 0.25.7 2247 | '@ast-grep/napi-win32-x64-msvc': 0.25.7 2248 | 2249 | '@babel/code-frame@7.26.2': 2250 | dependencies: 2251 | '@babel/helper-validator-identifier': 7.25.9 2252 | js-tokens: 4.0.0 2253 | picocolors: 1.1.1 2254 | 2255 | '@babel/compat-data@7.26.2': {} 2256 | 2257 | '@babel/core@7.26.0': 2258 | dependencies: 2259 | '@ampproject/remapping': 2.3.0 2260 | '@babel/code-frame': 7.26.2 2261 | '@babel/generator': 7.26.2 2262 | '@babel/helper-compilation-targets': 7.25.9 2263 | '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) 2264 | '@babel/helpers': 7.26.0 2265 | '@babel/parser': 7.26.2 2266 | '@babel/template': 7.25.9 2267 | '@babel/traverse': 7.25.9 2268 | '@babel/types': 7.26.0 2269 | convert-source-map: 2.0.0 2270 | debug: 4.3.7 2271 | gensync: 1.0.0-beta.2 2272 | json5: 2.2.3 2273 | semver: 6.3.1 2274 | transitivePeerDependencies: 2275 | - supports-color 2276 | 2277 | '@babel/generator@7.26.2': 2278 | dependencies: 2279 | '@babel/parser': 7.26.2 2280 | '@babel/types': 7.26.0 2281 | '@jridgewell/gen-mapping': 0.3.5 2282 | '@jridgewell/trace-mapping': 0.3.25 2283 | jsesc: 3.0.2 2284 | 2285 | '@babel/helper-annotate-as-pure@7.25.9': 2286 | dependencies: 2287 | '@babel/types': 7.26.0 2288 | 2289 | '@babel/helper-compilation-targets@7.25.9': 2290 | dependencies: 2291 | '@babel/compat-data': 7.26.2 2292 | '@babel/helper-validator-option': 7.25.9 2293 | browserslist: 4.24.2 2294 | lru-cache: 5.1.1 2295 | semver: 6.3.1 2296 | 2297 | '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': 2298 | dependencies: 2299 | '@babel/core': 7.26.0 2300 | '@babel/helper-annotate-as-pure': 7.25.9 2301 | '@babel/helper-member-expression-to-functions': 7.25.9 2302 | '@babel/helper-optimise-call-expression': 7.25.9 2303 | '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) 2304 | '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 2305 | '@babel/traverse': 7.25.9 2306 | semver: 6.3.1 2307 | transitivePeerDependencies: 2308 | - supports-color 2309 | 2310 | '@babel/helper-member-expression-to-functions@7.25.9': 2311 | dependencies: 2312 | '@babel/traverse': 7.25.9 2313 | '@babel/types': 7.26.0 2314 | transitivePeerDependencies: 2315 | - supports-color 2316 | 2317 | '@babel/helper-module-imports@7.25.9': 2318 | dependencies: 2319 | '@babel/traverse': 7.25.9 2320 | '@babel/types': 7.26.0 2321 | transitivePeerDependencies: 2322 | - supports-color 2323 | 2324 | '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': 2325 | dependencies: 2326 | '@babel/core': 7.26.0 2327 | '@babel/helper-module-imports': 7.25.9 2328 | '@babel/helper-validator-identifier': 7.25.9 2329 | '@babel/traverse': 7.25.9 2330 | transitivePeerDependencies: 2331 | - supports-color 2332 | 2333 | '@babel/helper-optimise-call-expression@7.25.9': 2334 | dependencies: 2335 | '@babel/types': 7.26.0 2336 | 2337 | '@babel/helper-plugin-utils@7.25.9': {} 2338 | 2339 | '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': 2340 | dependencies: 2341 | '@babel/core': 7.26.0 2342 | '@babel/helper-member-expression-to-functions': 7.25.9 2343 | '@babel/helper-optimise-call-expression': 7.25.9 2344 | '@babel/traverse': 7.25.9 2345 | transitivePeerDependencies: 2346 | - supports-color 2347 | 2348 | '@babel/helper-simple-access@7.25.9': 2349 | dependencies: 2350 | '@babel/traverse': 7.25.9 2351 | '@babel/types': 7.26.0 2352 | transitivePeerDependencies: 2353 | - supports-color 2354 | 2355 | '@babel/helper-skip-transparent-expression-wrappers@7.25.9': 2356 | dependencies: 2357 | '@babel/traverse': 7.25.9 2358 | '@babel/types': 7.26.0 2359 | transitivePeerDependencies: 2360 | - supports-color 2361 | 2362 | '@babel/helper-string-parser@7.25.9': {} 2363 | 2364 | '@babel/helper-validator-identifier@7.25.9': {} 2365 | 2366 | '@babel/helper-validator-option@7.25.9': {} 2367 | 2368 | '@babel/helpers@7.26.0': 2369 | dependencies: 2370 | '@babel/template': 7.25.9 2371 | '@babel/types': 7.26.0 2372 | 2373 | '@babel/parser@7.26.2': 2374 | dependencies: 2375 | '@babel/types': 7.26.0 2376 | 2377 | '@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0)': 2378 | dependencies: 2379 | '@babel/core': 7.26.0 2380 | '@babel/helper-plugin-utils': 7.25.9 2381 | 2382 | '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': 2383 | dependencies: 2384 | '@babel/core': 7.26.0 2385 | '@babel/helper-plugin-utils': 7.25.9 2386 | 2387 | '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': 2388 | dependencies: 2389 | '@babel/core': 7.26.0 2390 | '@babel/helper-plugin-utils': 7.25.9 2391 | 2392 | '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)': 2393 | dependencies: 2394 | '@babel/core': 7.26.0 2395 | '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) 2396 | '@babel/helper-plugin-utils': 7.25.9 2397 | transitivePeerDependencies: 2398 | - supports-color 2399 | 2400 | '@babel/plugin-transform-flow-strip-types@7.25.9(@babel/core@7.26.0)': 2401 | dependencies: 2402 | '@babel/core': 7.26.0 2403 | '@babel/helper-plugin-utils': 7.25.9 2404 | '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.0) 2405 | 2406 | '@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.26.0)': 2407 | dependencies: 2408 | '@babel/core': 7.26.0 2409 | '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) 2410 | '@babel/helper-plugin-utils': 7.25.9 2411 | '@babel/helper-simple-access': 7.25.9 2412 | transitivePeerDependencies: 2413 | - supports-color 2414 | 2415 | '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)': 2416 | dependencies: 2417 | '@babel/core': 7.26.0 2418 | '@babel/helper-plugin-utils': 7.25.9 2419 | 2420 | '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)': 2421 | dependencies: 2422 | '@babel/core': 7.26.0 2423 | '@babel/helper-plugin-utils': 7.25.9 2424 | '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 2425 | transitivePeerDependencies: 2426 | - supports-color 2427 | 2428 | '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)': 2429 | dependencies: 2430 | '@babel/core': 7.26.0 2431 | '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) 2432 | '@babel/helper-plugin-utils': 7.25.9 2433 | transitivePeerDependencies: 2434 | - supports-color 2435 | 2436 | '@babel/plugin-transform-typescript@7.25.9(@babel/core@7.26.0)': 2437 | dependencies: 2438 | '@babel/core': 7.26.0 2439 | '@babel/helper-annotate-as-pure': 7.25.9 2440 | '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) 2441 | '@babel/helper-plugin-utils': 7.25.9 2442 | '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 2443 | '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) 2444 | transitivePeerDependencies: 2445 | - supports-color 2446 | 2447 | '@babel/preset-flow@7.25.9(@babel/core@7.26.0)': 2448 | dependencies: 2449 | '@babel/core': 7.26.0 2450 | '@babel/helper-plugin-utils': 7.25.9 2451 | '@babel/helper-validator-option': 7.25.9 2452 | '@babel/plugin-transform-flow-strip-types': 7.25.9(@babel/core@7.26.0) 2453 | 2454 | '@babel/preset-typescript@7.26.0(@babel/core@7.26.0)': 2455 | dependencies: 2456 | '@babel/core': 7.26.0 2457 | '@babel/helper-plugin-utils': 7.25.9 2458 | '@babel/helper-validator-option': 7.25.9 2459 | '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) 2460 | '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) 2461 | '@babel/plugin-transform-typescript': 7.25.9(@babel/core@7.26.0) 2462 | transitivePeerDependencies: 2463 | - supports-color 2464 | 2465 | '@babel/register@7.25.9(@babel/core@7.26.0)': 2466 | dependencies: 2467 | '@babel/core': 7.26.0 2468 | clone-deep: 4.0.1 2469 | find-cache-dir: 2.1.0 2470 | make-dir: 2.1.0 2471 | pirates: 4.0.6 2472 | source-map-support: 0.5.21 2473 | 2474 | '@babel/template@7.25.9': 2475 | dependencies: 2476 | '@babel/code-frame': 7.26.2 2477 | '@babel/parser': 7.26.2 2478 | '@babel/types': 7.26.0 2479 | 2480 | '@babel/traverse@7.25.9': 2481 | dependencies: 2482 | '@babel/code-frame': 7.26.2 2483 | '@babel/generator': 7.26.2 2484 | '@babel/parser': 7.26.2 2485 | '@babel/template': 7.25.9 2486 | '@babel/types': 7.26.0 2487 | debug: 4.3.7 2488 | globals: 11.12.0 2489 | transitivePeerDependencies: 2490 | - supports-color 2491 | 2492 | '@babel/types@7.26.0': 2493 | dependencies: 2494 | '@babel/helper-string-parser': 7.25.9 2495 | '@babel/helper-validator-identifier': 7.25.9 2496 | 2497 | '@bcoe/v8-coverage@0.2.3': {} 2498 | 2499 | '@codemod.com/codemod-utils@1.0.0': 2500 | dependencies: 2501 | '@babel/parser': 7.26.2 2502 | '@types/jscodeshift': 0.11.11 2503 | jscodeshift: 0.16.1 2504 | transitivePeerDependencies: 2505 | - '@babel/preset-env' 2506 | - supports-color 2507 | 2508 | '@codemod.com/workflow@0.0.31': 2509 | dependencies: 2510 | '@ast-grep/cli': 0.25.7 2511 | '@ast-grep/napi': 0.25.7 2512 | '@octokit/rest': 20.1.1 2513 | '@sindresorhus/slugify': 2.2.1 2514 | '@types/jscodeshift': 0.11.11 2515 | colors-cli: 1.0.33 2516 | detect-indent: 7.0.1 2517 | detect-newline: 4.0.1 2518 | diff: 5.2.0 2519 | filenamify: 6.0.0 2520 | git-url-parse: 14.1.0 2521 | glob: 10.4.5 2522 | inquirer: 9.3.7 2523 | jscodeshift: 0.15.2 2524 | lodash-es: 4.17.21 2525 | magic-string: 0.30.12 2526 | openai: 4.23.0 2527 | prettier: 3.3.3 2528 | simple-git: 3.27.0 2529 | tree-kill: 1.2.2 2530 | ts-invariant: 0.10.3 2531 | yaml: 2.6.0 2532 | transitivePeerDependencies: 2533 | - '@babel/preset-env' 2534 | - encoding 2535 | - supports-color 2536 | 2537 | '@cspotcode/source-map-support@0.8.1': 2538 | dependencies: 2539 | '@jridgewell/trace-mapping': 0.3.9 2540 | 2541 | '@esbuild/aix-ppc64@0.21.5': 2542 | optional: true 2543 | 2544 | '@esbuild/aix-ppc64@0.23.1': 2545 | optional: true 2546 | 2547 | '@esbuild/aix-ppc64@0.24.0': 2548 | optional: true 2549 | 2550 | '@esbuild/android-arm64@0.21.5': 2551 | optional: true 2552 | 2553 | '@esbuild/android-arm64@0.23.1': 2554 | optional: true 2555 | 2556 | '@esbuild/android-arm64@0.24.0': 2557 | optional: true 2558 | 2559 | '@esbuild/android-arm@0.21.5': 2560 | optional: true 2561 | 2562 | '@esbuild/android-arm@0.23.1': 2563 | optional: true 2564 | 2565 | '@esbuild/android-arm@0.24.0': 2566 | optional: true 2567 | 2568 | '@esbuild/android-x64@0.21.5': 2569 | optional: true 2570 | 2571 | '@esbuild/android-x64@0.23.1': 2572 | optional: true 2573 | 2574 | '@esbuild/android-x64@0.24.0': 2575 | optional: true 2576 | 2577 | '@esbuild/darwin-arm64@0.21.5': 2578 | optional: true 2579 | 2580 | '@esbuild/darwin-arm64@0.23.1': 2581 | optional: true 2582 | 2583 | '@esbuild/darwin-arm64@0.24.0': 2584 | optional: true 2585 | 2586 | '@esbuild/darwin-x64@0.21.5': 2587 | optional: true 2588 | 2589 | '@esbuild/darwin-x64@0.23.1': 2590 | optional: true 2591 | 2592 | '@esbuild/darwin-x64@0.24.0': 2593 | optional: true 2594 | 2595 | '@esbuild/freebsd-arm64@0.21.5': 2596 | optional: true 2597 | 2598 | '@esbuild/freebsd-arm64@0.23.1': 2599 | optional: true 2600 | 2601 | '@esbuild/freebsd-arm64@0.24.0': 2602 | optional: true 2603 | 2604 | '@esbuild/freebsd-x64@0.21.5': 2605 | optional: true 2606 | 2607 | '@esbuild/freebsd-x64@0.23.1': 2608 | optional: true 2609 | 2610 | '@esbuild/freebsd-x64@0.24.0': 2611 | optional: true 2612 | 2613 | '@esbuild/linux-arm64@0.21.5': 2614 | optional: true 2615 | 2616 | '@esbuild/linux-arm64@0.23.1': 2617 | optional: true 2618 | 2619 | '@esbuild/linux-arm64@0.24.0': 2620 | optional: true 2621 | 2622 | '@esbuild/linux-arm@0.21.5': 2623 | optional: true 2624 | 2625 | '@esbuild/linux-arm@0.23.1': 2626 | optional: true 2627 | 2628 | '@esbuild/linux-arm@0.24.0': 2629 | optional: true 2630 | 2631 | '@esbuild/linux-ia32@0.21.5': 2632 | optional: true 2633 | 2634 | '@esbuild/linux-ia32@0.23.1': 2635 | optional: true 2636 | 2637 | '@esbuild/linux-ia32@0.24.0': 2638 | optional: true 2639 | 2640 | '@esbuild/linux-loong64@0.21.5': 2641 | optional: true 2642 | 2643 | '@esbuild/linux-loong64@0.23.1': 2644 | optional: true 2645 | 2646 | '@esbuild/linux-loong64@0.24.0': 2647 | optional: true 2648 | 2649 | '@esbuild/linux-mips64el@0.21.5': 2650 | optional: true 2651 | 2652 | '@esbuild/linux-mips64el@0.23.1': 2653 | optional: true 2654 | 2655 | '@esbuild/linux-mips64el@0.24.0': 2656 | optional: true 2657 | 2658 | '@esbuild/linux-ppc64@0.21.5': 2659 | optional: true 2660 | 2661 | '@esbuild/linux-ppc64@0.23.1': 2662 | optional: true 2663 | 2664 | '@esbuild/linux-ppc64@0.24.0': 2665 | optional: true 2666 | 2667 | '@esbuild/linux-riscv64@0.21.5': 2668 | optional: true 2669 | 2670 | '@esbuild/linux-riscv64@0.23.1': 2671 | optional: true 2672 | 2673 | '@esbuild/linux-riscv64@0.24.0': 2674 | optional: true 2675 | 2676 | '@esbuild/linux-s390x@0.21.5': 2677 | optional: true 2678 | 2679 | '@esbuild/linux-s390x@0.23.1': 2680 | optional: true 2681 | 2682 | '@esbuild/linux-s390x@0.24.0': 2683 | optional: true 2684 | 2685 | '@esbuild/linux-x64@0.21.5': 2686 | optional: true 2687 | 2688 | '@esbuild/linux-x64@0.23.1': 2689 | optional: true 2690 | 2691 | '@esbuild/linux-x64@0.24.0': 2692 | optional: true 2693 | 2694 | '@esbuild/netbsd-x64@0.21.5': 2695 | optional: true 2696 | 2697 | '@esbuild/netbsd-x64@0.23.1': 2698 | optional: true 2699 | 2700 | '@esbuild/netbsd-x64@0.24.0': 2701 | optional: true 2702 | 2703 | '@esbuild/openbsd-arm64@0.23.1': 2704 | optional: true 2705 | 2706 | '@esbuild/openbsd-arm64@0.24.0': 2707 | optional: true 2708 | 2709 | '@esbuild/openbsd-x64@0.21.5': 2710 | optional: true 2711 | 2712 | '@esbuild/openbsd-x64@0.23.1': 2713 | optional: true 2714 | 2715 | '@esbuild/openbsd-x64@0.24.0': 2716 | optional: true 2717 | 2718 | '@esbuild/sunos-x64@0.21.5': 2719 | optional: true 2720 | 2721 | '@esbuild/sunos-x64@0.23.1': 2722 | optional: true 2723 | 2724 | '@esbuild/sunos-x64@0.24.0': 2725 | optional: true 2726 | 2727 | '@esbuild/win32-arm64@0.21.5': 2728 | optional: true 2729 | 2730 | '@esbuild/win32-arm64@0.23.1': 2731 | optional: true 2732 | 2733 | '@esbuild/win32-arm64@0.24.0': 2734 | optional: true 2735 | 2736 | '@esbuild/win32-ia32@0.21.5': 2737 | optional: true 2738 | 2739 | '@esbuild/win32-ia32@0.23.1': 2740 | optional: true 2741 | 2742 | '@esbuild/win32-ia32@0.24.0': 2743 | optional: true 2744 | 2745 | '@esbuild/win32-x64@0.21.5': 2746 | optional: true 2747 | 2748 | '@esbuild/win32-x64@0.23.1': 2749 | optional: true 2750 | 2751 | '@esbuild/win32-x64@0.24.0': 2752 | optional: true 2753 | 2754 | '@inquirer/figures@1.0.7': {} 2755 | 2756 | '@isaacs/cliui@8.0.2': 2757 | dependencies: 2758 | string-width: 5.1.2 2759 | string-width-cjs: string-width@4.2.3 2760 | strip-ansi: 7.1.0 2761 | strip-ansi-cjs: strip-ansi@6.0.1 2762 | wrap-ansi: 8.1.0 2763 | wrap-ansi-cjs: wrap-ansi@7.0.0 2764 | 2765 | '@istanbuljs/schema@0.1.3': {} 2766 | 2767 | '@jridgewell/gen-mapping@0.3.5': 2768 | dependencies: 2769 | '@jridgewell/set-array': 1.2.1 2770 | '@jridgewell/sourcemap-codec': 1.5.0 2771 | '@jridgewell/trace-mapping': 0.3.25 2772 | 2773 | '@jridgewell/resolve-uri@3.1.2': {} 2774 | 2775 | '@jridgewell/set-array@1.2.1': {} 2776 | 2777 | '@jridgewell/sourcemap-codec@1.5.0': {} 2778 | 2779 | '@jridgewell/trace-mapping@0.3.25': 2780 | dependencies: 2781 | '@jridgewell/resolve-uri': 3.1.2 2782 | '@jridgewell/sourcemap-codec': 1.5.0 2783 | 2784 | '@jridgewell/trace-mapping@0.3.9': 2785 | dependencies: 2786 | '@jridgewell/resolve-uri': 3.1.2 2787 | '@jridgewell/sourcemap-codec': 1.5.0 2788 | 2789 | '@kwsites/file-exists@1.1.1': 2790 | dependencies: 2791 | debug: 4.3.7 2792 | transitivePeerDependencies: 2793 | - supports-color 2794 | 2795 | '@kwsites/promise-deferred@1.1.1': {} 2796 | 2797 | '@octokit/auth-token@4.0.0': {} 2798 | 2799 | '@octokit/core@5.2.0': 2800 | dependencies: 2801 | '@octokit/auth-token': 4.0.0 2802 | '@octokit/graphql': 7.1.0 2803 | '@octokit/request': 8.4.0 2804 | '@octokit/request-error': 5.1.0 2805 | '@octokit/types': 13.6.1 2806 | before-after-hook: 2.2.3 2807 | universal-user-agent: 6.0.1 2808 | 2809 | '@octokit/endpoint@9.0.5': 2810 | dependencies: 2811 | '@octokit/types': 13.6.1 2812 | universal-user-agent: 6.0.1 2813 | 2814 | '@octokit/graphql@7.1.0': 2815 | dependencies: 2816 | '@octokit/request': 8.4.0 2817 | '@octokit/types': 13.6.1 2818 | universal-user-agent: 6.0.1 2819 | 2820 | '@octokit/openapi-types@22.2.0': {} 2821 | 2822 | '@octokit/plugin-paginate-rest@11.3.1(@octokit/core@5.2.0)': 2823 | dependencies: 2824 | '@octokit/core': 5.2.0 2825 | '@octokit/types': 13.6.1 2826 | 2827 | '@octokit/plugin-request-log@4.0.1(@octokit/core@5.2.0)': 2828 | dependencies: 2829 | '@octokit/core': 5.2.0 2830 | 2831 | '@octokit/plugin-rest-endpoint-methods@13.2.2(@octokit/core@5.2.0)': 2832 | dependencies: 2833 | '@octokit/core': 5.2.0 2834 | '@octokit/types': 13.6.1 2835 | 2836 | '@octokit/request-error@5.1.0': 2837 | dependencies: 2838 | '@octokit/types': 13.6.1 2839 | deprecation: 2.3.1 2840 | once: 1.4.0 2841 | 2842 | '@octokit/request@8.4.0': 2843 | dependencies: 2844 | '@octokit/endpoint': 9.0.5 2845 | '@octokit/request-error': 5.1.0 2846 | '@octokit/types': 13.6.1 2847 | universal-user-agent: 6.0.1 2848 | 2849 | '@octokit/rest@20.1.1': 2850 | dependencies: 2851 | '@octokit/core': 5.2.0 2852 | '@octokit/plugin-paginate-rest': 11.3.1(@octokit/core@5.2.0) 2853 | '@octokit/plugin-request-log': 4.0.1(@octokit/core@5.2.0) 2854 | '@octokit/plugin-rest-endpoint-methods': 13.2.2(@octokit/core@5.2.0) 2855 | 2856 | '@octokit/types@13.6.1': 2857 | dependencies: 2858 | '@octokit/openapi-types': 22.2.0 2859 | 2860 | '@pkgjs/parseargs@0.11.0': 2861 | optional: true 2862 | 2863 | '@rollup/rollup-android-arm-eabi@4.24.4': 2864 | optional: true 2865 | 2866 | '@rollup/rollup-android-arm64@4.24.4': 2867 | optional: true 2868 | 2869 | '@rollup/rollup-darwin-arm64@4.24.4': 2870 | optional: true 2871 | 2872 | '@rollup/rollup-darwin-x64@4.24.4': 2873 | optional: true 2874 | 2875 | '@rollup/rollup-freebsd-arm64@4.24.4': 2876 | optional: true 2877 | 2878 | '@rollup/rollup-freebsd-x64@4.24.4': 2879 | optional: true 2880 | 2881 | '@rollup/rollup-linux-arm-gnueabihf@4.24.4': 2882 | optional: true 2883 | 2884 | '@rollup/rollup-linux-arm-musleabihf@4.24.4': 2885 | optional: true 2886 | 2887 | '@rollup/rollup-linux-arm64-gnu@4.24.4': 2888 | optional: true 2889 | 2890 | '@rollup/rollup-linux-arm64-musl@4.24.4': 2891 | optional: true 2892 | 2893 | '@rollup/rollup-linux-powerpc64le-gnu@4.24.4': 2894 | optional: true 2895 | 2896 | '@rollup/rollup-linux-riscv64-gnu@4.24.4': 2897 | optional: true 2898 | 2899 | '@rollup/rollup-linux-s390x-gnu@4.24.4': 2900 | optional: true 2901 | 2902 | '@rollup/rollup-linux-x64-gnu@4.24.4': 2903 | optional: true 2904 | 2905 | '@rollup/rollup-linux-x64-musl@4.24.4': 2906 | optional: true 2907 | 2908 | '@rollup/rollup-win32-arm64-msvc@4.24.4': 2909 | optional: true 2910 | 2911 | '@rollup/rollup-win32-ia32-msvc@4.24.4': 2912 | optional: true 2913 | 2914 | '@rollup/rollup-win32-x64-msvc@4.24.4': 2915 | optional: true 2916 | 2917 | '@sindresorhus/slugify@2.2.1': 2918 | dependencies: 2919 | '@sindresorhus/transliterate': 1.6.0 2920 | escape-string-regexp: 5.0.0 2921 | 2922 | '@sindresorhus/transliterate@1.6.0': 2923 | dependencies: 2924 | escape-string-regexp: 5.0.0 2925 | 2926 | '@tsconfig/node10@1.0.11': {} 2927 | 2928 | '@tsconfig/node12@1.0.11': {} 2929 | 2930 | '@tsconfig/node14@1.0.3': {} 2931 | 2932 | '@tsconfig/node16@1.0.4': {} 2933 | 2934 | '@types/estree@1.0.6': {} 2935 | 2936 | '@types/jscodeshift@0.11.11': 2937 | dependencies: 2938 | ast-types: 0.14.2 2939 | recast: 0.20.5 2940 | 2941 | '@types/node-fetch@2.6.11': 2942 | dependencies: 2943 | '@types/node': 22.9.0 2944 | form-data: 4.0.1 2945 | 2946 | '@types/node@18.19.64': 2947 | dependencies: 2948 | undici-types: 5.26.5 2949 | 2950 | '@types/node@22.9.0': 2951 | dependencies: 2952 | undici-types: 6.19.8 2953 | 2954 | '@vitest/coverage-v8@2.1.4(vitest@2.1.4(@types/node@22.9.0))': 2955 | dependencies: 2956 | '@ampproject/remapping': 2.3.0 2957 | '@bcoe/v8-coverage': 0.2.3 2958 | debug: 4.3.7 2959 | istanbul-lib-coverage: 3.2.2 2960 | istanbul-lib-report: 3.0.1 2961 | istanbul-lib-source-maps: 5.0.6 2962 | istanbul-reports: 3.1.7 2963 | magic-string: 0.30.12 2964 | magicast: 0.3.5 2965 | std-env: 3.8.0 2966 | test-exclude: 7.0.1 2967 | tinyrainbow: 1.2.0 2968 | vitest: 2.1.4(@types/node@22.9.0) 2969 | transitivePeerDependencies: 2970 | - supports-color 2971 | 2972 | '@vitest/expect@2.1.4': 2973 | dependencies: 2974 | '@vitest/spy': 2.1.4 2975 | '@vitest/utils': 2.1.4 2976 | chai: 5.1.2 2977 | tinyrainbow: 1.2.0 2978 | 2979 | '@vitest/mocker@2.1.4(vite@5.4.10(@types/node@22.9.0))': 2980 | dependencies: 2981 | '@vitest/spy': 2.1.4 2982 | estree-walker: 3.0.3 2983 | magic-string: 0.30.12 2984 | optionalDependencies: 2985 | vite: 5.4.10(@types/node@22.9.0) 2986 | 2987 | '@vitest/pretty-format@2.1.4': 2988 | dependencies: 2989 | tinyrainbow: 1.2.0 2990 | 2991 | '@vitest/runner@2.1.4': 2992 | dependencies: 2993 | '@vitest/utils': 2.1.4 2994 | pathe: 1.1.2 2995 | 2996 | '@vitest/snapshot@2.1.4': 2997 | dependencies: 2998 | '@vitest/pretty-format': 2.1.4 2999 | magic-string: 0.30.12 3000 | pathe: 1.1.2 3001 | 3002 | '@vitest/spy@2.1.4': 3003 | dependencies: 3004 | tinyspy: 3.0.2 3005 | 3006 | '@vitest/utils@2.1.4': 3007 | dependencies: 3008 | '@vitest/pretty-format': 2.1.4 3009 | loupe: 3.1.2 3010 | tinyrainbow: 1.2.0 3011 | 3012 | abort-controller@3.0.0: 3013 | dependencies: 3014 | event-target-shim: 5.0.1 3015 | 3016 | acorn-walk@8.3.4: 3017 | dependencies: 3018 | acorn: 8.14.0 3019 | 3020 | acorn@8.14.0: {} 3021 | 3022 | agentkeepalive@4.5.0: 3023 | dependencies: 3024 | humanize-ms: 1.2.1 3025 | 3026 | ansi-escapes@4.3.2: 3027 | dependencies: 3028 | type-fest: 0.21.3 3029 | 3030 | ansi-regex@5.0.1: {} 3031 | 3032 | ansi-regex@6.1.0: {} 3033 | 3034 | ansi-styles@4.3.0: 3035 | dependencies: 3036 | color-convert: 2.0.1 3037 | 3038 | ansi-styles@6.2.1: {} 3039 | 3040 | arg@4.1.3: {} 3041 | 3042 | assertion-error@2.0.1: {} 3043 | 3044 | ast-types@0.14.2: 3045 | dependencies: 3046 | tslib: 2.8.1 3047 | 3048 | ast-types@0.16.1: 3049 | dependencies: 3050 | tslib: 2.8.1 3051 | 3052 | asynckit@0.4.0: {} 3053 | 3054 | babel-core@7.0.0-bridge.0(@babel/core@7.26.0): 3055 | dependencies: 3056 | '@babel/core': 7.26.0 3057 | 3058 | balanced-match@1.0.2: {} 3059 | 3060 | base-64@0.1.0: {} 3061 | 3062 | base64-js@1.5.1: {} 3063 | 3064 | before-after-hook@2.2.3: {} 3065 | 3066 | bl@4.1.0: 3067 | dependencies: 3068 | buffer: 5.7.1 3069 | inherits: 2.0.4 3070 | readable-stream: 3.6.2 3071 | 3072 | blessed@0.1.81: {} 3073 | 3074 | brace-expansion@1.1.11: 3075 | dependencies: 3076 | balanced-match: 1.0.2 3077 | concat-map: 0.0.1 3078 | 3079 | brace-expansion@2.0.1: 3080 | dependencies: 3081 | balanced-match: 1.0.2 3082 | 3083 | braces@3.0.3: 3084 | dependencies: 3085 | fill-range: 7.1.1 3086 | 3087 | browserslist@4.24.2: 3088 | dependencies: 3089 | caniuse-lite: 1.0.30001679 3090 | electron-to-chromium: 1.5.55 3091 | node-releases: 2.0.18 3092 | update-browserslist-db: 1.1.1(browserslist@4.24.2) 3093 | 3094 | buffer-from@1.1.2: {} 3095 | 3096 | buffer@5.7.1: 3097 | dependencies: 3098 | base64-js: 1.5.1 3099 | ieee754: 1.2.1 3100 | 3101 | cac@6.7.14: {} 3102 | 3103 | caniuse-lite@1.0.30001679: {} 3104 | 3105 | chai@5.1.2: 3106 | dependencies: 3107 | assertion-error: 2.0.1 3108 | check-error: 2.1.1 3109 | deep-eql: 5.0.2 3110 | loupe: 3.1.2 3111 | pathval: 2.0.0 3112 | 3113 | chalk@4.1.2: 3114 | dependencies: 3115 | ansi-styles: 4.3.0 3116 | supports-color: 7.2.0 3117 | 3118 | chardet@0.7.0: {} 3119 | 3120 | charenc@0.0.2: {} 3121 | 3122 | check-error@2.1.1: {} 3123 | 3124 | chownr@1.1.4: {} 3125 | 3126 | cli-cursor@3.1.0: 3127 | dependencies: 3128 | restore-cursor: 3.1.0 3129 | 3130 | cli-spinners@2.9.2: {} 3131 | 3132 | cli-width@4.1.0: {} 3133 | 3134 | clone-deep@4.0.1: 3135 | dependencies: 3136 | is-plain-object: 2.0.4 3137 | kind-of: 6.0.3 3138 | shallow-clone: 3.0.1 3139 | 3140 | clone@1.0.4: {} 3141 | 3142 | codemod@0.14.1: 3143 | dependencies: 3144 | '@ast-grep/cli': 0.25.7 3145 | '@ast-grep/napi': 0.25.7 3146 | '@codemod.com/workflow': 0.0.31 3147 | '@octokit/rest': 20.1.1 3148 | blessed: 0.1.81 3149 | esbuild: 0.23.1 3150 | keytar: 7.9.0 3151 | transitivePeerDependencies: 3152 | - '@babel/preset-env' 3153 | - encoding 3154 | - supports-color 3155 | 3156 | color-convert@2.0.1: 3157 | dependencies: 3158 | color-name: 1.1.4 3159 | 3160 | color-name@1.1.4: {} 3161 | 3162 | colors-cli@1.0.33: {} 3163 | 3164 | combined-stream@1.0.8: 3165 | dependencies: 3166 | delayed-stream: 1.0.0 3167 | 3168 | commondir@1.0.1: {} 3169 | 3170 | concat-map@0.0.1: {} 3171 | 3172 | convert-source-map@2.0.0: {} 3173 | 3174 | create-require@1.1.1: {} 3175 | 3176 | cross-spawn@7.0.5: 3177 | dependencies: 3178 | path-key: 3.1.1 3179 | shebang-command: 2.0.0 3180 | which: 2.0.2 3181 | 3182 | crypt@0.0.2: {} 3183 | 3184 | debug@4.3.7: 3185 | dependencies: 3186 | ms: 2.1.3 3187 | 3188 | decompress-response@6.0.0: 3189 | dependencies: 3190 | mimic-response: 3.1.0 3191 | 3192 | deep-eql@5.0.2: {} 3193 | 3194 | deep-extend@0.6.0: {} 3195 | 3196 | defaults@1.0.4: 3197 | dependencies: 3198 | clone: 1.0.4 3199 | 3200 | delayed-stream@1.0.0: {} 3201 | 3202 | deprecation@2.3.1: {} 3203 | 3204 | detect-indent@7.0.1: {} 3205 | 3206 | detect-libc@2.0.3: {} 3207 | 3208 | detect-newline@4.0.1: {} 3209 | 3210 | diff@4.0.2: {} 3211 | 3212 | diff@5.2.0: {} 3213 | 3214 | digest-fetch@1.3.0: 3215 | dependencies: 3216 | base-64: 0.1.0 3217 | md5: 2.3.0 3218 | 3219 | eastasianwidth@0.2.0: {} 3220 | 3221 | electron-to-chromium@1.5.55: {} 3222 | 3223 | emoji-regex@8.0.0: {} 3224 | 3225 | emoji-regex@9.2.2: {} 3226 | 3227 | end-of-stream@1.4.4: 3228 | dependencies: 3229 | once: 1.4.0 3230 | 3231 | esbuild@0.21.5: 3232 | optionalDependencies: 3233 | '@esbuild/aix-ppc64': 0.21.5 3234 | '@esbuild/android-arm': 0.21.5 3235 | '@esbuild/android-arm64': 0.21.5 3236 | '@esbuild/android-x64': 0.21.5 3237 | '@esbuild/darwin-arm64': 0.21.5 3238 | '@esbuild/darwin-x64': 0.21.5 3239 | '@esbuild/freebsd-arm64': 0.21.5 3240 | '@esbuild/freebsd-x64': 0.21.5 3241 | '@esbuild/linux-arm': 0.21.5 3242 | '@esbuild/linux-arm64': 0.21.5 3243 | '@esbuild/linux-ia32': 0.21.5 3244 | '@esbuild/linux-loong64': 0.21.5 3245 | '@esbuild/linux-mips64el': 0.21.5 3246 | '@esbuild/linux-ppc64': 0.21.5 3247 | '@esbuild/linux-riscv64': 0.21.5 3248 | '@esbuild/linux-s390x': 0.21.5 3249 | '@esbuild/linux-x64': 0.21.5 3250 | '@esbuild/netbsd-x64': 0.21.5 3251 | '@esbuild/openbsd-x64': 0.21.5 3252 | '@esbuild/sunos-x64': 0.21.5 3253 | '@esbuild/win32-arm64': 0.21.5 3254 | '@esbuild/win32-ia32': 0.21.5 3255 | '@esbuild/win32-x64': 0.21.5 3256 | 3257 | esbuild@0.23.1: 3258 | optionalDependencies: 3259 | '@esbuild/aix-ppc64': 0.23.1 3260 | '@esbuild/android-arm': 0.23.1 3261 | '@esbuild/android-arm64': 0.23.1 3262 | '@esbuild/android-x64': 0.23.1 3263 | '@esbuild/darwin-arm64': 0.23.1 3264 | '@esbuild/darwin-x64': 0.23.1 3265 | '@esbuild/freebsd-arm64': 0.23.1 3266 | '@esbuild/freebsd-x64': 0.23.1 3267 | '@esbuild/linux-arm': 0.23.1 3268 | '@esbuild/linux-arm64': 0.23.1 3269 | '@esbuild/linux-ia32': 0.23.1 3270 | '@esbuild/linux-loong64': 0.23.1 3271 | '@esbuild/linux-mips64el': 0.23.1 3272 | '@esbuild/linux-ppc64': 0.23.1 3273 | '@esbuild/linux-riscv64': 0.23.1 3274 | '@esbuild/linux-s390x': 0.23.1 3275 | '@esbuild/linux-x64': 0.23.1 3276 | '@esbuild/netbsd-x64': 0.23.1 3277 | '@esbuild/openbsd-arm64': 0.23.1 3278 | '@esbuild/openbsd-x64': 0.23.1 3279 | '@esbuild/sunos-x64': 0.23.1 3280 | '@esbuild/win32-arm64': 0.23.1 3281 | '@esbuild/win32-ia32': 0.23.1 3282 | '@esbuild/win32-x64': 0.23.1 3283 | 3284 | esbuild@0.24.0: 3285 | optionalDependencies: 3286 | '@esbuild/aix-ppc64': 0.24.0 3287 | '@esbuild/android-arm': 0.24.0 3288 | '@esbuild/android-arm64': 0.24.0 3289 | '@esbuild/android-x64': 0.24.0 3290 | '@esbuild/darwin-arm64': 0.24.0 3291 | '@esbuild/darwin-x64': 0.24.0 3292 | '@esbuild/freebsd-arm64': 0.24.0 3293 | '@esbuild/freebsd-x64': 0.24.0 3294 | '@esbuild/linux-arm': 0.24.0 3295 | '@esbuild/linux-arm64': 0.24.0 3296 | '@esbuild/linux-ia32': 0.24.0 3297 | '@esbuild/linux-loong64': 0.24.0 3298 | '@esbuild/linux-mips64el': 0.24.0 3299 | '@esbuild/linux-ppc64': 0.24.0 3300 | '@esbuild/linux-riscv64': 0.24.0 3301 | '@esbuild/linux-s390x': 0.24.0 3302 | '@esbuild/linux-x64': 0.24.0 3303 | '@esbuild/netbsd-x64': 0.24.0 3304 | '@esbuild/openbsd-arm64': 0.24.0 3305 | '@esbuild/openbsd-x64': 0.24.0 3306 | '@esbuild/sunos-x64': 0.24.0 3307 | '@esbuild/win32-arm64': 0.24.0 3308 | '@esbuild/win32-ia32': 0.24.0 3309 | '@esbuild/win32-x64': 0.24.0 3310 | 3311 | escalade@3.2.0: {} 3312 | 3313 | escape-string-regexp@5.0.0: {} 3314 | 3315 | esprima@4.0.1: {} 3316 | 3317 | estree-walker@3.0.3: 3318 | dependencies: 3319 | '@types/estree': 1.0.6 3320 | 3321 | event-target-shim@5.0.1: {} 3322 | 3323 | expand-template@2.0.3: {} 3324 | 3325 | expect-type@1.1.0: {} 3326 | 3327 | external-editor@3.1.0: 3328 | dependencies: 3329 | chardet: 0.7.0 3330 | iconv-lite: 0.4.24 3331 | tmp: 0.0.33 3332 | 3333 | filename-reserved-regex@3.0.0: {} 3334 | 3335 | filenamify@6.0.0: 3336 | dependencies: 3337 | filename-reserved-regex: 3.0.0 3338 | 3339 | fill-range@7.1.1: 3340 | dependencies: 3341 | to-regex-range: 5.0.1 3342 | 3343 | find-cache-dir@2.1.0: 3344 | dependencies: 3345 | commondir: 1.0.1 3346 | make-dir: 2.1.0 3347 | pkg-dir: 3.0.0 3348 | 3349 | find-up@3.0.0: 3350 | dependencies: 3351 | locate-path: 3.0.0 3352 | 3353 | flow-parser@0.252.0: {} 3354 | 3355 | foreground-child@3.3.0: 3356 | dependencies: 3357 | cross-spawn: 7.0.5 3358 | signal-exit: 4.1.0 3359 | 3360 | form-data-encoder@1.7.2: {} 3361 | 3362 | form-data@4.0.1: 3363 | dependencies: 3364 | asynckit: 0.4.0 3365 | combined-stream: 1.0.8 3366 | mime-types: 2.1.35 3367 | 3368 | formdata-node@4.4.1: 3369 | dependencies: 3370 | node-domexception: 1.0.0 3371 | web-streams-polyfill: 4.0.0-beta.3 3372 | 3373 | fs-constants@1.0.0: {} 3374 | 3375 | fs.realpath@1.0.0: {} 3376 | 3377 | fsevents@2.3.3: 3378 | optional: true 3379 | 3380 | gensync@1.0.0-beta.2: {} 3381 | 3382 | git-up@7.0.0: 3383 | dependencies: 3384 | is-ssh: 1.4.0 3385 | parse-url: 8.1.0 3386 | 3387 | git-url-parse@14.1.0: 3388 | dependencies: 3389 | git-up: 7.0.0 3390 | 3391 | github-from-package@0.0.0: {} 3392 | 3393 | glob@10.4.5: 3394 | dependencies: 3395 | foreground-child: 3.3.0 3396 | jackspeak: 3.4.3 3397 | minimatch: 9.0.5 3398 | minipass: 7.1.2 3399 | package-json-from-dist: 1.0.1 3400 | path-scurry: 1.11.1 3401 | 3402 | glob@7.2.3: 3403 | dependencies: 3404 | fs.realpath: 1.0.0 3405 | inflight: 1.0.6 3406 | inherits: 2.0.4 3407 | minimatch: 3.1.2 3408 | once: 1.4.0 3409 | path-is-absolute: 1.0.1 3410 | 3411 | globals@11.12.0: {} 3412 | 3413 | graceful-fs@4.2.11: {} 3414 | 3415 | has-flag@4.0.0: {} 3416 | 3417 | html-escaper@2.0.2: {} 3418 | 3419 | humanize-ms@1.2.1: 3420 | dependencies: 3421 | ms: 2.1.3 3422 | 3423 | iconv-lite@0.4.24: 3424 | dependencies: 3425 | safer-buffer: 2.1.2 3426 | 3427 | ieee754@1.2.1: {} 3428 | 3429 | imurmurhash@0.1.4: {} 3430 | 3431 | inflight@1.0.6: 3432 | dependencies: 3433 | once: 1.4.0 3434 | wrappy: 1.0.2 3435 | 3436 | inherits@2.0.4: {} 3437 | 3438 | ini@1.3.8: {} 3439 | 3440 | inquirer@9.3.7: 3441 | dependencies: 3442 | '@inquirer/figures': 1.0.7 3443 | ansi-escapes: 4.3.2 3444 | cli-width: 4.1.0 3445 | external-editor: 3.1.0 3446 | mute-stream: 1.0.0 3447 | ora: 5.4.1 3448 | run-async: 3.0.0 3449 | rxjs: 7.8.1 3450 | string-width: 4.2.3 3451 | strip-ansi: 6.0.1 3452 | wrap-ansi: 6.2.0 3453 | yoctocolors-cjs: 2.1.2 3454 | 3455 | is-buffer@1.1.6: {} 3456 | 3457 | is-fullwidth-code-point@3.0.0: {} 3458 | 3459 | is-interactive@1.0.0: {} 3460 | 3461 | is-number@7.0.0: {} 3462 | 3463 | is-plain-object@2.0.4: 3464 | dependencies: 3465 | isobject: 3.0.1 3466 | 3467 | is-ssh@1.4.0: 3468 | dependencies: 3469 | protocols: 2.0.1 3470 | 3471 | is-unicode-supported@0.1.0: {} 3472 | 3473 | isexe@2.0.0: {} 3474 | 3475 | isobject@3.0.1: {} 3476 | 3477 | istanbul-lib-coverage@3.2.2: {} 3478 | 3479 | istanbul-lib-report@3.0.1: 3480 | dependencies: 3481 | istanbul-lib-coverage: 3.2.2 3482 | make-dir: 4.0.0 3483 | supports-color: 7.2.0 3484 | 3485 | istanbul-lib-source-maps@5.0.6: 3486 | dependencies: 3487 | '@jridgewell/trace-mapping': 0.3.25 3488 | debug: 4.3.7 3489 | istanbul-lib-coverage: 3.2.2 3490 | transitivePeerDependencies: 3491 | - supports-color 3492 | 3493 | istanbul-reports@3.1.7: 3494 | dependencies: 3495 | html-escaper: 2.0.2 3496 | istanbul-lib-report: 3.0.1 3497 | 3498 | jackspeak@3.4.3: 3499 | dependencies: 3500 | '@isaacs/cliui': 8.0.2 3501 | optionalDependencies: 3502 | '@pkgjs/parseargs': 0.11.0 3503 | 3504 | js-tokens@4.0.0: {} 3505 | 3506 | jscodeshift@0.15.2: 3507 | dependencies: 3508 | '@babel/core': 7.26.0 3509 | '@babel/parser': 7.26.2 3510 | '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) 3511 | '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) 3512 | '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) 3513 | '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) 3514 | '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) 3515 | '@babel/preset-flow': 7.25.9(@babel/core@7.26.0) 3516 | '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) 3517 | '@babel/register': 7.25.9(@babel/core@7.26.0) 3518 | babel-core: 7.0.0-bridge.0(@babel/core@7.26.0) 3519 | chalk: 4.1.2 3520 | flow-parser: 0.252.0 3521 | graceful-fs: 4.2.11 3522 | micromatch: 4.0.8 3523 | neo-async: 2.6.2 3524 | node-dir: 0.1.17 3525 | recast: 0.23.9 3526 | temp: 0.8.4 3527 | write-file-atomic: 2.4.3 3528 | transitivePeerDependencies: 3529 | - supports-color 3530 | 3531 | jscodeshift@0.16.1: 3532 | dependencies: 3533 | '@babel/core': 7.26.0 3534 | '@babel/parser': 7.26.2 3535 | '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) 3536 | '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) 3537 | '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) 3538 | '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) 3539 | '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) 3540 | '@babel/preset-flow': 7.25.9(@babel/core@7.26.0) 3541 | '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) 3542 | '@babel/register': 7.25.9(@babel/core@7.26.0) 3543 | chalk: 4.1.2 3544 | flow-parser: 0.252.0 3545 | graceful-fs: 4.2.11 3546 | micromatch: 4.0.8 3547 | neo-async: 2.6.2 3548 | node-dir: 0.1.17 3549 | recast: 0.23.9 3550 | temp: 0.9.4 3551 | write-file-atomic: 5.0.1 3552 | transitivePeerDependencies: 3553 | - supports-color 3554 | 3555 | jscodeshift@17.1.1: 3556 | dependencies: 3557 | '@babel/core': 7.26.0 3558 | '@babel/parser': 7.26.2 3559 | '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) 3560 | '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) 3561 | '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) 3562 | '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) 3563 | '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) 3564 | '@babel/preset-flow': 7.25.9(@babel/core@7.26.0) 3565 | '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) 3566 | '@babel/register': 7.25.9(@babel/core@7.26.0) 3567 | flow-parser: 0.252.0 3568 | graceful-fs: 4.2.11 3569 | micromatch: 4.0.8 3570 | neo-async: 2.6.2 3571 | picocolors: 1.1.1 3572 | recast: 0.23.9 3573 | tmp: 0.2.3 3574 | write-file-atomic: 5.0.1 3575 | transitivePeerDependencies: 3576 | - supports-color 3577 | 3578 | jsesc@3.0.2: {} 3579 | 3580 | json5@2.2.3: {} 3581 | 3582 | keytar@7.9.0: 3583 | dependencies: 3584 | node-addon-api: 4.3.0 3585 | prebuild-install: 7.1.2 3586 | 3587 | kind-of@6.0.3: {} 3588 | 3589 | locate-path@3.0.0: 3590 | dependencies: 3591 | p-locate: 3.0.0 3592 | path-exists: 3.0.0 3593 | 3594 | lodash-es@4.17.21: {} 3595 | 3596 | log-symbols@4.1.0: 3597 | dependencies: 3598 | chalk: 4.1.2 3599 | is-unicode-supported: 0.1.0 3600 | 3601 | loupe@3.1.2: {} 3602 | 3603 | lru-cache@10.4.3: {} 3604 | 3605 | lru-cache@5.1.1: 3606 | dependencies: 3607 | yallist: 3.1.1 3608 | 3609 | magic-string@0.30.12: 3610 | dependencies: 3611 | '@jridgewell/sourcemap-codec': 1.5.0 3612 | 3613 | magicast@0.3.5: 3614 | dependencies: 3615 | '@babel/parser': 7.26.2 3616 | '@babel/types': 7.26.0 3617 | source-map-js: 1.2.1 3618 | 3619 | make-dir@2.1.0: 3620 | dependencies: 3621 | pify: 4.0.1 3622 | semver: 5.7.2 3623 | 3624 | make-dir@4.0.0: 3625 | dependencies: 3626 | semver: 7.6.3 3627 | 3628 | make-error@1.3.6: {} 3629 | 3630 | md5@2.3.0: 3631 | dependencies: 3632 | charenc: 0.0.2 3633 | crypt: 0.0.2 3634 | is-buffer: 1.1.6 3635 | 3636 | micromatch@4.0.8: 3637 | dependencies: 3638 | braces: 3.0.3 3639 | picomatch: 2.3.1 3640 | 3641 | mime-db@1.52.0: {} 3642 | 3643 | mime-types@2.1.35: 3644 | dependencies: 3645 | mime-db: 1.52.0 3646 | 3647 | mimic-fn@2.1.0: {} 3648 | 3649 | mimic-response@3.1.0: {} 3650 | 3651 | minimatch@3.1.2: 3652 | dependencies: 3653 | brace-expansion: 1.1.11 3654 | 3655 | minimatch@9.0.5: 3656 | dependencies: 3657 | brace-expansion: 2.0.1 3658 | 3659 | minimist@1.2.8: {} 3660 | 3661 | minipass@7.1.2: {} 3662 | 3663 | mkdirp-classic@0.5.3: {} 3664 | 3665 | mkdirp@0.5.6: 3666 | dependencies: 3667 | minimist: 1.2.8 3668 | 3669 | ms@2.1.3: {} 3670 | 3671 | mute-stream@1.0.0: {} 3672 | 3673 | nanoid@3.3.7: {} 3674 | 3675 | napi-build-utils@1.0.2: {} 3676 | 3677 | neo-async@2.6.2: {} 3678 | 3679 | node-abi@3.71.0: 3680 | dependencies: 3681 | semver: 7.6.3 3682 | 3683 | node-addon-api@4.3.0: {} 3684 | 3685 | node-dir@0.1.17: 3686 | dependencies: 3687 | minimatch: 3.1.2 3688 | 3689 | node-domexception@1.0.0: {} 3690 | 3691 | node-fetch@2.7.0: 3692 | dependencies: 3693 | whatwg-url: 5.0.0 3694 | 3695 | node-releases@2.0.18: {} 3696 | 3697 | once@1.4.0: 3698 | dependencies: 3699 | wrappy: 1.0.2 3700 | 3701 | onetime@5.1.2: 3702 | dependencies: 3703 | mimic-fn: 2.1.0 3704 | 3705 | openai@4.23.0: 3706 | dependencies: 3707 | '@types/node': 18.19.64 3708 | '@types/node-fetch': 2.6.11 3709 | abort-controller: 3.0.0 3710 | agentkeepalive: 4.5.0 3711 | digest-fetch: 1.3.0 3712 | form-data-encoder: 1.7.2 3713 | formdata-node: 4.4.1 3714 | node-fetch: 2.7.0 3715 | web-streams-polyfill: 3.3.3 3716 | transitivePeerDependencies: 3717 | - encoding 3718 | 3719 | ora@5.4.1: 3720 | dependencies: 3721 | bl: 4.1.0 3722 | chalk: 4.1.2 3723 | cli-cursor: 3.1.0 3724 | cli-spinners: 2.9.2 3725 | is-interactive: 1.0.0 3726 | is-unicode-supported: 0.1.0 3727 | log-symbols: 4.1.0 3728 | strip-ansi: 6.0.1 3729 | wcwidth: 1.0.1 3730 | 3731 | os-tmpdir@1.0.2: {} 3732 | 3733 | p-limit@2.3.0: 3734 | dependencies: 3735 | p-try: 2.2.0 3736 | 3737 | p-locate@3.0.0: 3738 | dependencies: 3739 | p-limit: 2.3.0 3740 | 3741 | p-try@2.2.0: {} 3742 | 3743 | package-json-from-dist@1.0.1: {} 3744 | 3745 | parse-path@7.0.0: 3746 | dependencies: 3747 | protocols: 2.0.1 3748 | 3749 | parse-url@8.1.0: 3750 | dependencies: 3751 | parse-path: 7.0.0 3752 | 3753 | path-exists@3.0.0: {} 3754 | 3755 | path-is-absolute@1.0.1: {} 3756 | 3757 | path-key@3.1.1: {} 3758 | 3759 | path-scurry@1.11.1: 3760 | dependencies: 3761 | lru-cache: 10.4.3 3762 | minipass: 7.1.2 3763 | 3764 | pathe@1.1.2: {} 3765 | 3766 | pathval@2.0.0: {} 3767 | 3768 | picocolors@1.1.1: {} 3769 | 3770 | picomatch@2.3.1: {} 3771 | 3772 | pify@4.0.1: {} 3773 | 3774 | pirates@4.0.6: {} 3775 | 3776 | pkg-dir@3.0.0: 3777 | dependencies: 3778 | find-up: 3.0.0 3779 | 3780 | postcss@8.4.47: 3781 | dependencies: 3782 | nanoid: 3.3.7 3783 | picocolors: 1.1.1 3784 | source-map-js: 1.2.1 3785 | 3786 | prebuild-install@7.1.2: 3787 | dependencies: 3788 | detect-libc: 2.0.3 3789 | expand-template: 2.0.3 3790 | github-from-package: 0.0.0 3791 | minimist: 1.2.8 3792 | mkdirp-classic: 0.5.3 3793 | napi-build-utils: 1.0.2 3794 | node-abi: 3.71.0 3795 | pump: 3.0.2 3796 | rc: 1.2.8 3797 | simple-get: 4.0.1 3798 | tar-fs: 2.1.1 3799 | tunnel-agent: 0.6.0 3800 | 3801 | prettier@3.3.3: {} 3802 | 3803 | protocols@2.0.1: {} 3804 | 3805 | pump@3.0.2: 3806 | dependencies: 3807 | end-of-stream: 1.4.4 3808 | once: 1.4.0 3809 | 3810 | rc@1.2.8: 3811 | dependencies: 3812 | deep-extend: 0.6.0 3813 | ini: 1.3.8 3814 | minimist: 1.2.8 3815 | strip-json-comments: 2.0.1 3816 | 3817 | readable-stream@3.6.2: 3818 | dependencies: 3819 | inherits: 2.0.4 3820 | string_decoder: 1.3.0 3821 | util-deprecate: 1.0.2 3822 | 3823 | recast@0.20.5: 3824 | dependencies: 3825 | ast-types: 0.14.2 3826 | esprima: 4.0.1 3827 | source-map: 0.6.1 3828 | tslib: 2.8.1 3829 | 3830 | recast@0.23.9: 3831 | dependencies: 3832 | ast-types: 0.16.1 3833 | esprima: 4.0.1 3834 | source-map: 0.6.1 3835 | tiny-invariant: 1.3.3 3836 | tslib: 2.8.1 3837 | 3838 | restore-cursor@3.1.0: 3839 | dependencies: 3840 | onetime: 5.1.2 3841 | signal-exit: 3.0.7 3842 | 3843 | rimraf@2.6.3: 3844 | dependencies: 3845 | glob: 7.2.3 3846 | 3847 | rollup@4.24.4: 3848 | dependencies: 3849 | '@types/estree': 1.0.6 3850 | optionalDependencies: 3851 | '@rollup/rollup-android-arm-eabi': 4.24.4 3852 | '@rollup/rollup-android-arm64': 4.24.4 3853 | '@rollup/rollup-darwin-arm64': 4.24.4 3854 | '@rollup/rollup-darwin-x64': 4.24.4 3855 | '@rollup/rollup-freebsd-arm64': 4.24.4 3856 | '@rollup/rollup-freebsd-x64': 4.24.4 3857 | '@rollup/rollup-linux-arm-gnueabihf': 4.24.4 3858 | '@rollup/rollup-linux-arm-musleabihf': 4.24.4 3859 | '@rollup/rollup-linux-arm64-gnu': 4.24.4 3860 | '@rollup/rollup-linux-arm64-musl': 4.24.4 3861 | '@rollup/rollup-linux-powerpc64le-gnu': 4.24.4 3862 | '@rollup/rollup-linux-riscv64-gnu': 4.24.4 3863 | '@rollup/rollup-linux-s390x-gnu': 4.24.4 3864 | '@rollup/rollup-linux-x64-gnu': 4.24.4 3865 | '@rollup/rollup-linux-x64-musl': 4.24.4 3866 | '@rollup/rollup-win32-arm64-msvc': 4.24.4 3867 | '@rollup/rollup-win32-ia32-msvc': 4.24.4 3868 | '@rollup/rollup-win32-x64-msvc': 4.24.4 3869 | fsevents: 2.3.3 3870 | 3871 | run-async@3.0.0: {} 3872 | 3873 | rxjs@7.8.1: 3874 | dependencies: 3875 | tslib: 2.8.1 3876 | 3877 | safe-buffer@5.2.1: {} 3878 | 3879 | safer-buffer@2.1.2: {} 3880 | 3881 | semver@5.7.2: {} 3882 | 3883 | semver@6.3.1: {} 3884 | 3885 | semver@7.6.3: {} 3886 | 3887 | shallow-clone@3.0.1: 3888 | dependencies: 3889 | kind-of: 6.0.3 3890 | 3891 | shebang-command@2.0.0: 3892 | dependencies: 3893 | shebang-regex: 3.0.0 3894 | 3895 | shebang-regex@3.0.0: {} 3896 | 3897 | siginfo@2.0.0: {} 3898 | 3899 | signal-exit@3.0.7: {} 3900 | 3901 | signal-exit@4.1.0: {} 3902 | 3903 | simple-concat@1.0.1: {} 3904 | 3905 | simple-get@4.0.1: 3906 | dependencies: 3907 | decompress-response: 6.0.0 3908 | once: 1.4.0 3909 | simple-concat: 1.0.1 3910 | 3911 | simple-git@3.27.0: 3912 | dependencies: 3913 | '@kwsites/file-exists': 1.1.1 3914 | '@kwsites/promise-deferred': 1.1.1 3915 | debug: 4.3.7 3916 | transitivePeerDependencies: 3917 | - supports-color 3918 | 3919 | source-map-js@1.2.1: {} 3920 | 3921 | source-map-support@0.5.21: 3922 | dependencies: 3923 | buffer-from: 1.1.2 3924 | source-map: 0.6.1 3925 | 3926 | source-map@0.6.1: {} 3927 | 3928 | stackback@0.0.2: {} 3929 | 3930 | std-env@3.8.0: {} 3931 | 3932 | string-width@4.2.3: 3933 | dependencies: 3934 | emoji-regex: 8.0.0 3935 | is-fullwidth-code-point: 3.0.0 3936 | strip-ansi: 6.0.1 3937 | 3938 | string-width@5.1.2: 3939 | dependencies: 3940 | eastasianwidth: 0.2.0 3941 | emoji-regex: 9.2.2 3942 | strip-ansi: 7.1.0 3943 | 3944 | string_decoder@1.3.0: 3945 | dependencies: 3946 | safe-buffer: 5.2.1 3947 | 3948 | strip-ansi@6.0.1: 3949 | dependencies: 3950 | ansi-regex: 5.0.1 3951 | 3952 | strip-ansi@7.1.0: 3953 | dependencies: 3954 | ansi-regex: 6.1.0 3955 | 3956 | strip-json-comments@2.0.1: {} 3957 | 3958 | supports-color@7.2.0: 3959 | dependencies: 3960 | has-flag: 4.0.0 3961 | 3962 | tar-fs@2.1.1: 3963 | dependencies: 3964 | chownr: 1.1.4 3965 | mkdirp-classic: 0.5.3 3966 | pump: 3.0.2 3967 | tar-stream: 2.2.0 3968 | 3969 | tar-stream@2.2.0: 3970 | dependencies: 3971 | bl: 4.1.0 3972 | end-of-stream: 1.4.4 3973 | fs-constants: 1.0.0 3974 | inherits: 2.0.4 3975 | readable-stream: 3.6.2 3976 | 3977 | temp@0.8.4: 3978 | dependencies: 3979 | rimraf: 2.6.3 3980 | 3981 | temp@0.9.4: 3982 | dependencies: 3983 | mkdirp: 0.5.6 3984 | rimraf: 2.6.3 3985 | 3986 | test-exclude@7.0.1: 3987 | dependencies: 3988 | '@istanbuljs/schema': 0.1.3 3989 | glob: 10.4.5 3990 | minimatch: 9.0.5 3991 | 3992 | tiny-invariant@1.3.3: {} 3993 | 3994 | tinybench@2.9.0: {} 3995 | 3996 | tinyexec@0.3.1: {} 3997 | 3998 | tinypool@1.0.1: {} 3999 | 4000 | tinyrainbow@1.2.0: {} 4001 | 4002 | tinyspy@3.0.2: {} 4003 | 4004 | tmp@0.0.33: 4005 | dependencies: 4006 | os-tmpdir: 1.0.2 4007 | 4008 | tmp@0.2.3: {} 4009 | 4010 | to-regex-range@5.0.1: 4011 | dependencies: 4012 | is-number: 7.0.0 4013 | 4014 | tr46@0.0.3: {} 4015 | 4016 | tree-kill@1.2.2: {} 4017 | 4018 | ts-invariant@0.10.3: 4019 | dependencies: 4020 | tslib: 2.8.1 4021 | 4022 | ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3): 4023 | dependencies: 4024 | '@cspotcode/source-map-support': 0.8.1 4025 | '@tsconfig/node10': 1.0.11 4026 | '@tsconfig/node12': 1.0.11 4027 | '@tsconfig/node14': 1.0.3 4028 | '@tsconfig/node16': 1.0.4 4029 | '@types/node': 22.9.0 4030 | acorn: 8.14.0 4031 | acorn-walk: 8.3.4 4032 | arg: 4.1.3 4033 | create-require: 1.1.1 4034 | diff: 4.0.2 4035 | make-error: 1.3.6 4036 | typescript: 5.6.3 4037 | v8-compile-cache-lib: 3.0.1 4038 | yn: 3.1.1 4039 | 4040 | tslib@2.8.1: {} 4041 | 4042 | tunnel-agent@0.6.0: 4043 | dependencies: 4044 | safe-buffer: 5.2.1 4045 | 4046 | type-fest@0.21.3: {} 4047 | 4048 | typescript@5.6.3: {} 4049 | 4050 | undici-types@5.26.5: {} 4051 | 4052 | undici-types@6.19.8: {} 4053 | 4054 | universal-user-agent@6.0.1: {} 4055 | 4056 | update-browserslist-db@1.1.1(browserslist@4.24.2): 4057 | dependencies: 4058 | browserslist: 4.24.2 4059 | escalade: 3.2.0 4060 | picocolors: 1.1.1 4061 | 4062 | util-deprecate@1.0.2: {} 4063 | 4064 | v8-compile-cache-lib@3.0.1: {} 4065 | 4066 | vite-node@2.1.4(@types/node@22.9.0): 4067 | dependencies: 4068 | cac: 6.7.14 4069 | debug: 4.3.7 4070 | pathe: 1.1.2 4071 | vite: 5.4.10(@types/node@22.9.0) 4072 | transitivePeerDependencies: 4073 | - '@types/node' 4074 | - less 4075 | - lightningcss 4076 | - sass 4077 | - sass-embedded 4078 | - stylus 4079 | - sugarss 4080 | - supports-color 4081 | - terser 4082 | 4083 | vite@5.4.10(@types/node@22.9.0): 4084 | dependencies: 4085 | esbuild: 0.21.5 4086 | postcss: 8.4.47 4087 | rollup: 4.24.4 4088 | optionalDependencies: 4089 | '@types/node': 22.9.0 4090 | fsevents: 2.3.3 4091 | 4092 | vitest@2.1.4(@types/node@22.9.0): 4093 | dependencies: 4094 | '@vitest/expect': 2.1.4 4095 | '@vitest/mocker': 2.1.4(vite@5.4.10(@types/node@22.9.0)) 4096 | '@vitest/pretty-format': 2.1.4 4097 | '@vitest/runner': 2.1.4 4098 | '@vitest/snapshot': 2.1.4 4099 | '@vitest/spy': 2.1.4 4100 | '@vitest/utils': 2.1.4 4101 | chai: 5.1.2 4102 | debug: 4.3.7 4103 | expect-type: 1.1.0 4104 | magic-string: 0.30.12 4105 | pathe: 1.1.2 4106 | std-env: 3.8.0 4107 | tinybench: 2.9.0 4108 | tinyexec: 0.3.1 4109 | tinypool: 1.0.1 4110 | tinyrainbow: 1.2.0 4111 | vite: 5.4.10(@types/node@22.9.0) 4112 | vite-node: 2.1.4(@types/node@22.9.0) 4113 | why-is-node-running: 2.3.0 4114 | optionalDependencies: 4115 | '@types/node': 22.9.0 4116 | transitivePeerDependencies: 4117 | - less 4118 | - lightningcss 4119 | - msw 4120 | - sass 4121 | - sass-embedded 4122 | - stylus 4123 | - sugarss 4124 | - supports-color 4125 | - terser 4126 | 4127 | wcwidth@1.0.1: 4128 | dependencies: 4129 | defaults: 1.0.4 4130 | 4131 | web-streams-polyfill@3.3.3: {} 4132 | 4133 | web-streams-polyfill@4.0.0-beta.3: {} 4134 | 4135 | webidl-conversions@3.0.1: {} 4136 | 4137 | whatwg-url@5.0.0: 4138 | dependencies: 4139 | tr46: 0.0.3 4140 | webidl-conversions: 3.0.1 4141 | 4142 | which@2.0.2: 4143 | dependencies: 4144 | isexe: 2.0.0 4145 | 4146 | why-is-node-running@2.3.0: 4147 | dependencies: 4148 | siginfo: 2.0.0 4149 | stackback: 0.0.2 4150 | 4151 | wrap-ansi@6.2.0: 4152 | dependencies: 4153 | ansi-styles: 4.3.0 4154 | string-width: 4.2.3 4155 | strip-ansi: 6.0.1 4156 | 4157 | wrap-ansi@7.0.0: 4158 | dependencies: 4159 | ansi-styles: 4.3.0 4160 | string-width: 4.2.3 4161 | strip-ansi: 6.0.1 4162 | 4163 | wrap-ansi@8.1.0: 4164 | dependencies: 4165 | ansi-styles: 6.2.1 4166 | string-width: 5.1.2 4167 | strip-ansi: 7.1.0 4168 | 4169 | wrappy@1.0.2: {} 4170 | 4171 | write-file-atomic@2.4.3: 4172 | dependencies: 4173 | graceful-fs: 4.2.11 4174 | imurmurhash: 0.1.4 4175 | signal-exit: 3.0.7 4176 | 4177 | write-file-atomic@5.0.1: 4178 | dependencies: 4179 | imurmurhash: 0.1.4 4180 | signal-exit: 4.1.0 4181 | 4182 | yallist@3.1.1: {} 4183 | 4184 | yaml@2.6.0: {} 4185 | 4186 | yn@3.1.1: {} 4187 | 4188 | yoctocolors-cjs@2.1.2: {} 4189 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - 'packages/*' 3 | 4 | catalog: 5 | jscodeshift: ^17.1.1 6 | '@types/jscodeshift': ^0.11.10 7 | --------------------------------------------------------------------------------