Compare commits

..

8 Commits

Author SHA1 Message Date
JJ Kasper
c9597dc199 Publish Canary
- @vercel/build-utils@2.5.2-canary.0
 - vercel@20.1.1-canary.1
 - @vercel/client@9.0.2-canary.0
 - @vercel/next@2.6.25-canary.0
 - @vercel/node@1.8.2-canary.0
2020-09-05 00:16:18 -05:00
Steven
1b5c94b392 [node][next] Fix nft tracing for monorepos (#5143)
Co-authored-by: Joe Haddad <joe.haddad@zeit.co>
Co-authored-by: JJ Kasper <jj@jjsweb.site>
2020-09-05 01:13:54 -04:00
dav-is
bd1393a9d6 Publish Canary
- vercel@20.1.1-canary.0
2020-09-04 18:40:25 -04:00
dependabot[bot]
47ddd36fec [cli] Update http-proxy to v1.18.1 (#5152)
Bumps [http-proxy](https://github.com/http-party/node-http-proxy) from 1.17.0 to 1.18.1.
- [Release notes](https://github.com/http-party/node-http-proxy/releases)
- [Changelog](https://github.com/http-party/node-http-proxy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/http-party/node-http-proxy/compare/1.17.0...1.18.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-09-04 14:33:56 -07:00
dependabot[bot]
bd047cdc6a Update tree-kill to v1.2.2 (#5151)
Bumps [tree-kill](https://github.com/pkrumins/node-tree-kill) from 1.2.1 to 1.2.2.
- [Release notes](https://github.com/pkrumins/node-tree-kill/releases)
- [Commits](https://github.com/pkrumins/node-tree-kill/compare/v1.2.1...v1.2.2)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-09-04 14:33:32 -07:00
Connor Davis
477f9e8753 [cli] Fix color and indention in learn more link (#5148)
CH-568

Before:
![image](https://user-images.githubusercontent.com/11590024/92258007-2883e080-eea4-11ea-8c14-af0f3c9e27a6.png)

After:
![Screenshot-2020-09-04-11:44](https://user-images.githubusercontent.com/11590024/92258023-3174b200-eea4-11ea-9170-0acd4d6f883b.png)
2020-09-04 21:25:52 +00:00
Mike Hartington
183ea42f94 [examples] chore(ionic-angular): remove Google Maps API key (#5130) 2020-08-31 11:58:52 -07:00
Steven
57a17eb416 [tests] Deprecate "now" npm package in favor of "vercel" (#5119)
We deprecated all the `now` scoped packages in favor of the `vercel` equivalents, however the deprecation message disappears after each publish, so we must to run `npm deprecate` after `npm publish` for legacy packages.
2020-08-28 15:39:06 -04:00
18 changed files with 218 additions and 127 deletions

View File

@@ -68,12 +68,12 @@ In such cases you can visit the URL of the failed deployment and append `/_logs`
The logs of this deployment will contain the actual error which may help you to understand what went wrong. The logs of this deployment will contain the actual error which may help you to understand what went wrong.
### @zeit/node-file-trace ### @vercel/nft
Some of the Builders use `@zeit/node-file-trace` to tree-shake files before deployment. If you suspect an error with this tree-shaking mechanism, you can create the following script in your project: Some of the Builders use `@vercel/nft` to tree-shake files before deployment. If you suspect an error with this tree-shaking mechanism, you can create the following script in your project:
```js ```js
const trace = require('@zeit/node-file-trace'); const trace = require('@vercel/nft');
trace(['path/to/entrypoint.js'], { trace(['path/to/entrypoint.js'], {
ts: true, ts: true,
mixedModules: true, mixedModules: true,
@@ -82,7 +82,7 @@ trace(['path/to/entrypoint.js'], {
.then(e => console.error(e)); .then(e => console.error(e));
``` ```
When you run this script, you'll see all imported files. If anything file is missing, the bug is in [@zeit/node-file-trace](https://github.com/vercel/node-file-trace) and not the Builder. When you run this script, you'll see all imported files. If anything file is missing, the bug is in [@vercel/nft](https://github.com/vercel/nft) and not the Builder.
## Deploy a Builder with existing project ## Deploy a Builder with existing project

View File

@@ -15,7 +15,7 @@ jobs:
- uses: actions/checkout@v1 - uses: actions/checkout@v1
- uses: actions/setup-node@v1 - uses: actions/setup-node@v1
with: with:
node-version: 10 node-version: 12
- name: Install - name: Install
run: yarn install --check-files --frozen-lockfile run: yarn install --check-files --frozen-lockfile
- name: Build - name: Build

View File

@@ -27,7 +27,7 @@ export class MapPage implements AfterViewInit {
} }
const googleMaps = await getGoogleMaps( const googleMaps = await getGoogleMaps(
'AIzaSyB8pf6ZdFQj5qw7rc_HSGrhUwQKfIe9ICw' 'YOUR_API_KEY_HERE'
); );
let map; let map;

View File

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

View File

@@ -107,6 +107,13 @@ export interface BuildOptions {
*/ */
workPath: string; workPath: string;
/**
* The "Root Directory" is assigned to the `workPath` so the `repoRootPath`
* is the Git Repository Root. This is only relevant for Monorepos.
* See https://vercel.com/blog/monorepos
*/
repoRootPath?: string;
/** /**
* An arbitrary object passed by the user in the build definition defined * An arbitrary object passed by the user in the build definition defined
* in `vercel.json`. * in `vercel.json`.

View File

@@ -1,6 +1,6 @@
{ {
"name": "vercel", "name": "vercel",
"version": "20.1.0", "version": "20.1.1-canary.1",
"preferGlobal": true, "preferGlobal": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"description": "The command-line interface for Vercel", "description": "The command-line interface for Vercel",
@@ -61,9 +61,9 @@
"node": ">= 10" "node": ">= 10"
}, },
"dependencies": { "dependencies": {
"@vercel/build-utils": "2.5.1", "@vercel/build-utils": "2.5.2-canary.0",
"@vercel/go": "1.1.6", "@vercel/go": "1.1.6",
"@vercel/node": "1.8.1", "@vercel/node": "1.8.2-canary.0",
"@vercel/python": "1.2.3", "@vercel/python": "1.2.3",
"@vercel/ruby": "1.2.4", "@vercel/ruby": "1.2.4",
"update-notifier": "4.1.0" "update-notifier": "4.1.0"
@@ -134,7 +134,7 @@
"fs-extra": "7.0.1", "fs-extra": "7.0.1",
"get-port": "5.1.1", "get-port": "5.1.1",
"glob": "7.1.2", "glob": "7.1.2",
"http-proxy": "1.17.0", "http-proxy": "1.18.1",
"inquirer": "7.0.4", "inquirer": "7.0.4",
"is-port-reachable": "3.0.0", "is-port-reachable": "3.0.0",
"is-url": "1.2.2", "is-url": "1.2.2",
@@ -168,7 +168,7 @@
"text-table": "0.2.0", "text-table": "0.2.0",
"title": "3.4.1", "title": "3.4.1",
"tmp-promise": "1.0.3", "tmp-promise": "1.0.3",
"tree-kill": "1.2.1", "tree-kill": "1.2.2",
"ts-node": "8.3.0", "ts-node": "8.3.0",
"typescript": "3.9.3", "typescript": "3.9.3",
"universal-analytics": "0.4.20", "universal-analytics": "0.4.20",

View File

@@ -157,17 +157,22 @@ const printDeploymentStatus = async (
} }
if (indications) { if (indications) {
const indent = process.stdout.isTTY ? ' ' : ''; // if using emojis
const newline = '\n';
for (let indication of indications) { for (let indication of indications) {
output.print( const message =
prependEmoji( prependEmoji(chalk.dim(indication.payload), emoji(indication.type)) +
`${chalk.dim(indication.payload)}`, newline;
emoji(indication.type) let link = '';
if (indication.link)
link =
indent +
chalk.dim(
`${indication.action || 'Learn More'}: ${indication.link}`
) + ) +
`\n` + newline +
(indication.link newline;
? `${indication.action || 'Learn More'}: ${indication.link}\n\n` output.print(message + link);
: '')
);
} }
} }
}; };

View File

@@ -1,6 +1,6 @@
{ {
"name": "@vercel/client", "name": "@vercel/client",
"version": "9.0.1", "version": "9.0.2-canary.0",
"main": "dist/index.js", "main": "dist/index.js",
"typings": "dist/index.d.ts", "typings": "dist/index.d.ts",
"homepage": "https://vercel.com", "homepage": "https://vercel.com",
@@ -37,7 +37,7 @@
] ]
}, },
"dependencies": { "dependencies": {
"@vercel/build-utils": "2.5.1", "@vercel/build-utils": "2.5.2-canary.0",
"@zeit/fetch": "5.2.0", "@zeit/fetch": "5.2.0",
"async-retry": "1.2.3", "async-retry": "1.2.3",
"async-sema": "3.0.0", "async-sema": "3.0.0",

View File

@@ -1,6 +1,6 @@
{ {
"name": "@vercel/next", "name": "@vercel/next",
"version": "2.6.24", "version": "2.6.25-canary.0",
"license": "MIT", "license": "MIT",
"main": "./dist/index", "main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/next-js", "homepage": "https://vercel.com/docs/runtimes#official-runtimes/next-js",
@@ -26,7 +26,7 @@
"@types/resolve-from": "5.0.1", "@types/resolve-from": "5.0.1",
"@types/semver": "6.0.0", "@types/semver": "6.0.0",
"@types/yazl": "2.4.1", "@types/yazl": "2.4.1",
"@zeit/node-file-trace": "0.8.2", "@vercel/nft": "0.9.2",
"async-sema": "3.0.1", "async-sema": "3.0.1",
"buffer-crc32": "0.2.13", "buffer-crc32": "0.2.13",
"escape-string-regexp": "3.0.0", "escape-string-regexp": "3.0.0",

View File

@@ -16,7 +16,7 @@ import {
convertRedirects, convertRedirects,
convertRewrites, convertRewrites,
} from '@vercel/routing-utils/dist/superstatic'; } from '@vercel/routing-utils/dist/superstatic';
import { nodeFileTrace, NodeFileTraceReasons } from '@zeit/node-file-trace'; import { nodeFileTrace, NodeFileTraceReasons } from '@vercel/nft';
import { Sema } from 'async-sema'; import { Sema } from 'async-sema';
import { ChildProcess, fork } from 'child_process'; import { ChildProcess, fork } from 'child_process';
import escapeStringRegexp from 'escape-string-regexp'; import escapeStringRegexp from 'escape-string-regexp';
@@ -213,6 +213,7 @@ function startDevServer(entryPath: string, runtimeEnv: EnvConfig) {
export const build = async ({ export const build = async ({
files, files,
workPath, workPath,
repoRootPath,
entrypoint, entrypoint,
config = {} as Config, config = {} as Config,
meta = {} as BuildParamsMeta, meta = {} as BuildParamsMeta,
@@ -231,6 +232,7 @@ export const build = async ({
const entryPath = path.join(workPath, entryDirectory); const entryPath = path.join(workPath, entryDirectory);
const outputDirectory = config.outputDirectory || '.next'; const outputDirectory = config.outputDirectory || '.next';
const dotNextStatic = path.join(entryPath, outputDirectory, 'static'); const dotNextStatic = path.join(entryPath, outputDirectory, 'static');
const baseDir = repoRootPath || workPath;
await download(files, workPath, meta); await download(files, workPath, meta);
@@ -240,7 +242,7 @@ export const build = async ({
const spawnOpts = getSpawnOptions(meta, nodeVersion); const spawnOpts = getSpawnOptions(meta, nodeVersion);
const nowJsonPath = await findUp(['now.json', 'vercel.json'], { const nowJsonPath = await findUp(['now.json', 'vercel.json'], {
cwd: path.join(workPath, path.dirname(entrypoint)), cwd: entryPath,
}); });
let hasLegacyRoutes = false; let hasLegacyRoutes = false;
@@ -756,7 +758,10 @@ export const build = async ({
}; };
const lambdaOptions = await getLambdaOptionsFromFunction({ const lambdaOptions = await getLambdaOptionsFromFunction({
sourceFile: await getSourceFilePathFromPage({ workPath, page }), sourceFile: await getSourceFilePathFromPage({
workPath: entryPath,
page,
}),
config, config,
}); });
@@ -939,12 +944,18 @@ export const build = async ({
const { const {
fileList: apiFileList, fileList: apiFileList,
reasons: apiReasons, reasons: apiReasons,
} = await nodeFileTrace(apiPages, { base: workPath }); } = await nodeFileTrace(apiPages, {
base: baseDir,
processCwd: entryPath,
});
const { const { fileList, reasons: nonApiReasons } = await nodeFileTrace(
fileList, nonApiPages,
reasons: nonApiReasons, {
} = await nodeFileTrace(nonApiPages, { base: workPath }); base: baseDir,
processCwd: entryPath,
}
);
debug(`node-file-trace result for pages: ${fileList}`); debug(`node-file-trace result for pages: ${fileList}`);
@@ -962,7 +973,7 @@ export const build = async ({
// Initial files are manually added to the lambda later // Initial files are manually added to the lambda later
return; return;
} }
const filePath = path.join(workPath, file); const filePath = path.join(baseDir, file);
if (!lstatResults[filePath]) { if (!lstatResults[filePath]) {
lstatResults[filePath] = lstatSema lstatResults[filePath] = lstatSema
@@ -973,7 +984,7 @@ export const build = async ({
const { mode } = await lstatResults[filePath]; const { mode } = await lstatResults[filePath];
files[file] = new FileFsRef({ files[file] = new FileFsRef({
fsPath: path.join(workPath, file), fsPath: path.join(baseDir, file),
mode, mode,
}); });
}; };
@@ -1158,7 +1169,11 @@ export const build = async ({
const { const {
pseudoLayer: pageLayer, pseudoLayer: pageLayer,
pseudoLayerBytes: pageLayerBytes, pseudoLayerBytes: pageLayerBytes,
} = await createPseudoLayer({ [pageFileName]: pages[page] }); } = await createPseudoLayer({
[path.join(path.relative(baseDir, entryPath), pageFileName)]: pages[
page
],
});
currentLambdaGroup.pages[outputName] = { currentLambdaGroup.pages[outputName] = {
pageLayer, pageLayer,
@@ -1194,21 +1209,31 @@ export const build = async ({
} }
const pageFileName = path.normalize( const pageFileName = path.normalize(
path.relative(workPath, pages[page].fsPath) path.relative(entryPath, pages[page].fsPath)
); );
const launcher = launcherData.replace( const launcher = launcherData.replace(
/__LAUNCHER_PAGE_PATH__/g, /__LAUNCHER_PAGE_PATH__/g,
JSON.stringify(requiresTracing ? `./${pageFileName}` : './page') JSON.stringify(requiresTracing ? `./${pageFileName}` : './page')
); );
const launcherFiles: { [name: string]: FileFsRef | FileBlob } = { const launcherFiles: { [name: string]: FileFsRef | FileBlob } = {
'now__bridge.js': new FileFsRef({ [path.join(
path.relative(baseDir, entryPath),
'now__bridge.js'
)]: new FileFsRef({
fsPath: path.join(__dirname, 'now__bridge.js'), fsPath: path.join(__dirname, 'now__bridge.js'),
}), }),
'now__launcher.js': new FileBlob({ data: launcher }), [path.join(
path.relative(baseDir, entryPath),
'now__launcher.js'
)]: new FileBlob({ data: launcher }),
}; };
const lambdaOptions = await getLambdaOptionsFromFunction({ const lambdaOptions = await getLambdaOptionsFromFunction({
sourceFile: await getSourceFilePathFromPage({ workPath, page }), sourceFile: await getSourceFilePathFromPage({
workPath: entryPath,
page,
}),
config, config,
}); });
@@ -1218,10 +1243,16 @@ export const build = async ({
lambdas[outputName] = await createLambdaFromPseudoLayers({ lambdas[outputName] = await createLambdaFromPseudoLayers({
files: { files: {
...launcherFiles, ...launcherFiles,
[requiresTracing ? pageFileName : 'page.js']: pages[page], [path.join(
path.relative(baseDir, entryPath),
pageFileName
)]: pages[page],
}, },
layers: isApiPage(pageFileName) ? apiPseudoLayers : pseudoLayers, layers: isApiPage(pageFileName) ? apiPseudoLayers : pseudoLayers,
handler: 'now__launcher.launcher', handler: path.join(
path.relative(baseDir, entryPath),
'now__launcher.launcher'
),
runtime: nodeVersion.runtime, runtime: nodeVersion.runtime,
...lambdaOptions, ...lambdaOptions,
}); });
@@ -1231,7 +1262,7 @@ export const build = async ({
...launcherFiles, ...launcherFiles,
...assets, ...assets,
...tracedFiles, ...tracedFiles,
[requiresTracing ? pageFileName : 'page.js']: pages[page], ['page.js']: pages[page],
}, },
handler: 'now__launcher.launcher', handler: 'now__launcher.launcher',
runtime: nodeVersion.runtime, runtime: nodeVersion.runtime,
@@ -1372,10 +1403,16 @@ export const build = async ({
` `
); );
const launcherFiles: { [name: string]: FileFsRef | FileBlob } = { const launcherFiles: { [name: string]: FileFsRef | FileBlob } = {
'now__bridge.js': new FileFsRef({ [path.join(
path.relative(baseDir, entryPath),
'now__bridge.js'
)]: new FileFsRef({
fsPath: path.join(__dirname, 'now__bridge.js'), fsPath: path.join(__dirname, 'now__bridge.js'),
}), }),
'now__launcher.js': new FileBlob({ data: launcher }), [path.join(
path.relative(baseDir, entryPath),
'now__launcher.js'
)]: new FileBlob({ data: launcher }),
}; };
const pageLayers: PseudoLayer[] = []; const pageLayers: PseudoLayer[] = [];
@@ -1397,7 +1434,10 @@ export const build = async ({
...(group.isApiLambda ? apiPseudoLayers : pseudoLayers), ...(group.isApiLambda ? apiPseudoLayers : pseudoLayers),
...pageLayers, ...pageLayers,
], ],
handler: 'now__launcher.launcher', handler: path.join(
path.relative(baseDir, entryPath),
'now__launcher.launcher'
),
runtime: nodeVersion.runtime, runtime: nodeVersion.runtime,
}); });
} else { } else {
@@ -1409,7 +1449,10 @@ export const build = async ({
...assets, ...assets,
}, },
layers: pageLayers, layers: pageLayers,
handler: 'now__launcher.launcher', handler: path.join(
path.relative(baseDir, entryPath),
'now__launcher.launcher'
),
runtime: nodeVersion.runtime, runtime: nodeVersion.runtime,
}); });
} }

View File

@@ -1,3 +1,9 @@
// The Next.js builder can emit the project in a subdirectory depending on how
// many folder levels of `node_modules` are traced. To ensure `process.cwd()`
// returns the proper path, we change the directory to the folder with the
// launcher. This mimics `yarn workspace run` behavior.
process.chdir(__dirname);
if (!process.env.NODE_ENV) { if (!process.env.NODE_ENV) {
const region = process.env.VERCEL_REGION || process.env.NOW_REGION; const region = process.env.VERCEL_REGION || process.env.NOW_REGION;
process.env.NODE_ENV = region === 'dev1' ? 'development' : 'production'; process.env.NODE_ENV = region === 'dev1' ? 'development' : 'production';

View File

@@ -1,3 +1,9 @@
// The Next.js builder can emit the project in a subdirectory depending on how
// many folder levels of `node_modules` are traced. To ensure `process.cwd()`
// returns the proper path, we change the directory to the folder with the
// launcher. This mimics `yarn workspace run` behavior.
process.chdir(__dirname);
if (!process.env.NODE_ENV) { if (!process.env.NODE_ENV) {
const region = process.env.VERCEL_REGION || process.env.NOW_REGION; const region = process.env.VERCEL_REGION || process.env.NOW_REGION;
process.env.NODE_ENV = region === 'dev1' ? 'development' : 'production'; process.env.NODE_ENV = region === 'dev1' ? 'development' : 'production';

View File

@@ -1,6 +1,6 @@
{ {
"name": "@vercel/node", "name": "@vercel/node",
"version": "1.8.1", "version": "1.8.2-canary.0",
"license": "MIT", "license": "MIT",
"main": "./dist/index", "main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/node-js", "homepage": "https://vercel.com/docs/runtimes#official-runtimes/node-js",
@@ -33,7 +33,7 @@
"@types/etag": "1.8.0", "@types/etag": "1.8.0",
"@types/test-listen": "1.1.0", "@types/test-listen": "1.1.0",
"@vercel/ncc": "0.24.0", "@vercel/ncc": "0.24.0",
"@zeit/node-file-trace": "0.8.2", "@vercel/nft": "0.9.2",
"content-type": "1.0.4", "content-type": "1.0.4",
"cookie": "0.4.0", "cookie": "0.4.0",
"etag": "1.8.1", "etag": "1.8.1",

View File

@@ -19,7 +19,7 @@ import {
// @ts-ignore - `@types/mkdirp-promise` is broken // @ts-ignore - `@types/mkdirp-promise` is broken
import mkdirp from 'mkdirp-promise'; import mkdirp from 'mkdirp-promise';
import once from '@tootallnate/once'; import once from '@tootallnate/once';
import { nodeFileTrace } from '@zeit/node-file-trace'; import { nodeFileTrace } from '@vercel/nft';
import buildUtils from './build-utils'; import buildUtils from './build-utils';
import { import {
File, File,
@@ -52,12 +52,6 @@ import { Register, register } from './typescript';
export { shouldServe }; export { shouldServe };
export { NowRequest, NowResponse } from './types'; export { NowRequest, NowResponse } from './types';
interface CompilerConfig {
debug?: boolean;
includeFiles?: string | string[];
excludeFiles?: string | string[];
}
interface DownloadOptions { interface DownloadOptions {
files: Files; files: Files;
entrypoint: string; entrypoint: string;
@@ -125,9 +119,10 @@ async function downloadInstallAndBundle({
async function compile( async function compile(
workPath: string, workPath: string,
baseDir: string,
entrypointPath: string, entrypointPath: string,
entrypoint: string, entrypoint: string,
config: CompilerConfig config: Config
): Promise<{ ): Promise<{
preparedFiles: Files; preparedFiles: Files;
shouldAddSourcemapSupport: boolean; shouldAddSourcemapSupport: boolean;
@@ -150,20 +145,21 @@ async function compile(
for (const pattern of includeFiles) { for (const pattern of includeFiles) {
const files = await glob(pattern, workPath); const files = await glob(pattern, workPath);
await Promise.all( await Promise.all(
Object.keys(files).map(async file => { Object.values(files).map(async entry => {
const entry = files[file]; const { fsPath } = entry;
fsCache.set(file, entry); const relPath = relative(baseDir, fsPath);
fsCache.set(relPath, entry);
const stream = entry.toStream(); const stream = entry.toStream();
const { data } = await FileBlob.fromStream({ stream }); const { data } = await FileBlob.fromStream({ stream });
if (file.endsWith('.ts') || file.endsWith('.tsx')) { if (relPath.endsWith('.ts') || relPath.endsWith('.tsx')) {
sourceCache.set( sourceCache.set(
file, relPath,
compileTypeScript(resolve(workPath, file), data.toString()) compileTypeScript(fsPath, data.toString())
); );
} else { } else {
sourceCache.set(file, data); sourceCache.set(relPath, data);
} }
inputFiles.add(resolve(workPath, file)); inputFiles.add(fsPath);
}) })
); );
} }
@@ -178,7 +174,7 @@ async function compile(
let tsCompile: Register; let tsCompile: Register;
function compileTypeScript(path: string, source: string): string { function compileTypeScript(path: string, source: string): string {
const relPath = relative(workPath, path); const relPath = relative(baseDir, path);
if (!tsCompile) { if (!tsCompile) {
tsCompile = register({ tsCompile = register({
basePath: workPath, // The base is the same as root now.json dir basePath: workPath, // The base is the same as root now.json dir
@@ -201,12 +197,13 @@ async function compile(
const { fileList, esmFileList, warnings } = await nodeFileTrace( const { fileList, esmFileList, warnings } = await nodeFileTrace(
[...inputFiles], [...inputFiles],
{ {
base: workPath, base: baseDir,
processCwd: workPath,
ts: true, ts: true,
mixedModules: true, mixedModules: true,
ignore: config.excludeFiles, ignore: config.excludeFiles,
readFile(fsPath: string): Buffer | string | null { readFile(fsPath: string): Buffer | string | null {
const relPath = relative(workPath, fsPath); const relPath = relative(baseDir, fsPath);
const cached = sourceCache.get(relPath); const cached = sourceCache.get(relPath);
if (cached) return cached.toString(); if (cached) return cached.toString();
// null represents a not found // null represents a not found
@@ -246,7 +243,7 @@ async function compile(
for (const path of fileList) { for (const path of fileList) {
let entry = fsCache.get(path); let entry = fsCache.get(path);
if (!entry) { if (!entry) {
const fsPath = resolve(workPath, path); const fsPath = resolve(baseDir, path);
const { mode } = lstatSync(fsPath); const { mode } = lstatSync(fsPath);
if (isSymbolicLink(mode)) { if (isSymbolicLink(mode)) {
entry = new FileFsRef({ fsPath, mode }); entry = new FileFsRef({ fsPath, mode });
@@ -258,14 +255,14 @@ async function compile(
if (isSymbolicLink(entry.mode) && entry.fsPath) { if (isSymbolicLink(entry.mode) && entry.fsPath) {
// ensure the symlink target is added to the file list // ensure the symlink target is added to the file list
const symlinkTarget = relative( const symlinkTarget = relative(
workPath, baseDir,
resolve(dirname(entry.fsPath), readlinkSync(entry.fsPath)) resolve(dirname(entry.fsPath), readlinkSync(entry.fsPath))
); );
if ( if (
!symlinkTarget.startsWith('..' + sep) && !symlinkTarget.startsWith('..' + sep) &&
fileList.indexOf(symlinkTarget) === -1 fileList.indexOf(symlinkTarget) === -1
) { ) {
const stats = statSync(resolve(workPath, symlinkTarget)); const stats = statSync(resolve(baseDir, symlinkTarget));
if (stats.isFile()) { if (stats.isFile()) {
fileList.push(symlinkTarget); fileList.push(symlinkTarget);
} }
@@ -275,7 +272,7 @@ async function compile(
// There is a bug on Windows where entrypoint uses forward slashes // There is a bug on Windows where entrypoint uses forward slashes
// and workPath uses backslashes so we use resolve before comparing. // and workPath uses backslashes so we use resolve before comparing.
if ( if (
resolve(workPath, path) !== resolve(workPath, entrypoint) && resolve(baseDir, path) !== resolve(workPath, entrypoint) &&
tsCompiled.has(path) tsCompiled.has(path)
) { ) {
preparedFiles[ preparedFiles[
@@ -339,6 +336,7 @@ export async function build({
files, files,
entrypoint, entrypoint,
workPath, workPath,
repoRootPath,
config = {}, config = {},
meta = {}, meta = {},
}: BuildOptions) { }: BuildOptions) {
@@ -346,6 +344,7 @@ export async function build({
config.helpers === false || process.env.NODEJS_HELPERS === '0' config.helpers === false || process.env.NODEJS_HELPERS === '0'
); );
const baseDir = repoRootPath || workPath;
const awsLambdaHandler = getAWSLambdaHandler(entrypoint, config); const awsLambdaHandler = getAWSLambdaHandler(entrypoint, config);
const { const {
@@ -372,6 +371,7 @@ export async function build({
const traceTime = Date.now(); const traceTime = Date.now();
const { preparedFiles, shouldAddSourcemapSupport, watch } = await compile( const { preparedFiles, shouldAddSourcemapSupport, watch } = await compile(
workPath, workPath,
baseDir,
entrypointPath, entrypointPath,
entrypoint, entrypoint,
config config
@@ -383,7 +383,7 @@ export async function build({
const launcherFiles: Files = { const launcherFiles: Files = {
[`${LAUNCHER_FILENAME}.js`]: new FileBlob({ [`${LAUNCHER_FILENAME}.js`]: new FileBlob({
data: makeLauncher({ data: makeLauncher({
entrypointPath: `./${entrypoint}`, entrypointPath: `./${relative(baseDir, entrypointPath)}`,
bridgePath: `./${BRIDGE_FILENAME}`, bridgePath: `./${BRIDGE_FILENAME}`,
helpersPath: `./${HELPERS_FILENAME}`, helpersPath: `./${HELPERS_FILENAME}`,
sourcemapSupportPath: `./${SOURCEMAP_SUPPORT_FILENAME}`, sourcemapSupportPath: `./${SOURCEMAP_SUPPORT_FILENAME}`,

View File

@@ -3,6 +3,7 @@
"strict": true, "strict": true,
"esModuleInterop": true, "esModuleInterop": true,
"sourceMap": true, "sourceMap": true,
"jsx": "react",
"lib": ["esnext"], "lib": ["esnext"],
"target": "esnext", "target": "esnext",
"module": "commonjs" "module": "commonjs"

View File

@@ -14,7 +14,15 @@ commit="$(git log --format="%H" -n 1)"
tags="$(git show-ref --tags -d | grep ^"$commit" | sed -e 's,.* refs/tags/,,' -e 's/\^{}//')" tags="$(git show-ref --tags -d | grep ^"$commit" | sed -e 's,.* refs/tags/,,' -e 's/\^{}//')"
for tag in $tags; do for tag in $tags; do
package_dir="$(node "${__dirname}/update-legacy-name.js" "$tag")" str="$(node "${__dirname}/update-legacy-name.js" "$tag")"
IFS='|' # set delimiter
read -ra ADDR <<< "$str" # str is read into an array as tokens separated by IFS
package_dir="${ADDR[0]}"
old_name="${ADDR[1]}"
new_name="${ADDR[2]}"
version="${ADDR[3]}"
IFS=' ' # reset to default after usage
cd "${__dirname}/../packages/${package_dir}" cd "${__dirname}/../packages/${package_dir}"
@@ -25,4 +33,6 @@ for tag in $tags; do
echo "Running \`npm publish $npm_tag\` in \"$(pwd)\"" echo "Running \`npm publish $npm_tag\` in \"$(pwd)\""
npm publish $npm_tag npm publish $npm_tag
echo "Running \`npm deprecate $old_name@$version\` in favor of $new_name"
npm deprecate "$old_name@$version" "\"$old_name\" is deprecated and will stop receiving updates on December 31, 2020. Please use \"$new_name\" instead."
done done

View File

@@ -29,7 +29,8 @@ if (!packageDir) {
const pkgJsonPath = join(packagesDir, packageDir, 'package.json'); const pkgJsonPath = join(packagesDir, packageDir, 'package.json');
const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf8')); const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf8'));
const originalName = pkg.name; const oldName = pkg.name;
const version = pkg.version;
if (pkg.name === '@vercel/client') { if (pkg.name === '@vercel/client') {
// The legacy name for `@vercel/client` is `now-client` (global scope) // The legacy name for `@vercel/client` is `now-client` (global scope)
@@ -42,10 +43,12 @@ if (pkg.name === '@vercel/client') {
} }
} }
console.error(`Updated package name: "${originalName}" -> "${pkg.name}"`); const newName = pkg.name;
console.error(`Updated package name: "${oldName}" -> "${newName}"`);
fs.writeFileSync(pkgJsonPath, `${JSON.stringify(pkg, null, 2)}\n`); fs.writeFileSync(pkgJsonPath, `${JSON.stringify(pkg, null, 2)}\n`);
// Log the directory name to stdout for the `publish-legacy.sh` // Log the directory name to stdout for the `publish-legacy.sh`
// script to consume for the `npm publish` that happens next. // script to consume for the `npm publish` that happens next.
console.log(packageDir); const IFS = '|';
console.log([packageDir, oldName, newName, version].join(IFS));

108
yarn.lock
View File

@@ -2221,6 +2221,28 @@
resolved "https://registry.yarnpkg.com/@vercel/ncc/-/ncc-0.24.0.tgz#a2e8783a185caa99b5d8961a57dfc9665de16296" resolved "https://registry.yarnpkg.com/@vercel/ncc/-/ncc-0.24.0.tgz#a2e8783a185caa99b5d8961a57dfc9665de16296"
integrity sha512-crqItMcIwCkvdXY/V3/TzrHJQx6nbIaRqE1cOopJhgGX6izvNov40SmD//nS5flfEvdK54YGjwVVq+zG6crjOg== integrity sha512-crqItMcIwCkvdXY/V3/TzrHJQx6nbIaRqE1cOopJhgGX6izvNov40SmD//nS5flfEvdK54YGjwVVq+zG6crjOg==
"@vercel/nft@0.9.2":
version "0.9.2"
resolved "https://registry.yarnpkg.com/@vercel/nft/-/nft-0.9.2.tgz#677ecefb0bd618143281c62c719baca57a36ac4d"
integrity sha512-Dr2yJlCnfkQEt4QHKcPJKTxCyoBX0YCzHDzozd8upBFm8kKbh2yMSu5wp+1btevQXOMkOUtxntovwwPHDIU51w==
dependencies:
acorn "^7.1.1"
acorn-class-fields "^0.3.2"
acorn-export-ns-from "^0.1.0"
acorn-import-meta "^1.1.0"
acorn-numeric-separator "^0.3.0"
acorn-static-class-features "^0.2.1"
bindings "^1.4.0"
estree-walker "^0.6.1"
glob "^7.1.3"
graceful-fs "^4.1.15"
micromatch "^4.0.2"
mkdirp "^0.5.1"
node-gyp-build "^4.2.2"
node-pre-gyp "^0.13.0"
resolve-from "^5.0.0"
rollup-pluginutils "^2.8.2"
"@zeit/dns-cached-resolve@2.1.0": "@zeit/dns-cached-resolve@2.1.0":
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/@zeit/dns-cached-resolve/-/dns-cached-resolve-2.1.0.tgz#78583010df1683fdb7b05949b75593c9a8641bc1" resolved "https://registry.yarnpkg.com/@zeit/dns-cached-resolve/-/dns-cached-resolve-2.1.0.tgz#78583010df1683fdb7b05949b75593c9a8641bc1"
@@ -2282,28 +2304,6 @@
xdg-app-paths "5.1.0" xdg-app-paths "5.1.0"
yauzl-promise "2.1.3" yauzl-promise "2.1.3"
"@zeit/node-file-trace@0.8.2":
version "0.8.2"
resolved "https://registry.yarnpkg.com/@zeit/node-file-trace/-/node-file-trace-0.8.2.tgz#a00d21a98015c4ea18c8b1104ad60ea91b42dcca"
integrity sha512-M6KR95Xz9af8kB8X7e4inhoIjVoKNT6WxjLQwPByAAdCP6JdCg3Fb0dbTh2WelKlAibUpfS9nANU/HUDcfedSA==
dependencies:
acorn "^7.1.1"
acorn-class-fields "^0.3.2"
acorn-export-ns-from "^0.1.0"
acorn-import-meta "^1.1.0"
acorn-numeric-separator "^0.3.0"
acorn-static-class-features "^0.2.1"
bindings "^1.4.0"
estree-walker "^0.6.1"
glob "^7.1.3"
graceful-fs "^4.1.15"
micromatch "^4.0.2"
mkdirp "^0.5.1"
node-gyp-build "^4.2.2"
node-pre-gyp "^0.13.0"
resolve-from "^5.0.0"
rollup-pluginutils "^2.8.2"
"@zeit/source-map-support@0.6.2": "@zeit/source-map-support@0.6.2":
version "0.6.2" version "0.6.2"
resolved "https://registry.yarnpkg.com/@zeit/source-map-support/-/source-map-support-0.6.2.tgz#0efd478f24a606726948165e53a8efe89e24036f" resolved "https://registry.yarnpkg.com/@zeit/source-map-support/-/source-map-support-0.6.2.tgz#0efd478f24a606726948165e53a8efe89e24036f"
@@ -2339,11 +2339,11 @@ abbrev@1:
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
acorn-class-fields@^0.3.2: acorn-class-fields@^0.3.2:
version "0.3.4" version "0.3.7"
resolved "https://registry.yarnpkg.com/acorn-class-fields/-/acorn-class-fields-0.3.4.tgz#4144289bdf9d8b2bb9d274b794dd72d7f8e4a815" resolved "https://registry.yarnpkg.com/acorn-class-fields/-/acorn-class-fields-0.3.7.tgz#a35122f3cc6ad2bb33b1857e79215677fcfdd720"
integrity sha512-yqUCIu0UJHFmCVhH3Cq29UR+3OJo1CtNWf1ncxTf3KfdEDt7aD0iVYmX7UN+RvIHyOsgukzplQhNkgePtASLUw== integrity sha512-jdUWSFce0fuADUljmExz4TWpPkxmRW/ZCPRqeeUzbGf0vFUcpQYbyq52l75qGd0oSwwtAepeL6hgb/naRgvcKQ==
dependencies: dependencies:
acorn-private-class-elements "^0.2.5" acorn-private-class-elements "^0.2.7"
acorn-export-ns-from@^0.1.0: acorn-export-ns-from@^0.1.0:
version "0.1.0" version "0.1.0"
@@ -2369,21 +2369,21 @@ acorn-jsx@^5.2.0:
integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==
acorn-numeric-separator@^0.3.0: acorn-numeric-separator@^0.3.0:
version "0.3.2" version "0.3.6"
resolved "https://registry.yarnpkg.com/acorn-numeric-separator/-/acorn-numeric-separator-0.3.2.tgz#5f849ae00d11e0bf1f8092e0eca7e0917436ae9f" resolved "https://registry.yarnpkg.com/acorn-numeric-separator/-/acorn-numeric-separator-0.3.6.tgz#af7f0abaf8e74bd9ca1117602954d0a3b75804f3"
integrity sha512-ZNN1qnKvjWycDSQBfuD1TCiB81ItjjeGUPLHuqfP8X8HXwAodGTWsAaqSOQ1Nc9t+Wlb3tcEFdBrwUFUIzDiiA== integrity sha512-jUr5esgChu4k7VzesH/Nww3EysuyGJJcTEEiXqILUFKpO96PNyEXmK21M6nE0TSqGA1PeEg1MzgqJaoFsn9JMw==
acorn-private-class-elements@^0.2.3, acorn-private-class-elements@^0.2.5: acorn-private-class-elements@^0.2.7:
version "0.2.5" version "0.2.7"
resolved "https://registry.yarnpkg.com/acorn-private-class-elements/-/acorn-private-class-elements-0.2.5.tgz#5082582395d2dabbbb1ddf6397244fdaa61cded6" resolved "https://registry.yarnpkg.com/acorn-private-class-elements/-/acorn-private-class-elements-0.2.7.tgz#b14902c705bcff267adede1c9f61c1a317ef95d2"
integrity sha512-3eApRrJmPjaxWB3XidP8YMeVq9pcswPFE0KsSWVuhceCU68ZS8fkcf0fTXGhCmnNd7n48NWWV27EKMFPeCoJLg== integrity sha512-+GZH2wOKNZOBI4OOPmzpo4cs6mW297sn6fgIk1dUI08jGjhAaEwvC39mN2gJAg2lmAQJ1rBkFqKWonL3Zz6PVA==
acorn-static-class-features@^0.2.1: acorn-static-class-features@^0.2.1:
version "0.2.2" version "0.2.4"
resolved "https://registry.yarnpkg.com/acorn-static-class-features/-/acorn-static-class-features-0.2.2.tgz#3f8e5b97e5b969d544cf4b2fe51c0d4c396d7a5b" resolved "https://registry.yarnpkg.com/acorn-static-class-features/-/acorn-static-class-features-0.2.4.tgz#a0f5261dd483f25196716854f2d7652a1deb39ee"
integrity sha512-B7aWeS7MXqdgP3RnettN/CFz7HevAlQWfh5zkc3LJzeCQoF1InTzYBCfkkbmit1p0pmCEB8IG05gB62pOm5lvA== integrity sha512-5X4mpYq5J3pdndLmIB0+WtFd/mKWnNYpuTlTzj32wUu/PMmEGOiayQ5UrqgwdBNiaZBtDDh5kddpP7Yg2QaQYA==
dependencies: dependencies:
acorn-private-class-elements "^0.2.3" acorn-private-class-elements "^0.2.7"
acorn-walk@^6.0.1: acorn-walk@^6.0.1:
version "6.2.0" version "6.2.0"
@@ -4992,11 +4992,16 @@ etag@1.8.1:
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
eventemitter3@^3.0.0, eventemitter3@^3.1.0: eventemitter3@^3.1.0:
version "3.1.2" version "3.1.2"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7"
integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==
eventemitter3@^4.0.0:
version "4.0.7"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
events-intercept@^2.0.0: events-intercept@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/events-intercept/-/events-intercept-2.0.0.tgz#adbf38681c5a4b2011c41ee41f61a34cba448897" resolved "https://registry.yarnpkg.com/events-intercept/-/events-intercept-2.0.0.tgz#adbf38681c5a4b2011c41ee41f61a34cba448897"
@@ -6046,12 +6051,12 @@ http-proxy-agent@^4.0.0:
agent-base "6" agent-base "6"
debug "4" debug "4"
http-proxy@1.17.0: http-proxy@1.18.1:
version "1.17.0" version "1.18.1"
resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==
dependencies: dependencies:
eventemitter3 "^3.0.0" eventemitter3 "^4.0.0"
follow-redirects "^1.0.0" follow-redirects "^1.0.0"
requires-port "^1.0.0" requires-port "^1.0.0"
@@ -8280,9 +8285,9 @@ natural-compare@^1.4.0:
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
needle@^2.2.1: needle@^2.2.1:
version "2.5.0" version "2.5.2"
resolved "https://registry.yarnpkg.com/needle/-/needle-2.5.0.tgz#e6fc4b3cc6c25caed7554bd613a5cf0bac8c31c0" resolved "https://registry.yarnpkg.com/needle/-/needle-2.5.2.tgz#cf1a8fce382b5a280108bba90a14993c00e4010a"
integrity sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA== integrity sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ==
dependencies: dependencies:
debug "^3.2.6" debug "^3.2.6"
iconv-lite "^0.4.4" iconv-lite "^0.4.4"
@@ -8334,9 +8339,9 @@ node-fetch@2.6.0, node-fetch@^2.2.0, node-fetch@^2.2.1, node-fetch@^2.3.0, node-
integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
node-gyp-build@^4.2.2: node-gyp-build@^4.2.2:
version "4.2.2" version "4.2.3"
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.2.tgz#3f44b65adaafd42fb6c3d81afd630e45c847eb66" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739"
integrity sha512-Lqh7mrByWCM8Cf9UPqpeoVBBo5Ugx+RKu885GAzmLBVYjeywScxHXPGLa4JfYNZmcNGwzR0Glu5/9GaQZMFqyA== integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==
node-gyp@^5.0.2: node-gyp@^5.0.2:
version "5.1.1" version "5.1.1"
@@ -11087,6 +11092,11 @@ tree-kill@1.2.1:
resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a"
integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q== integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==
tree-kill@1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
trim-newlines@^1.0.0: trim-newlines@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"