mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-10 04:22:12 +00:00
Rather than creating a `builders.tar.gz` file with the core Runtimes and bundling that tarball with Now CLI, simply have them be regular npm dependencies so that they are installed into Now CLI's `node_modules` directory. When one of the core runtimes is specified for a build, the runtime will be required as a regular module dependency of Now CLI, and the builders cache will never touched. Bundled runtimes are also no longer updated, making the runtime versions pinned to the version of Now CLI. Logic for the builders cache directory still remains, but will now only be used when using a Community Runtime (or development tarball URL).
96 lines
3.1 KiB
TypeScript
96 lines
3.1 KiB
TypeScript
import cpy from 'cpy';
|
|
import execa from 'execa';
|
|
import { join } from 'path';
|
|
import { remove, writeFile } from 'fs-extra';
|
|
|
|
const dirRoot = join(__dirname, '..');
|
|
|
|
async function createConstants() {
|
|
console.log('Creating constants.ts');
|
|
const filename = join(dirRoot, 'src/util/constants.ts');
|
|
const contents = `// This file is auto-generated
|
|
export const GA_TRACKING_ID: string | undefined = ${envToString(
|
|
'GA_TRACKING_ID'
|
|
)};
|
|
export const SENTRY_DSN: string | undefined = ${envToString('SENTRY_DSN')};
|
|
`;
|
|
await writeFile(filename, contents, 'utf8');
|
|
}
|
|
|
|
function envToString(key: string) {
|
|
const value = process.env[key];
|
|
if (!value) {
|
|
console.log(`- Constant ${key} is not assigned`);
|
|
}
|
|
return JSON.stringify(value);
|
|
}
|
|
|
|
async function main() {
|
|
const isDev = process.argv[2] === '--dev';
|
|
|
|
if (!isDev) {
|
|
// Read the secrets from GitHub Actions and generate a file.
|
|
// During local development, these secrets will be empty.
|
|
await createConstants();
|
|
|
|
// `now dev` uses chokidar to watch the filesystem, but opts-out of the
|
|
// `fsevents` feature using `useFsEvents: false`, so delete the module here so
|
|
// that it is not compiled by ncc, which makes the npm package size larger
|
|
// than necessary.
|
|
await remove(join(dirRoot, '../../node_modules/fsevents'));
|
|
|
|
// Compile the `doT.js` template files for `now dev`
|
|
console.log();
|
|
await execa(process.execPath, [join(__dirname, 'compile-templates.js')], {
|
|
stdio: 'inherit',
|
|
});
|
|
}
|
|
|
|
// Do the initial `ncc` build
|
|
console.log();
|
|
const src = join(dirRoot, 'src');
|
|
const args = ['@zeit/ncc', 'build', '--source-map'];
|
|
if (!isDev) {
|
|
args.push('--minify');
|
|
}
|
|
args.push(src);
|
|
await execa('npx', args, { stdio: 'inherit' });
|
|
|
|
// `ncc` has some issues with `@zeit/fun`'s runtime files:
|
|
// - Executable bits on the `bootstrap` files appear to be lost:
|
|
// https://github.com/zeit/ncc/pull/182
|
|
// - The `bootstrap.js` asset does not get copied into the output dir:
|
|
// https://github.com/zeit/ncc/issues/278
|
|
//
|
|
// Aside from those issues, all the same files from the `runtimes` directory
|
|
// should be copied into the output runtimes dir, specifically the `index.js`
|
|
// files (correctly) do not get copied into the output bundle because they
|
|
// get compiled into the final ncc bundle file, however, we want them to be
|
|
// present in the npm package because the contents of those files are involved
|
|
// with `fun`'s cache invalidation mechanism and they need to be shasum'd.
|
|
const runtimes = join(
|
|
dirRoot,
|
|
'../../node_modules/@zeit/fun/dist/src/runtimes'
|
|
);
|
|
const dest = join(dirRoot, 'dist/runtimes');
|
|
await cpy('**/*', dest, { parents: true, cwd: runtimes });
|
|
|
|
console.log('Finished building `now-cli`');
|
|
}
|
|
|
|
process.on('unhandledRejection', (reason: any, promise: Promise<any>) => {
|
|
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
|
|
process.exit(1);
|
|
});
|
|
|
|
process.on('uncaughtException', err => {
|
|
console.error('Uncaught Exception:');
|
|
console.error(err);
|
|
process.exit(1);
|
|
});
|
|
|
|
main().catch(err => {
|
|
console.error(err);
|
|
process.exit(1);
|
|
});
|