Compare commits

...

7 Commits

Author SHA1 Message Date
Steven
47e3381c6d Publish Stable
- @vercel/build-utils@5.3.0
 - vercel@27.3.8
 - @vercel/client@12.1.11
 - @vercel/go@2.0.16
 - @vercel/hydrogen@0.0.13
 - @vercel/next@3.1.16
 - @vercel/node@2.5.7
 - @vercel/python@3.1.8
 - @vercel/redwood@1.0.17
 - @vercel/remix@1.0.18
 - @vercel/ruby@1.3.24
 - @vercel/static-build@1.0.17
2022-08-08 19:11:12 -04:00
Sean Massa
33aefdc029 [go] fix function name conflict (#8299)
Co-authored-by: Steven <steven@ceriously.com>
2022-08-08 17:07:02 -05:00
Steven
30fe76a0cf [build-utils] Push back nodejs12.x sunset date (#8355)
This PR pushes back the `nodejs12.x` discontinue date to give more projects a chance to upgrade
2022-08-08 20:46:04 +00:00
Thomas Knickman
97ef88dc28 chore(docs): use relative links for README (#8354)
This allows README links to work locally (within your IDE) without kicking to a browser - and maintains the current functionality elsewhere.
2022-08-08 20:04:09 +00:00
Nathan Rajlich
f679098d7a [cli] Fix "retrieve" typo (#8352) 2022-08-08 19:22:00 +00:00
Steven
2b57e12ad3 [build-utils] Refactor framework prefixed env vars into shared function (#8166)
This consolidates the logic to get the framework-specific prefixed System Environment Variables into a single shared function so each builder can reuse the same function.

- Related to #7009 
- Related to #8306

In the future, this feature could be added to any other missing builders as well as `vc dev` but we'll save that for a new PR.
2022-08-05 00:51:52 +00:00
Nathan Rajlich
c4e94ad03f [cli] Always set BROWSER=none env var for frontend dev server in vc dev (#8326)
Previously `vc dev` would only set this env var for "create-react-app" Framework preset, but other frameworks do the "auto-open browser window" behavior as well, and respect this env var (Docusaurus, specifically).

So always set the `BROWSER=none` env var regardless of which framework preset is selected. Also simplifies the code since this was the only place `frameworkSlug` property was being used.
2022-08-04 21:49:14 +00:00
37 changed files with 493 additions and 88 deletions

View File

@@ -35,6 +35,6 @@ For details on how to use Vercel, check out our [documentation](https://vercel.c
## Contributing
- [Code of Conduct](https://github.com/vercel/vercel/blob/main/.github/CODE_OF_CONDUCT.md)
- [Contributing Guidelines](https://github.com/vercel/vercel/blob/main/.github/CONTRIBUTING.md)
- [MIT License](https://github.com/vercel/vercel/blob/main/LICENSE)
- [Code of Conduct](./.github/CODE_OF_CONDUCT.md)
- [Contributing Guidelines](./.github/CONTRIBUTING.md)
- [MIT License](./LICENSE)

View File

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

View File

@@ -10,7 +10,7 @@ const allOptions = [
major: 12,
range: '12.x',
runtime: 'nodejs12.x',
discontinueDate: new Date('2022-08-09'),
discontinueDate: new Date('2022-10-01'),
},
{
major: 10,

View File

@@ -0,0 +1,32 @@
type Envs = { [key: string]: string | undefined };
/**
* Get the framework-specific prefixed System Environment Variables.
* See https://vercel.com/docs/concepts/projects/environment-variables#system-environment-variables
* @param envPrefix - Prefix, typically from `@vercel/frameworks`
* @param envs - Environment Variables, typically from `process.env`
*/
export function getPrefixedEnvVars({
envPrefix,
envs,
}: {
envPrefix: string | undefined;
envs: Envs;
}): Envs {
const vercelSystemEnvPrefix = 'VERCEL_';
const newEnvs: Envs = {};
if (envPrefix && envs.VERCEL_URL) {
Object.keys(envs)
.filter(key => key.startsWith(vercelSystemEnvPrefix))
.forEach(key => {
const newKey = `${envPrefix}${key}`;
if (!(newKey in envs)) {
newEnvs[newKey] = envs[key];
}
});
// Tell turbo to exclude all Vercel System Env Vars
// See https://github.com/vercel/turborepo/pull/1622
newEnvs.TURBO_CI_VENDOR_ENV_KEY = `${envPrefix}${vercelSystemEnvPrefix}`;
}
return newEnvs;
}

View File

@@ -40,6 +40,7 @@ import streamToBuffer from './fs/stream-to-buffer';
import debug from './debug';
import getIgnoreFilter from './get-ignore-filter';
import { getPlatformEnv } from './get-platform-env';
import { getPrefixedEnvVars } from './get-prefixed-env-vars';
export {
FileBlob,
@@ -76,6 +77,7 @@ export {
getDiscontinuedNodeVersions,
getSpawnOptions,
getPlatformEnv,
getPrefixedEnvVars,
streamToBuffer,
debug,
isSymbolicLink,

View File

@@ -0,0 +1,87 @@
import { getPrefixedEnvVars } from '../src';
describe('Test `getPrefixedEnvVars()`', () => {
const cases: Array<{
name: string;
args: Parameters<typeof getPrefixedEnvVars>[0];
want: ReturnType<typeof getPrefixedEnvVars>;
}> = [
{
name: 'should work with NEXT_PUBLIC_',
args: {
envPrefix: 'NEXT_PUBLIC_',
envs: {
VERCEL: '1',
VERCEL_URL: 'example.vercel.sh',
USER_ENV_VAR_NOT_VERCEL: 'example.com',
FOO: 'bar',
},
},
want: {
NEXT_PUBLIC_VERCEL_URL: 'example.vercel.sh',
TURBO_CI_VENDOR_ENV_KEY: 'NEXT_PUBLIC_VERCEL_',
},
},
{
name: 'should work with GATSBY_',
args: {
envPrefix: 'GATSBY_',
envs: {
USER_ENV_VAR_NOT_VERCEL: 'example.com',
FOO: 'bar',
VERCEL_URL: 'example.vercel.sh',
VERCEL_ENV: 'production',
VERCEL_REGION: 'iad1',
VERCEL_GIT_COMMIT_AUTHOR_LOGIN: 'rauchg',
},
},
want: {
GATSBY_VERCEL_URL: 'example.vercel.sh',
GATSBY_VERCEL_ENV: 'production',
GATSBY_VERCEL_REGION: 'iad1',
GATSBY_VERCEL_GIT_COMMIT_AUTHOR_LOGIN: 'rauchg',
TURBO_CI_VENDOR_ENV_KEY: 'GATSBY_VERCEL_',
},
},
{
name: 'should not return anything if no system env vars detected',
args: {
envPrefix: 'GATSBY_',
envs: {
USER_ENV_VAR_NOT_VERCEL: 'example.com',
FOO: 'bar',
BLARG_VERCEL_THING: 'fake',
},
},
want: {},
},
{
name: 'should not return anything if envPrefix is empty string',
args: {
envPrefix: '',
envs: {
VERCEL: '1',
VERCEL_URL: 'example.vercel.sh',
},
},
want: {},
},
{
name: 'should not return anything if envPrefix is undefined',
args: {
envPrefix: undefined,
envs: {
VERCEL: '1',
VERCEL_URL: 'example.vercel.sh',
},
},
want: {},
},
];
for (const { name, args, want } of cases) {
it(name, () => {
expect(getPrefixedEnvVars(args)).toEqual(want);
});
}
});

View File

@@ -394,7 +394,7 @@ it('should get latest node version', async () => {
it('should throw for discontinued versions', async () => {
// Mock a future date so that Node 8 and 10 become discontinued
const realDateNow = Date.now.bind(global.Date);
global.Date.now = () => new Date('2022-09-01').getTime();
global.Date.now = () => new Date('2022-10-15').getTime();
expect(getSupportedNodeVersion('8.10.x', false)).rejects.toThrow();
expect(getSupportedNodeVersion('8.10.x', true)).rejects.toThrow();
@@ -436,8 +436,8 @@ it('should warn for deprecated versions, soon to be discontinued', async () => {
expect(warningMessages).toStrictEqual([
'Error: Node.js version 10.x has reached End-of-Life. Deployments created on or after 2021-04-20 will fail to build. Please set "engines": { "node": "16.x" } in your `package.json` file to use Node.js 16.',
'Error: Node.js version 10.x has reached End-of-Life. Deployments created on or after 2021-04-20 will fail to build. Please set Node.js Version to 16.x in your Project Settings to use Node.js 16.',
'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-08-09 will fail to build. Please set "engines": { "node": "16.x" } in your `package.json` file to use Node.js 16.',
'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-08-09 will fail to build. Please set Node.js Version to 16.x in your Project Settings to use Node.js 16.',
'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-10-01 will fail to build. Please set "engines": { "node": "16.x" } in your `package.json` file to use Node.js 16.',
'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-10-01 will fail to build. Please set Node.js Version to 16.x in your Project Settings to use Node.js 16.',
]);
global.Date.now = realDateNow;

View File

@@ -1,6 +1,6 @@
{
"name": "vercel",
"version": "27.3.7",
"version": "27.3.8",
"preferGlobal": true,
"license": "Apache-2.0",
"description": "The command-line interface for Vercel",
@@ -41,16 +41,16 @@
"node": ">= 14"
},
"dependencies": {
"@vercel/build-utils": "5.2.0",
"@vercel/go": "2.0.15",
"@vercel/hydrogen": "0.0.12",
"@vercel/next": "3.1.15",
"@vercel/node": "2.5.6",
"@vercel/python": "3.1.7",
"@vercel/redwood": "1.0.16",
"@vercel/remix": "1.0.17",
"@vercel/ruby": "1.3.23",
"@vercel/static-build": "1.0.16",
"@vercel/build-utils": "5.3.0",
"@vercel/go": "2.0.16",
"@vercel/hydrogen": "0.0.13",
"@vercel/next": "3.1.16",
"@vercel/node": "2.5.7",
"@vercel/python": "3.1.8",
"@vercel/redwood": "1.0.17",
"@vercel/remix": "1.0.18",
"@vercel/ruby": "1.3.24",
"@vercel/static-build": "1.0.17",
"update-notifier": "5.1.0"
},
"devDependencies": {
@@ -96,7 +96,7 @@
"@types/which": "1.3.2",
"@types/write-json-file": "2.2.1",
"@types/yauzl-promise": "2.1.0",
"@vercel/client": "12.1.10",
"@vercel/client": "12.1.11",
"@vercel/frameworks": "1.1.3",
"@vercel/fs-detectors": "2.0.5",
"@vercel/fun": "1.0.4",

View File

@@ -157,7 +157,7 @@ export default async function main(client: Client): Promise<number> {
client.output.print(
`No Project Settings found locally. Run ${cli.getCommandName(
'pull --yes'
)} to retreive them.`
)} to retrieve them.`
);
return 1;
}

View File

@@ -61,7 +61,6 @@ export default async function dev(
}
let devCommand: string | undefined;
let frameworkSlug: string | undefined;
let projectSettings: ProjectSettings | undefined;
let projectEnvs: ProjectEnvVariable[] = [];
let systemEnvValues: string[] = [];
@@ -77,10 +76,6 @@ export default async function dev(
const framework = frameworks.find(f => f.slug === project.framework);
if (framework) {
if (framework.slug) {
frameworkSlug = framework.slug;
}
const defaults = framework.settings.devCommand.value;
if (defaults) {
devCommand = defaults;
@@ -120,7 +115,6 @@ export default async function dev(
const devServer = new DevServer(cwd, {
output,
devCommand,
frameworkSlug,
projectSettings,
projectEnvs,
systemEnvValues,

View File

@@ -131,7 +131,6 @@ export default class DevServer {
public output: Output;
public proxy: httpProxy;
public envConfigs: EnvConfigs;
public frameworkSlug?: string;
public files: BuilderInputs;
public address: string;
public devCacheDir: string;
@@ -175,7 +174,6 @@ export default class DevServer {
this.address = '';
this.devCommand = options.devCommand;
this.projectSettings = options.projectSettings;
this.frameworkSlug = options.frameworkSlug;
this.caseSensitive = false;
this.apiDir = null;
this.apiExtensions = new Set();
@@ -2210,7 +2208,10 @@ export default class DevServer {
// Because of child process 'pipe' below, isTTY will be false.
// Most frameworks use `chalk`/`supports-color` so we enable it anyway.
FORCE_COLOR: process.stdout.isTTY ? '1' : '0',
...(this.frameworkSlug === 'create-react-app' ? { BROWSER: 'none' } : {}),
// Prevent framework dev servers from automatically opening a web
// browser window, since it will not be the port that `vc dev`
// is listening on and thus will be missing Vercel features.
BROWSER: 'none',
...process.env,
...this.envConfigs.allEnv,
PORT: `${port}`,

View File

@@ -24,7 +24,6 @@ export { VercelConfig };
export interface DevServerOptions {
output: Output;
devCommand?: string;
frameworkSlug?: string;
projectSettings?: ProjectSettings;
systemEnvValues?: string[];
projectEnvs?: ProjectEnvVariable[];

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/client",
"version": "12.1.10",
"version": "12.1.11",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"homepage": "https://vercel.com",
@@ -42,7 +42,7 @@
]
},
"dependencies": {
"@vercel/build-utils": "5.2.0",
"@vercel/build-utils": "5.3.0",
"@vercel/routing-utils": "2.0.2",
"@zeit/fetch": "5.2.0",
"async-retry": "1.2.3",

View File

@@ -90,6 +90,12 @@ type UndoFileAction = {
to: string | undefined;
};
type UndoFunctionRename = {
fsPath: string;
from: string;
to: string;
};
export const version = 3;
export async function build({
@@ -109,6 +115,7 @@ export async function build({
// in order to undo the action, not what the original action was
const undoFileActions: UndoFileAction[] = [];
const undoDirectoryCreation: string[] = [];
const undoFunctionRenames: UndoFunctionRename[] = [];
try {
if (process.env.GIT_CREDENTIALS) {
@@ -128,6 +135,7 @@ export async function build({
`);
}
const originalEntrypointAbsolute = join(workPath, entrypoint);
const renamedEntrypoint = getRenamedEntrypoint(entrypoint);
if (renamedEntrypoint) {
await move(join(workPath, entrypoint), join(workPath, renamedEntrypoint));
@@ -245,10 +253,21 @@ export async function build({
}
}
const handlerFunctionName = parsedAnalyzed.functionName;
debug(
`Found exported function "${handlerFunctionName}" in "${entrypoint}"`
const originalFunctionName = parsedAnalyzed.functionName;
const handlerFunctionName = getNewHandlerFunctionName(
originalFunctionName,
entrypoint
);
await renameHandlerFunction(
entrypointAbsolute,
originalFunctionName,
handlerFunctionName
);
undoFunctionRenames.push({
fsPath: originalEntrypointAbsolute,
from: handlerFunctionName,
to: originalFunctionName,
});
if (!isGoModExist) {
if (await pathExists(join(workPath, 'vendor'))) {
@@ -501,7 +520,11 @@ export async function build({
throw error;
} finally {
try {
await cleanupFileSystem(undoFileActions, undoDirectoryCreation);
await cleanupFileSystem(
undoFileActions,
undoDirectoryCreation,
undoFunctionRenames
);
} catch (error) {
console.log(`Build cleanup failed: ${error.message}`);
debug('Cleanup Error: ' + error);
@@ -509,9 +532,47 @@ export async function build({
}
}
async function renameHandlerFunction(fsPath: string, from: string, to: string) {
let fileContents = await readFile(fsPath, 'utf8');
const fromRegex = new RegExp(`\\b${from}\\b`, 'g');
fileContents = fileContents.replace(fromRegex, to);
await writeFile(fsPath, fileContents);
}
export function getNewHandlerFunctionName(
originalFunctionName: string,
entrypoint: string
) {
if (!originalFunctionName) {
throw new Error(
'Handler function renaming failed because original function name was empty.'
);
}
if (!entrypoint) {
throw new Error(
'Handler function renaming failed because entrypoint was empty.'
);
}
debug(`Found exported function "${originalFunctionName}" in "${entrypoint}"`);
const pathSlug = entrypoint.replace(/(\s|\\|\/|\]|\[|-|\.)/g, '_');
const newHandlerName = `${originalFunctionName}_${pathSlug}`;
debug(
`Renaming handler function temporarily from "${originalFunctionName}" to "${newHandlerName}"`
);
return newHandlerName;
}
async function cleanupFileSystem(
undoFileActions: UndoFileAction[],
undoDirectoryCreation: string[]
undoDirectoryCreation: string[],
undoFunctionRenames: UndoFunctionRename[]
) {
// we have to undo the actions in reverse order in cases
// where one file was moved multiple times, which happens
@@ -524,6 +585,12 @@ async function cleanupFileSystem(
}
}
// after files are moved back, we can undo function renames
// these reference the original file location
for (const rename of undoFunctionRenames) {
await renameHandlerFunction(rename.fsPath, rename.from, rename.to);
}
const undoDirectoryPromises = undoDirectoryCreation.map(async directory => {
const contents = await readdir(directory);
// only delete an empty directory

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/go",
"version": "2.0.15",
"version": "2.0.16",
"license": "MIT",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/go",
@@ -17,14 +17,25 @@
"files": [
"dist"
],
"jest": {
"preset": "ts-jest",
"testEnvironment": "node",
"globals": {
"ts-jest": {
"diagnostics": true,
"isolatedModules": true
}
}
},
"devDependencies": {
"@tootallnate/once": "1.1.2",
"@types/async-retry": "1.4.2",
"@types/execa": "^0.9.0",
"@types/fs-extra": "^5.0.5",
"@types/jest": "28.1.6",
"@types/node-fetch": "^2.3.0",
"@types/tar": "^4.0.0",
"@vercel/build-utils": "5.2.0",
"@vercel/build-utils": "5.3.0",
"@vercel/ncc": "0.24.0",
"async-retry": "1.3.1",
"execa": "^1.0.0",

View File

@@ -0,0 +1,12 @@
package handler
import (
"fmt"
"net/http"
)
// "Handler" conflicts with the other files' exported function,
// but should still work
func Handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "from dupe-handler.go")
}

View File

@@ -0,0 +1,3 @@
module go-mod
go 1.15

View File

@@ -0,0 +1,11 @@
package handler
import (
"fmt"
"net/http"
)
// Handler func
func Handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "from index.go")
}

View File

@@ -0,0 +1,12 @@
package other
import (
"fmt"
"net/http"
)
// "Handler" conflicts with the other files' exported function,
// but not in the same package
func Handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "from other-package.go")
}

View File

@@ -0,0 +1,11 @@
package handler
import (
"fmt"
"net/http"
)
// "Handler" conflicts with the other files' exported function
func Handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "from /sub/one.go")
}

View File

@@ -0,0 +1,11 @@
package handler
import (
"fmt"
"net/http"
)
// "Handler" conflicts with the other files' exported function
func Handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "from /sub/two.go")
}

View File

@@ -0,0 +1,11 @@
{
"version": 2,
"builds": [{ "src": "**/*.go", "use": "@vercel/go" }],
"probes": [
{ "path": "/", "mustContain": "from index.go" },
{ "path": "/dupe-handler.go", "mustContain": "from dupe-handler.go" },
{ "path": "/other-package.go", "mustContain": "from other-package.go" },
{ "path": "/sub/one.go", "mustContain": "from /sub/one.go" },
{ "path": "/sub/two.go", "mustContain": "from /sub/two.go" }
]
}

92
packages/go/test/index.test.ts vendored Normal file
View File

@@ -0,0 +1,92 @@
import { getNewHandlerFunctionName } from '../index';
describe('getNewHandlerFunctionName', function () {
it('does nothing with empty original function name', async () => {
let error;
try {
getNewHandlerFunctionName('', 'some/kind-of-file.js');
} catch (err) {
error = err;
}
expect(error).toBeDefined();
expect(error.message).toEqual(
'Handler function renaming failed because original function name was empty.'
);
});
it('does nothing with empty original function name', async () => {
let error;
try {
getNewHandlerFunctionName('Handler', '');
} catch (err) {
error = err;
}
expect(error).toBeDefined();
expect(error.message).toEqual(
'Handler function renaming failed because entrypoint was empty.'
);
});
it('generates slug with back slashes in file path', async () => {
const newFunctionName = getNewHandlerFunctionName(
'Handler',
'some\\file.js'
);
expect(newFunctionName).toEqual('Handler_some_file_js');
});
it('generates slug with forward slashes in file path', async () => {
const newFunctionName = getNewHandlerFunctionName(
'Handler',
'some/file.js'
);
expect(newFunctionName).toEqual('Handler_some_file_js');
});
it('generates slug with dashes in file path', async () => {
const newFunctionName = getNewHandlerFunctionName(
'Handler',
'kind-of-file.js'
);
expect(newFunctionName).toEqual('Handler_kind_of_file_js');
});
it('generates slug with dashes in file path', async () => {
const newFunctionName = getNewHandlerFunctionName(
'Handler',
'kind-of-file.js'
);
expect(newFunctionName).toEqual('Handler_kind_of_file_js');
});
it('generates slug with brackets in file path', async () => {
const newFunctionName = getNewHandlerFunctionName(
'Handler',
'[segment].js'
);
// this expects two underscores on each side intentionally
// left (1): there's an added separator between original function name and slug;
// left (2): the opening bracket is replaced
// right (1): the closing bracket is replaced
// right (2): the period is replaced
expect(newFunctionName).toEqual('Handler__segment__js');
});
it('generates slug with space in file path', async () => {
const newFunctionName = getNewHandlerFunctionName(
'Handler',
'kind of file.js'
);
expect(newFunctionName).toEqual('Handler_kind_of_file_js');
});
it('generates slug with periods in file path', async () => {
const newFunctionName = getNewHandlerFunctionName(
'Handler',
'kind.of.file.js'
);
expect(newFunctionName).toEqual('Handler_kind_of_file_js');
});
});

View File

@@ -11,7 +11,7 @@
"noUnusedLocals": true,
"noUnusedParameters": true,
"noImplicitThis": false,
"types": ["node"],
"types": ["node", "jest"],
"strict": true,
"target": "ES2020"
}

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/hydrogen",
"version": "0.0.12",
"version": "0.0.13",
"license": "MIT",
"main": "./dist/index.js",
"homepage": "https://vercel.com/docs",
@@ -21,7 +21,7 @@
"devDependencies": {
"@types/jest": "27.5.1",
"@types/node": "*",
"@vercel/build-utils": "5.2.0",
"@vercel/build-utils": "5.3.0",
"typescript": "4.6.4"
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/next",
"version": "3.1.15",
"version": "3.1.16",
"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.2.0",
"@vercel/build-utils": "5.3.0",
"@vercel/nft": "0.21.0",
"@vercel/routing-utils": "2.0.2",
"async-sema": "3.0.1",

View File

@@ -10,6 +10,7 @@ import {
download,
getLambdaOptionsFromFunction,
getNodeVersion,
getPrefixedEnvVars,
getSpawnOptions,
getScriptName,
glob,
@@ -224,14 +225,14 @@ export const build: BuildV2 = async ({
)
);
Object.keys(process.env)
.filter(key => key.startsWith('VERCEL_'))
.forEach(key => {
const newKey = `NEXT_PUBLIC_${key}`;
if (!(newKey in process.env)) {
process.env[newKey] = process.env[key];
}
});
const prefixedEnvs = getPrefixedEnvVars({
envPrefix: 'NEXT_PUBLIC_',
envs: process.env,
});
for (const [key, value] of Object.entries(prefixedEnvs)) {
process.env[key] = value;
}
await download(files, workPath, meta);

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/node",
"version": "2.5.6",
"version": "2.5.7",
"license": "MIT",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/node-js",
@@ -31,7 +31,7 @@
"dependencies": {
"@edge-runtime/vm": "1.1.0-beta.23",
"@types/node": "*",
"@vercel/build-utils": "5.2.0",
"@vercel/build-utils": "5.3.0",
"@vercel/node-bridge": "3.0.0",
"@vercel/static-config": "2.0.3",
"edge-runtime": "1.1.0-beta.23",

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/python",
"version": "3.1.7",
"version": "3.1.8",
"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.2.0",
"@vercel/build-utils": "5.3.0",
"@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.16",
"version": "1.0.17",
"main": "./dist/index.js",
"license": "MIT",
"homepage": "https://vercel.com/docs",
@@ -27,6 +27,6 @@
"@types/aws-lambda": "8.10.19",
"@types/node": "*",
"@types/semver": "6.0.0",
"@vercel/build-utils": "5.2.0"
"@vercel/build-utils": "5.3.0"
}
}

View File

@@ -15,6 +15,7 @@ import {
glob,
debug,
getNodeVersion,
getPrefixedEnvVars,
getSpawnOptions,
runNpmInstall,
runPackageJsonScript,
@@ -54,14 +55,14 @@ export const build: BuildV2 = async ({
}) => {
await download(files, workPath, meta);
Object.keys(process.env)
.filter(key => key.startsWith('VERCEL_'))
.forEach(key => {
const newKey = `REDWOOD_ENV_${key}`;
if (!(newKey in process.env)) {
process.env[newKey] = process.env[key];
}
});
const prefixedEnvs = getPrefixedEnvVars({
envPrefix: 'REDWOOD_ENV_',
envs: process.env,
});
for (const [key, value] of Object.entries(prefixedEnvs)) {
process.env[key] = value;
}
const { installCommand, buildCommand } = config;
const mountpoint = dirname(entrypoint);

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/remix",
"version": "1.0.17",
"version": "1.0.18",
"license": "MIT",
"main": "./dist/index.js",
"homepage": "https://vercel.com/docs",
@@ -25,7 +25,7 @@
"devDependencies": {
"@types/jest": "27.5.1",
"@types/node": "*",
"@vercel/build-utils": "5.2.0",
"@vercel/build-utils": "5.3.0",
"typescript": "4.6.4"
}
}

View File

@@ -1,7 +1,7 @@
{
"name": "@vercel/ruby",
"author": "Nathan Cahill <nathan@nathancahill.com>",
"version": "1.3.23",
"version": "1.3.24",
"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.2.0",
"@vercel/build-utils": "5.3.0",
"@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.16",
"version": "1.0.17",
"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.2.0",
"@vercel/build-utils": "5.3.0",
"@vercel/frameworks": "1.1.3",
"@vercel/ncc": "0.24.0",
"@vercel/routing-utils": "2.0.2",

View File

@@ -20,6 +20,7 @@ import {
spawnCommand,
runNpmInstall,
getEnvForPackageManager,
getPrefixedEnvVars,
getNodeBinPath,
runBundleInstall,
runPipInstall,
@@ -366,22 +367,13 @@ export const build: BuildV2 = async ({
`Detected ${framework.name} framework. Optimizing your deployment...`
);
if (process.env.VERCEL_URL) {
const vercelSystemEnvPrefix = 'VERCEL_';
const { envPrefix } = framework;
if (envPrefix) {
Object.keys(process.env)
.filter(key => key.startsWith(vercelSystemEnvPrefix))
.forEach(key => {
const newKey = `${envPrefix}${key}`;
if (!(newKey in process.env)) {
process.env[newKey] = process.env[key];
}
});
const prefixedEnvs = getPrefixedEnvVars({
envPrefix: framework.envPrefix,
envs: process.env,
});
// tell turbo to exclude all vercel system env vars (envPrefix includes trailing underscore)
process.env.TURBO_CI_VENDOR_ENV_KEY = `${envPrefix}${vercelSystemEnvPrefix}`;
}
for (const [key, value] of Object.entries(prefixedEnvs)) {
process.env[key] = value;
}
if (process.env.VERCEL_ANALYTICS_ID) {

View File

@@ -1035,6 +1035,13 @@
dependencies:
"@sinclair/typebox" "^0.23.3"
"@jest/schemas@^28.1.3":
version "28.1.3"
resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905"
integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==
dependencies:
"@sinclair/typebox" "^0.24.1"
"@jest/source-map@^28.0.2":
version "28.0.2"
resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.0.2.tgz#914546f4410b67b1d42c262a1da7e0406b52dc90"
@@ -2060,6 +2067,11 @@
resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.4.tgz#6ff93fd2585ce44f7481c9ff6af610fbb5de98a4"
integrity sha512-0/WqSvpVbCBAV1yPeko7eAczKbs78dNVAaX14quVlwOb2wxfKuXCx91h4NrEfkYK9zEnyVSW4JVI/trP3iS+Qg==
"@sinclair/typebox@^0.24.1":
version "0.24.27"
resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.27.tgz#d55643516a1546174e10da681a8aaa81e757452d"
integrity sha512-K7C7IlQ3zLePEZleUN21ceBA2aLcMnLHTLph8QWk1JK37L90obdpY+QGY8bXMKxf1ht1Z0MNewvXxWv0oGDYFg==
"@sindresorhus/is@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
@@ -2653,6 +2665,14 @@
jest-matcher-utils "^27.0.0"
pretty-format "^27.0.0"
"@types/jest@28.1.6":
version "28.1.6"
resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.6.tgz#d6a9cdd38967d2d746861fb5be6b120e38284dd4"
integrity sha512-0RbGAFMfcBJKOmqRazM8L98uokwuwD5F8rHrv/ZMbrZBwVOWZUyPG6VFNscjYr/vjM3Vu4fRrCPbOs42AfemaQ==
dependencies:
jest-matcher-utils "^28.0.0"
pretty-format "^28.0.0"
"@types/js-yaml@3.12.1":
version "3.12.1"
resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.1.tgz#5c6f4a1eabca84792fbd916f0cb40847f123c656"
@@ -5343,6 +5363,11 @@ diff-sequences@^28.0.2:
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.0.2.tgz#40f8d4ffa081acbd8902ba35c798458d0ff1af41"
integrity sha512-YtEoNynLDFCRznv/XDalsKGSZDoj0U5kLnXvY0JSq3nBboRrZXjD81+eSiwi+nzcZDwedMmcowcxNwwgFW23mQ==
diff-sequences@^28.1.1:
version "28.1.1"
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6"
integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==
diff@^4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
@@ -8016,6 +8041,16 @@ jest-diff@^28.0.2:
jest-get-type "^28.0.2"
pretty-format "^28.0.2"
jest-diff@^28.1.3:
version "28.1.3"
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f"
integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==
dependencies:
chalk "^4.0.0"
diff-sequences "^28.1.1"
jest-get-type "^28.0.2"
pretty-format "^28.1.3"
jest-docblock@^28.0.2:
version "28.0.2"
resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.0.2.tgz#3cab8abea53275c9d670cdca814fc89fba1298c2"
@@ -8093,6 +8128,16 @@ jest-matcher-utils@^27.0.0:
jest-get-type "^27.5.1"
pretty-format "^27.5.1"
jest-matcher-utils@^28.0.0:
version "28.1.3"
resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e"
integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==
dependencies:
chalk "^4.0.0"
jest-diff "^28.1.3"
jest-get-type "^28.0.2"
pretty-format "^28.1.3"
jest-matcher-utils@^28.0.2:
version "28.0.2"
resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.0.2.tgz#eb461af204b6d0f05281e9228094f0ab7e9e8537"
@@ -10420,6 +10465,16 @@ pretty-format@^27.5.1:
ansi-styles "^5.0.0"
react-is "^17.0.1"
pretty-format@^28.0.0, pretty-format@^28.1.3:
version "28.1.3"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5"
integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==
dependencies:
"@jest/schemas" "^28.1.3"
ansi-regex "^5.0.1"
ansi-styles "^5.0.0"
react-is "^18.0.0"
pretty-format@^28.0.2:
version "28.0.2"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.0.2.tgz#6a24d71cbb61a5e5794ba7513fe22101675481bc"