chore: move vercel adapter to code

This commit is contained in:
Emanuele Stoppa
2025-02-06 15:38:30 +00:00
parent 3f3c487b5e
commit 64b118ac95
35 changed files with 302 additions and 69 deletions

View File

@@ -31,12 +31,12 @@
},
"files": ["dist", "types.d.ts"],
"scripts": {
"build": "tsc",
"build": "astro-scripts build \"src/**/*.ts\" && tsc",
"test": "astro-scripts test --timeout 50000 \"test/**/!(hosted).test.js\"",
"test:hosted": "astro-scripts test --timeout 30000 \"test/hosted/*.test.js\""
},
"dependencies": {
"@astrojs/internal-helpers": "^0.4.2",
"@astrojs/internal-helpers": "^0.5.1",
"@vercel/analytics": "^1.4.1",
"@vercel/edge": "^1.2.1",
"@vercel/nft": "^0.29.0",
@@ -48,8 +48,7 @@
"astro": "^5.0.0"
},
"devDependencies": {
"@astrojs/test-utils": "workspace:*",
"astro": "^5.1.6",
"astro": "workspace:*",
"astro-scripts": "workspace:*",
"cheerio": "1.0.0"
},

View File

@@ -53,7 +53,6 @@ const service: ExternalImageService = {
options.width && searchParams.append('w', options.width.toString());
options.quality && searchParams.append('q', options.quality.toString());
// biome-ignore lint/style/useTemplate: <explanation>
return '/_vercel/image?' + searchParams;
},
};

View File

@@ -15,7 +15,6 @@ export const baseDevService: Omit<LocalImageService, 'transform'> = {
options.width && searchParams.append('w', options.width.toString());
options.quality && searchParams.append('q', options.quality.toString());
// biome-ignore lint/style/useTemplate: <explanation>
return '/_image?' + searchParams;
},
parseURL(url) {
@@ -26,9 +25,7 @@ export const baseDevService: Omit<LocalImageService, 'transform'> = {
}
const transform = {
// biome-ignore lint/style/noNonNullAssertion: <explanation>
src: params.get('href')!,
// biome-ignore lint/style/noNonNullAssertion: <explanation>
width: params.has('w') ? Number.parseInt(params.get('w')!) : undefined,
quality: params.get('q'),
};

View File

@@ -142,7 +142,6 @@ export function sharedValidateOptions(
} else {
if (!configuredWidths.includes(options.width)) {
const nearestWidth = configuredWidths.reduce((prev, curr) => {
// biome-ignore lint/style/noNonNullAssertion: <explanation>
return Math.abs(curr - options.width!) < Math.abs(prev - options.width!) ? curr : prev;
});

View File

@@ -174,11 +174,9 @@ export default function vercelAdapter({
}: VercelServerlessConfig = {}): AstroIntegration {
if (maxDuration) {
if (typeof maxDuration !== 'number') {
// biome-ignore lint/style/noUnusedTemplateLiteral: <explanation>
throw new TypeError(`maxDuration must be a number`, { cause: maxDuration });
}
if (maxDuration <= 0) {
// biome-ignore lint/style/noUnusedTemplateLiteral: <explanation>
throw new TypeError(`maxDuration must be a positive number`, { cause: maxDuration });
}
}
@@ -223,9 +221,9 @@ export default function vercelAdapter({
hooks: {
'astro:build:done': async () => {
logger.info('Copying static files to .vercel/output/static');
const staticDir =
const _staticDir =
_buildOutput === 'static' ? _config.outDir : _config.build.client;
cpSync(staticDir, new URL('./.vercel/output/static/', _config.root), {
cpSync(_staticDir, new URL('./.vercel/output/static/', _config.root), {
recursive: true,
});
},
@@ -258,7 +256,6 @@ export default function vercelAdapter({
`maxDuration is set to ${maxDuration} seconds, which is longer than the maximum allowed duration of 900 seconds.`
);
logger.warn(
// biome-ignore lint/style/noUnusedTemplateLiteral: <explanation>
`Please make sure that your plan allows for this duration. See https://vercel.com/docs/functions/serverless-functions/runtimes#maxduration for more information.`
);
}
@@ -574,7 +571,7 @@ class VercelBuilder {
) {}
async buildServerlessFolder(entry: URL, functionName: string, root: URL) {
const { config, includeFiles, excludeFiles, logger, NTF_CACHE, runtime, maxDuration } = this;
const { includeFiles, excludeFiles, logger, NTF_CACHE, runtime, maxDuration } = this;
// .vercel/output/functions/<name>.func/
const functionFolder = new URL(`./functions/${functionName}.func/`, this.outDir);
const packageJson = new URL(`./functions/${functionName}.func/package.json`, this.outDir);
@@ -635,7 +632,6 @@ class VercelBuilder {
this.logger
);
// biome-ignore lint/style/noUnusedTemplateLiteral: <explanation>
await writeJson(new URL(`./.vc-config.json`, functionFolder), {
runtime: 'edge',
entrypoint: 'middleware.mjs',
@@ -649,13 +645,9 @@ function getRuntime(process: NodeJS.Process, logger: AstroIntegrationLogger): Ru
const support = SUPPORTED_NODE_VERSIONS[major];
if (support === undefined) {
logger.warn(
// biome-ignore lint/style/useTemplate: <explanation>
// biome-ignore lint/style/noUnusedTemplateLiteral: <explanation>
`\n` +
`\tThe local Node.js version (${major}) is not supported by Vercel Serverless Functions.\n` +
// biome-ignore lint/style/noUnusedTemplateLiteral: <explanation>
`\tYour project will use Node.js 18 as the runtime instead.\n` +
// biome-ignore lint/style/noUnusedTemplateLiteral: <explanation>
`\tConsider switching your local version to 18.\n`
);
return 'nodejs18.x';
@@ -682,12 +674,9 @@ function getRuntime(process: NodeJS.Process, logger: AstroIntegrationLogger): Ru
support.removal
);
logger.warn(
// biome-ignore lint/style/useTemplate: <explanation>
// biome-ignore lint/style/noUnusedTemplateLiteral: <explanation>
`\n` +
`\tYour project is being built for Node.js ${major} as the runtime.\n` +
`\tThis version is deprecated by Vercel Serverless Functions, and scheduled to be disabled on ${removeDate}.\n` +
// biome-ignore lint/style/noUnusedTemplateLiteral: <explanation>
`\tConsider upgrading your local version to 18.\n`
);
return `nodejs${major}.x`;

View File

@@ -42,7 +42,6 @@ export async function copyDependenciesToFunction(
for (const error of result.warnings) {
if (error.message.startsWith('Failed to resolve dependency')) {
// biome-ignore lint/style/noNonNullAssertion: <explanation>
const [, module, file] = /Cannot find module '(.+?)' loaded from (.+)/.exec(error.message)!;
// The import(astroRemark) sometimes fails to resolve, but it's not a problem
@@ -65,7 +64,6 @@ export async function copyDependenciesToFunction(
// such as this html file in "main" meant for nw instead of node:
// https://github.com/vercel/nft/issues/311
else if (error.message.startsWith('Failed to parse')) {
// biome-ignore lint/correctness/noUnnecessaryContinue: <explanation>
continue;
} else {
throw error;

View File

@@ -6,16 +6,6 @@ import type { Redirect } from '@vercel/routing-utils';
const pathJoin = nodePath.posix.join;
// https://vercel.com/docs/project-configuration#legacy/routes
interface VercelRoute {
src: string;
methods?: string[];
dest?: string;
headers?: Record<string, string>;
status?: number;
continue?: boolean;
}
// Copied from astro/packages/astro/src/core/routing/manifest/create.ts
// Disable eslint as we're not sure how to improve this regex yet
// eslint-disable-next-line regexp/no-super-linear-backtracking

View File

@@ -7,7 +7,6 @@ export async function getInjectableWebAnalyticsContent({
}: {
mode: 'development' | 'production';
}) {
// biome-ignore lint/style/noUnusedTemplateLiteral: <explanation>
const base = `window.va = window.va || function () { (window.vaq = window.vaq || []).push(arguments); };`;
if (mode === 'development') {

View File

@@ -16,8 +16,12 @@ import {
*
* Then this file gets bundled with esbuild. The bundle phase will inline the Astro middleware code.
*
* @param astroMiddlewareEntryPoint
* @param astroMiddlewareEntryPointPath
* @param root
* @param vercelEdgeMiddlewareHandlerPath
* @param outPath
* @param middlewareSecret
* @param logger
* @returns {Promise<URL>} The path to the bundled file
*/
export async function generateEdgeMiddleware(
@@ -61,7 +65,6 @@ export async function generateEdgeMiddleware(
name: 'esbuild-namespace-node-built-in-modules',
setup(build) {
const filter = new RegExp(builtinModules.map((mod) => `(^${mod}$)`).join('|'));
// biome-ignore lint/style/useTemplate: <explanation>
build.onResolve({ filter }, (args) => ({ path: 'node:' + args.path, external: true }));
},
},
@@ -82,14 +85,12 @@ function edgeMiddlewareTemplate(
const filePathEdgeMiddleware = fileURLToPath(vercelEdgeMiddlewareHandlerPath);
let handlerTemplateImport = '';
let handlerTemplateCall = '{}';
// biome-ignore lint/style/useTemplate: <explanation>
if (existsSync(filePathEdgeMiddleware + '.js') || existsSync(filePathEdgeMiddleware + '.ts')) {
logger.warn(
'Usage of `vercel-edge-middleware.js` is deprecated. You can now use the `waitUntil(promise)` function directly as `ctx.locals.waitUntil(promise)`.'
);
const stringified = JSON.stringify(filePathEdgeMiddleware.replace(/\\/g, '/'));
handlerTemplateImport = `import handler from ${stringified}`;
// biome-ignore lint/style/noUnusedTemplateLiteral: <explanation>
handlerTemplateCall = `await handler({ request, context })`;
} else {
}

View File

@@ -3,7 +3,7 @@ import { before, describe, it } from 'node:test';
import { loadFixture } from './test-utils.js';
describe('Vercel edge middleware', () => {
/** @type {import('../../../astro/test/test-utils.js').Fixture} */
/** @type {import('./test-utils.js').Fixture} */
let build;
before(async () => {
build = await loadFixture({

View File

@@ -4,6 +4,6 @@
"private": true,
"dependencies": {
"@astrojs/vercel": "workspace:*",
"astro": "^5.1.6"
"astro": "workspace:*"
}
}

View File

@@ -7,6 +7,6 @@
},
"dependencies": {
"@astrojs/vercel": "workspace:*",
"astro": "^5.1.6"
"astro": "workspace:*"
}
}

View File

@@ -5,6 +5,6 @@
"dependencies": {
"@astrojs/sitemap": "^3.2.1",
"@astrojs/vercel": "workspace:*",
"astro": "^5.1.6"
"astro": "workspace:*"
}
}
}

View File

@@ -4,6 +4,6 @@
"private": true,
"dependencies": {
"@astrojs/vercel": "workspace:*",
"astro": "^5.1.6"
"astro": "workspace:*"
}
}

View File

@@ -4,6 +4,6 @@
"private": true,
"dependencies": {
"@astrojs/vercel": "workspace:*",
"astro": "^5.1.6"
"astro": "workspace:*"
}
}

View File

@@ -4,6 +4,6 @@
"private": true,
"dependencies": {
"@astrojs/vercel": "workspace:*",
"astro": "^5.1.6"
"astro": "workspace:*"
}
}

View File

@@ -4,6 +4,6 @@
"private": true,
"dependencies": {
"@astrojs/vercel": "workspace:*",
"astro": "^5.1.6"
"astro": "workspace:*"
}
}

View File

@@ -4,6 +4,6 @@
"private": true,
"dependencies": {
"@astrojs/vercel": "workspace:*",
"astro": "^5.1.6"
"astro": "workspace:*"
}
}

View File

@@ -4,6 +4,6 @@
"private": true,
"dependencies": {
"@astrojs/vercel": "workspace:*",
"astro": "^5.1.6"
"astro": "workspace:*"
}
}

View File

@@ -4,6 +4,6 @@
"private": true,
"dependencies": {
"@astrojs/vercel": "workspace:*",
"astro": "^5.1.6"
"astro": "workspace:*"
}
}

View File

@@ -4,6 +4,6 @@
"private": true,
"dependencies": {
"@astrojs/vercel": "workspace:*",
"astro": "^5.1.6"
"astro": "workspace:*"
}
}

View File

@@ -4,6 +4,6 @@
"private": true,
"dependencies": {
"@astrojs/vercel": "workspace:*",
"astro": "^5.1.6"
"astro": "workspace:*"
}
}

View File

@@ -4,6 +4,6 @@
"private": true,
"dependencies": {
"@astrojs/vercel": "workspace:*",
"astro": "^5.1.6"
"astro": "workspace:*"
}
}

View File

@@ -4,6 +4,6 @@
"private": true,
"dependencies": {
"@astrojs/vercel": "workspace:*",
"astro": "^5.1.6"
"astro": "workspace:*"
}
}

View File

@@ -4,6 +4,6 @@
"private": true,
"dependencies": {
"@astrojs/vercel": "workspace:*",
"astro": "^5.1.6"
"astro": "workspace:*"
}
}

View File

@@ -4,6 +4,6 @@
"private": true,
"dependencies": {
"@astrojs/vercel": "workspace:*",
"astro": "^5.1.6"
"astro": "workspace:*"
}
}

View File

@@ -4,6 +4,6 @@
"private": true,
"dependencies": {
"@astrojs/vercel": "workspace:*",
"astro": "^5.1.6"
"astro": "workspace:*"
}
}

View File

@@ -4,6 +4,6 @@
"private": true,
"dependencies": {
"@astrojs/vercel": "workspace:*",
"astro": "^5.1.6"
"astro": "workspace:*"
}
}

View File

@@ -4,7 +4,7 @@ import * as cheerio from 'cheerio';
import { loadFixture } from './test-utils.js';
describe('Image', () => {
/** @type {import('../../../astro/test/test-utils.js').Fixture} */
/** @type {import('./test-utils.js').Fixture} */
let fixture;
before(async () => {

View File

@@ -1,5 +1,5 @@
import assert from 'node:assert/strict';
import { before, describe, it } from 'node:test';
import { describe, it } from 'node:test';
import { loadFixture } from './test-utils.js';
describe('Assets generated by integrations', () => {

View File

@@ -3,7 +3,7 @@ import { before, describe, it } from 'node:test';
import { loadFixture } from './test-utils.js';
describe('Redirects', () => {
/** @type {import('../../../astro/test/test-utils.js').Fixture} */
/** @type {import('./test-utils.js').Fixture} */
let fixture;
before(async () => {

View File

@@ -3,7 +3,7 @@ import { describe, it } from 'node:test';
import { loadFixture } from './test-utils.js';
describe('Static Assets', () => {
/** @type {import('../../../astro/test/test-utils.js').Fixture} */
/** @type {import('./test-utils.js').Fixture} */
let fixture;
const VALID_CACHE_CONTROL = 'public, max-age=31536000, immutable';

View File

@@ -1,6 +1,5 @@
import { loadFixture as baseLoadFixture } from '@astrojs/test-utils';
export { fixLineEndings } from '@astrojs/test-utils';
import { loadFixture as baseLoadFixture } from '../../../astro/test/test-utils.js';
export { fixLineEndings } from '../../../astro/test/test-utils.js';
export function loadFixture(config) {
if (config?.root) {

View File

@@ -1,5 +1,5 @@
{
"extends": "../../tsconfig.base.json",
"extends": "../../../tsconfig.base.json",
"include": ["src"],
"compilerOptions": {
"outDir": "./dist"

265
pnpm-lock.yaml generated
View File

@@ -5484,7 +5484,213 @@ importers:
specifier: workspace:*
version: link:../../../../../astro
packages/integrations/vercel: {}
packages/integrations/vercel:
dependencies:
'@astrojs/internal-helpers':
specifier: ^0.5.1
version: link:../../internal-helpers
'@vercel/analytics':
specifier: ^1.4.1
version: 1.4.1(react@19.0.0)(svelte@5.19.7)(vue@3.5.13(typescript@5.7.3))
'@vercel/edge':
specifier: ^1.2.1
version: 1.2.1
'@vercel/nft':
specifier: ^0.29.0
version: 0.29.1(rollup@4.34.2)
'@vercel/routing-utils':
specifier: 5.0.2
version: 5.0.2
esbuild:
specifier: ^0.24.0
version: 0.24.2
fast-glob:
specifier: ^3.3.3
version: 3.3.3
devDependencies:
astro:
specifier: workspace:*
version: link:../../astro
astro-scripts:
specifier: workspace:*
version: link:../../../scripts
cheerio:
specifier: 1.0.0
version: 1.0.0
packages/integrations/vercel/test/fixtures/basic:
dependencies:
'@astrojs/vercel':
specifier: workspace:*
version: link:../../..
astro:
specifier: workspace:*
version: link:../../../../../astro
packages/integrations/vercel/test/fixtures/image:
dependencies:
'@astrojs/vercel':
specifier: workspace:*
version: link:../../..
astro:
specifier: workspace:*
version: link:../../../../../astro
packages/integrations/vercel/test/fixtures/integration-assets:
dependencies:
'@astrojs/sitemap':
specifier: ^3.2.1
version: link:../../../../sitemap
'@astrojs/vercel':
specifier: workspace:*
version: link:../../..
astro:
specifier: workspace:*
version: link:../../../../../astro
packages/integrations/vercel/test/fixtures/isr:
dependencies:
'@astrojs/vercel':
specifier: workspace:*
version: link:../../..
astro:
specifier: workspace:*
version: link:../../../../../astro
packages/integrations/vercel/test/fixtures/max-duration:
dependencies:
'@astrojs/vercel':
specifier: workspace:*
version: link:../../..
astro:
specifier: workspace:*
version: link:../../../../../astro
packages/integrations/vercel/test/fixtures/middleware-with-edge-file:
dependencies:
'@astrojs/vercel':
specifier: workspace:*
version: link:../../..
astro:
specifier: workspace:*
version: link:../../../../../astro
packages/integrations/vercel/test/fixtures/middleware-without-edge-file:
dependencies:
'@astrojs/vercel':
specifier: workspace:*
version: link:../../..
astro:
specifier: workspace:*
version: link:../../../../../astro
packages/integrations/vercel/test/fixtures/no-output:
dependencies:
'@astrojs/vercel':
specifier: workspace:*
version: link:../../..
astro:
specifier: workspace:*
version: link:../../../../../astro
packages/integrations/vercel/test/fixtures/prerendered-error-pages:
dependencies:
'@astrojs/vercel':
specifier: workspace:*
version: link:../../..
astro:
specifier: workspace:*
version: link:../../../../../astro
packages/integrations/vercel/test/fixtures/redirects:
dependencies:
'@astrojs/vercel':
specifier: workspace:*
version: link:../../..
astro:
specifier: workspace:*
version: link:../../../../../astro
packages/integrations/vercel/test/fixtures/redirects-serverless:
dependencies:
'@astrojs/vercel':
specifier: workspace:*
version: link:../../..
astro:
specifier: workspace:*
version: link:../../../../../astro
packages/integrations/vercel/test/fixtures/server-islands:
dependencies:
'@astrojs/vercel':
specifier: workspace:*
version: link:../../..
astro:
specifier: workspace:*
version: link:../../../../../astro
packages/integrations/vercel/test/fixtures/serverless-prerender:
dependencies:
'@astrojs/vercel':
specifier: workspace:*
version: link:../../..
astro:
specifier: workspace:*
version: link:../../../../../astro
packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes:
dependencies:
'@astrojs/vercel':
specifier: workspace:*
version: link:../../..
astro:
specifier: workspace:*
version: link:../../../../../astro
packages/integrations/vercel/test/fixtures/static:
dependencies:
'@astrojs/vercel':
specifier: workspace:*
version: link:../../..
astro:
specifier: workspace:*
version: link:../../../../../astro
packages/integrations/vercel/test/fixtures/static-assets:
dependencies:
'@astrojs/vercel':
specifier: workspace:*
version: link:../../..
astro:
specifier: workspace:*
version: link:../../../../../astro
packages/integrations/vercel/test/fixtures/streaming:
dependencies:
'@astrojs/vercel':
specifier: workspace:*
version: link:../../..
astro:
specifier: workspace:*
version: link:../../../../../astro
packages/integrations/vercel/test/fixtures/with-web-analytics-enabled/output-as-static:
dependencies:
'@astrojs/vercel':
specifier: workspace:*
version: link:../../../..
astro:
specifier: workspace:*
version: link:../../../../../../astro
packages/integrations/vercel/test/hosted/hosted-astro-project:
dependencies:
'@astrojs/vercel':
specifier: workspace:*
version: link:../../..
astro:
specifier: ^5.1.6
version: link:../../../../../astro
packages/integrations/vue:
dependencies:
@@ -7708,11 +7914,43 @@ packages:
'@ungap/structured-clone@1.2.0':
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
'@vercel/analytics@1.4.1':
resolution: {integrity: sha512-ekpL4ReX2TH3LnrRZTUKjHHNpNy9S1I7QmS+g/RQXoSUQ8ienzosuX7T9djZ/s8zPhBx1mpHP/Rw5875N+zQIQ==}
peerDependencies:
'@remix-run/react': ^2
'@sveltejs/kit': ^1 || ^2
next: '>= 13'
react: ^18 || ^19 || ^19.0.0-rc
svelte: '>= 4'
vue: ^3
vue-router: ^4
peerDependenciesMeta:
'@remix-run/react':
optional: true
'@sveltejs/kit':
optional: true
next:
optional: true
react:
optional: true
svelte:
optional: true
vue:
optional: true
vue-router:
optional: true
'@vercel/edge@1.2.1':
resolution: {integrity: sha512-1++yncEyIAi68D3UEOlytYb1IUcIulMWdoSzX2h9LuSeeyR7JtaIgR8DcTQ6+DmYOQn+5MCh6LY+UmK6QBByNA==}
'@vercel/nft@0.29.1':
resolution: {integrity: sha512-6239JJM1V9b3OjvZIjbe+47/hGxMr44FEzlbTErrqzebCaoKAHK+yvahn3gdNacybDUbTxVF8Zuh0vqaeM8aKQ==}
engines: {node: '>=18'}
hasBin: true
'@vercel/routing-utils@5.0.2':
resolution: {integrity: sha512-uJViB3+HEo+kzHYELs7cQWX5k0kCNvq9G/8nJQX8mP5Ta0fG68CBRmOaaG8A+2xbtTp/QuGORIwV8CsI9ebcNg==}
'@vitejs/plugin-react@4.3.4':
resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==}
engines: {node: ^14.18.0 || >=16.0.0}
@@ -10226,6 +10464,12 @@ packages:
path-to-regexp@0.1.12:
resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
path-to-regexp@6.1.0:
resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==}
path-to-regexp@6.3.0:
resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
path-type@4.0.0:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
@@ -13887,6 +14131,14 @@ snapshots:
'@ungap/structured-clone@1.2.0': {}
'@vercel/analytics@1.4.1(react@19.0.0)(svelte@5.19.7)(vue@3.5.13(typescript@5.7.3))':
optionalDependencies:
react: 19.0.0
svelte: 5.19.7
vue: 3.5.13(typescript@5.7.3)
'@vercel/edge@1.2.1': {}
'@vercel/nft@0.29.1(rollup@4.34.2)':
dependencies:
'@mapbox/node-pre-gyp': 2.0.0
@@ -13906,6 +14158,13 @@ snapshots:
- rollup
- supports-color
'@vercel/routing-utils@5.0.2':
dependencies:
path-to-regexp: 6.1.0
path-to-regexp-updated: path-to-regexp@6.3.0
optionalDependencies:
ajv: 6.12.6
'@vitejs/plugin-react@4.3.4(vite@6.0.11(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.4)(yaml@2.5.1))':
dependencies:
'@babel/core': 7.26.0
@@ -16841,6 +17100,10 @@ snapshots:
path-to-regexp@0.1.12: {}
path-to-regexp@6.1.0: {}
path-to-regexp@6.3.0: {}
path-type@4.0.0: {}
path-type@5.0.0: {}