@gigadrive/network-config 2.0.0 → 2.0.1
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/index.d.mts +26 -8
- package/dist/index.d.ts +26 -8
- package/dist/index.js +137 -120
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +60 -40
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,27 +1,41 @@
|
|
|
1
|
-
// src/
|
|
1
|
+
// src/find-config.ts
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
var ALLOWED_CONFIG_NAMES = ["gigadrive.yaml", "gigadrive.yml", "nebula.yaml", "nebula.yml", "nebula.json"];
|
|
5
|
+
var findConfig = (projectFolder) => {
|
|
6
|
+
for (const name of ALLOWED_CONFIG_NAMES) {
|
|
7
|
+
const filePath = path.join(projectFolder, name);
|
|
8
|
+
if (fs.existsSync(filePath)) {
|
|
9
|
+
return filePath;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
// src/parse-config.ts
|
|
2
16
|
import Ajv from "ajv";
|
|
3
17
|
import addFormats from "ajv-formats";
|
|
4
|
-
import
|
|
5
|
-
import
|
|
18
|
+
import fs5 from "fs";
|
|
19
|
+
import path4 from "path";
|
|
6
20
|
|
|
7
21
|
// src/build-output-v3/parse.ts
|
|
8
22
|
import { getFilesForPattern } from "@gigadrive/build-utils";
|
|
9
|
-
import
|
|
10
|
-
import
|
|
23
|
+
import fs3 from "fs";
|
|
24
|
+
import path3 from "path";
|
|
11
25
|
|
|
12
26
|
// src/parse-raw-config.ts
|
|
13
|
-
import
|
|
14
|
-
import
|
|
27
|
+
import fs2 from "fs";
|
|
28
|
+
import path2 from "path";
|
|
15
29
|
import { parse as parseYaml } from "yaml";
|
|
16
30
|
var parseRawConfig = async (filePath) => {
|
|
17
|
-
if (!
|
|
31
|
+
if (!fs2.existsSync(filePath)) {
|
|
18
32
|
throw new Error(`Config file not found at ${filePath}`);
|
|
19
33
|
}
|
|
20
|
-
const fileContents =
|
|
34
|
+
const fileContents = fs2.readFileSync(filePath, "utf8");
|
|
21
35
|
if (fileContents.length === 0) {
|
|
22
36
|
throw new Error(`Config file is empty at ${filePath}`);
|
|
23
37
|
}
|
|
24
|
-
const fileExtension =
|
|
38
|
+
const fileExtension = path2.extname(filePath).toLowerCase();
|
|
25
39
|
let parsed;
|
|
26
40
|
try {
|
|
27
41
|
if (fileExtension === ".json") {
|
|
@@ -49,7 +63,7 @@ var parseRawConfig = async (filePath) => {
|
|
|
49
63
|
var configPath = ".vercel/output/config.json";
|
|
50
64
|
var functionConfigsPattern = ".vercel/output/functions/*.func/.vc-config.json";
|
|
51
65
|
var parseVercelBuildOutputV3 = async (parseResult, projectFolder) => {
|
|
52
|
-
const config = await readConfigFile(
|
|
66
|
+
const config = await readConfigFile(path3.join(projectFolder, configPath));
|
|
53
67
|
if (!config || config.version < 3) {
|
|
54
68
|
return parseResult;
|
|
55
69
|
}
|
|
@@ -72,12 +86,12 @@ var loadAssetOverrides = async (config, parseResult) => {
|
|
|
72
86
|
var loadFunctions = async (config, parseResult, projectFolder) => {
|
|
73
87
|
const functionConfigs = await getFilesForPattern(functionConfigsPattern, projectFolder);
|
|
74
88
|
for (const functionConfigPath of functionConfigs) {
|
|
75
|
-
const functionConfig = await readConfigFile(
|
|
89
|
+
const functionConfig = await readConfigFile(path3.join(projectFolder, functionConfigPath));
|
|
76
90
|
if (!functionConfig) {
|
|
77
91
|
parseResult.errors.push(`Failed to read function config at ${functionConfigPath}`);
|
|
78
92
|
continue;
|
|
79
93
|
}
|
|
80
|
-
const functionName =
|
|
94
|
+
const functionName = path3.basename(path3.dirname(functionConfigPath)).replace(/\.func$/, "");
|
|
81
95
|
const runtime = translateVercelRuntime(functionConfig.runtime);
|
|
82
96
|
if (!runtime) {
|
|
83
97
|
parseResult.errors.push(`Unsupported runtime for function ${functionName}: ${functionConfig.runtime}`);
|
|
@@ -105,7 +119,7 @@ var loadFunctions = async (config, parseResult, projectFolder) => {
|
|
|
105
119
|
const streaming = runtime == null || runtime.startsWith("node-") || runtime.startsWith("bun-");
|
|
106
120
|
const filePathMap = {};
|
|
107
121
|
for (const [key, value] of Object.entries(functionConfig.filePathMap ?? {})) {
|
|
108
|
-
filePathMap[
|
|
122
|
+
filePathMap[path3.join(projectFolder, key)] = value;
|
|
109
123
|
}
|
|
110
124
|
parseResult.entrypoints.push({
|
|
111
125
|
displayName: functionName,
|
|
@@ -116,7 +130,7 @@ var loadFunctions = async (config, parseResult, projectFolder) => {
|
|
|
116
130
|
environmentVariables,
|
|
117
131
|
streaming,
|
|
118
132
|
package: {
|
|
119
|
-
rootOverwrite:
|
|
133
|
+
rootOverwrite: path3.join(projectFolder, functionDirectory),
|
|
120
134
|
filePathMap
|
|
121
135
|
}
|
|
122
136
|
});
|
|
@@ -142,7 +156,7 @@ var loadFunctions = async (config, parseResult, projectFolder) => {
|
|
|
142
156
|
}
|
|
143
157
|
};
|
|
144
158
|
var readConfigFile = async (configFilePath) => {
|
|
145
|
-
if (!
|
|
159
|
+
if (!fs3.existsSync(configFilePath)) {
|
|
146
160
|
return null;
|
|
147
161
|
}
|
|
148
162
|
const parsed = await parseRawConfig(configFilePath);
|
|
@@ -188,7 +202,7 @@ var translateVercelRegion = (region) => {
|
|
|
188
202
|
|
|
189
203
|
// src/v4/parse.ts
|
|
190
204
|
import { getFilesForPattern as getFilesForPattern2 } from "@gigadrive/build-utils";
|
|
191
|
-
import
|
|
205
|
+
import fs4 from "fs";
|
|
192
206
|
import { minimatch } from "minimatch";
|
|
193
207
|
|
|
194
208
|
// src/regions.ts
|
|
@@ -223,16 +237,16 @@ var parseConfigV4 = async (config, projectFolder) => {
|
|
|
223
237
|
const errors = [];
|
|
224
238
|
const warnings = [];
|
|
225
239
|
if (config.functions != null) {
|
|
226
|
-
for (const [
|
|
227
|
-
const settings = getFunctionSettings(
|
|
240
|
+
for (const [path5, func] of Object.entries(config.functions)) {
|
|
241
|
+
const settings = getFunctionSettings(path5, config);
|
|
228
242
|
if (settings == null) {
|
|
229
|
-
throw new Error(`Settings invalid for function at path '${
|
|
243
|
+
throw new Error(`Settings invalid for function at path '${path5}'`);
|
|
230
244
|
}
|
|
231
|
-
(await getFilesForPattern2(
|
|
245
|
+
(await getFilesForPattern2(path5, projectFolder, func.excludeFiles)).forEach((file) => {
|
|
232
246
|
if (entrypoints.find((entrypoint) => entrypoint.path === file)) {
|
|
233
247
|
return;
|
|
234
248
|
}
|
|
235
|
-
if (config.functions != null && Object.keys(config.functions).find((func2) => func2 === file && func2 !==
|
|
249
|
+
if (config.functions != null && Object.keys(config.functions).find((func2) => func2 === file && func2 !== path5)) {
|
|
236
250
|
return;
|
|
237
251
|
}
|
|
238
252
|
entrypoints.push({
|
|
@@ -250,11 +264,11 @@ var parseConfigV4 = async (config, projectFolder) => {
|
|
|
250
264
|
const assets = [];
|
|
251
265
|
if (config.assets != null) {
|
|
252
266
|
const assetsPath = `${projectFolder}/${config.assets}`;
|
|
253
|
-
if (
|
|
254
|
-
for (const asset of
|
|
267
|
+
if (fs4.existsSync(assetsPath) && fs4.statSync(assetsPath).isDirectory()) {
|
|
268
|
+
for (const asset of fs4.readdirSync(`${projectFolder}/${config.assets}`, {
|
|
255
269
|
recursive: true
|
|
256
270
|
})) {
|
|
257
|
-
if (
|
|
271
|
+
if (fs4.statSync(`${projectFolder}/${config.assets}/${asset}`).isDirectory()) {
|
|
258
272
|
continue;
|
|
259
273
|
}
|
|
260
274
|
const disallowedExtensions = [".htaccess", ".htpasswd"];
|
|
@@ -295,10 +309,10 @@ var parseConfigV4 = async (config, projectFolder) => {
|
|
|
295
309
|
})
|
|
296
310
|
};
|
|
297
311
|
};
|
|
298
|
-
var getFunctionSettings = (
|
|
312
|
+
var getFunctionSettings = (path5, config) => {
|
|
299
313
|
let functionSettings;
|
|
300
314
|
for (const [key, value] of Object.entries(config.functions ?? {})) {
|
|
301
|
-
if (minimatch(
|
|
315
|
+
if (minimatch(path5, key) || new RegExp(key).test(path5)) {
|
|
302
316
|
if (functionSettings == null) {
|
|
303
317
|
functionSettings = {
|
|
304
318
|
memory: 128,
|
|
@@ -335,18 +349,8 @@ var getFunctionSettings = (path4, config) => {
|
|
|
335
349
|
return functionSettings;
|
|
336
350
|
};
|
|
337
351
|
|
|
338
|
-
// src/
|
|
339
|
-
var schemaV4 = JSON.parse(
|
|
340
|
-
var ALLOWED_CONFIG_NAMES = ["gigadrive.yaml", "gigadrive.yml", "nebula.yaml", "nebula.yml", "nebula.json"];
|
|
341
|
-
var findConfig = (projectFolder) => {
|
|
342
|
-
for (const name of ALLOWED_CONFIG_NAMES) {
|
|
343
|
-
const filePath = path3.join(projectFolder, name);
|
|
344
|
-
if (fs4.existsSync(filePath)) {
|
|
345
|
-
return filePath;
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
return null;
|
|
349
|
-
};
|
|
352
|
+
// src/parse-config.ts
|
|
353
|
+
var schemaV4 = JSON.parse(fs5.readFileSync(path4.join(__dirname, "./v4/schema.json"), "utf8"));
|
|
350
354
|
var parseConfig = async (filePath, projectFolder) => {
|
|
351
355
|
const parsed = await parseRawConfig(filePath);
|
|
352
356
|
const version = parsed.version;
|
|
@@ -385,9 +389,25 @@ var parseConfig = async (filePath, projectFolder) => {
|
|
|
385
389
|
}
|
|
386
390
|
return parseResult;
|
|
387
391
|
};
|
|
392
|
+
|
|
393
|
+
// src/runtime.ts
|
|
394
|
+
var RUNTIME_DEFINITIONS = [
|
|
395
|
+
"php-84",
|
|
396
|
+
"php-83",
|
|
397
|
+
"php-81",
|
|
398
|
+
"node-22",
|
|
399
|
+
"node-20",
|
|
400
|
+
"node-18",
|
|
401
|
+
"node-16",
|
|
402
|
+
"bun-1"
|
|
403
|
+
];
|
|
404
|
+
var AVAILABLE_RUNTIMES = [...RUNTIME_DEFINITIONS];
|
|
388
405
|
export {
|
|
389
406
|
ALLOWED_CONFIG_NAMES,
|
|
407
|
+
AVAILABLE_REGIONS,
|
|
408
|
+
AVAILABLE_RUNTIMES,
|
|
390
409
|
findConfig,
|
|
391
|
-
parseConfig
|
|
410
|
+
parseConfig,
|
|
411
|
+
parseRawConfig
|
|
392
412
|
};
|
|
393
413
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/build-output-v3/parse.ts","../src/parse-raw-config.ts","../src/v4/parse.ts","../src/regions.ts"],"sourcesContent":["import Ajv from 'ajv';\nimport addFormats from 'ajv-formats';\nimport fs from 'fs';\nimport path from 'path';\nimport { parseVercelBuildOutputV3 } from './build-output-v3/parse';\nimport type { NormalizedConfig } from './normalized-config';\nimport { parseRawConfig } from './parse-raw-config';\nimport { parseConfigV4 } from './v4/parse';\n\nconst schemaV4 = JSON.parse(fs.readFileSync(path.join(__dirname, './v4/schema.json'), 'utf8'));\n\nexport const ALLOWED_CONFIG_NAMES = ['gigadrive.yaml', 'gigadrive.yml', 'nebula.yaml', 'nebula.yml', 'nebula.json'];\n\n/**\n * Finds a config file in the project folder.\n * @param projectFolder The folder to search for a config file in.\n * @returns The path to the config file, or null if no config file is found.\n */\nexport const findConfig = (projectFolder: string): string | null => {\n for (const name of ALLOWED_CONFIG_NAMES) {\n const filePath = path.join(projectFolder, name);\n if (fs.existsSync(filePath)) {\n return filePath;\n }\n }\n return null;\n};\n\nexport const parseConfig = async (filePath: string, projectFolder: string): Promise<NormalizedConfig> => {\n const parsed = await parseRawConfig(filePath);\n const version = parsed.version;\n\n const schemaMap: Record<number, object> = {\n /*1: schemaV1,\n 2: schemaV2,\n 3: schemaV3,*/\n 4: schemaV4,\n };\n\n // build the path to the config file relative to the project root (strip /tmp/unzipped prefix)\n const relativePath = filePath.replace('/tmp/unzipped/', '');\n\n const schema = schemaMap[version];\n\n if (!schema) {\n throw new Error(`Config file at ${relativePath} has an unsupported version: ${version}`);\n }\n\n // validate the config file\n const ajv = new Ajv();\n addFormats(ajv);\n\n const validate = ajv.compile(schema);\n\n const valid = validate(parsed);\n if (!valid) {\n throw new Error(`Config file at ${relativePath} is invalid: ${ajv.errorsText(validate.errors)}`);\n }\n\n // @ts-ignore\n const parserMap: Record<number, (config, projectFolder) => Promise<NormalizedConfig>> = {\n /*1: parseConfigV1,\n 2: parseConfigV2,\n 3: parseConfigV3,*/\n 4: parseConfigV4,\n };\n\n let parseResult: NormalizedConfig = await parserMap[version](parsed, projectFolder);\n\n // TODO: apply transformers\n parseResult = await parseVercelBuildOutputV3(parseResult, projectFolder);\n\n // if the config does not resolve to any resources, warn the user\n if (parseResult.entrypoints.length === 0 && (parseResult.assets?.paths?.length || 0) === 0) {\n parseResult.warnings.push('The current project does not have any functions or assets to deploy.');\n } else if (\n parseResult.entrypoints.length === 0 &&\n (parseResult.assets?.paths?.length || 0) === 0 &&\n parseResult.routes.length === 0\n ) {\n parseResult.errors.push(\n 'The current project config does not resolve to any functions, assets or routes and can not be deployed.'\n );\n }\n\n return parseResult;\n};\n","import { getFilesForPattern } from '@gigadrive/build-utils';\nimport fs from 'fs';\nimport path from 'path';\nimport { type Config, type Route, type ServerlessFunctionConfig } from '.';\nimport type {\n NormalizedConfig,\n NormalizedConfigRoute,\n NormalizedConfigRouteHandler,\n NormalizedConfigRouteMethod,\n} from '../normalized-config';\nimport { parseRawConfig } from '../parse-raw-config';\nimport type { Region } from '../regions';\nimport type { Runtime } from '../runtime';\n\nconst configPath = '.vercel/output/config.json';\nconst functionConfigsPattern = '.vercel/output/functions/*.func/.vc-config.json';\n\n/**\n * Transforms a parsed config file using Vercel's Build Output API v3\n * @param parseResult The result of parsing the existing config file\n * @param projectFolder The path to the project folder\n * @returns\n */\nexport const parseVercelBuildOutputV3 = async (\n parseResult: NormalizedConfig,\n projectFolder: string\n): Promise<NormalizedConfig> => {\n // read config file\n const config = await readConfigFile<Config>(path.join(projectFolder, configPath));\n\n if (!config || config.version < 3) {\n // TODO: Log error\n return parseResult;\n }\n\n // TODO: Routes\n // TODO: Images\n // TODO: Wildcards\n // TODO: Cache\n // TODO: Cron\n // TODO: Edge Functions\n // TODO: Prerender Functions\n\n await loadFunctions(config, parseResult, projectFolder);\n await loadAssetOverrides(config, parseResult);\n\n return parseResult;\n};\n\nconst loadAssetOverrides = async (config: Config, parseResult: NormalizedConfig) => {\n if (!parseResult.assets) {\n parseResult.assets = {\n paths: [],\n prefixToStrip: '',\n };\n }\n\n parseResult.assets.overrides = {\n ...(parseResult.assets.overrides ?? {}),\n ...config.overrides,\n };\n};\n\nexport const loadFunctions = async (config: Config, parseResult: NormalizedConfig, projectFolder: string) => {\n const functionConfigs = await getFilesForPattern(functionConfigsPattern, projectFolder);\n\n // console.debug('functionConfigs', functionConfigs);\n\n for (const functionConfigPath of functionConfigs) {\n const functionConfig = await readConfigFile<ServerlessFunctionConfig>(path.join(projectFolder, functionConfigPath));\n\n if (!functionConfig) {\n parseResult.errors.push(`Failed to read function config at ${functionConfigPath}`);\n continue;\n }\n\n const functionName: string = path.basename(path.dirname(functionConfigPath)).replace(/\\.func$/, '');\n const runtime = translateVercelRuntime(functionConfig.runtime);\n\n if (!runtime) {\n parseResult.errors.push(`Unsupported runtime for function ${functionName}: ${functionConfig.runtime}`);\n continue;\n }\n\n const functionDirectory = `.vercel/output/functions/${functionName}.func`;\n const handler = functionConfig.handler;\n const maxDuration = functionConfig.maxDuration;\n const memory = functionConfig.memory;\n\n // add regions and filter duplicates\n parseResult.regions = Array.from(\n new Set([\n ...(parseResult.regions ?? []),\n ...(functionConfig.regions ?? ['us-east-1']).map((r) => translateVercelRegion(r)),\n ])\n ) as Region[];\n\n const environmentVariables: Record<string, string> = {};\n\n const functionEnv = functionConfig.environment;\n\n if (functionEnv != null && typeof functionEnv === 'object') {\n for (const env of Object.values(functionEnv)) {\n for (const [key, value] of Object.entries(env)) {\n environmentVariables[key] = value;\n }\n }\n }\n\n const streaming: boolean = runtime == null || runtime.startsWith('node-') || runtime.startsWith('bun-');\n\n // translate filePathMap relative paths to absolute paths\n const filePathMap: Record<string, string> = {};\n for (const [key, value] of Object.entries(functionConfig.filePathMap ?? {})) {\n filePathMap[path.join(projectFolder, key)] = value;\n }\n\n parseResult.entrypoints.push({\n displayName: functionName,\n runtime,\n path: handler,\n memory: memory ?? 1024,\n maxDuration: maxDuration ?? 15,\n environmentVariables,\n streaming,\n package: {\n rootOverwrite: path.join(projectFolder, functionDirectory),\n filePathMap: filePathMap,\n },\n });\n\n const handlerType: NormalizedConfigRouteHandler = streaming\n ? 'SERVERLESS_FUNCTION_STREAMING'\n : 'SERVERLESS_FUNCTION';\n\n (\n [\n {\n path: `/${functionName}`,\n methods: ['ANY'],\n headers: {},\n destination: handler,\n handler: handlerType,\n },\n ...(config.routes\n ?.filter((r) => r.dest === `/${functionName}`)\n .map((r: Route) => ({\n path: r.src ?? `/${functionName}`,\n methods: ['ANY'] as NormalizedConfigRouteMethod[],\n headers: {},\n destination: handler,\n handler: handlerType,\n })) ?? []),\n ] as NormalizedConfigRoute[]\n ).forEach((route) => {\n parseResult.routes.push(route);\n });\n }\n};\n\nexport const readConfigFile = async <T>(configFilePath: string): Promise<T | null> => {\n if (!fs.existsSync(configFilePath)) {\n // skip vercel transformation if no vercel output exists\n return null;\n }\n\n const parsed = await parseRawConfig(configFilePath);\n\n return parsed as T;\n};\n\nexport const translateVercelRuntime = (runtime: string): Runtime | null => {\n switch (runtime) {\n case 'nodejs12.x':\n case 'nodejs14.x':\n case 'nodejs16.x':\n case 'nodejs18.x':\n return 'node-18';\n case 'nodejs20.x':\n case 'nodejs22.x': // TODO: Update when Lambda supports Node.js 22\n return 'node-20';\n default:\n return null;\n }\n};\n\n/**\n * @link https://vercel.com/docs/edge-network/regions#region-list\n */\nexport const translateVercelRegion = (region: string): string => {\n const regionMap: Record<string, string> = {\n arn1: 'eu-north-1',\n bom1: 'ap-south-1',\n cdg1: 'eu-west-3',\n cle1: 'us-east-2',\n cpt1: 'af-south-1',\n dub1: 'eu-west-1',\n fra1: 'eu-central-1',\n gru1: 'sa-east-1',\n hkg1: 'ap-east-1',\n hnd1: 'ap-northeast-1',\n iad1: 'us-east-1',\n icn1: 'ap-northeast-2',\n kix1: 'ap-northeast-3',\n lhr1: 'eu-west-2',\n pdx1: 'us-west-2',\n sfo1: 'us-west-1',\n sin1: 'ap-southeast-1',\n syd1: 'ap-southeast-2',\n };\n\n return regionMap[region.toLowerCase()] ?? 'us-east-1';\n};\n","import fs from 'fs';\nimport path from 'path';\nimport { parse as parseYaml } from 'yaml';\n\nexport const parseRawConfig = async (filePath: string): Promise<any> => {\n // check if the file exists\n if (!fs.existsSync(filePath)) {\n throw new Error(`Config file not found at ${filePath}`);\n }\n\n // read the file\n const fileContents = fs.readFileSync(filePath, 'utf8');\n\n if (fileContents.length === 0) {\n throw new Error(`Config file is empty at ${filePath}`);\n }\n\n // determine file type based on extension\n const fileExtension = path.extname(filePath).toLowerCase();\n\n // parse the file based on its extension\n let parsed;\n try {\n if (fileExtension === '.json') {\n parsed = JSON.parse(fileContents);\n } else if (['.yml', '.yaml'].includes(fileExtension)) {\n parsed = parseYaml(fileContents);\n } else {\n // Try to parse as YAML by default, which is more forgiving\n parsed = parseYaml(fileContents);\n }\n } catch (error) {\n throw new Error(\n `Failed to parse config file at ${filePath}: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n\n if (parsed === undefined) {\n throw new Error(`Config file could not be parsed at ${filePath}`);\n }\n\n // check if the version is present\n if (typeof parsed.version !== 'number') {\n throw new Error(`Config file is missing version at ${filePath}`);\n }\n\n return parsed;\n};\n","import { getFilesForPattern } from '@gigadrive/build-utils';\nimport fs from 'fs';\nimport { minimatch } from 'minimatch';\nimport type { ConfigV4, ConfigV4FunctionSettings } from '.';\nimport type {\n NormalizedConfig,\n NormalizedConfigEntrypoint,\n NormalizedConfigRoute,\n NormalizedConfigRouteHandler,\n} from '../normalized-config';\nimport { AVAILABLE_REGIONS, type Region } from '../regions';\n\nexport const parseConfigV4 = async (config: ConfigV4, projectFolder: string): Promise<NormalizedConfig> => {\n const regions =\n config.regions?.includes('global') === true\n ? AVAILABLE_REGIONS\n : (config.regions?.filter((region) => region !== 'global') ?? ['global']);\n\n const populateAssetCache = config.populateAssetCache ?? false;\n const environmentVariables = config.env ?? {};\n const commands = config.build_commands ?? [];\n const entrypoints: NormalizedConfigEntrypoint[] = [];\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (config.functions != null) {\n for (const [path, func] of Object.entries(config.functions)) {\n const settings = getFunctionSettings(path, config);\n\n if (settings == null) {\n throw new Error(`Settings invalid for function at path '${path}'`);\n }\n\n (await getFilesForPattern(path, projectFolder, func.excludeFiles)).forEach((file) => {\n // check if file is already in entrypoints, or if the path has a definition other than this one that matches it exactly\n if (entrypoints.find((entrypoint) => entrypoint.path === file)) {\n return;\n }\n\n if (config.functions != null && Object.keys(config.functions).find((func) => func === file && func !== path)) {\n return;\n }\n\n entrypoints.push({\n path: file,\n runtime: settings.runtime ?? 'node-20',\n memory: settings.memory ?? 128,\n maxDuration: settings.max_duration ?? 30,\n schedule: func.schedule,\n symlinks: func.symlinks,\n streaming:\n settings.runtime == null || settings.runtime.startsWith('node-') || settings.runtime.startsWith('bun-'),\n });\n });\n }\n }\n\n const assets: string[] = [];\n\n if (config.assets != null) {\n // list all files in assets folder recursively\n\n const assetsPath = `${projectFolder}/${config.assets}`;\n\n if (fs.existsSync(assetsPath) && fs.statSync(assetsPath).isDirectory()) {\n // console.debug('---- ASSET DEBUG ----');\n // console.debug('projectFolder', fs.readdirSync(assetsPath, { recursive: true }));\n\n // find all files in assets folder using fs\n for (const asset of fs.readdirSync(`${projectFolder}/${config.assets}`, {\n recursive: true,\n })) {\n // if file is a directory, skip it\n if (fs.statSync(`${projectFolder}/${config.assets}/${asset}`).isDirectory()) {\n continue;\n }\n\n const disallowedExtensions = ['.htaccess', '.htpasswd'];\n\n const assetName = asset.toString();\n\n if (disallowedExtensions.some((ext) => assetName.toLowerCase().endsWith(ext.toLowerCase()))) {\n continue;\n }\n\n assets.push(`${config.assets}/${assetName}`);\n }\n }\n }\n\n const routes = config.routes ?? [];\n\n return {\n regions: regions as Region[],\n assets: {\n paths: assets.sort(),\n prefixToStrip: (config.assets ?? '') + '/',\n dynamicRoutes: true,\n populateCache: populateAssetCache,\n },\n environmentVariables,\n commands,\n entrypoints,\n errors,\n warnings,\n routes: routes.map((route) => {\n // check if the destination has a protocol, if so use REDIRECT handler\n const handler: NormalizedConfigRouteHandler =\n route.destination.toLowerCase().startsWith('http://') || route.destination.toLowerCase().startsWith('https://')\n ? route.redirect === true\n ? 'HTTP_REDIRECT'\n : 'HTTP_PROXY'\n : route.redirect === true\n ? 'HTTP_REDIRECT'\n : 'SERVERLESS_FUNCTION';\n\n return {\n path: route.source,\n destination: route.destination,\n handler,\n headers: route.headers ?? {},\n methods: route.methods ?? ['ANY'],\n positiveRequirements: route.has,\n negativeRequirements: route.missing,\n status: route.statusCode,\n } as NormalizedConfigRoute;\n }),\n };\n};\n\n/**\n * Gets the runtime, memory and max duration for a given path.\n * @param path\n * @param config\n * @returns The runtime, memory and max duration for the given path. Should return undefined when a path should not be deployed as a function.\n */\nexport const getFunctionSettings = (path: string, config: ConfigV4): ConfigV4FunctionSettings | undefined => {\n // functions don't have to state all their options.\n // some function definitions might be glob or regex patterns.\n // go through all function definitions, find those that match the path and merge them.\n\n let functionSettings: ConfigV4FunctionSettings | undefined;\n\n for (const [key, value] of Object.entries(config.functions ?? {})) {\n // make sure to check for both glob and regex patterns\n if (minimatch(path, key) || new RegExp(key).test(path)) {\n if (functionSettings == null) {\n functionSettings = {\n memory: 128,\n max_duration: 30,\n schedule: undefined,\n symlinks: undefined,\n excludeFiles: undefined,\n includeFiles: undefined,\n };\n }\n\n if (value.runtime != null) {\n functionSettings.runtime = value.runtime;\n }\n\n if (value.memory != null) {\n functionSettings.memory = value.memory;\n }\n\n if (value.max_duration != null) {\n functionSettings.max_duration = value.max_duration;\n }\n\n if (value.schedule != null) {\n functionSettings.schedule = value.schedule;\n }\n\n if (value.symlinks != null) {\n functionSettings.symlinks = value.symlinks;\n }\n\n if (value.excludeFiles != null) {\n functionSettings.excludeFiles = value.excludeFiles;\n }\n\n if (value.includeFiles != null) {\n functionSettings.includeFiles = value.includeFiles;\n }\n }\n }\n\n return functionSettings;\n};\n","// Define all available runtimes in a single array\nconst REGION_DEFINITIONS = [\n 'us-east-1',\n 'us-east-2',\n 'us-west-1',\n 'us-west-2',\n 'ap-south-1',\n 'ap-northeast-3',\n 'ap-northeast-2',\n 'ap-southeast-1',\n 'ap-southeast-2',\n 'ap-northeast-1',\n 'ca-central-1',\n 'eu-central-1',\n 'eu-west-1',\n 'eu-west-2',\n 'eu-west-3',\n 'eu-north-1',\n 'sa-east-1',\n] as const;\n\n// Generate the Runtime type from the array\nexport type Region = (typeof REGION_DEFINITIONS)[number];\n\n// Export the available runtimes\nexport const AVAILABLE_REGIONS: Region[] = [...REGION_DEFINITIONS];\n"],"mappings":"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","names":["fs","path","fs","path","path","fs","getFilesForPattern","fs","path","getFilesForPattern","func","fs","fs","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/find-config.ts","../src/parse-config.ts","../src/build-output-v3/parse.ts","../src/parse-raw-config.ts","../src/v4/parse.ts","../src/regions.ts","../src/runtime.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nexport const ALLOWED_CONFIG_NAMES = ['gigadrive.yaml', 'gigadrive.yml', 'nebula.yaml', 'nebula.yml', 'nebula.json'];\n\n/**\n * Finds a config file in the project folder.\n * @param projectFolder The folder to search for a config file in.\n * @returns The path to the config file, or null if no config file is found.\n */\nexport const findConfig = (projectFolder: string): string | null => {\n for (const name of ALLOWED_CONFIG_NAMES) {\n const filePath = path.join(projectFolder, name);\n if (fs.existsSync(filePath)) {\n return filePath;\n }\n }\n return null;\n};\n","import Ajv from 'ajv';\nimport addFormats from 'ajv-formats';\nimport fs from 'fs';\nimport path from 'path';\nimport { parseVercelBuildOutputV3 } from './build-output-v3/parse';\nimport type { NormalizedConfig } from './normalized-config';\nimport { parseRawConfig } from './parse-raw-config';\nimport { parseConfigV4 } from './v4/parse';\n\nconst schemaV4 = JSON.parse(fs.readFileSync(path.join(__dirname, './v4/schema.json'), 'utf8'));\n\nexport const parseConfig = async (filePath: string, projectFolder: string): Promise<NormalizedConfig> => {\n const parsed = await parseRawConfig(filePath);\n const version = parsed.version;\n\n const schemaMap: Record<number, object> = {\n /*1: schemaV1,\n 2: schemaV2,\n 3: schemaV3,*/\n 4: schemaV4,\n };\n\n // build the path to the config file relative to the project root (strip /tmp/unzipped prefix)\n const relativePath = filePath.replace('/tmp/unzipped/', '');\n\n const schema = schemaMap[version];\n\n if (!schema) {\n throw new Error(`Config file at ${relativePath} has an unsupported version: ${version}`);\n }\n\n // validate the config file\n const ajv = new Ajv();\n addFormats(ajv);\n\n const validate = ajv.compile(schema);\n\n const valid = validate(parsed);\n if (!valid) {\n throw new Error(`Config file at ${relativePath} is invalid: ${ajv.errorsText(validate.errors)}`);\n }\n\n // @ts-ignore\n const parserMap: Record<number, (config, projectFolder) => Promise<NormalizedConfig>> = {\n /*1: parseConfigV1,\n 2: parseConfigV2,\n 3: parseConfigV3,*/\n 4: parseConfigV4,\n };\n\n let parseResult: NormalizedConfig = await parserMap[version](parsed, projectFolder);\n\n // TODO: apply transformers\n parseResult = await parseVercelBuildOutputV3(parseResult, projectFolder);\n\n // if the config does not resolve to any resources, warn the user\n if (parseResult.entrypoints.length === 0 && (parseResult.assets?.paths?.length || 0) === 0) {\n parseResult.warnings.push('The current project does not have any functions or assets to deploy.');\n } else if (\n parseResult.entrypoints.length === 0 &&\n (parseResult.assets?.paths?.length || 0) === 0 &&\n parseResult.routes.length === 0\n ) {\n parseResult.errors.push(\n 'The current project config does not resolve to any functions, assets or routes and can not be deployed.'\n );\n }\n\n return parseResult;\n};\n","import { getFilesForPattern } from '@gigadrive/build-utils';\nimport fs from 'fs';\nimport path from 'path';\nimport { type Config, type Route, type ServerlessFunctionConfig } from '.';\nimport type {\n NormalizedConfig,\n NormalizedConfigRoute,\n NormalizedConfigRouteHandler,\n NormalizedConfigRouteMethod,\n} from '../normalized-config';\nimport { parseRawConfig } from '../parse-raw-config';\nimport type { Region } from '../regions';\nimport type { Runtime } from '../runtime';\n\nconst configPath = '.vercel/output/config.json';\nconst functionConfigsPattern = '.vercel/output/functions/*.func/.vc-config.json';\n\n/**\n * Transforms a parsed config file using Vercel's Build Output API v3\n * @param parseResult The result of parsing the existing config file\n * @param projectFolder The path to the project folder\n * @returns\n */\nexport const parseVercelBuildOutputV3 = async (\n parseResult: NormalizedConfig,\n projectFolder: string\n): Promise<NormalizedConfig> => {\n // read config file\n const config = await readConfigFile<Config>(path.join(projectFolder, configPath));\n\n if (!config || config.version < 3) {\n // TODO: Log error\n return parseResult;\n }\n\n // TODO: Routes\n // TODO: Images\n // TODO: Wildcards\n // TODO: Cache\n // TODO: Cron\n // TODO: Edge Functions\n // TODO: Prerender Functions\n\n await loadFunctions(config, parseResult, projectFolder);\n await loadAssetOverrides(config, parseResult);\n\n return parseResult;\n};\n\nconst loadAssetOverrides = async (config: Config, parseResult: NormalizedConfig) => {\n if (!parseResult.assets) {\n parseResult.assets = {\n paths: [],\n prefixToStrip: '',\n };\n }\n\n parseResult.assets.overrides = {\n ...(parseResult.assets.overrides ?? {}),\n ...config.overrides,\n };\n};\n\nexport const loadFunctions = async (config: Config, parseResult: NormalizedConfig, projectFolder: string) => {\n const functionConfigs = await getFilesForPattern(functionConfigsPattern, projectFolder);\n\n // console.debug('functionConfigs', functionConfigs);\n\n for (const functionConfigPath of functionConfigs) {\n const functionConfig = await readConfigFile<ServerlessFunctionConfig>(path.join(projectFolder, functionConfigPath));\n\n if (!functionConfig) {\n parseResult.errors.push(`Failed to read function config at ${functionConfigPath}`);\n continue;\n }\n\n const functionName: string = path.basename(path.dirname(functionConfigPath)).replace(/\\.func$/, '');\n const runtime = translateVercelRuntime(functionConfig.runtime);\n\n if (!runtime) {\n parseResult.errors.push(`Unsupported runtime for function ${functionName}: ${functionConfig.runtime}`);\n continue;\n }\n\n const functionDirectory = `.vercel/output/functions/${functionName}.func`;\n const handler = functionConfig.handler;\n const maxDuration = functionConfig.maxDuration;\n const memory = functionConfig.memory;\n\n // add regions and filter duplicates\n parseResult.regions = Array.from(\n new Set([\n ...(parseResult.regions ?? []),\n ...(functionConfig.regions ?? ['us-east-1']).map((r) => translateVercelRegion(r)),\n ])\n ) as Region[];\n\n const environmentVariables: Record<string, string> = {};\n\n const functionEnv = functionConfig.environment;\n\n if (functionEnv != null && typeof functionEnv === 'object') {\n for (const env of Object.values(functionEnv)) {\n for (const [key, value] of Object.entries(env)) {\n environmentVariables[key] = value;\n }\n }\n }\n\n const streaming: boolean = runtime == null || runtime.startsWith('node-') || runtime.startsWith('bun-');\n\n // translate filePathMap relative paths to absolute paths\n const filePathMap: Record<string, string> = {};\n for (const [key, value] of Object.entries(functionConfig.filePathMap ?? {})) {\n filePathMap[path.join(projectFolder, key)] = value;\n }\n\n parseResult.entrypoints.push({\n displayName: functionName,\n runtime,\n path: handler,\n memory: memory ?? 1024,\n maxDuration: maxDuration ?? 15,\n environmentVariables,\n streaming,\n package: {\n rootOverwrite: path.join(projectFolder, functionDirectory),\n filePathMap: filePathMap,\n },\n });\n\n const handlerType: NormalizedConfigRouteHandler = streaming\n ? 'SERVERLESS_FUNCTION_STREAMING'\n : 'SERVERLESS_FUNCTION';\n\n (\n [\n {\n path: `/${functionName}`,\n methods: ['ANY'],\n headers: {},\n destination: handler,\n handler: handlerType,\n },\n ...(config.routes\n ?.filter((r) => r.dest === `/${functionName}`)\n .map((r: Route) => ({\n path: r.src ?? `/${functionName}`,\n methods: ['ANY'] as NormalizedConfigRouteMethod[],\n headers: {},\n destination: handler,\n handler: handlerType,\n })) ?? []),\n ] as NormalizedConfigRoute[]\n ).forEach((route) => {\n parseResult.routes.push(route);\n });\n }\n};\n\nexport const readConfigFile = async <T>(configFilePath: string): Promise<T | null> => {\n if (!fs.existsSync(configFilePath)) {\n // skip vercel transformation if no vercel output exists\n return null;\n }\n\n const parsed = await parseRawConfig(configFilePath);\n\n return parsed as T;\n};\n\nexport const translateVercelRuntime = (runtime: string): Runtime | null => {\n switch (runtime) {\n case 'nodejs12.x':\n case 'nodejs14.x':\n case 'nodejs16.x':\n case 'nodejs18.x':\n return 'node-18';\n case 'nodejs20.x':\n case 'nodejs22.x': // TODO: Update when Lambda supports Node.js 22\n return 'node-20';\n default:\n return null;\n }\n};\n\n/**\n * @link https://vercel.com/docs/edge-network/regions#region-list\n */\nexport const translateVercelRegion = (region: string): string => {\n const regionMap: Record<string, string> = {\n arn1: 'eu-north-1',\n bom1: 'ap-south-1',\n cdg1: 'eu-west-3',\n cle1: 'us-east-2',\n cpt1: 'af-south-1',\n dub1: 'eu-west-1',\n fra1: 'eu-central-1',\n gru1: 'sa-east-1',\n hkg1: 'ap-east-1',\n hnd1: 'ap-northeast-1',\n iad1: 'us-east-1',\n icn1: 'ap-northeast-2',\n kix1: 'ap-northeast-3',\n lhr1: 'eu-west-2',\n pdx1: 'us-west-2',\n sfo1: 'us-west-1',\n sin1: 'ap-southeast-1',\n syd1: 'ap-southeast-2',\n };\n\n return regionMap[region.toLowerCase()] ?? 'us-east-1';\n};\n","import fs from 'fs';\nimport path from 'path';\nimport { parse as parseYaml } from 'yaml';\n\nexport const parseRawConfig = async (filePath: string): Promise<any> => {\n // check if the file exists\n if (!fs.existsSync(filePath)) {\n throw new Error(`Config file not found at ${filePath}`);\n }\n\n // read the file\n const fileContents = fs.readFileSync(filePath, 'utf8');\n\n if (fileContents.length === 0) {\n throw new Error(`Config file is empty at ${filePath}`);\n }\n\n // determine file type based on extension\n const fileExtension = path.extname(filePath).toLowerCase();\n\n // parse the file based on its extension\n let parsed;\n try {\n if (fileExtension === '.json') {\n parsed = JSON.parse(fileContents);\n } else if (['.yml', '.yaml'].includes(fileExtension)) {\n parsed = parseYaml(fileContents);\n } else {\n // Try to parse as YAML by default, which is more forgiving\n parsed = parseYaml(fileContents);\n }\n } catch (error) {\n throw new Error(\n `Failed to parse config file at ${filePath}: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n\n if (parsed === undefined) {\n throw new Error(`Config file could not be parsed at ${filePath}`);\n }\n\n // check if the version is present\n if (typeof parsed.version !== 'number') {\n throw new Error(`Config file is missing version at ${filePath}`);\n }\n\n return parsed;\n};\n","import { getFilesForPattern } from '@gigadrive/build-utils';\nimport fs from 'fs';\nimport { minimatch } from 'minimatch';\nimport type { ConfigV4, ConfigV4FunctionSettings } from '.';\nimport type {\n NormalizedConfig,\n NormalizedConfigEntrypoint,\n NormalizedConfigRoute,\n NormalizedConfigRouteHandler,\n} from '../normalized-config';\nimport { AVAILABLE_REGIONS, type Region } from '../regions';\n\nexport const parseConfigV4 = async (config: ConfigV4, projectFolder: string): Promise<NormalizedConfig> => {\n const regions =\n config.regions?.includes('global') === true\n ? AVAILABLE_REGIONS\n : (config.regions?.filter((region) => region !== 'global') ?? ['global']);\n\n const populateAssetCache = config.populateAssetCache ?? false;\n const environmentVariables = config.env ?? {};\n const commands = config.build_commands ?? [];\n const entrypoints: NormalizedConfigEntrypoint[] = [];\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (config.functions != null) {\n for (const [path, func] of Object.entries(config.functions)) {\n const settings = getFunctionSettings(path, config);\n\n if (settings == null) {\n throw new Error(`Settings invalid for function at path '${path}'`);\n }\n\n (await getFilesForPattern(path, projectFolder, func.excludeFiles)).forEach((file) => {\n // check if file is already in entrypoints, or if the path has a definition other than this one that matches it exactly\n if (entrypoints.find((entrypoint) => entrypoint.path === file)) {\n return;\n }\n\n if (config.functions != null && Object.keys(config.functions).find((func) => func === file && func !== path)) {\n return;\n }\n\n entrypoints.push({\n path: file,\n runtime: settings.runtime ?? 'node-20',\n memory: settings.memory ?? 128,\n maxDuration: settings.max_duration ?? 30,\n schedule: func.schedule,\n symlinks: func.symlinks,\n streaming:\n settings.runtime == null || settings.runtime.startsWith('node-') || settings.runtime.startsWith('bun-'),\n });\n });\n }\n }\n\n const assets: string[] = [];\n\n if (config.assets != null) {\n // list all files in assets folder recursively\n\n const assetsPath = `${projectFolder}/${config.assets}`;\n\n if (fs.existsSync(assetsPath) && fs.statSync(assetsPath).isDirectory()) {\n // console.debug('---- ASSET DEBUG ----');\n // console.debug('projectFolder', fs.readdirSync(assetsPath, { recursive: true }));\n\n // find all files in assets folder using fs\n for (const asset of fs.readdirSync(`${projectFolder}/${config.assets}`, {\n recursive: true,\n })) {\n // if file is a directory, skip it\n if (fs.statSync(`${projectFolder}/${config.assets}/${asset}`).isDirectory()) {\n continue;\n }\n\n const disallowedExtensions = ['.htaccess', '.htpasswd'];\n\n const assetName = asset.toString();\n\n if (disallowedExtensions.some((ext) => assetName.toLowerCase().endsWith(ext.toLowerCase()))) {\n continue;\n }\n\n assets.push(`${config.assets}/${assetName}`);\n }\n }\n }\n\n const routes = config.routes ?? [];\n\n return {\n regions: regions as Region[],\n assets: {\n paths: assets.sort(),\n prefixToStrip: (config.assets ?? '') + '/',\n dynamicRoutes: true,\n populateCache: populateAssetCache,\n },\n environmentVariables,\n commands,\n entrypoints,\n errors,\n warnings,\n routes: routes.map((route) => {\n // check if the destination has a protocol, if so use REDIRECT handler\n const handler: NormalizedConfigRouteHandler =\n route.destination.toLowerCase().startsWith('http://') || route.destination.toLowerCase().startsWith('https://')\n ? route.redirect === true\n ? 'HTTP_REDIRECT'\n : 'HTTP_PROXY'\n : route.redirect === true\n ? 'HTTP_REDIRECT'\n : 'SERVERLESS_FUNCTION';\n\n return {\n path: route.source,\n destination: route.destination,\n handler,\n headers: route.headers ?? {},\n methods: route.methods ?? ['ANY'],\n positiveRequirements: route.has,\n negativeRequirements: route.missing,\n status: route.statusCode,\n } as NormalizedConfigRoute;\n }),\n };\n};\n\n/**\n * Gets the runtime, memory and max duration for a given path.\n * @param path\n * @param config\n * @returns The runtime, memory and max duration for the given path. Should return undefined when a path should not be deployed as a function.\n */\nexport const getFunctionSettings = (path: string, config: ConfigV4): ConfigV4FunctionSettings | undefined => {\n // functions don't have to state all their options.\n // some function definitions might be glob or regex patterns.\n // go through all function definitions, find those that match the path and merge them.\n\n let functionSettings: ConfigV4FunctionSettings | undefined;\n\n for (const [key, value] of Object.entries(config.functions ?? {})) {\n // make sure to check for both glob and regex patterns\n if (minimatch(path, key) || new RegExp(key).test(path)) {\n if (functionSettings == null) {\n functionSettings = {\n memory: 128,\n max_duration: 30,\n schedule: undefined,\n symlinks: undefined,\n excludeFiles: undefined,\n includeFiles: undefined,\n };\n }\n\n if (value.runtime != null) {\n functionSettings.runtime = value.runtime;\n }\n\n if (value.memory != null) {\n functionSettings.memory = value.memory;\n }\n\n if (value.max_duration != null) {\n functionSettings.max_duration = value.max_duration;\n }\n\n if (value.schedule != null) {\n functionSettings.schedule = value.schedule;\n }\n\n if (value.symlinks != null) {\n functionSettings.symlinks = value.symlinks;\n }\n\n if (value.excludeFiles != null) {\n functionSettings.excludeFiles = value.excludeFiles;\n }\n\n if (value.includeFiles != null) {\n functionSettings.includeFiles = value.includeFiles;\n }\n }\n }\n\n return functionSettings;\n};\n","// Define all available runtimes in a single array\nconst REGION_DEFINITIONS = [\n 'us-east-1',\n 'us-east-2',\n 'us-west-1',\n 'us-west-2',\n 'ap-south-1',\n 'ap-northeast-3',\n 'ap-northeast-2',\n 'ap-southeast-1',\n 'ap-southeast-2',\n 'ap-northeast-1',\n 'ca-central-1',\n 'eu-central-1',\n 'eu-west-1',\n 'eu-west-2',\n 'eu-west-3',\n 'eu-north-1',\n 'sa-east-1',\n] as const;\n\n// Generate the Runtime type from the array\nexport type Region = (typeof REGION_DEFINITIONS)[number];\n\n// Export the available runtimes\nexport const AVAILABLE_REGIONS: Region[] = [...REGION_DEFINITIONS];\n","// Define all available runtimes in a single array\nconst RUNTIME_DEFINITIONS = [\n 'php-84',\n 'php-83',\n 'php-81',\n 'node-22',\n 'node-20',\n 'node-18',\n 'node-16',\n 'bun-1',\n] as const;\n\n// Generate the Runtime type from the array\nexport type Runtime = (typeof RUNTIME_DEFINITIONS)[number];\n\n// Export the available runtimes\nexport const AVAILABLE_RUNTIMES: Runtime[] = [...RUNTIME_DEFINITIONS];\n"],"mappings":";AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AAEV,IAAM,uBAAuB,CAAC,kBAAkB,iBAAiB,eAAe,cAAc,aAAa;AAO3G,IAAM,aAAa,CAAC,kBAAyC;AAClE,aAAW,QAAQ,sBAAsB;AACvC,UAAM,WAAW,KAAK,KAAK,eAAe,IAAI;AAC9C,QAAI,GAAG,WAAW,QAAQ,GAAG;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;;;AClBA,OAAO,SAAS;AAChB,OAAO,gBAAgB;AACvB,OAAOA,SAAQ;AACf,OAAOC,WAAU;;;ACHjB,SAAS,0BAA0B;AACnC,OAAOC,SAAQ;AACf,OAAOC,WAAU;;;ACFjB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,SAAS,iBAAiB;AAE5B,IAAM,iBAAiB,OAAO,aAAmC;AAEtE,MAAI,CAACD,IAAG,WAAW,QAAQ,GAAG;AAC5B,UAAM,IAAI,MAAM,4BAA4B,QAAQ,EAAE;AAAA,EACxD;AAGA,QAAM,eAAeA,IAAG,aAAa,UAAU,MAAM;AAErD,MAAI,aAAa,WAAW,GAAG;AAC7B,UAAM,IAAI,MAAM,2BAA2B,QAAQ,EAAE;AAAA,EACvD;AAGA,QAAM,gBAAgBC,MAAK,QAAQ,QAAQ,EAAE,YAAY;AAGzD,MAAI;AACJ,MAAI;AACF,QAAI,kBAAkB,SAAS;AAC7B,eAAS,KAAK,MAAM,YAAY;AAAA,IAClC,WAAW,CAAC,QAAQ,OAAO,EAAE,SAAS,aAAa,GAAG;AACpD,eAAS,UAAU,YAAY;AAAA,IACjC,OAAO;AAEL,eAAS,UAAU,YAAY;AAAA,IACjC;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,kCAAkC,QAAQ,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,IACzG;AAAA,EACF;AAEA,MAAI,WAAW,QAAW;AACxB,UAAM,IAAI,MAAM,sCAAsC,QAAQ,EAAE;AAAA,EAClE;AAGA,MAAI,OAAO,OAAO,YAAY,UAAU;AACtC,UAAM,IAAI,MAAM,qCAAqC,QAAQ,EAAE;AAAA,EACjE;AAEA,SAAO;AACT;;;ADjCA,IAAM,aAAa;AACnB,IAAM,yBAAyB;AAQxB,IAAM,2BAA2B,OACtC,aACA,kBAC8B;AAE9B,QAAM,SAAS,MAAM,eAAuBC,MAAK,KAAK,eAAe,UAAU,CAAC;AAEhF,MAAI,CAAC,UAAU,OAAO,UAAU,GAAG;AAEjC,WAAO;AAAA,EACT;AAUA,QAAM,cAAc,QAAQ,aAAa,aAAa;AACtD,QAAM,mBAAmB,QAAQ,WAAW;AAE5C,SAAO;AACT;AAEA,IAAM,qBAAqB,OAAO,QAAgB,gBAAkC;AAClF,MAAI,CAAC,YAAY,QAAQ;AACvB,gBAAY,SAAS;AAAA,MACnB,OAAO,CAAC;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,cAAY,OAAO,YAAY;AAAA,IAC7B,GAAI,YAAY,OAAO,aAAa,CAAC;AAAA,IACrC,GAAG,OAAO;AAAA,EACZ;AACF;AAEO,IAAM,gBAAgB,OAAO,QAAgB,aAA+B,kBAA0B;AAC3G,QAAM,kBAAkB,MAAM,mBAAmB,wBAAwB,aAAa;AAItF,aAAW,sBAAsB,iBAAiB;AAChD,UAAM,iBAAiB,MAAM,eAAyCA,MAAK,KAAK,eAAe,kBAAkB,CAAC;AAElH,QAAI,CAAC,gBAAgB;AACnB,kBAAY,OAAO,KAAK,qCAAqC,kBAAkB,EAAE;AACjF;AAAA,IACF;AAEA,UAAM,eAAuBA,MAAK,SAASA,MAAK,QAAQ,kBAAkB,CAAC,EAAE,QAAQ,WAAW,EAAE;AAClG,UAAM,UAAU,uBAAuB,eAAe,OAAO;AAE7D,QAAI,CAAC,SAAS;AACZ,kBAAY,OAAO,KAAK,oCAAoC,YAAY,KAAK,eAAe,OAAO,EAAE;AACrG;AAAA,IACF;AAEA,UAAM,oBAAoB,4BAA4B,YAAY;AAClE,UAAM,UAAU,eAAe;AAC/B,UAAM,cAAc,eAAe;AACnC,UAAM,SAAS,eAAe;AAG9B,gBAAY,UAAU,MAAM;AAAA,MAC1B,oBAAI,IAAI;AAAA,QACN,GAAI,YAAY,WAAW,CAAC;AAAA,QAC5B,IAAI,eAAe,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,sBAAsB,CAAC,CAAC;AAAA,MAClF,CAAC;AAAA,IACH;AAEA,UAAM,uBAA+C,CAAC;AAEtD,UAAM,cAAc,eAAe;AAEnC,QAAI,eAAe,QAAQ,OAAO,gBAAgB,UAAU;AAC1D,iBAAW,OAAO,OAAO,OAAO,WAAW,GAAG;AAC5C,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,+BAAqB,GAAG,IAAI;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAqB,WAAW,QAAQ,QAAQ,WAAW,OAAO,KAAK,QAAQ,WAAW,MAAM;AAGtG,UAAM,cAAsC,CAAC;AAC7C,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,eAAe,eAAe,CAAC,CAAC,GAAG;AAC3E,kBAAYA,MAAK,KAAK,eAAe,GAAG,CAAC,IAAI;AAAA,IAC/C;AAEA,gBAAY,YAAY,KAAK;AAAA,MAC3B,aAAa;AAAA,MACb;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,UAAU;AAAA,MAClB,aAAa,eAAe;AAAA,MAC5B;AAAA,MACA;AAAA,MACA,SAAS;AAAA,QACP,eAAeA,MAAK,KAAK,eAAe,iBAAiB;AAAA,QACzD;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,cAA4C,YAC9C,kCACA;AAEJ,IACE;AAAA,MACE;AAAA,QACE,MAAM,IAAI,YAAY;AAAA,QACtB,SAAS,CAAC,KAAK;AAAA,QACf,SAAS,CAAC;AAAA,QACV,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA,GAAI,OAAO,QACP,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,YAAY,EAAE,EAC5C,IAAI,CAAC,OAAc;AAAA,QAClB,MAAM,EAAE,OAAO,IAAI,YAAY;AAAA,QAC/B,SAAS,CAAC,KAAK;AAAA,QACf,SAAS,CAAC;AAAA,QACV,aAAa;AAAA,QACb,SAAS;AAAA,MACX,EAAE,KAAK,CAAC;AAAA,IACZ,EACA,QAAQ,CAAC,UAAU;AACnB,kBAAY,OAAO,KAAK,KAAK;AAAA,IAC/B,CAAC;AAAA,EACH;AACF;AAEO,IAAM,iBAAiB,OAAU,mBAA8C;AACpF,MAAI,CAACC,IAAG,WAAW,cAAc,GAAG;AAElC,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,eAAe,cAAc;AAElD,SAAO;AACT;AAEO,IAAM,yBAAyB,CAAC,YAAoC;AACzE,UAAQ,SAAS;AAAA,IACf,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAKO,IAAM,wBAAwB,CAAC,WAA2B;AAC/D,QAAM,YAAoC;AAAA,IACxC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,SAAO,UAAU,OAAO,YAAY,CAAC,KAAK;AAC5C;;;AEpNA,SAAS,sBAAAC,2BAA0B;AACnC,OAAOC,SAAQ;AACf,SAAS,iBAAiB;;;ACD1B,IAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,IAAM,oBAA8B,CAAC,GAAG,kBAAkB;;;ADb1D,IAAM,gBAAgB,OAAO,QAAkB,kBAAqD;AACzG,QAAM,UACJ,OAAO,SAAS,SAAS,QAAQ,MAAM,OACnC,oBACC,OAAO,SAAS,OAAO,CAAC,WAAW,WAAW,QAAQ,KAAK,CAAC,QAAQ;AAE3E,QAAM,qBAAqB,OAAO,sBAAsB;AACxD,QAAM,uBAAuB,OAAO,OAAO,CAAC;AAC5C,QAAM,WAAW,OAAO,kBAAkB,CAAC;AAC3C,QAAM,cAA4C,CAAC;AACnD,QAAM,SAAmB,CAAC;AAC1B,QAAM,WAAqB,CAAC;AAE5B,MAAI,OAAO,aAAa,MAAM;AAC5B,eAAW,CAACC,OAAM,IAAI,KAAK,OAAO,QAAQ,OAAO,SAAS,GAAG;AAC3D,YAAM,WAAW,oBAAoBA,OAAM,MAAM;AAEjD,UAAI,YAAY,MAAM;AACpB,cAAM,IAAI,MAAM,0CAA0CA,KAAI,GAAG;AAAA,MACnE;AAEA,OAAC,MAAMC,oBAAmBD,OAAM,eAAe,KAAK,YAAY,GAAG,QAAQ,CAAC,SAAS;AAEnF,YAAI,YAAY,KAAK,CAAC,eAAe,WAAW,SAAS,IAAI,GAAG;AAC9D;AAAA,QACF;AAEA,YAAI,OAAO,aAAa,QAAQ,OAAO,KAAK,OAAO,SAAS,EAAE,KAAK,CAACE,UAASA,UAAS,QAAQA,UAASF,KAAI,GAAG;AAC5G;AAAA,QACF;AAEA,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,SAAS,SAAS,WAAW;AAAA,UAC7B,QAAQ,SAAS,UAAU;AAAA,UAC3B,aAAa,SAAS,gBAAgB;AAAA,UACtC,UAAU,KAAK;AAAA,UACf,UAAU,KAAK;AAAA,UACf,WACE,SAAS,WAAW,QAAQ,SAAS,QAAQ,WAAW,OAAO,KAAK,SAAS,QAAQ,WAAW,MAAM;AAAA,QAC1G,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,SAAmB,CAAC;AAE1B,MAAI,OAAO,UAAU,MAAM;AAGzB,UAAM,aAAa,GAAG,aAAa,IAAI,OAAO,MAAM;AAEpD,QAAIG,IAAG,WAAW,UAAU,KAAKA,IAAG,SAAS,UAAU,EAAE,YAAY,GAAG;AAKtE,iBAAW,SAASA,IAAG,YAAY,GAAG,aAAa,IAAI,OAAO,MAAM,IAAI;AAAA,QACtE,WAAW;AAAA,MACb,CAAC,GAAG;AAEF,YAAIA,IAAG,SAAS,GAAG,aAAa,IAAI,OAAO,MAAM,IAAI,KAAK,EAAE,EAAE,YAAY,GAAG;AAC3E;AAAA,QACF;AAEA,cAAM,uBAAuB,CAAC,aAAa,WAAW;AAEtD,cAAM,YAAY,MAAM,SAAS;AAEjC,YAAI,qBAAqB,KAAK,CAAC,QAAQ,UAAU,YAAY,EAAE,SAAS,IAAI,YAAY,CAAC,CAAC,GAAG;AAC3F;AAAA,QACF;AAEA,eAAO,KAAK,GAAG,OAAO,MAAM,IAAI,SAAS,EAAE;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,UAAU,CAAC;AAEjC,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,MACN,OAAO,OAAO,KAAK;AAAA,MACnB,gBAAgB,OAAO,UAAU,MAAM;AAAA,MACvC,eAAe;AAAA,MACf,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,IAAI,CAAC,UAAU;AAE5B,YAAM,UACJ,MAAM,YAAY,YAAY,EAAE,WAAW,SAAS,KAAK,MAAM,YAAY,YAAY,EAAE,WAAW,UAAU,IAC1G,MAAM,aAAa,OACjB,kBACA,eACF,MAAM,aAAa,OACjB,kBACA;AAER,aAAO;AAAA,QACL,MAAM,MAAM;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB;AAAA,QACA,SAAS,MAAM,WAAW,CAAC;AAAA,QAC3B,SAAS,MAAM,WAAW,CAAC,KAAK;AAAA,QAChC,sBAAsB,MAAM;AAAA,QAC5B,sBAAsB,MAAM;AAAA,QAC5B,QAAQ,MAAM;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAQO,IAAM,sBAAsB,CAACH,OAAc,WAA2D;AAK3G,MAAI;AAEJ,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,aAAa,CAAC,CAAC,GAAG;AAEjE,QAAI,UAAUA,OAAM,GAAG,KAAK,IAAI,OAAO,GAAG,EAAE,KAAKA,KAAI,GAAG;AACtD,UAAI,oBAAoB,MAAM;AAC5B,2BAAmB;AAAA,UACjB,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,UAAU;AAAA,UACV,cAAc;AAAA,UACd,cAAc;AAAA,QAChB;AAAA,MACF;AAEA,UAAI,MAAM,WAAW,MAAM;AACzB,yBAAiB,UAAU,MAAM;AAAA,MACnC;AAEA,UAAI,MAAM,UAAU,MAAM;AACxB,yBAAiB,SAAS,MAAM;AAAA,MAClC;AAEA,UAAI,MAAM,gBAAgB,MAAM;AAC9B,yBAAiB,eAAe,MAAM;AAAA,MACxC;AAEA,UAAI,MAAM,YAAY,MAAM;AAC1B,yBAAiB,WAAW,MAAM;AAAA,MACpC;AAEA,UAAI,MAAM,YAAY,MAAM;AAC1B,yBAAiB,WAAW,MAAM;AAAA,MACpC;AAEA,UAAI,MAAM,gBAAgB,MAAM;AAC9B,yBAAiB,eAAe,MAAM;AAAA,MACxC;AAEA,UAAI,MAAM,gBAAgB,MAAM;AAC9B,yBAAiB,eAAe,MAAM;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AHnLA,IAAM,WAAW,KAAK,MAAMI,IAAG,aAAaC,MAAK,KAAK,WAAW,kBAAkB,GAAG,MAAM,CAAC;AAEtF,IAAM,cAAc,OAAO,UAAkB,kBAAqD;AACvG,QAAM,SAAS,MAAM,eAAe,QAAQ;AAC5C,QAAM,UAAU,OAAO;AAEvB,QAAM,YAAoC;AAAA;AAAA;AAAA;AAAA,IAIxC,GAAG;AAAA,EACL;AAGA,QAAM,eAAe,SAAS,QAAQ,kBAAkB,EAAE;AAE1D,QAAM,SAAS,UAAU,OAAO;AAEhC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,kBAAkB,YAAY,gCAAgC,OAAO,EAAE;AAAA,EACzF;AAGA,QAAM,MAAM,IAAI,IAAI;AACpB,aAAW,GAAG;AAEd,QAAM,WAAW,IAAI,QAAQ,MAAM;AAEnC,QAAM,QAAQ,SAAS,MAAM;AAC7B,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,kBAAkB,YAAY,gBAAgB,IAAI,WAAW,SAAS,MAAM,CAAC,EAAE;AAAA,EACjG;AAGA,QAAM,YAAkF;AAAA;AAAA;AAAA;AAAA,IAItF,GAAG;AAAA,EACL;AAEA,MAAI,cAAgC,MAAM,UAAU,OAAO,EAAE,QAAQ,aAAa;AAGlF,gBAAc,MAAM,yBAAyB,aAAa,aAAa;AAGvE,MAAI,YAAY,YAAY,WAAW,MAAM,YAAY,QAAQ,OAAO,UAAU,OAAO,GAAG;AAC1F,gBAAY,SAAS,KAAK,sEAAsE;AAAA,EAClG,WACE,YAAY,YAAY,WAAW,MAClC,YAAY,QAAQ,OAAO,UAAU,OAAO,KAC7C,YAAY,OAAO,WAAW,GAC9B;AACA,gBAAY,OAAO;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AKpEA,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,IAAM,qBAAgC,CAAC,GAAG,mBAAmB;","names":["fs","path","fs","path","fs","path","path","fs","getFilesForPattern","fs","path","getFilesForPattern","func","fs","fs","path"]}
|