UNPKG

4.34 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6exports.onDevRequest = exports.rawBody = void 0;
7const entrypoint = process.env.VERCEL_DEV_ENTRYPOINT;
8delete process.env.VERCEL_DEV_ENTRYPOINT;
9const tsconfig = process.env.VERCEL_DEV_TSCONFIG;
10delete process.env.VERCEL_DEV_TSCONFIG;
11if (!entrypoint) {
12 throw new Error('`VERCEL_DEV_ENTRYPOINT` must be defined');
13}
14const fs_1 = __importDefault(require("fs"));
15const ts_node_1 = require("ts-node");
16// Use the project's version of TypeScript if available,
17// otherwise fall back to using the copy that `@now/node` uses.
18let compiler;
19try {
20 compiler = require.resolve('typescript', {
21 paths: [process.cwd()],
22 });
23}
24catch (e) {
25 compiler = 'typescript';
26}
27// Assume Node 10
28let target = 'es2018';
29const nodeMajor = Number(process.versions.node.split('.')[0]);
30if (nodeMajor >= 14) {
31 target = 'es2020';
32}
33else if (nodeMajor >= 12) {
34 target = 'es2019';
35}
36if (tsconfig) {
37 try {
38 const tsconfigParsed = JSON.parse(fs_1.default.readFileSync(tsconfig, 'utf8'));
39 if (tsconfigParsed.compilerOptions &&
40 tsconfigParsed.compilerOptions.target) {
41 target = tsconfigParsed.compilerOptions.target;
42 }
43 }
44 catch (err) {
45 if (err.code !== 'ENOENT') {
46 console.error(`Error while parsing "${tsconfig}"`);
47 throw err;
48 }
49 }
50}
51ts_node_1.register({
52 compiler,
53 compilerOptions: {
54 allowJs: true,
55 esModuleInterop: true,
56 jsx: 'react',
57 module: 'commonjs',
58 target,
59 },
60 project: tsconfig || undefined,
61 transpileOnly: true,
62});
63const http_1 = require("http");
64const path_1 = require("path");
65const launcher_1 = require("./launcher");
66function listen(server, port, host) {
67 return new Promise(resolve => {
68 server.listen(port, host, () => {
69 resolve();
70 });
71 });
72}
73let bridge = undefined;
74async function main() {
75 const config = JSON.parse(process.env.VERCEL_DEV_CONFIG || '{}');
76 delete process.env.VERCEL_DEV_CONFIG;
77 const buildEnv = JSON.parse(process.env.VERCEL_DEV_BUILD_ENV || '{}');
78 delete process.env.VERCEL_DEV_BUILD_ENV;
79 const shouldAddHelpers = !(config.helpers === false || buildEnv.NODEJS_HELPERS === '0');
80 bridge = launcher_1.getNowLauncher({
81 entrypointPath: path_1.join(process.cwd(), entrypoint),
82 helpersPath: './helpers',
83 shouldAddHelpers,
84 bridgePath: 'not used',
85 sourcemapSupportPath: 'not used',
86 })();
87 const proxyServer = http_1.createServer(onDevRequest);
88 await listen(proxyServer, 0, '127.0.0.1');
89 const address = proxyServer.address();
90 if (typeof process.send === 'function') {
91 process.send(address);
92 }
93 else {
94 console.log('Dev server listening:', address);
95 }
96}
97function rawBody(readable) {
98 return new Promise((resolve, reject) => {
99 let bytes = 0;
100 const chunks = [];
101 readable.on('error', reject);
102 readable.on('data', chunk => {
103 chunks.push(chunk);
104 bytes += chunk.length;
105 });
106 readable.on('end', () => {
107 resolve(Buffer.concat(chunks, bytes));
108 });
109 });
110}
111exports.rawBody = rawBody;
112async function onDevRequest(req, res) {
113 const body = await rawBody(req);
114 const event = {
115 Action: 'Invoke',
116 body: JSON.stringify({
117 method: req.method,
118 path: req.url,
119 headers: req.headers,
120 encoding: 'base64',
121 body: body.toString('base64'),
122 }),
123 };
124 if (!bridge) {
125 res.statusCode = 500;
126 res.end('Bridge is not defined');
127 return;
128 }
129 const result = await bridge.launcher(event, {
130 callbackWaitsForEmptyEventLoop: false,
131 });
132 res.statusCode = result.statusCode;
133 for (const [key, value] of Object.entries(result.headers)) {
134 if (typeof value !== 'undefined') {
135 res.setHeader(key, value);
136 }
137 }
138 res.end(Buffer.from(result.body, result.encoding));
139}
140exports.onDevRequest = onDevRequest;
141main().catch(err => {
142 console.error(err);
143 process.exit(1);
144});