@easel-sh/cli 0.1.0-alpha.3 → 0.1.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/create-lambda-gateway.d.ts.map +1 -1
- package/dist/commands/create-lambda-gateway.js +3 -181
- package/dist/commands/create-lambda-gateway.js.map +1 -1
- package/dist/commands/package-functions.d.ts.map +1 -1
- package/dist/commands/package-functions.js +1 -185
- package/dist/commands/package-functions.js.map +1 -1
- package/dist/handler-wrapper.d.ts +8 -0
- package/dist/handler-wrapper.d.ts.map +1 -0
- package/dist/handler-wrapper.js +262 -0
- package/dist/handler-wrapper.js.map +1 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +35 -6
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-lambda-gateway.d.ts","sourceRoot":"","sources":["../../src/commands/create-lambda-gateway.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-lambda-gateway.d.ts","sourceRoot":"","sources":["../../src/commands/create-lambda-gateway.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,0BAA0B;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,IAAI,CAmI7E"}
|
|
@@ -2,6 +2,7 @@ import * as fs from 'fs';
|
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import * as os from "os";
|
|
4
4
|
import { scanFunctions, resolveVercelOutputDir } from "../utils.js";
|
|
5
|
+
import { generateHandlerWrapper } from "../handler-wrapper.js";
|
|
5
6
|
export function createLambdaGateway(options) {
|
|
6
7
|
const { vercelOutputDir, functionsDir, manifestFile, staticDir, output, stage, profile, } = options;
|
|
7
8
|
// Resolve base Vercel output directory
|
|
@@ -143,187 +144,8 @@ function generateSstConfig(hashGroups, outputDir, tempDir, stage, profile) {
|
|
|
143
144
|
else {
|
|
144
145
|
console.warn(`Warning: .vc-config.json not found in ${funcDirAbsolute}, using default handler`);
|
|
145
146
|
}
|
|
146
|
-
// Generate handler wrapper file
|
|
147
|
-
const handlerWrapperCode =
|
|
148
|
-
|
|
149
|
-
const handler = require("./${vcHandlerFile.replace(/\.js$/, "")}");
|
|
150
|
-
|
|
151
|
-
const { Readable } = require("stream");
|
|
152
|
-
|
|
153
|
-
const { EventEmitter } = require("events");
|
|
154
|
-
|
|
155
|
-
module.exports.handler = async (event, _context) => {
|
|
156
|
-
return new Promise((resolve, reject) => {
|
|
157
|
-
// Convert AWS Lambda API Gateway event to Node.js request/response objects
|
|
158
|
-
// Support both API Gateway V1 (REST) and V2 (HTTP) formats
|
|
159
|
-
const isV2 = event.requestContext && event.requestContext.http;
|
|
160
|
-
const method = isV2
|
|
161
|
-
? event.requestContext.http.method
|
|
162
|
-
: event.httpMethod || "GET";
|
|
163
|
-
|
|
164
|
-
// Normalize headers (API Gateway V2 uses lowercase, V1 can be mixed)
|
|
165
|
-
const normalizedHeaders = {};
|
|
166
|
-
if (event.headers) {
|
|
167
|
-
Object.entries(event.headers).forEach(([key, value]) => {
|
|
168
|
-
normalizedHeaders[key.toLowerCase()] = value;
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// Build URL with query parameters
|
|
173
|
-
const queryParams = { ...(event.queryStringParameters || {}) };
|
|
174
|
-
|
|
175
|
-
// Extract the URL from the 'x-matched-path' header
|
|
176
|
-
// This header contains the original path that was matched
|
|
177
|
-
let path = "/";
|
|
178
|
-
const matchedPath = normalizedHeaders["x-matched-path"];
|
|
179
|
-
if (matchedPath) {
|
|
180
|
-
path = matchedPath;
|
|
181
|
-
// Ensure path starts with /
|
|
182
|
-
if (!path.startsWith("/")) {
|
|
183
|
-
path = "/" + path;
|
|
184
|
-
}
|
|
185
|
-
} else {
|
|
186
|
-
// Fallback to original path if no 'x-matched-path' header
|
|
187
|
-
path = isV2
|
|
188
|
-
? event.rawPath || event.path || "/"
|
|
189
|
-
: event.path || "/";
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
const url = new URL(path, \`http://\${event.headers?.host || event.headers?.["host"] || "localhost"}\`);
|
|
193
|
-
|
|
194
|
-
// Add remaining query parameters
|
|
195
|
-
Object.entries(queryParams).forEach(([key, value]) => {
|
|
196
|
-
url.searchParams.set(key, value);
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
// Handle body - decode if base64 encoded
|
|
200
|
-
let bodyBuffer = null;
|
|
201
|
-
if (event.body) {
|
|
202
|
-
if (event.isBase64Encoded) {
|
|
203
|
-
bodyBuffer = Buffer.from(event.body, "base64");
|
|
204
|
-
} else {
|
|
205
|
-
bodyBuffer = Buffer.from(event.body, "utf8");
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
// Create a mock request object
|
|
210
|
-
const req = Object.assign(
|
|
211
|
-
new Readable({
|
|
212
|
-
read() {
|
|
213
|
-
if (bodyBuffer) {
|
|
214
|
-
this.push(bodyBuffer);
|
|
215
|
-
}
|
|
216
|
-
this.push(null);
|
|
217
|
-
},
|
|
218
|
-
}),
|
|
219
|
-
{
|
|
220
|
-
method: method,
|
|
221
|
-
url: url.pathname + url.search,
|
|
222
|
-
headers: normalizedHeaders,
|
|
223
|
-
query: queryParams,
|
|
224
|
-
body: bodyBuffer,
|
|
225
|
-
}
|
|
226
|
-
);
|
|
227
|
-
|
|
228
|
-
// Create a mock response object
|
|
229
|
-
let statusCode = 200;
|
|
230
|
-
const headers = {};
|
|
231
|
-
let body = "";
|
|
232
|
-
let headersSent = false;
|
|
233
|
-
const res = Object.assign(new EventEmitter(), {
|
|
234
|
-
setHeader: (key, value) => {
|
|
235
|
-
if (!headersSent) {
|
|
236
|
-
headers[key.toLowerCase()] = value;
|
|
237
|
-
}
|
|
238
|
-
},
|
|
239
|
-
getHeader: (key) => headers[key.toLowerCase()],
|
|
240
|
-
removeHeader: (key) => {
|
|
241
|
-
delete headers[key.toLowerCase()];
|
|
242
|
-
},
|
|
243
|
-
appendHeader: (key, value) => {
|
|
244
|
-
if (!headersSent) {
|
|
245
|
-
const lowerKey = key.toLowerCase();
|
|
246
|
-
const existing = headers[lowerKey];
|
|
247
|
-
if (existing) {
|
|
248
|
-
// Append to existing header (comma-separated)
|
|
249
|
-
headers[lowerKey] = Array.isArray(existing)
|
|
250
|
-
? existing.concat(value)
|
|
251
|
-
: [existing, value];
|
|
252
|
-
} else {
|
|
253
|
-
headers[lowerKey] = value;
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
},
|
|
257
|
-
hasHeader: (key) => {
|
|
258
|
-
return key.toLowerCase() in headers;
|
|
259
|
-
},
|
|
260
|
-
getHeaderNames: () => Object.keys(headers),
|
|
261
|
-
writeHead: (code, responseHeaders) => {
|
|
262
|
-
if (!headersSent) {
|
|
263
|
-
statusCode = code;
|
|
264
|
-
if (responseHeaders) {
|
|
265
|
-
Object.entries(responseHeaders).forEach(([key, value]) => {
|
|
266
|
-
headers[key.toLowerCase()] = value;
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
headersSent = true;
|
|
270
|
-
}
|
|
271
|
-
return res;
|
|
272
|
-
},
|
|
273
|
-
write: (chunk) => {
|
|
274
|
-
if (!headersSent) {
|
|
275
|
-
headersSent = true;
|
|
276
|
-
}
|
|
277
|
-
body += chunk.toString();
|
|
278
|
-
return true;
|
|
279
|
-
},
|
|
280
|
-
end: (chunk) => {
|
|
281
|
-
if (chunk) {
|
|
282
|
-
body += chunk.toString();
|
|
283
|
-
}
|
|
284
|
-
if (!headersSent) {
|
|
285
|
-
headersSent = true;
|
|
286
|
-
}
|
|
287
|
-
// Normalize headers - convert arrays to comma-separated strings
|
|
288
|
-
const normalizedHeaders = {};
|
|
289
|
-
Object.entries(headers).forEach(([key, value]) => {
|
|
290
|
-
normalizedHeaders[key] = Array.isArray(value) ? value.join(", ") : value;
|
|
291
|
-
});
|
|
292
|
-
// Return AWS Lambda API Gateway response format
|
|
293
|
-
// Use statusCode (which can be set via res.statusCode = value or writeHead)
|
|
294
|
-
resolve({
|
|
295
|
-
statusCode: statusCode || 200,
|
|
296
|
-
headers: normalizedHeaders,
|
|
297
|
-
body: body,
|
|
298
|
-
});
|
|
299
|
-
},
|
|
300
|
-
headersSent: false,
|
|
301
|
-
});
|
|
302
|
-
|
|
303
|
-
// Define statusCode as a getter/setter to sync with the local variable
|
|
304
|
-
// This allows handlers to set res.statusCode = 404 and have it work correctly
|
|
305
|
-
Object.defineProperty(res, "statusCode", {
|
|
306
|
-
get: () => statusCode,
|
|
307
|
-
set: (value) => {
|
|
308
|
-
statusCode = value;
|
|
309
|
-
},
|
|
310
|
-
enumerable: true,
|
|
311
|
-
configurable: true,
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
// Handle errors
|
|
315
|
-
req.on("error", reject);
|
|
316
|
-
res.on("error", reject);
|
|
317
|
-
|
|
318
|
-
// Call the Next.js handler
|
|
319
|
-
try {
|
|
320
|
-
handler(req, res);
|
|
321
|
-
} catch (error) {
|
|
322
|
-
reject(error);
|
|
323
|
-
}
|
|
324
|
-
});
|
|
325
|
-
};
|
|
326
|
-
`;
|
|
147
|
+
// Generate handler wrapper file (shared with hash so wrapper changes produce fresh hashes)
|
|
148
|
+
const handlerWrapperCode = generateHandlerWrapper(vcHandlerFile);
|
|
327
149
|
// Write handler wrapper to temporary directory
|
|
328
150
|
const handlerFileName = `handler-${hash.substring(0, 8)}.js`;
|
|
329
151
|
const handlerWrapperPath = path.join(tempDir, handlerFileName);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-lambda-gateway.js","sourceRoot":"","sources":["../../src/commands/create-lambda-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"create-lambda-gateway.js","sourceRoot":"","sources":["../../src/commands/create-lambda-gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-functions.d.ts","sourceRoot":"","sources":["../../src/commands/package-functions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"package-functions.d.ts","sourceRoot":"","sources":["../../src/commands/package-functions.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAwLvE"}
|
|
@@ -2,191 +2,7 @@ import * as fs from 'fs';
|
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import { execSync } from 'child_process';
|
|
4
4
|
import { resolveVercelOutputDir } from "../utils.js";
|
|
5
|
-
|
|
6
|
-
* Handler wrapper code that converts API Gateway events to Node.js req/res objects
|
|
7
|
-
*/
|
|
8
|
-
function generateHandlerWrapper(handlerFile) {
|
|
9
|
-
return `/* eslint-disable @typescript-eslint/no-require-imports */
|
|
10
|
-
|
|
11
|
-
const handler = require("./${handlerFile.replace(/\.js$/, "")}");
|
|
12
|
-
|
|
13
|
-
const { Readable } = require("stream");
|
|
14
|
-
|
|
15
|
-
const { EventEmitter } = require("events");
|
|
16
|
-
|
|
17
|
-
module.exports.handler = async (event, _context) => {
|
|
18
|
-
return new Promise((resolve, reject) => {
|
|
19
|
-
// Convert AWS Lambda API Gateway event to Node.js request/response objects
|
|
20
|
-
// Support both API Gateway V1 (REST) and V2 (HTTP) formats
|
|
21
|
-
const isV2 = event.requestContext && event.requestContext.http;
|
|
22
|
-
const method = isV2
|
|
23
|
-
? event.requestContext.http.method
|
|
24
|
-
: event.httpMethod || "GET";
|
|
25
|
-
|
|
26
|
-
// Normalize headers (API Gateway V2 uses lowercase, V1 can be mixed)
|
|
27
|
-
const normalizedHeaders = {};
|
|
28
|
-
if (event.headers) {
|
|
29
|
-
Object.entries(event.headers).forEach(([key, value]) => {
|
|
30
|
-
normalizedHeaders[key.toLowerCase()] = value;
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// Build URL with query parameters
|
|
35
|
-
const queryParams = { ...(event.queryStringParameters || {}) };
|
|
36
|
-
|
|
37
|
-
// Extract the URL from the 'x-matched-path' header
|
|
38
|
-
// This header contains the original path that was matched
|
|
39
|
-
let path = "/";
|
|
40
|
-
const matchedPath = normalizedHeaders["x-matched-path"];
|
|
41
|
-
if (matchedPath) {
|
|
42
|
-
path = matchedPath;
|
|
43
|
-
// Ensure path starts with /
|
|
44
|
-
if (!path.startsWith("/")) {
|
|
45
|
-
path = "/" + path;
|
|
46
|
-
}
|
|
47
|
-
} else {
|
|
48
|
-
// Fallback to original path if no 'x-matched-path' header
|
|
49
|
-
path = isV2
|
|
50
|
-
? event.rawPath || event.path || "/"
|
|
51
|
-
: event.path || "/";
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const url = new URL(path, \`http://\${event.headers?.host || event.headers?.["host"] || "localhost"}\`);
|
|
55
|
-
|
|
56
|
-
// Add remaining query parameters
|
|
57
|
-
Object.entries(queryParams).forEach(([key, value]) => {
|
|
58
|
-
url.searchParams.set(key, value);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
// Handle body - decode if base64 encoded
|
|
62
|
-
let bodyBuffer = null;
|
|
63
|
-
if (event.body) {
|
|
64
|
-
if (event.isBase64Encoded) {
|
|
65
|
-
bodyBuffer = Buffer.from(event.body, "base64");
|
|
66
|
-
} else {
|
|
67
|
-
bodyBuffer = Buffer.from(event.body, "utf8");
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Create a mock request object
|
|
72
|
-
const req = Object.assign(
|
|
73
|
-
new Readable({
|
|
74
|
-
read() {
|
|
75
|
-
if (bodyBuffer) {
|
|
76
|
-
this.push(bodyBuffer);
|
|
77
|
-
}
|
|
78
|
-
this.push(null);
|
|
79
|
-
},
|
|
80
|
-
}),
|
|
81
|
-
{
|
|
82
|
-
method: method,
|
|
83
|
-
url: url.pathname + url.search,
|
|
84
|
-
headers: normalizedHeaders,
|
|
85
|
-
query: queryParams,
|
|
86
|
-
body: bodyBuffer,
|
|
87
|
-
}
|
|
88
|
-
);
|
|
89
|
-
|
|
90
|
-
// Create a mock response object
|
|
91
|
-
let statusCode = 200;
|
|
92
|
-
const headers = {};
|
|
93
|
-
let body = "";
|
|
94
|
-
let headersSent = false;
|
|
95
|
-
const res = Object.assign(new EventEmitter(), {
|
|
96
|
-
setHeader: (key, value) => {
|
|
97
|
-
if (!headersSent) {
|
|
98
|
-
headers[key.toLowerCase()] = value;
|
|
99
|
-
}
|
|
100
|
-
},
|
|
101
|
-
getHeader: (key) => headers[key.toLowerCase()],
|
|
102
|
-
removeHeader: (key) => {
|
|
103
|
-
delete headers[key.toLowerCase()];
|
|
104
|
-
},
|
|
105
|
-
appendHeader: (key, value) => {
|
|
106
|
-
if (!headersSent) {
|
|
107
|
-
const lowerKey = key.toLowerCase();
|
|
108
|
-
const existing = headers[lowerKey];
|
|
109
|
-
if (existing) {
|
|
110
|
-
// Append to existing header (comma-separated)
|
|
111
|
-
headers[lowerKey] = Array.isArray(existing)
|
|
112
|
-
? existing.concat(value)
|
|
113
|
-
: [existing, value];
|
|
114
|
-
} else {
|
|
115
|
-
headers[lowerKey] = value;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
},
|
|
119
|
-
hasHeader: (key) => {
|
|
120
|
-
return key.toLowerCase() in headers;
|
|
121
|
-
},
|
|
122
|
-
getHeaderNames: () => Object.keys(headers),
|
|
123
|
-
writeHead: (code, responseHeaders) => {
|
|
124
|
-
if (!headersSent) {
|
|
125
|
-
statusCode = code;
|
|
126
|
-
if (responseHeaders) {
|
|
127
|
-
Object.entries(responseHeaders).forEach(([key, value]) => {
|
|
128
|
-
headers[key.toLowerCase()] = value;
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
headersSent = true;
|
|
132
|
-
}
|
|
133
|
-
return res;
|
|
134
|
-
},
|
|
135
|
-
write: (chunk) => {
|
|
136
|
-
if (!headersSent) {
|
|
137
|
-
headersSent = true;
|
|
138
|
-
}
|
|
139
|
-
body += chunk.toString();
|
|
140
|
-
return true;
|
|
141
|
-
},
|
|
142
|
-
end: (chunk) => {
|
|
143
|
-
if (chunk) {
|
|
144
|
-
body += chunk.toString();
|
|
145
|
-
}
|
|
146
|
-
if (!headersSent) {
|
|
147
|
-
headersSent = true;
|
|
148
|
-
}
|
|
149
|
-
// Normalize headers - convert arrays to comma-separated strings
|
|
150
|
-
const normalizedHeaders = {};
|
|
151
|
-
Object.entries(headers).forEach(([key, value]) => {
|
|
152
|
-
normalizedHeaders[key] = Array.isArray(value) ? value.join(", ") : value;
|
|
153
|
-
});
|
|
154
|
-
// Return AWS Lambda API Gateway response format
|
|
155
|
-
// Use statusCode (which can be set via res.statusCode = value or writeHead)
|
|
156
|
-
resolve({
|
|
157
|
-
statusCode: statusCode || 200,
|
|
158
|
-
headers: normalizedHeaders,
|
|
159
|
-
body: body,
|
|
160
|
-
});
|
|
161
|
-
},
|
|
162
|
-
headersSent: false,
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
// Define statusCode as a getter/setter to sync with the local variable
|
|
166
|
-
// This allows handlers to set res.statusCode = 404 and have it work correctly
|
|
167
|
-
Object.defineProperty(res, "statusCode", {
|
|
168
|
-
get: () => statusCode,
|
|
169
|
-
set: (value) => {
|
|
170
|
-
statusCode = value;
|
|
171
|
-
},
|
|
172
|
-
enumerable: true,
|
|
173
|
-
configurable: true,
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
// Handle errors
|
|
177
|
-
req.on("error", reject);
|
|
178
|
-
res.on("error", reject);
|
|
179
|
-
|
|
180
|
-
// Call the Next.js handler
|
|
181
|
-
try {
|
|
182
|
-
handler(req, res);
|
|
183
|
-
} catch (error) {
|
|
184
|
-
reject(error);
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
};
|
|
188
|
-
`;
|
|
189
|
-
}
|
|
5
|
+
import { generateHandlerWrapper } from "../handler-wrapper.js";
|
|
190
6
|
/**
|
|
191
7
|
* Package each function directory into a zip file named by its hash from the manifest
|
|
192
8
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-functions.js","sourceRoot":"","sources":["../../src/commands/package-functions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"package-functions.js","sourceRoot":"","sources":["../../src/commands/package-functions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler wrapper compatible with Vercel Node.js runtime:
|
|
3
|
+
* - Fetch Web Standard: export default { fetch(request) { return new Response(...); } };
|
|
4
|
+
* - HTTP method exports: export function GET(request) { return new Response(...); }
|
|
5
|
+
* - Node-style: export default (req, res) => { ... } with Vercel-like helpers (query, cookies, body, status, send, json, redirect).
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateHandlerWrapper(handlerFile: string): string;
|
|
8
|
+
//# sourceMappingURL=handler-wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-wrapper.d.ts","sourceRoot":"","sources":["../src/handler-wrapper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA8PlE"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler wrapper compatible with Vercel Node.js runtime:
|
|
3
|
+
* - Fetch Web Standard: export default { fetch(request) { return new Response(...); } };
|
|
4
|
+
* - HTTP method exports: export function GET(request) { return new Response(...); }
|
|
5
|
+
* - Node-style: export default (req, res) => { ... } with Vercel-like helpers (query, cookies, body, status, send, json, redirect).
|
|
6
|
+
*/
|
|
7
|
+
export function generateHandlerWrapper(handlerFile) {
|
|
8
|
+
const handlerPath = JSON.stringify("./" + handlerFile.replace(/\\/g, "/"));
|
|
9
|
+
return `/* eslint-disable @typescript-eslint/no-require-imports */
|
|
10
|
+
|
|
11
|
+
const { Readable } = require("stream");
|
|
12
|
+
const { EventEmitter } = require("events");
|
|
13
|
+
|
|
14
|
+
const HTTP_METHODS = ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS", "HEAD"];
|
|
15
|
+
|
|
16
|
+
let userModulePromise = null;
|
|
17
|
+
function getModule() {
|
|
18
|
+
if (!userModulePromise) {
|
|
19
|
+
userModulePromise = import(${handlerPath}).then(function (m) { return m || {}; });
|
|
20
|
+
}
|
|
21
|
+
return userModulePromise;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async function responseToLambda(response) {
|
|
25
|
+
const responseHeaders = {};
|
|
26
|
+
response.headers.forEach((value, key) => {
|
|
27
|
+
responseHeaders[key.toLowerCase()] = value;
|
|
28
|
+
});
|
|
29
|
+
const body = await response.text();
|
|
30
|
+
return {
|
|
31
|
+
statusCode: response.status || 200,
|
|
32
|
+
headers: responseHeaders,
|
|
33
|
+
body: body,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
module.exports.handler = async (event, _context) => {
|
|
38
|
+
const mod = await getModule();
|
|
39
|
+
const handler = mod.default !== undefined ? mod.default : mod;
|
|
40
|
+
|
|
41
|
+
const isV2 = event.requestContext && event.requestContext.http;
|
|
42
|
+
const method = isV2 ? event.requestContext.http.method : event.httpMethod || "GET";
|
|
43
|
+
|
|
44
|
+
const normalizedHeaders = {};
|
|
45
|
+
if (event.headers) {
|
|
46
|
+
Object.entries(event.headers).forEach(([key, value]) => {
|
|
47
|
+
normalizedHeaders[key.toLowerCase()] = value;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const queryParams = { ...(event.queryStringParameters || {}) };
|
|
52
|
+
let path = "/";
|
|
53
|
+
const matchedPath = normalizedHeaders["x-matched-path"];
|
|
54
|
+
if (matchedPath) {
|
|
55
|
+
path = matchedPath.startsWith("/") ? matchedPath : "/" + matchedPath;
|
|
56
|
+
} else {
|
|
57
|
+
path = isV2 ? event.rawPath || event.path || "/" : event.path || "/";
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const host = event.headers?.host || event.headers?.["host"] || "localhost";
|
|
61
|
+
const url = new URL(path, "http://" + host);
|
|
62
|
+
Object.entries(queryParams).forEach(([key, value]) => {
|
|
63
|
+
url.searchParams.set(key, value);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
let bodyBuffer = null;
|
|
67
|
+
if (event.body) {
|
|
68
|
+
bodyBuffer = event.isBase64Encoded
|
|
69
|
+
? Buffer.from(event.body, "base64")
|
|
70
|
+
: Buffer.from(event.body, "utf8");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const requestUrl = "http://" + host + url.pathname + url.search;
|
|
74
|
+
const webRequest = new Request(requestUrl, {
|
|
75
|
+
method: method,
|
|
76
|
+
headers: normalizedHeaders,
|
|
77
|
+
body: bodyBuffer && bodyBuffer.length > 0 ? bodyBuffer : undefined,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// Vercel: named method export (e.g. export function GET(request) { ... })
|
|
81
|
+
if (HTTP_METHODS.includes(method) && typeof mod[method] === "function") {
|
|
82
|
+
const response = await Promise.resolve(mod[method](webRequest));
|
|
83
|
+
return responseToLambda(response);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Vercel/Nitro: default export with fetch(request)
|
|
87
|
+
if (handler && typeof handler.fetch === "function") {
|
|
88
|
+
const response = await handler.fetch(webRequest, _context);
|
|
89
|
+
return responseToLambda(response);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Node-style: default export as function (req, res), with Vercel-like helpers
|
|
93
|
+
if (typeof handler !== "function") {
|
|
94
|
+
throw new TypeError(
|
|
95
|
+
"Handler must export a function (req, res), an object with fetch(request), or named GET/POST/etc. Got: " + typeof handler
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return new Promise((resolve, reject) => {
|
|
100
|
+
let _bodyParsed = undefined;
|
|
101
|
+
function getParsedBody() {
|
|
102
|
+
if (_bodyParsed !== undefined) return _bodyParsed;
|
|
103
|
+
if (!bodyBuffer || bodyBuffer.length === 0) {
|
|
104
|
+
_bodyParsed = undefined;
|
|
105
|
+
return _bodyParsed;
|
|
106
|
+
}
|
|
107
|
+
const ct = (normalizedHeaders["content-type"] || "").toLowerCase();
|
|
108
|
+
const text = bodyBuffer.toString("utf8");
|
|
109
|
+
try {
|
|
110
|
+
if (ct.includes("application/json")) _bodyParsed = JSON.parse(text);
|
|
111
|
+
else if (ct.includes("application/x-www-form-urlencoded")) {
|
|
112
|
+
_bodyParsed = Object.fromEntries(new URLSearchParams(text));
|
|
113
|
+
}
|
|
114
|
+
else if (ct.includes("text/plain")) _bodyParsed = text;
|
|
115
|
+
else if (ct.includes("application/octet-stream")) _bodyParsed = bodyBuffer;
|
|
116
|
+
else _bodyParsed = undefined;
|
|
117
|
+
} catch (e) {
|
|
118
|
+
if (ct.includes("application/json")) throw e;
|
|
119
|
+
_bodyParsed = undefined;
|
|
120
|
+
}
|
|
121
|
+
return _bodyParsed;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
let cookiesObj = undefined;
|
|
125
|
+
function getCookies() {
|
|
126
|
+
if (cookiesObj !== undefined) return cookiesObj;
|
|
127
|
+
cookiesObj = {};
|
|
128
|
+
const cookieHeader = normalizedHeaders["cookie"];
|
|
129
|
+
if (cookieHeader) {
|
|
130
|
+
cookieHeader.split(";").forEach(function (part) {
|
|
131
|
+
const eq = part.indexOf("=");
|
|
132
|
+
if (eq > 0) {
|
|
133
|
+
const key = part.slice(0, eq).trim();
|
|
134
|
+
const val = part.slice(eq + 1).trim();
|
|
135
|
+
cookiesObj[key] = val;
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return cookiesObj;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const req = Object.assign(
|
|
143
|
+
new Readable({
|
|
144
|
+
read() {
|
|
145
|
+
if (bodyBuffer) this.push(bodyBuffer);
|
|
146
|
+
this.push(null);
|
|
147
|
+
},
|
|
148
|
+
}),
|
|
149
|
+
{
|
|
150
|
+
method: method,
|
|
151
|
+
url: url.pathname + url.search,
|
|
152
|
+
headers: normalizedHeaders,
|
|
153
|
+
query: queryParams,
|
|
154
|
+
}
|
|
155
|
+
);
|
|
156
|
+
Object.defineProperty(req, "body", { get: getParsedBody, enumerable: true, configurable: true });
|
|
157
|
+
Object.defineProperty(req, "cookies", { get: getCookies, enumerable: true, configurable: true });
|
|
158
|
+
|
|
159
|
+
let statusCode = 200;
|
|
160
|
+
const headers = {};
|
|
161
|
+
let body = "";
|
|
162
|
+
let headersSent = false;
|
|
163
|
+
|
|
164
|
+
function finishRes() {
|
|
165
|
+
if (headersSent) return;
|
|
166
|
+
headersSent = true;
|
|
167
|
+
const out = {};
|
|
168
|
+
Object.entries(headers).forEach(([k, v]) => {
|
|
169
|
+
out[k] = Array.isArray(v) ? v.join(", ") : v;
|
|
170
|
+
});
|
|
171
|
+
resolve({ statusCode: statusCode || 200, headers: out, body: body });
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const res = Object.assign(new EventEmitter(), {
|
|
175
|
+
setHeader: (key, value) => {
|
|
176
|
+
if (!headersSent) headers[key.toLowerCase()] = value;
|
|
177
|
+
},
|
|
178
|
+
getHeader: (key) => headers[key.toLowerCase()],
|
|
179
|
+
removeHeader: (key) => { delete headers[key.toLowerCase()]; },
|
|
180
|
+
appendHeader: (key, value) => {
|
|
181
|
+
if (!headersSent) {
|
|
182
|
+
const lowerKey = key.toLowerCase();
|
|
183
|
+
const existing = headers[lowerKey];
|
|
184
|
+
headers[lowerKey] = existing
|
|
185
|
+
? (Array.isArray(existing) ? existing.concat(value) : [existing, value])
|
|
186
|
+
: value;
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
hasHeader: (key) => key.toLowerCase() in headers,
|
|
190
|
+
getHeaderNames: () => Object.keys(headers),
|
|
191
|
+
writeHead: (code, responseHeaders) => {
|
|
192
|
+
if (!headersSent) {
|
|
193
|
+
statusCode = code;
|
|
194
|
+
if (responseHeaders) {
|
|
195
|
+
Object.entries(responseHeaders).forEach(([key, value]) => {
|
|
196
|
+
headers[key.toLowerCase()] = value;
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
headersSent = true;
|
|
200
|
+
}
|
|
201
|
+
return res;
|
|
202
|
+
},
|
|
203
|
+
write: (chunk) => {
|
|
204
|
+
if (!headersSent) headersSent = true;
|
|
205
|
+
body += chunk.toString();
|
|
206
|
+
return true;
|
|
207
|
+
},
|
|
208
|
+
end: (chunk) => {
|
|
209
|
+
if (chunk) body += chunk.toString();
|
|
210
|
+
finishRes();
|
|
211
|
+
},
|
|
212
|
+
status: (code) => {
|
|
213
|
+
statusCode = code;
|
|
214
|
+
return res;
|
|
215
|
+
},
|
|
216
|
+
send: (val) => {
|
|
217
|
+
if (typeof val === "object" && val !== null && !Buffer.isBuffer(val)) {
|
|
218
|
+
if (!headers["content-type"]) headers["content-type"] = "application/json";
|
|
219
|
+
body = JSON.stringify(val);
|
|
220
|
+
} else {
|
|
221
|
+
body = val == null ? "" : String(val);
|
|
222
|
+
}
|
|
223
|
+
finishRes();
|
|
224
|
+
return res;
|
|
225
|
+
},
|
|
226
|
+
json: (obj) => {
|
|
227
|
+
headers["content-type"] = "application/json";
|
|
228
|
+
body = JSON.stringify(obj);
|
|
229
|
+
finishRes();
|
|
230
|
+
return res;
|
|
231
|
+
},
|
|
232
|
+
redirect: (a, b) => {
|
|
233
|
+
const code = typeof a === "number" ? a : 307;
|
|
234
|
+
const loc = typeof a === "number" ? b : a;
|
|
235
|
+
statusCode = code;
|
|
236
|
+
headers["location"] = loc;
|
|
237
|
+
finishRes();
|
|
238
|
+
return res;
|
|
239
|
+
},
|
|
240
|
+
headersSent: false,
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
Object.defineProperty(res, "statusCode", {
|
|
244
|
+
get: () => statusCode,
|
|
245
|
+
set: (value) => { statusCode = value; },
|
|
246
|
+
enumerable: true,
|
|
247
|
+
configurable: true,
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
req.on("error", reject);
|
|
251
|
+
res.on("error", reject);
|
|
252
|
+
|
|
253
|
+
try {
|
|
254
|
+
handler(req, res);
|
|
255
|
+
} catch (error) {
|
|
256
|
+
reject(error);
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
};
|
|
260
|
+
`;
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=handler-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-wrapper.js","sourceRoot":"","sources":["../src/handler-wrapper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAAmB;IACxD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3E,OAAO;;;;;;;;;;iCAUwB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiP3C,CAAC;AACF,CAAC"}
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AASA;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkC/D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAyC1C;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CA0I1E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAmG7D"}
|
package/dist/utils.js
CHANGED
|
@@ -3,6 +3,7 @@ import * as path from 'path';
|
|
|
3
3
|
import * as os from "os";
|
|
4
4
|
import * as crypto from 'crypto';
|
|
5
5
|
import { fileURLToPath } from 'url';
|
|
6
|
+
import { generateHandlerWrapper } from "./handler-wrapper.js";
|
|
6
7
|
/**
|
|
7
8
|
* Resolve the Vercel output directory from a given path
|
|
8
9
|
* Handles cases where the path points to:
|
|
@@ -227,7 +228,7 @@ export function scanFunctions(dir, baseDir) {
|
|
|
227
228
|
* Similar to the bash script: uses sorted file names and contents
|
|
228
229
|
*/
|
|
229
230
|
export function hashFunctionDirectory(funcDir) {
|
|
230
|
-
const hash = crypto.createHash(
|
|
231
|
+
const hash = crypto.createHash("sha256");
|
|
231
232
|
const files = [];
|
|
232
233
|
function walkDir(dir, baseDir) {
|
|
233
234
|
if (!fs.existsSync(dir)) {
|
|
@@ -235,12 +236,15 @@ export function hashFunctionDirectory(funcDir) {
|
|
|
235
236
|
}
|
|
236
237
|
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
237
238
|
// Sort entries by name for deterministic ordering
|
|
238
|
-
entries.sort((a, b) => a.name.localeCompare(b.name,
|
|
239
|
+
entries.sort((a, b) => a.name.localeCompare(b.name, "en", { numeric: true }));
|
|
239
240
|
for (const entry of entries) {
|
|
240
241
|
const fullPath = path.join(dir, entry.name);
|
|
241
242
|
const relativePath = path.relative(baseDir, fullPath);
|
|
242
243
|
// Skip .DS_Store and __MACOSX
|
|
243
|
-
if (entry.name ===
|
|
244
|
+
if (entry.name === ".DS_Store" ||
|
|
245
|
+
entry.name === "__MACOSX" ||
|
|
246
|
+
relativePath.includes("/.DS_Store") ||
|
|
247
|
+
relativePath.includes("/__MACOSX")) {
|
|
244
248
|
continue;
|
|
245
249
|
}
|
|
246
250
|
if (entry.isFile()) {
|
|
@@ -275,15 +279,40 @@ export function hashFunctionDirectory(funcDir) {
|
|
|
275
279
|
}
|
|
276
280
|
// Walk the directory and collect all files
|
|
277
281
|
walkDir(funcDir, funcDir);
|
|
282
|
+
// Include the injected handler wrapper in the hash so that changes to the wrapper
|
|
283
|
+
// (e.g. dynamic import for ESM) produce fresh hashes and deployments.
|
|
284
|
+
let handlerFile = "handler.js";
|
|
285
|
+
const vcConfigPath = path.join(funcDir, ".vc-config.json");
|
|
286
|
+
if (fs.existsSync(vcConfigPath)) {
|
|
287
|
+
try {
|
|
288
|
+
const vcConfig = JSON.parse(fs.readFileSync(vcConfigPath, "utf8"));
|
|
289
|
+
if (vcConfig.handler) {
|
|
290
|
+
handlerFile = vcConfig.handler;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
// Use default handler file if config is missing or invalid
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
const wrapperContent = Buffer.from(generateHandlerWrapper(handlerFile), "utf8");
|
|
298
|
+
// Replace any existing handler.js in the dir with our wrapper (zip contents match hash)
|
|
299
|
+
const normalized = (p) => p.split(path.sep).join("/");
|
|
300
|
+
const filtered = files.filter((f) => normalized(f.path) !== "handler.js");
|
|
301
|
+
filtered.push({ path: "handler.js", content: wrapperContent });
|
|
302
|
+
files.length = 0;
|
|
303
|
+
files.push(...filtered);
|
|
278
304
|
// Sort files by path for deterministic ordering
|
|
279
|
-
files.sort((a, b) => a.path.localeCompare(b.path,
|
|
305
|
+
files.sort((a, b) => a.path.localeCompare(b.path, "en", { numeric: true }));
|
|
280
306
|
// Create a deterministic representation
|
|
281
307
|
// Format: path:size:content_hash\n
|
|
282
308
|
for (const file of files) {
|
|
283
|
-
const fileHash = crypto
|
|
309
|
+
const fileHash = crypto
|
|
310
|
+
.createHash("sha256")
|
|
311
|
+
.update(file.content)
|
|
312
|
+
.digest("hex");
|
|
284
313
|
const line = `${file.path}:${file.content.length}:${fileHash}\n`;
|
|
285
314
|
hash.update(line);
|
|
286
315
|
}
|
|
287
|
-
return hash.digest(
|
|
316
|
+
return hash.digest("hex");
|
|
288
317
|
}
|
|
289
318
|
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAGzB,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAO,aAAa,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|