Compare commits

..

7 Commits

Author SHA1 Message Date
Ethan Arrowood
74593e4d81 Publish Stable
- @vercel/build-utils@5.5.8
 - vercel@28.5.2
 - @vercel/client@12.2.18
 - @vercel/go@2.2.16
 - @vercel/hydrogen@0.0.30
 - @vercel/next@3.2.12
 - @vercel/node@2.6.3
 - @vercel/python@3.1.26
 - @vercel/redwood@1.0.36
 - @vercel/remix@1.0.36
 - @vercel/ruby@1.3.42
 - @vercel/static-build@1.0.37
2022-11-15 14:56:46 -07:00
Ethan Arrowood
3770b84999 [cli] add support for JSON5 and skip when no rootDirectory (#8913)
### Related Issues

Adds support for comments in JSON configs and skips operation when root directory is null or `'.'`

### 📋 Checklist

<!--
  Please keep your PR as a Draft until the checklist is complete
-->

#### Tests

- [ ] The code changed/added as part of this PR has been covered with tests
- [ ] All tests pass locally with `yarn test-unit`

#### Code Review

- [ ] This PR has a concise title and thorough description useful to a reviewer
- [ ] Issue from task tracker has a link to this PR
2022-11-15 21:00:40 +00:00
Nathan Rajlich
91bc2e693b [cli] Remove readOutputStream() helper function for tests (#8889)
The `readOutputStream()` module was counting "data" events, not lines specifically, and was failing for me locally. So that was removed, and updated the tests that were using it to use the `line-async-iterator` module instead to be more explicit and be able to perform assertions on a per-line basis.
2022-11-15 19:37:18 +00:00
Nathan Rajlich
898a5621f1 [build-utils] Fix runNpmInstall() error when install fails (#8909)
Fixes a regression where the thrown error was not propagated to the caller when npm deps failed to install.
2022-11-15 08:25:21 +00:00
Sean Massa
4e41c0e0a6 Publish Stable
- vercel@28.5.1
 - @vercel/fs-detectors@3.5.1
2022-11-14 14:24:34 -06:00
Ethan Arrowood
a8822170d6 [fs-detectors] restore rush support in fs-detectors (#8907)
Co-authored-by: Sean Massa <EndangeredMassa@gmail.com>
2022-11-14 14:23:12 -06:00
Sean Massa
7d87f66f5d [cli] update yarn.lock (#8905) 2022-11-14 14:07:50 -06:00
32 changed files with 303 additions and 108 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/build-utils",
"version": "5.5.7",
"version": "5.5.8",
"license": "MIT",
"main": "./dist/index.js",
"types": "./dist/index.d.js",

View File

@@ -492,7 +492,7 @@ export async function runNpmInstall(
try {
await spawnAsync(cliType, commandArgs, opts);
} catch (_) {
} catch (err: unknown) {
const potentialErrorPath = path.join(
process.env.HOME || '/',
'.npm',
@@ -508,6 +508,8 @@ export async function runNpmInstall(
);
commandArgs.push('--legacy-peer-deps');
await spawnAsync(cliType, commandArgs, opts);
} else {
throw err;
}
}
debug(`Install complete [${Date.now() - installTime}ms]`);

View File

@@ -1,3 +1,5 @@
let spawnExitCode = 0;
const spawnMock = jest.fn();
jest.mock('cross-spawn', () => {
const spawn = (...args: any) => {
@@ -5,7 +7,7 @@ jest.mock('cross-spawn', () => {
const child = {
on: (type: string, fn: (code: number) => void) => {
if (type === 'close') {
return fn(0);
return fn(spawnExitCode);
}
},
};
@@ -15,6 +17,7 @@ jest.mock('cross-spawn', () => {
});
afterEach(() => {
spawnExitCode = 0;
spawnMock.mockClear();
});
@@ -195,3 +198,27 @@ it('should only invoke `runNpmInstall()` once per `package.json` file (parallel)
env: expect.any(Object),
});
});
it('should throw error when install failed - yarn', async () => {
spawnExitCode = 1;
const meta: Meta = {};
const fixture = path.join(__dirname, 'fixtures', '19-yarn-v2');
await expect(
runNpmInstall(fixture, [], undefined, meta)
).rejects.toMatchObject({
name: 'Error',
message: 'Command "yarn install" exited with 1',
});
});
it('should throw error when install failed - npm', async () => {
spawnExitCode = 1;
const meta: Meta = {};
const fixture = path.join(__dirname, 'fixtures', '20-npm-7');
await expect(
runNpmInstall(fixture, [], undefined, meta)
).rejects.toMatchObject({
name: 'Error',
message: 'Command "npm install" exited with 1',
});
});

View File

@@ -1,6 +1,6 @@
{
"name": "vercel",
"version": "28.5.0",
"version": "28.5.2",
"preferGlobal": true,
"license": "Apache-2.0",
"description": "The command-line interface for Vercel",
@@ -41,16 +41,17 @@
"node": ">= 14"
},
"dependencies": {
"@vercel/build-utils": "5.5.7",
"@vercel/go": "2.2.15",
"@vercel/hydrogen": "0.0.29",
"@vercel/next": "3.2.11",
"@vercel/node": "2.6.2",
"@vercel/python": "3.1.25",
"@vercel/redwood": "1.0.35",
"@vercel/remix": "1.0.35",
"@vercel/ruby": "1.3.41",
"@vercel/static-build": "1.0.36",
"@vercel/build-utils": "5.5.8",
"@vercel/go": "2.2.16",
"@vercel/hydrogen": "0.0.30",
"@vercel/next": "3.2.12",
"@vercel/node": "2.6.3",
"@vercel/python": "3.1.26",
"@vercel/redwood": "1.0.36",
"@vercel/remix": "1.0.36",
"@vercel/ruby": "1.3.42",
"@vercel/static-build": "1.0.37",
"json5": "2.2.1",
"update-notifier": "5.1.0"
},
"devDependencies": {
@@ -95,10 +96,10 @@
"@types/which": "1.3.2",
"@types/write-json-file": "2.2.1",
"@types/yauzl-promise": "2.1.0",
"@vercel/client": "12.2.17",
"@vercel/client": "12.2.18",
"@vercel/error-utils": "1.0.3",
"@vercel/frameworks": "1.1.12",
"@vercel/fs-detectors": "3.5.0",
"@vercel/fs-detectors": "3.5.1",
"@vercel/fun": "1.0.4",
"@vercel/ncc": "0.24.0",
"@zeit/source-map-support": "0.6.2",
@@ -142,6 +143,7 @@
"is-url": "1.2.2",
"jaro-winkler": "0.2.8",
"jsonlines": "0.1.1",
"line-async-iterator": "3.0.0",
"load-json-file": "3.0.0",
"mime-types": "2.1.24",
"minimatch": "3.0.4",

View File

@@ -304,7 +304,12 @@ async function doBuild(
...pickOverrides(localConfig),
};
await setMonorepoDefaultSettings(cwd, workPath, projectSettings, output);
if (
projectSettings.rootDirectory !== null &&
projectSettings.rootDirectory !== '.'
) {
await setMonorepoDefaultSettings(cwd, workPath, projectSettings, output);
}
// Get a list of source files
const files = (await getFiles(workPath, client)).map(f =>

View File

@@ -9,6 +9,7 @@ import {
import { ProjectLinkAndSettings } from '../projects/project-settings';
import { Output } from '../output';
import title from 'title';
import JSON5 from 'json5';
export async function setMonorepoDefaultSettings(
cwd: string,
@@ -55,7 +56,7 @@ export async function setMonorepoDefaultSettings(
if (monorepoManager === 'turbo') {
// No ENOENT handling required here since conditional wouldn't be `true` unless `turbo.json` was found.
const turboJSON = JSON.parse(
const turboJSON = JSON5.parse(
fs.readFileSync(join(cwd, 'turbo.json'), 'utf-8')
);
@@ -76,7 +77,7 @@ export async function setMonorepoDefaultSettings(
);
} else if (monorepoManager === 'nx') {
// No ENOENT handling required here since conditional wouldn't be `true` unless `nx.json` was found.
const nxJSON = JSON.parse(fs.readFileSync(join(cwd, 'nx.json'), 'utf-8'));
const nxJSON = JSON5.parse(fs.readFileSync(join(cwd, 'nx.json'), 'utf-8'));
if (!nxJSON?.targetDefaults?.build) {
output.log(
@@ -92,14 +93,14 @@ export async function setMonorepoDefaultSettings(
if (projectJSONBuf) {
output.log('Found project.json Nx configuration.');
const projectJSON = JSON.parse(projectJSONBuf.toString('utf-8'));
const projectJSON = JSON5.parse(projectJSONBuf.toString('utf-8'));
if (projectJSON?.targets?.build) {
hasBuildTarget = true;
}
}
if (packageJsonBuf) {
const packageJSON = JSON.parse(packageJsonBuf.toString('utf-8'));
const packageJSON = JSON5.parse(packageJsonBuf.toString('utf-8'));
if (packageJSON?.nx) {
output.log('Found package.json Nx configuration.');
if (packageJSON.nx.targets?.build) {

View File

@@ -0,0 +1,7 @@
const path = require('node:path');
const fs = require('node:fs');
const public = path.join(__dirname, 'public');
fs.rmSync(public, { recursive: true, force: true });
fs.mkdirSync(public);
fs.writeFileSync(path.join(public, 'index.txt'), `Hello, world`);

View File

@@ -0,0 +1,7 @@
const path = require('node:path');
const fs = require('node:fs');
const public = path.join(__dirname, 'public');
fs.rmSync(public, { recursive: true, force: true });
fs.mkdirSync(public);
fs.writeFileSync(path.join(public, 'index.txt'), `Hello, world`);

View File

@@ -0,0 +1,7 @@
const path = require('node:path');
const fs = require('node:fs');
const public = path.join(__dirname, 'public');
fs.rmSync(public, { recursive: true, force: true });
fs.mkdirSync(public);
fs.writeFileSync(path.join(public, 'index.txt'), `Hello, world`);

View File

@@ -0,0 +1,7 @@
const path = require('node:path');
const fs = require('node:fs');
const public = path.join(__dirname, 'public');
fs.rmSync(public, { recursive: true, force: true });
fs.mkdirSync(public);
fs.writeFileSync(path.join(public, 'index.txt'), `Hello, world`);

View File

@@ -0,0 +1,7 @@
const path = require('node:path');
const fs = require('node:fs');
const public = path.join(__dirname, 'public');
fs.rmSync(public, { recursive: true, force: true });
fs.mkdirSync(public);
fs.writeFileSync(path.join(public, 'index.txt'), `Hello, world`);

View File

@@ -0,0 +1,7 @@
const path = require('node:path');
const fs = require('node:fs');
const public = path.join(__dirname, 'public');
fs.rmSync(public, { recursive: true, force: true });
fs.mkdirSync(public);
fs.writeFileSync(path.join(public, 'index.txt'), `Hello, world`);

View File

@@ -1 +1,2 @@
// TEST COMMENT TO VERIFY JSON5 SUPPORT
{ "pipeline": { "build": { "dependsOn": ["^build"], "outputs": ["dist/**"] } } }

View File

@@ -1,27 +0,0 @@
import { MockClient } from '../mocks/client';
export function readOutputStream(
client: MockClient,
length: number = 3
): Promise<string> {
return new Promise((resolve, reject) => {
let output: string = '';
let lines = 0;
const timeout = setTimeout(() => {
reject(
new Error(`Was waiting for ${length} lines, but only received ${lines}`)
);
}, 3000);
client.stderr.resume();
client.stderr.on('data', chunk => {
output += chunk.toString();
lines++;
if (lines === length) {
clearTimeout(timeout);
resolve(output);
}
});
client.stderr.on('error', reject);
});
}

View File

@@ -8,6 +8,8 @@ import { defaultProject, useProject } from '../../mocks/project';
import { useTeams } from '../../mocks/team';
import { useUser } from '../../mocks/user';
import { setupFixture } from '../../helpers/setup-fixture';
import JSON5 from 'json5';
// TODO (@Ethan-Arrowood) - After shipping support for turbo and nx, revisit rush support
// import execa from 'execa';
jest.setTimeout(ms('1 minute'));
@@ -1312,6 +1314,59 @@ describe('build', () => {
},
ms('5 minutes')
);
test(
`skip when rootDirectory is null or '.'`,
async () => {
try {
const cwd = setupMonorepoDetectionFixture(fixture);
const projectJSONPath = join(cwd, '.vercel/project.json');
const projectJSON = JSON.parse(
await fs.readFile(projectJSONPath, 'utf-8')
);
await fs.writeFile(
projectJSONPath,
JSON.stringify({
...projectJSON,
settings: {
rootDirectory: null,
outputDirectory: null,
},
})
);
const packageJSONPath = join(cwd, 'package.json');
const packageJSON = JSON.parse(
await fs.readFile(packageJSONPath, 'utf-8')
);
await fs.writeFile(
packageJSONPath,
JSON.stringify({
...packageJSON,
scripts: {
...packageJSON.scripts,
build: `node build.js`,
},
})
);
const exitCode = await build(client);
expect(exitCode).toBe(0);
const result = await fs.readFile(
join(cwd, '.vercel/output/static/index.txt'),
'utf8'
);
expect(result).toMatch(/Hello, world/);
} finally {
process.chdir(originalCwd);
delete process.env.__VERCEL_BUILD_RUNNING;
}
},
ms('5 miuntes')
);
});
describe.each([
@@ -1373,7 +1428,7 @@ describe('build', () => {
const cwd = setupMonorepoDetectionFixture(fixture);
const configPath = join(cwd, configFile);
const config = JSON.parse(await fs.readFile(configPath, 'utf-8'));
const config = JSON5.parse(await fs.readFile(configPath, 'utf-8'));
deleteSubProperty(config, propertyAccessor);
await fs.writeFile(configPath, JSON.stringify(config));

View File

@@ -1,3 +1,4 @@
import createLineIterator from 'line-async-iterator';
import { client } from '../../mocks/client';
import { useUser } from '../../mocks/user';
import list, {
@@ -8,7 +9,6 @@ import { join } from 'path';
import { useTeams } from '../../mocks/team';
import { defaultProject, useProject } from '../../mocks/project';
import { useDeployment } from '../../mocks/deployment';
import { readOutputStream } from '../../helpers/read-output-stream';
import {
parseSpacedTableRow,
pluckIdentifiersFromDeploymentList,
@@ -38,14 +38,26 @@ describe('list', () => {
await list(client);
const output = await readOutputStream(client, 6);
const lines = createLineIterator(client.stderr);
const { org } = pluckIdentifiersFromDeploymentList(output.split('\n')[2]);
const header: string[] = parseSpacedTableRow(output.split('\n')[5]);
const data: string[] = parseSpacedTableRow(output.split('\n')[6]);
data.shift();
let line = await lines.next();
expect(line.value).toEqual('Retrieving project…');
line = await lines.next();
expect(line.value).toEqual(`Fetching deployments in ${team[0].slug}`);
line = await lines.next();
const { org } = pluckIdentifiersFromDeploymentList(line.value!);
expect(org).toEqual(team[0].slug);
// skip next line
await lines.next();
line = await lines.next();
expect(line.value).toEqual('');
line = await lines.next();
const header = parseSpacedTableRow(line.value!);
expect(header).toEqual([
'Age',
'Deployment',
@@ -54,6 +66,9 @@ describe('list', () => {
'Username',
]);
line = await lines.next();
const data = parseSpacedTableRow(line.value!);
data.shift();
expect(data).toEqual([
`https://${deployment.url}`,
stateString(deployment.state || ''),
@@ -64,6 +79,7 @@ describe('list', () => {
process.chdir(originalCwd);
}
});
it('should get deployments for linked project where the scope is a user', async () => {
const cwd = fixture('with-team');
try {
@@ -81,15 +97,32 @@ describe('list', () => {
client.setArgv('-S', user.username);
await list(client);
const output = await readOutputStream(client, 6);
const lines = createLineIterator(client.stderr);
const { org } = pluckIdentifiersFromDeploymentList(output.split('\n')[2]);
const header: string[] = parseSpacedTableRow(output.split('\n')[5]);
const data: string[] = parseSpacedTableRow(output.split('\n')[6]);
let line = await lines.next();
expect(line.value).toEqual('Retrieving project…');
line = await lines.next();
expect(line.value).toEqual(`Fetching deployments in ${user.username}`);
line = await lines.next();
const { org } = pluckIdentifiersFromDeploymentList(line.value!);
expect(org).toEqual(user.username);
// skip next line
await lines.next();
line = await lines.next();
expect(line.value).toEqual('');
line = await lines.next();
const header = parseSpacedTableRow(line.value!);
expect(header).toEqual(['Age', 'Deployment', 'Status', 'Duration']);
line = await lines.next();
const data = parseSpacedTableRow(line.value!);
data.shift();
expect(org).toEqual(user.username);
expect(header).toEqual(['Age', 'Deployment', 'Status', 'Duration']);
expect(data).toEqual([
'https://' + deployment.url,
stateString(deployment.state || ''),
@@ -99,6 +132,7 @@ describe('list', () => {
process.chdir(originalCwd);
}
});
it('should get the deployments for a specified project', async () => {
const cwd = fixture('with-team');
try {
@@ -116,15 +150,28 @@ describe('list', () => {
client.setArgv(deployment.name);
await list(client);
const output = await readOutputStream(client, 6);
const lines = createLineIterator(client.stderr);
const { org } = pluckIdentifiersFromDeploymentList(output.split('\n')[2]);
const header: string[] = parseSpacedTableRow(output.split('\n')[5]);
const data: string[] = parseSpacedTableRow(output.split('\n')[6]);
data.shift();
let line = await lines.next();
expect(line.value).toEqual('Retrieving project…');
line = await lines.next();
expect(line.value).toEqual(
`Fetching deployments in ${teamSlug || team[0].slug}`
);
line = await lines.next();
const { org } = pluckIdentifiersFromDeploymentList(line.value!);
expect(org).toEqual(teamSlug || team[0].slug);
// skip next line
await lines.next();
line = await lines.next();
expect(line.value).toEqual('');
line = await lines.next();
const header = parseSpacedTableRow(line.value!);
expect(header).toEqual([
'Age',
'Deployment',
@@ -132,6 +179,10 @@ describe('list', () => {
'Duration',
'Username',
]);
line = await lines.next();
const data = parseSpacedTableRow(line.value!);
data.shift();
expect(data).toEqual([
`https://${deployment.url}`,
stateString(deployment.state || ''),

View File

@@ -1,10 +1,10 @@
import createLineIterator from 'line-async-iterator';
import projects from '../../../src/commands/project';
import { useUser } from '../../mocks/user';
import { useTeams } from '../../mocks/team';
import { defaultProject, useProject } from '../../mocks/project';
import { client } from '../../mocks/client';
import { Project } from '../../../src/types';
import { readOutputStream } from '../../helpers/read-output-stream';
import {
pluckIdentifiersFromDeploymentList,
parseSpacedTableRow,
@@ -22,20 +22,33 @@ describe('project', () => {
client.setArgv('project', 'ls');
await projects(client);
const output = await readOutputStream(client, 3);
const { org } = pluckIdentifiersFromDeploymentList(output.split('\n')[1]);
const header: string[] = parseSpacedTableRow(output.split('\n')[3]);
const data: string[] = parseSpacedTableRow(output.split('\n')[4]);
data.pop();
const lines = createLineIterator(client.stderr);
let line = await lines.next();
expect(line.value).toEqual(`Fetching projects in ${user.username}`);
line = await lines.next();
const { org } = pluckIdentifiersFromDeploymentList(line.value!);
expect(org).toEqual(user.username);
// empty line
line = await lines.next();
expect(line.value).toEqual('');
line = await lines.next();
const header = parseSpacedTableRow(line.value!);
expect(header).toEqual([
'Project Name',
'Latest Production URL',
'Updated',
]);
line = await lines.next();
const data = parseSpacedTableRow(line.value!);
data.pop();
expect(data).toEqual([project.project.name, 'https://foobar.com']);
});
it('should list projects when there is no production deployment', async () => {
const user = useUser();
useTeams('team_dummy');
@@ -47,21 +60,34 @@ describe('project', () => {
client.setArgv('project', 'ls');
await projects(client);
const output = await readOutputStream(client, 3);
const { org } = pluckIdentifiersFromDeploymentList(output.split('\n')[1]);
const header: string[] = parseSpacedTableRow(output.split('\n')[3]);
const data: string[] = parseSpacedTableRow(output.split('\n')[4]);
data.pop();
const lines = createLineIterator(client.stderr);
let line = await lines.next();
expect(line.value).toEqual(`Fetching projects in ${user.username}`);
line = await lines.next();
const { org } = pluckIdentifiersFromDeploymentList(line.value!);
expect(org).toEqual(user.username);
// empty line
line = await lines.next();
expect(line.value).toEqual('');
line = await lines.next();
const header = parseSpacedTableRow(line.value!);
expect(header).toEqual([
'Project Name',
'Latest Production URL',
'Updated',
]);
line = await lines.next();
const data = parseSpacedTableRow(line.value!);
data.pop();
expect(data).toEqual([project.project.name, '--']);
});
});
describe('add', () => {
it('should add a project', async () => {
const user = useUser();
@@ -82,6 +108,7 @@ describe('project', () => {
);
});
});
describe('rm', () => {
it('should remove a project', async () => {
useUser();

View File

@@ -1,6 +1,7 @@
import { join } from 'path';
import fs from 'fs-extra';
import os from 'os';
import createLineIterator from 'line-async-iterator';
import { getWriteableDirectory } from '@vercel/build-utils';
import {
createGitMeta,
@@ -10,7 +11,6 @@ import {
} from '../../../../src/util/create-git-meta';
import { client } from '../../../mocks/client';
import { parseRepoUrl } from '../../../../src/util/git/connect-git-provider';
import { readOutputStream } from '../../../helpers/read-output-stream';
import { useUser } from '../../../mocks/user';
import { defaultProject, useProject } from '../../../mocks/project';
import { Project } from '../../../../src/types';
@@ -270,12 +270,18 @@ describe('createGitMeta', () => {
client.output.debugEnabled = true;
const data = await createGitMeta(tmpDir, client.output);
const output = await readOutputStream(client, 2);
const lines = createLineIterator(client.stderr);
expect(output).toContain(
let line = await lines.next();
expect(line.value).toContain(
`Failed to get last commit. The directory is likely not a Git repo, there are no latest commits, or it is corrupted.`
);
expect(output).toContain(
// skip next line
await lines.next();
line = await lines.next();
expect(line.value).toContain(
`Failed to determine if Git repo has been modified:`
);
expect(data).toBeUndefined();

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/client",
"version": "12.2.17",
"version": "12.2.18",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"homepage": "https://vercel.com",
@@ -43,7 +43,7 @@
]
},
"dependencies": {
"@vercel/build-utils": "5.5.7",
"@vercel/build-utils": "5.5.8",
"@vercel/routing-utils": "2.1.3",
"@zeit/fetch": "5.2.0",
"async-retry": "1.2.3",

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/fs-detectors",
"version": "3.5.0",
"version": "3.5.1",
"description": "Vercel filesystem detectors",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -19,7 +19,7 @@
"test-unit": "yarn test"
},
"dependencies": {
"@vercel/error-utils": "1.0.2",
"@vercel/error-utils": "1.0.3",
"@vercel/frameworks": "1.1.12",
"@vercel/routing-utils": "2.1.3",
"glob": "8.0.3",

View File

@@ -76,8 +76,7 @@ export const monorepoManagers: Array<
},
},
},
// TODO (@Ethan-Arrowood) - Revisit rush support when we can test it better
/* {
{
name: 'Rush',
slug: 'rush',
logo: 'https://api-frameworks.vercel.sh/monorepo-logos/rush.svg',
@@ -103,7 +102,7 @@ export const monorepoManagers: Array<
value: null,
},
},
}, */
},
];
export default monorepoManagers;

View File

@@ -9,8 +9,7 @@ describe('monorepo-managers', () => {
['31-turborepo-in-package-json', 'turbo'],
['22-pnpm', null],
['39-nx-monorepo', 'nx'],
// TODO (@Ethan-Arrowood) - Revisit rush support when we can test it better
// ['40-rush-monorepo', 'rush'],
['40-rush-monorepo', 'rush'],
])('with detectFramework', (fixturePath, frameworkSlug) => {
const testName = frameworkSlug
? `should detect a ${frameworkSlug} workspace for ${fixturePath}`

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/go",
"version": "2.2.15",
"version": "2.2.16",
"license": "MIT",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/go",
@@ -35,7 +35,7 @@
"@types/jest": "28.1.6",
"@types/node-fetch": "^2.3.0",
"@types/tar": "^4.0.0",
"@vercel/build-utils": "5.5.7",
"@vercel/build-utils": "5.5.8",
"@vercel/ncc": "0.24.0",
"async-retry": "1.3.1",
"execa": "^1.0.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/hydrogen",
"version": "0.0.29",
"version": "0.0.30",
"license": "MIT",
"main": "./dist/index.js",
"homepage": "https://vercel.com/docs",
@@ -21,7 +21,7 @@
"devDependencies": {
"@types/jest": "27.5.1",
"@types/node": "14.18.33",
"@vercel/build-utils": "5.5.7",
"@vercel/build-utils": "5.5.8",
"@vercel/static-config": "2.0.6",
"typescript": "4.6.4"
}

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/next",
"version": "3.2.11",
"version": "3.2.12",
"license": "MIT",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/next-js",
@@ -44,7 +44,7 @@
"@types/semver": "6.0.0",
"@types/text-table": "0.2.1",
"@types/webpack-sources": "3.2.0",
"@vercel/build-utils": "5.5.7",
"@vercel/build-utils": "5.5.8",
"@vercel/nft": "0.22.1",
"@vercel/routing-utils": "2.1.3",
"async-sema": "3.0.1",

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/node",
"version": "2.6.2",
"version": "2.6.3",
"license": "MIT",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/node-js",
@@ -31,7 +31,7 @@
"dependencies": {
"@edge-runtime/vm": "2.0.0",
"@types/node": "14.18.33",
"@vercel/build-utils": "5.5.7",
"@vercel/build-utils": "5.5.8",
"@vercel/node-bridge": "3.1.2",
"@vercel/static-config": "2.0.6",
"edge-runtime": "2.0.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/python",
"version": "3.1.25",
"version": "3.1.26",
"main": "./dist/index.js",
"license": "MIT",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/python",
@@ -22,7 +22,7 @@
"devDependencies": {
"@types/execa": "^0.9.0",
"@types/jest": "27.4.1",
"@vercel/build-utils": "5.5.7",
"@vercel/build-utils": "5.5.8",
"@vercel/ncc": "0.24.0",
"execa": "^1.0.0",
"typescript": "4.3.4"

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/redwood",
"version": "1.0.35",
"version": "1.0.36",
"main": "./dist/index.js",
"license": "MIT",
"homepage": "https://vercel.com/docs",
@@ -27,6 +27,6 @@
"@types/aws-lambda": "8.10.19",
"@types/node": "14.18.33",
"@types/semver": "6.0.0",
"@vercel/build-utils": "5.5.7"
"@vercel/build-utils": "5.5.8"
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/remix",
"version": "1.0.35",
"version": "1.0.36",
"license": "MIT",
"main": "./dist/index.js",
"homepage": "https://vercel.com/docs",
@@ -25,7 +25,7 @@
"devDependencies": {
"@types/jest": "27.5.1",
"@types/node": "14.18.33",
"@vercel/build-utils": "5.5.7",
"@vercel/build-utils": "5.5.8",
"typescript": "4.6.4"
}
}

View File

@@ -1,7 +1,7 @@
{
"name": "@vercel/ruby",
"author": "Nathan Cahill <nathan@nathancahill.com>",
"version": "1.3.41",
"version": "1.3.42",
"license": "MIT",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/ruby",
@@ -22,7 +22,7 @@
"devDependencies": {
"@types/fs-extra": "8.0.0",
"@types/semver": "6.0.0",
"@vercel/build-utils": "5.5.7",
"@vercel/build-utils": "5.5.8",
"@vercel/ncc": "0.24.0",
"execa": "2.0.4",
"fs-extra": "^7.0.1",

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/static-build",
"version": "1.0.36",
"version": "1.0.37",
"license": "MIT",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/build-step",
@@ -36,7 +36,7 @@
"@types/ms": "0.7.31",
"@types/node-fetch": "2.5.4",
"@types/promise-timeout": "1.3.0",
"@vercel/build-utils": "5.5.7",
"@vercel/build-utils": "5.5.8",
"@vercel/frameworks": "1.1.12",
"@vercel/ncc": "0.24.0",
"@vercel/routing-utils": "2.1.3",

View File

@@ -9235,6 +9235,11 @@ lilconfig@^2.0.5:
resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25"
integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==
line-async-iterator@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/line-async-iterator/-/line-async-iterator-3.0.0.tgz#e8fef6b72fa1710d971fb70a4d59a4b6daf4c17d"
integrity sha512-IJwnVaX14dtWL2Za0B/qpuettNO3wtO2tb3NT37ffrz3ZOOkAFOpty5vysg7eLJ+QodMLRSROjR2csFB8ozYJg==
lines-and-columns@^1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"