Compare commits

...

7 Commits

Author SHA1 Message Date
Vercel Release Bot
19a373288f Version Packages (#11079)
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## vercel@33.3.0

### Minor Changes

- Emit "filePathMap" in `vc-config.json` for `FileFsRef` instances
([#11060](https://github.com/vercel/vercel/pull/11060))

### Patch Changes

- Update `vc dev` to support `Lambda` instances without `zipBuffer`
([#11080](https://github.com/vercel/vercel/pull/11080))

- Updated dependencies
\[[`322c88536`](322c88536d),
[`62ca2efa7`](62ca2efa73)]:
    -   @vercel/ruby@2.0.5
    -   @vercel/python@4.1.1

## @vercel/client@13.1.0

### Minor Changes

- Upload files referenced by "filePathMap" during `vc deploy --prebuilt`
([#11077](https://github.com/vercel/vercel/pull/11077))

## @vercel/python@4.1.1

### Patch Changes

- Remove deprecated `createLambda()` usage
([#11080](https://github.com/vercel/vercel/pull/11080))

## @vercel/ruby@2.0.5

### Patch Changes

- add ruby3 to path during build
([#11094](https://github.com/vercel/vercel/pull/11094))

- Remove deprecated `createLambda()` usage
([#11080](https://github.com/vercel/vercel/pull/11080))

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-01-25 14:29:57 -06:00
Sean Massa
322c88536d add ruby3 to path during build (#11094)
Add ruby to the path plus some debug code. I'll remove the debug code
after we verify this works.
2024-01-25 14:16:53 -06:00
Trek Glowacki
1f259d5eb9 [static-build] Update parcel@2 fixture to latest minor (#11087) 2024-01-24 21:51:10 +00:00
Trek Glowacki
3759da57ab [static-build] update blitzjs@2 fixture to latest minor (#11086)
update blitzjs@2 fixture to latest minor
2024-01-24 10:15:16 -06:00
Nathan Rajlich
30ba68edf9 [cli] Emit "filePathMap" in vc-config.json for FileFsRef instances (#11060)
This is a performance / bandwidth / storage space optimization for the **Build Output API**.

When a Builder returns function which contains a file that is a `FileFsRef` instance, it _won't_ be copied into the corresponding `.func` directory, but instead will be added to a `"files"` mapping in the `.vc-config.json` file. This mapping represents keys which are destination file paths within the function filesystem, and values which are relative paths from the root of the project codebase. This allows for common files (i.e. `node_modules`) to be referenced (instead of physically copied on the disk).

This introduces an additional complexity to `vc deploy --prebuilt`, in such that now it needs to build up the list of `"files"` referenced from the `.vc-config.json` files, and _also_ upload those file paths along with the `.vercel/output` directory.

Depends on:

* https://github.com/vercel/vercel/pull/11077
* https://github.com/vercel/vercel/pull/11080
2024-01-23 20:54:34 +00:00
Nathan Rajlich
62ca2efa73 [python][ruby][cli] Remove deprecated createLambda() usage (#11080)
* Use `Lambda` constructor instead of `createLambda()`
* Return `FileBlob` instance for the entrypoint files, so that they do not get written to cwd
* In `vc dev`, support `Lambda` instances which do not have `zipBuffer` property
2024-01-23 19:53:36 +00:00
Nathan Rajlich
2b71ee6b42 [client] Upload files referenced by "filePathMap" during vc deploy --prebuilt (#11077)
Ensure that files referenced by the `filePathMap` property in the `.vc-config.json` files for functions in the Build Output API `.vercel/output` directory are uploaded during the prebuilt deployment process.

Related to / precursor for https://github.com/vercel/vercel/pull/11060.
2024-01-22 22:48:12 +00:00
26 changed files with 2085 additions and 13873 deletions

View File

@@ -1,5 +1,19 @@
# vercel
## 33.3.0
### Minor Changes
- Emit "filePathMap" in `vc-config.json` for `FileFsRef` instances ([#11060](https://github.com/vercel/vercel/pull/11060))
### Patch Changes
- Update `vc dev` to support `Lambda` instances without `zipBuffer` ([#11080](https://github.com/vercel/vercel/pull/11080))
- Updated dependencies [[`322c88536`](https://github.com/vercel/vercel/commit/322c88536dfa0ba3892eb580858ee54f6b04ed3f), [`62ca2efa7`](https://github.com/vercel/vercel/commit/62ca2efa731c4df46d586b94078b2dcb1c0bb934)]:
- @vercel/ruby@2.0.5
- @vercel/python@4.1.1
## 33.2.0
### Minor Changes

View File

@@ -1,6 +1,6 @@
{
"name": "vercel",
"version": "33.2.0",
"version": "33.3.0",
"preferGlobal": true,
"license": "Apache-2.0",
"description": "The command-line interface for Vercel",
@@ -37,10 +37,10 @@
"@vercel/hydrogen": "1.0.2",
"@vercel/next": "4.1.0",
"@vercel/node": "3.0.17",
"@vercel/python": "4.1.0",
"@vercel/python": "4.1.1",
"@vercel/redwood": "2.0.6",
"@vercel/remix-builder": "2.0.18",
"@vercel/ruby": "2.0.4",
"@vercel/ruby": "2.0.5",
"@vercel/static-build": "2.1.0",
"chokidar": "3.3.1"
},
@@ -89,7 +89,7 @@
"@vercel-internals/constants": "1.0.4",
"@vercel-internals/get-package-json": "1.0.0",
"@vercel-internals/types": "1.0.21",
"@vercel/client": "13.0.14",
"@vercel/client": "13.1.0",
"@vercel/error-utils": "2.0.2",
"@vercel/frameworks": "2.0.6",
"@vercel/fs-detectors": "5.1.6",

View File

@@ -553,6 +553,7 @@ async function doBuild(
// Start flushing the file outputs to the filesystem asynchronously
ops.push(
writeBuildResult(
repoRootPath,
outputDir,
buildResult,
build,

View File

@@ -14,6 +14,7 @@ import {
BuildResultV2,
BuildResultV3,
File,
Files,
FileFsRef,
BuilderV2,
BuilderV3,
@@ -45,6 +46,7 @@ interface FunctionConfiguration {
}
export async function writeBuildResult(
repoRootPath: string,
outputDir: string,
buildResult: BuildResultV2 | BuildResultV3,
build: Builder,
@@ -55,6 +57,7 @@ export async function writeBuildResult(
const { version } = builder;
if (typeof version !== 'number' || version === 2) {
return writeBuildResultV2(
repoRootPath,
outputDir,
buildResult as BuildResultV2,
build,
@@ -62,6 +65,7 @@ export async function writeBuildResult(
);
} else if (version === 3) {
return writeBuildResultV3(
repoRootPath,
outputDir,
buildResult as BuildResultV3,
build,
@@ -107,6 +111,7 @@ function stripDuplicateSlashes(path: string): string {
* the filesystem.
*/
async function writeBuildResultV2(
repoRootPath: string,
outputDir: string,
buildResult: BuildResultV2,
build: Builder,
@@ -136,6 +141,7 @@ async function writeBuildResultV2(
const normalizedPath = stripDuplicateSlashes(path);
if (isLambda(output)) {
await writeLambda(
repoRootPath,
outputDir,
output,
normalizedPath,
@@ -150,6 +156,7 @@ async function writeBuildResultV2(
}
await writeLambda(
repoRootPath,
outputDir,
output.lambda,
normalizedPath,
@@ -210,6 +217,7 @@ async function writeBuildResultV2(
);
} else if (isEdgeFunction(output)) {
await writeEdgeFunction(
repoRootPath,
outputDir,
output,
normalizedPath,
@@ -231,6 +239,7 @@ async function writeBuildResultV2(
* the filesystem.
*/
async function writeBuildResultV3(
repoRootPath: string,
outputDir: string,
buildResult: BuildResultV3,
build: Builder,
@@ -254,9 +263,15 @@ async function writeBuildResultV3(
build.config?.zeroConfig ? src.substring(0, src.length - ext.length) : src
);
if (isLambda(output)) {
await writeLambda(outputDir, output, path, functionConfiguration);
await writeLambda(
repoRootPath,
outputDir,
output,
path,
functionConfiguration
);
} else if (isEdgeFunction(output)) {
await writeEdgeFunction(outputDir, output, path);
await writeEdgeFunction(repoRootPath, outputDir, output, path);
} else {
throw new Error(
`Unsupported output type: "${(output as any).type}" for ${build.src}`
@@ -364,6 +379,7 @@ async function writeFunctionSymlink(
* @param existingFunctions (optional) Map of `Lambda`/`EdgeFunction` instances that have previously been written
*/
async function writeEdgeFunction(
repoRootPath: string,
outputDir: string,
edgeFunction: EdgeFunction,
path: string,
@@ -387,12 +403,17 @@ async function writeEdgeFunction(
await fs.mkdirp(dest);
const ops: Promise<any>[] = [];
ops.push(download(edgeFunction.files, dest));
const { files, filePathMap } = filesWithoutFsRefs(
edgeFunction.files,
repoRootPath
);
ops.push(download(files, dest));
const config = {
runtime: 'edge',
...edgeFunction,
entrypoint: normalizePath(edgeFunction.entrypoint),
filePathMap,
files: undefined,
type: undefined,
};
@@ -415,6 +436,7 @@ async function writeEdgeFunction(
* @param existingFunctions (optional) Map of `Lambda`/`EdgeFunction` instances that have previously been written
*/
async function writeLambda(
repoRootPath: string,
outputDir: string,
lambda: Lambda,
path: string,
@@ -434,9 +456,12 @@ async function writeLambda(
await fs.mkdirp(dest);
const ops: Promise<any>[] = [];
let filePathMap: Record<string, string> | undefined;
if (lambda.files) {
// `files` is defined
ops.push(download(lambda.files, dest));
const f = filesWithoutFsRefs(lambda.files, repoRootPath);
filePathMap = f.filePathMap;
ops.push(download(f.files, dest));
} else if (lambda.zipBuffer) {
// Builders that use the deprecated `createLambda()` might only have `zipBuffer`
ops.push(unzip(lambda.zipBuffer, dest));
@@ -452,6 +477,7 @@ async function writeLambda(
handler: normalizePath(lambda.handler),
memory,
maxDuration,
filePathMap,
type: undefined,
files: undefined,
zipBuffer: undefined,
@@ -559,3 +585,25 @@ export async function* findDirs(
}
}
}
/**
* Removes the `FileFsRef` instances from the `Files` object
* and returns them in a JSON serializable map of repo root
* relative paths to Lambda destination paths.
*/
function filesWithoutFsRefs(
files: Files,
repoRootPath: string
): { files: Files; filePathMap?: Record<string, string> } {
let filePathMap: Record<string, string> | undefined;
const out: Files = {};
for (const [path, file] of Object.entries(files)) {
if (file.type === 'FileFsRef') {
if (!filePathMap) filePathMap = {};
filePathMap[path] = relative(repoRootPath, file.fsPath);
} else {
out[path] = file;
}
}
return { files: out, filePathMap };
}

View File

@@ -42,6 +42,18 @@ async function processMessage(message) {
// structure to JSON" errors, so delete the property...
delete result.childProcesses;
if (builder.version === 3) {
if (result.output.type === 'Lambda') {
result.output.zipBuffer = await result.output.createZip();
}
} else {
for (const output of Object.values(result.output)) {
if (output.type === 'Lambda') {
output.zipBuffer = await output.createZip();
}
}
}
process.send({ type: 'buildResult', result });
}

View File

@@ -361,8 +361,10 @@ export async function executeBuild(
await oldAsset.fn.destroy();
}
const ZipFile = asset.zipBuffer || (await asset.createZip());
asset.fn = await createFunction({
Code: { ZipFile: asset.zipBuffer },
Code: { ZipFile },
Handler: asset.handler,
Runtime: asset.runtime,
MemorySize: asset.memory || 3008,

View File

@@ -857,7 +857,7 @@ test('deploy pnpm twice using pnp and symlink=false', async () => {
page = await fetch(stdout);
text = await page.text();
expect(text).toBe('cache exists\n');
expect(text).toContain('cache exists\n');
});
test('reject deploying with wrong team .vercel config', async () => {

View File

@@ -1,5 +1,11 @@
# @vercel/client
## 13.1.0
### Minor Changes
- Upload files referenced by "filePathMap" during `vc deploy --prebuilt` ([#11077](https://github.com/vercel/vercel/pull/11077))
## 13.0.14
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/client",
"version": "13.0.14",
"version": "13.1.0",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"homepage": "https://vercel.com",

View File

@@ -1,7 +1,7 @@
import { FilesMap } from './hashes';
import { FetchOptions } from '@zeit/fetch';
import { nodeFetch, zeitFetch } from './fetch';
import { join, sep, relative } from 'path';
import { join, sep, relative, basename } from 'path';
import { URL } from 'url';
import ignore from 'ignore';
import { pkgVersion } from '../pkg';
@@ -109,6 +109,29 @@ export async function buildFileTree(
return ignored;
};
fileList = await readdir(path, [ignores]);
if (prebuilt) {
// Traverse over the `.vc-config.json` files and include
// the files referenced by the "filePathMap" properties
const refs = new Set<string>();
const vcConfigFilePaths = fileList.filter(
file => basename(file) === '.vc-config.json'
);
await Promise.all(
vcConfigFilePaths.map(async p => {
const configJson = await readFile(p, 'utf8');
const config = JSON.parse(configJson);
if (!config.filePathMap) return;
for (const v of Object.values(config.filePathMap) as string[]) {
refs.add(join(path, v));
}
})
);
if (refs.size > 0) {
fileList = fileList.concat(Array.from(refs));
}
}
debug(`Found ${fileList.length} files in the specified directory`);
} else if (Array.isArray(path)) {
// Array of file paths

View File

@@ -0,0 +1 @@
!/.vercel

View File

@@ -0,0 +1,5 @@
{
"filePathMap": {
"node_modules/another/index.js": "node_modules/another/index.js"
}
}

View File

@@ -0,0 +1,5 @@
{
"filePathMap": {
"node_modules/example/index.js": "node_modules/example/index.js"
}
}

View File

@@ -109,7 +109,7 @@ describe('buildFileTree()', () => {
normalizeWindowsPaths(fileList).sort()
);
const expectedIgnoreList = ['.vercel'];
const expectedIgnoreList = ['.gitignore', '.vercel'];
expect(normalizeWindowsPaths(expectedIgnoreList).sort()).toEqual(
normalizeWindowsPaths(ignoreList).sort()
);
@@ -124,14 +124,18 @@ describe('buildFileTree()', () => {
);
const expectedFileList = toAbsolutePaths(cwd, [
'.vercel/output/functions/api/another.func/.vc-config.json',
'.vercel/output/functions/api/example.func/.vc-config.json',
'.vercel/output/static/baz.txt',
'.vercel/output/static/sub/qux.txt',
'node_modules/another/index.js',
'node_modules/example/index.js',
]);
expect(normalizeWindowsPaths(expectedFileList).sort()).toEqual(
normalizeWindowsPaths(fileList).sort()
);
const expectedIgnoreList = ['foo.txt', 'sub'];
const expectedIgnoreList = ['.gitignore', 'foo.txt', 'sub'];
expect(normalizeWindowsPaths(expectedIgnoreList).sort()).toEqual(
normalizeWindowsPaths(ignoreList).sort()
);

View File

@@ -1,5 +1,11 @@
# @vercel/python
## 4.1.1
### Patch Changes
- Remove deprecated `createLambda()` usage ([#11080](https://github.com/vercel/vercel/pull/11080))
## 4.1.0
### Minor Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/python",
"version": "4.1.0",
"version": "4.1.1",
"main": "./dist/index.js",
"license": "Apache-2.0",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/python",

View File

@@ -1,23 +1,27 @@
import { join, dirname, basename } from 'path';
import execa from 'execa';
import fs from 'fs';
import execa from 'execa';
import { promisify } from 'util';
const readFile = promisify(fs.readFile);
const writeFile = promisify(fs.writeFile);
import { join, dirname, basename } from 'path';
import {
GlobOptions,
BuildOptions,
getWriteableDirectory,
download,
glob,
createLambda,
Lambda,
FileBlob,
shouldServe,
debug,
NowBuildError,
type BuildOptions,
type GlobOptions,
type BuildV3,
type Files,
} from '@vercel/build-utils';
import { installRequirement, installRequirementsFile } from './install';
import { getLatestPythonVersion, getSupportedPythonVersion } from './version';
const readFile = promisify(fs.readFile);
const writeFile = promisify(fs.writeFile);
async function pipenvConvert(cmd: string, srcDir: string) {
debug('Running pipfile2req...');
try {
@@ -53,13 +57,13 @@ export async function downloadFilesInWorkPath({
return workPath;
}
export const build = async ({
export const build: BuildV3 = async ({
workPath,
files: originalFiles,
entrypoint,
meta = {},
config,
}: BuildOptions) => {
}) => {
let pythonVersion = getLatestPythonVersion(meta);
workPath = await downloadFilesInWorkPath({
@@ -190,12 +194,6 @@ export const build = async ({
.replace(/__VC_HANDLER_MODULE_NAME/g, moduleName)
.replace(/__VC_HANDLER_ENTRYPOINT/g, entrypointWithSuffix);
// in order to allow the user to have `server.py`, we need our `server.py` to be called
// somethig else
const handlerPyFilename = 'vc__handler__python';
await writeFile(join(workPath, `${handlerPyFilename}.py`), handlerPyContents);
const globOptions: GlobOptions = {
cwd: workPath,
ignore:
@@ -204,14 +202,22 @@ export const build = async ({
: 'node_modules/**',
};
const lambda = await createLambda({
files: await glob('**', globOptions),
const files: Files = await glob('**', globOptions);
// in order to allow the user to have `server.py`, we
// need our `server.py` to be called something else
const handlerPyFilename = 'vc__handler__python';
files[`${handlerPyFilename}.py`] = new FileBlob({ data: handlerPyContents });
const output = new Lambda({
files,
handler: `${handlerPyFilename}.vc_handler`,
runtime: pythonVersion.runtime,
environment: {},
});
return { output: lambda };
return { output };
};
export { shouldServe };

View File

@@ -1,5 +1,13 @@
# @vercel/ruby
## 2.0.5
### Patch Changes
- add ruby3 to path during build ([#11094](https://github.com/vercel/vercel/pull/11094))
- Remove deprecated `createLambda()` usage ([#11080](https://github.com/vercel/vercel/pull/11080))
## 2.0.4
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "@vercel/ruby",
"author": "Nathan Cahill <nathan@nathancahill.com>",
"version": "2.0.4",
"version": "2.0.5",
"license": "Apache-2.0",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/ruby",

View File

@@ -10,14 +10,16 @@ import {
writeFile,
} from 'fs-extra';
import {
BuildOptions,
download,
getWriteableDirectory,
glob,
createLambda,
Lambda,
debug,
walkParentDirs,
cloneEnv,
FileBlob,
type Files,
type BuildV3,
} from '@vercel/build-utils';
import { installBundler } from './install-ruby';
@@ -46,6 +48,7 @@ async function bundleInstall(
bundlePath: string,
bundleDir: string,
gemfilePath: string,
rubyPath: string,
runtime: string
) {
debug(`running "bundle install --deployment"...`);
@@ -74,7 +77,7 @@ async function bundleInstall(
const bundlerEnv = cloneEnv(process.env, {
// Ensure the correct version of `ruby` is in front of the $PATH
PATH: `${dirname(bundlePath)}:${process.env.PATH}`,
PATH: `${dirname(rubyPath)}:${dirname(bundlePath)}:${process.env.PATH}`,
BUNDLE_SILENCE_ROOT_WARNING: '1',
BUNDLE_APP_CONFIG: bundleAppConfig,
BUNDLE_JOBS: '4',
@@ -114,13 +117,13 @@ async function bundleInstall(
export const version = 3;
export async function build({
export const build: BuildV3 = async ({
workPath,
files,
entrypoint,
config,
meta = {},
}: BuildOptions) {
}) => {
await download(files, workPath, meta);
const entrypointFsDirname = join(workPath, dirname(entrypoint));
const gemfileName = 'Gemfile';
@@ -140,10 +143,8 @@ export async function build({
const gemfileContents = gemfilePath
? await readFile(gemfilePath, 'utf8')
: '';
const { gemHome, bundlerPath, vendorPath, runtime } = await installBundler(
meta,
gemfileContents
);
const { gemHome, bundlerPath, vendorPath, runtime, rubyPath } =
await installBundler(meta, gemfileContents);
process.env.GEM_HOME = gemHome;
debug(`Checking existing vendor directory at "${vendorPath}"`);
const vendorDir = join(workPath, vendorPath);
@@ -187,7 +188,13 @@ export async function build({
} else {
// try installing. this won't work if native extesions are required.
// if that's the case, gems should be vendored locally before deploying.
await bundleInstall(bundlerPath, bundleDir, gemfilePath, runtime);
await bundleInstall(
bundlerPath,
bundleDir,
gemfilePath,
rubyPath,
runtime
);
}
}
} else {
@@ -217,12 +224,11 @@ export async function build({
// somethig else
const handlerRbFilename = 'vc__handler__ruby';
await writeFile(
join(workPath, `${handlerRbFilename}.rb`),
nowHandlerRbContents
);
const outputFiles: Files = await glob('**', workPath);
const outputFiles = await glob('**', workPath);
outputFiles[`${handlerRbFilename}.rb`] = new FileBlob({
data: nowHandlerRbContents,
});
// static analysis is impossible with ruby.
// instead, provide `includeFiles` and `excludeFiles` config options to reduce bundle size.
@@ -253,12 +259,12 @@ export async function build({
}
}
const lambda = await createLambda({
const output = new Lambda({
files: outputFiles,
handler: `${handlerRbFilename}.vc__handler`,
runtime,
environment: {},
});
return { output: lambda };
}
return { output };
};

View File

@@ -81,6 +81,12 @@ def vc__handler(event:, context:)
payload = JSON.parse(event['body'])
path = payload['path']
headers = payload['headers']
if ENV['VERCEL_DEBUG']
puts 'Request Headers: '
puts headers
end
httpMethod = payload['method']
encoding = payload['encoding']
body = payload['body']

File diff suppressed because it is too large Load Diff

View File

@@ -20,14 +20,14 @@
]
},
"dependencies": {
"@blitzjs/next": "2.0.0-beta.33",
"blitz": "2.0.0-beta.33",
"next": "13.4.5",
"@blitzjs/auth": "2.0.3",
"@blitzjs/next": "2.0.3",
"@blitzjs/rpc": "^2.0.0",
"blitz": "2.0.3",
"next": "13.5.6",
"react": "18.2.0",
"react-dom": "18.2.0",
"ts-node": "10.9.1",
"@blitzjs/rpc": "2.0.0-beta.33",
"@blitzjs/auth": "2.0.0-beta.33"
"ts-node": "10.9.1"
},
"devDependencies": {
"@next/bundle-analyzer": "12.0.8",
@@ -37,14 +37,14 @@
"@typescript-eslint/eslint-plugin": "5.30.5",
"@vitejs/plugin-react": "2.2.0",
"eslint": "8.27.0",
"eslint-config-prettier": "8.5.0",
"eslint-config-next": "12.3.1",
"eslint-config-prettier": "8.5.0",
"husky": "8.0.2",
"jsdom": "20.0.3",
"lint-staged": "13.0.3",
"prettier": "^2.7.1",
"prettier": "2.8.8",
"pretty-quick": "3.1.3",
"typescript": "^4.8.4",
"typescript": "4.9.5",
"vite-tsconfig-paths": "3.6.0",
"vitest": "0.25.3"
},

File diff suppressed because it is too large Load Diff

View File

@@ -6,6 +6,6 @@
"build": "parcel build"
},
"dependencies": {
"parcel": "2.9.3"
"parcel": "^2.11.0"
}
}

6
pnpm-lock.yaml generated
View File

@@ -328,7 +328,7 @@ importers:
specifier: 3.0.17
version: link:../node
'@vercel/python':
specifier: 4.1.0
specifier: 4.1.1
version: link:../python
'@vercel/redwood':
specifier: 2.0.6
@@ -337,7 +337,7 @@ importers:
specifier: 2.0.18
version: link:../remix
'@vercel/ruby':
specifier: 2.0.4
specifier: 2.0.5
version: link:../ruby
'@vercel/static-build':
specifier: 2.1.0
@@ -479,7 +479,7 @@ importers:
specifier: 1.0.21
version: link:../../internals/types
'@vercel/client':
specifier: 13.0.14
specifier: 13.1.0
version: link:../client
'@vercel/error-utils':
specifier: 2.0.2