@function-bay/nodejs 1.0.1 → 1.0.3

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.cjs CHANGED
@@ -94,17 +94,14 @@ exports.handler = async (event) => {
94
94
 
95
95
  return {
96
96
  statusCode: 200,
97
- body: JSON.stringify({
98
- message: "Payload received",
99
- received: data
100
- })
97
+ body: JSON.stringify({ result })
101
98
  };
102
99
  } catch (err) {
103
100
  if (typeof err == 'object' && err.__function_bay_error) {
104
101
  let result = err.toResponse();
105
102
  return {
106
- statusCode: result.statusCode || 500,
107
- body: JSON.stringify(result)
103
+ statusCode: 500,
104
+ body: JSON.stringify({ error: result })
108
105
  };
109
106
  }
110
107
 
@@ -241,7 +238,6 @@ var build = async () => {
241
238
  let packageJson = await readJsonFileOptional("package.json");
242
239
  if (!packageJson) {
243
240
  console.log("No package.json found in the current directory. Exiting build.");
244
- packageJson = {};
245
241
  }
246
242
  let functionBayFile = await readJsonFileOptional("function-bay.json") ?? await readJsonFileOptional("metorial.json");
247
243
  let nodeJsVersionIdentifierRaw = functionBayFile?.nodeJsVersion ?? process.env.NODE_VERSION ?? "24.x";
@@ -249,27 +245,31 @@ var build = async () => {
249
245
  console.log(`Using Node.js version identifier: ${nodeJsVersionIdentifier}`);
250
246
  let env = { PATH: `${process.env.HOME}/.volta/bin:${process.env.PATH}` };
251
247
  await $`bash -c "volta install node@${nodeJsVersionIdentifier}"`.env(env);
252
- if (fileExistsSync("yarn.lock")) {
253
- console.log("Detected yarn.lock, installing dependencies with Yarn...");
254
- await $`bash -c "volta install yarn@1"`.env(env);
255
- await $`bash -c "yarn install"`.env(env);
256
- } else if (fileExistsSync("pnpm-lock.yaml")) {
257
- console.log("Detected pnpm-lock.yaml, installing dependencies with pnpm...");
258
- await $`bash -c "volta install pnpm"`.env(env);
259
- await $`bash -c "pnpm install"`.env(env);
260
- } else if (fileExistsSync("bun.lock")) {
261
- console.log("Detected bun.lock, installing dependencies with Bun...");
262
- await $`bash -c "volta install bun"`.env(env);
263
- await $`bash -c "bun install"`.env(env);
248
+ if (packageJson) {
249
+ if (fileExistsSync("yarn.lock")) {
250
+ console.log("Detected yarn.lock, installing dependencies with Yarn...");
251
+ await $`bash -c "volta install yarn@1"`.env(env);
252
+ await $`bash -c "yarn install"`.env(env);
253
+ } else if (fileExistsSync("pnpm-lock.yaml")) {
254
+ console.log("Detected pnpm-lock.yaml, installing dependencies with pnpm...");
255
+ await $`bash -c "volta install pnpm"`.env(env);
256
+ await $`bash -c "pnpm install"`.env(env);
257
+ } else if (fileExistsSync("bun.lock")) {
258
+ console.log("Detected bun.lock, installing dependencies with Bun...");
259
+ await $`bash -c "volta install bun"`.env(env);
260
+ await $`bash -c "bun install"`.env(env);
261
+ } else {
262
+ console.log("Installing dependencies with npm...");
263
+ await $`bash -c "npm install"`.env(env);
264
+ }
264
265
  } else {
265
- console.log("Installing dependencies with npm...");
266
- await $`bash -c "npm install"`.env(env);
266
+ console.log("No package.json found, skipping dependency installation.");
267
267
  }
268
268
  if (functionBayFile?.scripts?.build) {
269
269
  let buildScript = functionBayFile.scripts.build;
270
270
  console.log(`Detected build script: "${buildScript}"`);
271
271
  await $`bash -c ${buildScript}`.env(env);
272
- } else if (packageJson.scripts?.build) {
272
+ } else if (packageJson?.scripts?.build) {
273
273
  console.log(`Detected build script in package.json: "${packageJson.scripts.build}"`);
274
274
  await $`bash -c "npm run build"`.env(env);
275
275
  } else {
@@ -277,7 +277,7 @@ var build = async () => {
277
277
  }
278
278
  let potentialEntrypoints = cleanup([
279
279
  functionBayFile?.entrypoint,
280
- packageJson.main,
280
+ packageJson?.main,
281
281
  ...tryDirs(tryExtensions("index")),
282
282
  ...tryDirs(tryExtensions("main")),
283
283
  ...tryDirs(tryExtensions("server")),
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/launcher.ts","../src/lib/cleanup.ts","../src/lib/fs.ts"],"sourcesContent":["import { Function, Runtime, tempDir } from '@function-bay/build';\nimport { v, ValidationTypeValue } from '@lowerdeck/validation';\nimport { $ as _$ } from 'bun';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport { getMetorialLauncher } from './launcher';\nimport { cleanup } from './lib/cleanup';\nimport { fileExistsSync, readJsonFileOptional } from './lib/fs';\n\nlet $ = (...args: Parameters<typeof _$>) => {\n let commandString = '';\n let [templateStrings, ...values] = args;\n for (let i = 0; i < templateStrings.length; i++) {\n commandString += templateStrings[i];\n if (i < values.length) {\n commandString += values[i];\n }\n }\n\n let bashPrefix = 'bash -c \"';\n if (commandString.startsWith(bashPrefix)) {\n commandString = commandString.slice(bashPrefix.length, -1);\n }\n\n console.log(`\\n$ ${commandString}`);\n\n return _$(...args);\n};\n\nlet spec = v.object({\n entrypoint: v.optional(v.string()),\n scripts: v.optional(\n v.object({\n build: v.optional(v.string())\n })\n ),\n nodeJsVersion: v.optional(v.string())\n});\n\ntype Spec = ValidationTypeValue<typeof spec>;\n\nlet differentJsTypes = ['.ts', '.js', '.cjs', '.mjs'];\nlet tryExtensions = (base: string) => differentJsTypes.map(ext => base + ext);\n\nlet potentialDirs = ['', 'dist/', 'build/', 'output/', 'out/'];\nlet tryDirs = (filenames: string[]) =>\n filenames.flatMap(name => potentialDirs.map(dir => dir + name));\n\nexport let build = async (): Promise<void> => {\n console.log('Building Node.js function...');\n\n await $`bun i -g @vercel/ncc typescript`;\n await $`curl https://get.volta.sh | bash`;\n\n console.log('Setting up Node.js build environment...');\n\n let packageJson = await readJsonFileOptional<{\n main?: string;\n scripts?: { build?: string };\n }>('package.json');\n if (!packageJson) {\n console.log('No package.json found in the current directory. Exiting build.');\n packageJson = {};\n }\n\n let functionBayFile =\n (await readJsonFileOptional<Spec>('function-bay.json')) ??\n (await readJsonFileOptional<Spec>('metorial.json'));\n\n let nodeJsVersionIdentifierRaw =\n functionBayFile?.nodeJsVersion ?? process.env.NODE_VERSION ?? '24.x';\n let nodeJsVersionIdentifier = nodeJsVersionIdentifierRaw.split('.')[0] + '.x';\n\n console.log(`Using Node.js version identifier: ${nodeJsVersionIdentifier}`);\n\n let env = { PATH: `${process.env.HOME}/.volta/bin:${process.env.PATH}` };\n\n await $`bash -c \"volta install node@${nodeJsVersionIdentifier}\"`.env(env);\n\n if (fileExistsSync('yarn.lock')) {\n console.log('Detected yarn.lock, installing dependencies with Yarn...');\n await $`bash -c \"volta install yarn@1\"`.env(env);\n await $`bash -c \"yarn install\"`.env(env);\n } else if (fileExistsSync('pnpm-lock.yaml')) {\n console.log('Detected pnpm-lock.yaml, installing dependencies with pnpm...');\n await $`bash -c \"volta install pnpm\"`.env(env);\n await $`bash -c \"pnpm install\"`.env(env);\n } else if (fileExistsSync('bun.lock')) {\n console.log('Detected bun.lock, installing dependencies with Bun...');\n await $`bash -c \"volta install bun\"`.env(env);\n await $`bash -c \"bun install\"`.env(env);\n } else {\n console.log('Installing dependencies with npm...');\n await $`bash -c \"npm install\"`.env(env);\n }\n\n if (functionBayFile?.scripts?.build) {\n let buildScript = functionBayFile.scripts.build;\n console.log(`Detected build script: \"${buildScript}\"`);\n await $`bash -c ${buildScript}`.env(env);\n } else if (packageJson.scripts?.build) {\n console.log(`Detected build script in package.json: \"${packageJson.scripts.build}\"`);\n await $`bash -c \"npm run build\"`.env(env);\n } else {\n console.log('No build script detected, skipping build step.');\n }\n\n let potentialEntrypoints = cleanup([\n functionBayFile?.entrypoint,\n packageJson.main,\n\n ...tryDirs(tryExtensions('index')),\n ...tryDirs(tryExtensions('main')),\n ...tryDirs(tryExtensions('server')),\n ...tryDirs(tryExtensions('function'))\n ]).filter(fileExistsSync);\n\n if (potentialEntrypoints.length === 0) {\n throw new Error(\n 'Could not find entrypoint for function. Please specify one in function-bay.json'\n );\n }\n\n let entrypoint = potentialEntrypoints[0];\n console.log(`Detected entrypoint: ${entrypoint}`);\n if (!functionBayFile?.entrypoint) {\n console.log(\n 'You can specify this entrypoint in metorial.json to skip this detection step in the future.'\n );\n }\n\n console.log('Bundling function to Metorial Function Bay format...');\n\n let launcher = await getMetorialLauncher({\n bundledEntrypoint: entrypoint\n });\n for (let file of launcher.files) {\n await fs.writeFile(path.join(process.cwd(), file.filename), file.content, 'utf-8');\n }\n\n let outputTempDir = await tempDir();\n await $`ncc build ${launcher.entrypoint} -o ${outputTempDir} --minify --source-map --debug --target es2020`.env(\n env\n );\n\n console.log('\\nCreating function package...');\n\n await Function.create({\n runtime: {\n identifier: '@function-bay/nodejs',\n layer: Runtime.layer,\n handler: launcher.handler,\n runtime: {\n identifier: 'nodejs',\n version: nodeJsVersionIdentifier as '24.x'\n }\n },\n directory: outputTempDir\n });\n\n console.log('Function package created successfully.');\n};\n","import { Runtime } from '@function-bay/build';\n\nexport let getMetorialLauncher = async (opts: { bundledEntrypoint: string }) => {\n if (Runtime.provider == 'aws.lambda') {\n return {\n handler: 'metorial_launcher.handler',\n entrypoint: 'metorial_launcher.js',\n files: [\n {\n filename: 'metorial_launcher.js',\n content: `// Auto-generated by Metorial Function Bay\nimport * as handlerModule from './${opts.bundledEntrypoint}';\n\nlet handler = handlerModule;\n\nexports.handler = async (event) => {\n // Load the entrypoint module\n if (typeof handler == 'object') {\n if (typeof handler.default === 'function') {\n handler = handler.default;\n } else if (typeof handler.handler === 'function') {\n handler = handler.handler;\n }\n }\n\n if (typeof handler !== 'function') {\n return {\n statusCode: 500,\n body: JSON.stringify({ error: { code: 'function_bay.launcher', message: \"Entrypoint does not export a valid handler function\" } })\n };\n }\n\n let rawPayload = event.payload;\n if (!rawPayload) {\n return {\n statusCode: 400,\n body: JSON.stringify({ error: { code: 'function_bay.launcher', message: \"Missing payload field\" } })\n };\n }\n\n let data;\n try {\n data = JSON.parse(rawPayload);\n } catch (err) {\n return {\n statusCode: 400,\n body: JSON.stringify({ error: { code: 'function_bay.launcher', message: \"Invalid JSON payload\" } })\n };\n }\n\n try {\n let result = await handler(data);\n\n return {\n statusCode: 200,\n body: JSON.stringify({\n message: \"Payload received\",\n received: data\n })\n };\n } catch (err) {\n if (typeof err == 'object' && err.__function_bay_error) {\n let result = err.toResponse();\n return {\n statusCode: result.statusCode || 500,\n body: JSON.stringify(result)\n };\n }\n\n let fullMessage = '';\n if (typeof err == 'object' && err !== null) {\n if ('name' in err && typeof err.name === 'string') {\n fullMessage += \\`[\\${err.name}]: \\\\n\\`;\n }\n\n if ('message' in err && typeof err.message === 'string') {\n fullMessage += err.message;\n }\n\n if ('stack' in err && typeof err.stack === 'string') {\n fullMessage += '\\\\n' + err.stack;\n }\n } else {\n try {\n fullMessage = JSON.stringify(err);\n } catch {\n fullMessage = String(err || 'Unknown error');\n }\n }\n\n return {\n statusCode: 500,\n body: JSON.stringify({ error: { code: 'function_bay.handler_error', message: fullMessage } })\n };\n }\n};\n`\n },\n\n {\n filename: 'tsconfig.json',\n content: JSON.stringify(\n {\n compilerOptions: {\n lib: ['ESNext'],\n target: 'es2020',\n jsx: 'react-jsx',\n allowJs: true,\n moduleResolution: 'bundler',\n verbatimModuleSyntax: false,\n strict: false,\n skipLibCheck: true,\n noFallthroughCasesInSwitch: false,\n noUncheckedIndexedAccess: false,\n noImplicitOverride: false,\n noUnusedLocals: false,\n noUnusedParameters: false,\n noPropertyAccessFromIndexSignature: false\n }\n },\n null,\n 2\n )\n }\n ]\n };\n }\n\n throw new Error(`Unsupported provider for Node.js runtime: ${Runtime.provider}`);\n};\n","export let cleanup = <T>(arr: (T | null | undefined)[]): T[] =>\n arr.filter((item): item is T => item != null);\n","import fsSync from 'fs';\nimport fs from 'fs/promises';\nimport path from 'path';\n\nexport let readJsonFile = async <T>(inPath: string): Promise<T> => {\n let content = await fs.readFile(path.join(process.cwd(), inPath), 'utf-8');\n return JSON.parse(content) as T;\n};\n\nexport let readJsonFileOptional = async <T>(inPath: string): Promise<T | null> => {\n if (!(await fileExists(inPath))) {\n return null;\n }\n\n return readJsonFile<T>(inPath);\n};\n\nexport let fileExists = async (inPath: string): Promise<boolean> => {\n try {\n await fs.access(path.join(process.cwd(), inPath));\n return true;\n } catch {\n return false;\n }\n};\n\nexport let fileExistsSync = (inPath: string): boolean => {\n try {\n fsSync.accessSync(path.join(process.cwd(), inPath));\n return true;\n } catch {\n return false;\n }\n};\n"],"mappings":"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","names":["import_build","import_promises","import_path","fs","path","fsSync","_$","fs","path"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/launcher.ts","../src/lib/cleanup.ts","../src/lib/fs.ts"],"sourcesContent":["import { Function, Runtime, tempDir } from '@function-bay/build';\nimport { v, ValidationTypeValue } from '@lowerdeck/validation';\nimport { $ as _$ } from 'bun';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport { getMetorialLauncher } from './launcher';\nimport { cleanup } from './lib/cleanup';\nimport { fileExistsSync, readJsonFileOptional } from './lib/fs';\n\nlet $ = (...args: Parameters<typeof _$>) => {\n let commandString = '';\n let [templateStrings, ...values] = args;\n for (let i = 0; i < templateStrings.length; i++) {\n commandString += templateStrings[i];\n if (i < values.length) {\n commandString += values[i];\n }\n }\n\n let bashPrefix = 'bash -c \"';\n if (commandString.startsWith(bashPrefix)) {\n commandString = commandString.slice(bashPrefix.length, -1);\n }\n\n console.log(`\\n$ ${commandString}`);\n\n return _$(...args);\n};\n\nlet spec = v.object({\n entrypoint: v.optional(v.string()),\n scripts: v.optional(\n v.object({\n build: v.optional(v.string())\n })\n ),\n nodeJsVersion: v.optional(v.string())\n});\n\ntype Spec = ValidationTypeValue<typeof spec>;\n\nlet differentJsTypes = ['.ts', '.js', '.cjs', '.mjs'];\nlet tryExtensions = (base: string) => differentJsTypes.map(ext => base + ext);\n\nlet potentialDirs = ['', 'dist/', 'build/', 'output/', 'out/'];\nlet tryDirs = (filenames: string[]) =>\n filenames.flatMap(name => potentialDirs.map(dir => dir + name));\n\nexport let build = async (): Promise<void> => {\n console.log('Building Node.js function...');\n\n await $`bun i -g @vercel/ncc typescript`;\n await $`curl https://get.volta.sh | bash`;\n\n console.log('Setting up Node.js build environment...');\n\n let packageJson = await readJsonFileOptional<{\n main?: string;\n scripts?: { build?: string };\n }>('package.json');\n if (!packageJson) {\n console.log('No package.json found in the current directory. Exiting build.');\n }\n\n let functionBayFile =\n (await readJsonFileOptional<Spec>('function-bay.json')) ??\n (await readJsonFileOptional<Spec>('metorial.json'));\n\n let nodeJsVersionIdentifierRaw =\n functionBayFile?.nodeJsVersion ?? process.env.NODE_VERSION ?? '24.x';\n let nodeJsVersionIdentifier = nodeJsVersionIdentifierRaw.split('.')[0] + '.x';\n\n console.log(`Using Node.js version identifier: ${nodeJsVersionIdentifier}`);\n\n let env = { PATH: `${process.env.HOME}/.volta/bin:${process.env.PATH}` };\n\n await $`bash -c \"volta install node@${nodeJsVersionIdentifier}\"`.env(env);\n\n if (packageJson) {\n if (fileExistsSync('yarn.lock')) {\n console.log('Detected yarn.lock, installing dependencies with Yarn...');\n await $`bash -c \"volta install yarn@1\"`.env(env);\n await $`bash -c \"yarn install\"`.env(env);\n } else if (fileExistsSync('pnpm-lock.yaml')) {\n console.log('Detected pnpm-lock.yaml, installing dependencies with pnpm...');\n await $`bash -c \"volta install pnpm\"`.env(env);\n await $`bash -c \"pnpm install\"`.env(env);\n } else if (fileExistsSync('bun.lock')) {\n console.log('Detected bun.lock, installing dependencies with Bun...');\n await $`bash -c \"volta install bun\"`.env(env);\n await $`bash -c \"bun install\"`.env(env);\n } else {\n console.log('Installing dependencies with npm...');\n await $`bash -c \"npm install\"`.env(env);\n }\n } else {\n console.log('No package.json found, skipping dependency installation.');\n }\n\n if (functionBayFile?.scripts?.build) {\n let buildScript = functionBayFile.scripts.build;\n console.log(`Detected build script: \"${buildScript}\"`);\n await $`bash -c ${buildScript}`.env(env);\n } else if (packageJson?.scripts?.build) {\n console.log(`Detected build script in package.json: \"${packageJson.scripts.build}\"`);\n await $`bash -c \"npm run build\"`.env(env);\n } else {\n console.log('No build script detected, skipping build step.');\n }\n\n let potentialEntrypoints = cleanup([\n functionBayFile?.entrypoint,\n packageJson?.main,\n\n ...tryDirs(tryExtensions('index')),\n ...tryDirs(tryExtensions('main')),\n ...tryDirs(tryExtensions('server')),\n ...tryDirs(tryExtensions('function'))\n ]).filter(fileExistsSync);\n\n if (potentialEntrypoints.length === 0) {\n throw new Error(\n 'Could not find entrypoint for function. Please specify one in function-bay.json'\n );\n }\n\n let entrypoint = potentialEntrypoints[0];\n console.log(`Detected entrypoint: ${entrypoint}`);\n if (!functionBayFile?.entrypoint) {\n console.log(\n 'You can specify this entrypoint in metorial.json to skip this detection step in the future.'\n );\n }\n\n console.log('Bundling function to Metorial Function Bay format...');\n\n let launcher = await getMetorialLauncher({\n bundledEntrypoint: entrypoint\n });\n for (let file of launcher.files) {\n await fs.writeFile(path.join(process.cwd(), file.filename), file.content, 'utf-8');\n }\n\n let outputTempDir = await tempDir();\n await $`ncc build ${launcher.entrypoint} -o ${outputTempDir} --minify --source-map --debug --target es2020`.env(\n env\n );\n\n console.log('\\nCreating function package...');\n\n await Function.create({\n runtime: {\n identifier: '@function-bay/nodejs',\n layer: Runtime.layer,\n handler: launcher.handler,\n runtime: {\n identifier: 'nodejs',\n version: nodeJsVersionIdentifier as '24.x'\n }\n },\n directory: outputTempDir\n });\n\n console.log('Function package created successfully.');\n};\n","import { Runtime } from '@function-bay/build';\n\nexport let getMetorialLauncher = async (opts: { bundledEntrypoint: string }) => {\n if (Runtime.provider == 'aws.lambda') {\n return {\n handler: 'metorial_launcher.handler',\n entrypoint: 'metorial_launcher.js',\n files: [\n {\n filename: 'metorial_launcher.js',\n content: `// Auto-generated by Metorial Function Bay\nimport * as handlerModule from './${opts.bundledEntrypoint}';\n\nlet handler = handlerModule;\n\nexports.handler = async (event) => {\n // Load the entrypoint module\n if (typeof handler == 'object') {\n if (typeof handler.default === 'function') {\n handler = handler.default;\n } else if (typeof handler.handler === 'function') {\n handler = handler.handler;\n }\n }\n\n if (typeof handler !== 'function') {\n return {\n statusCode: 500,\n body: JSON.stringify({ error: { code: 'function_bay.launcher', message: \"Entrypoint does not export a valid handler function\" } })\n };\n }\n\n let rawPayload = event.payload;\n if (!rawPayload) {\n return {\n statusCode: 400,\n body: JSON.stringify({ error: { code: 'function_bay.launcher', message: \"Missing payload field\" } })\n };\n }\n\n let data;\n try {\n data = JSON.parse(rawPayload);\n } catch (err) {\n return {\n statusCode: 400,\n body: JSON.stringify({ error: { code: 'function_bay.launcher', message: \"Invalid JSON payload\" } })\n };\n }\n\n try {\n let result = await handler(data);\n\n return {\n statusCode: 200,\n body: JSON.stringify({ result })\n };\n } catch (err) {\n if (typeof err == 'object' && err.__function_bay_error) {\n let result = err.toResponse();\n return {\n statusCode: 500,\n body: JSON.stringify({ error: result })\n };\n }\n\n let fullMessage = '';\n if (typeof err == 'object' && err !== null) {\n if ('name' in err && typeof err.name === 'string') {\n fullMessage += \\`[\\${err.name}]: \\\\n\\`;\n }\n\n if ('message' in err && typeof err.message === 'string') {\n fullMessage += err.message;\n }\n\n if ('stack' in err && typeof err.stack === 'string') {\n fullMessage += '\\\\n' + err.stack;\n }\n } else {\n try {\n fullMessage = JSON.stringify(err);\n } catch {\n fullMessage = String(err || 'Unknown error');\n }\n }\n\n return {\n statusCode: 500,\n body: JSON.stringify({ error: { code: 'function_bay.handler_error', message: fullMessage } })\n };\n }\n};\n`\n },\n\n {\n filename: 'tsconfig.json',\n content: JSON.stringify(\n {\n compilerOptions: {\n lib: ['ESNext'],\n target: 'es2020',\n jsx: 'react-jsx',\n allowJs: true,\n moduleResolution: 'bundler',\n verbatimModuleSyntax: false,\n strict: false,\n skipLibCheck: true,\n noFallthroughCasesInSwitch: false,\n noUncheckedIndexedAccess: false,\n noImplicitOverride: false,\n noUnusedLocals: false,\n noUnusedParameters: false,\n noPropertyAccessFromIndexSignature: false\n }\n },\n null,\n 2\n )\n }\n ]\n };\n }\n\n throw new Error(`Unsupported provider for Node.js runtime: ${Runtime.provider}`);\n};\n","export let cleanup = <T>(arr: (T | null | undefined)[]): T[] =>\n arr.filter((item): item is T => item != null);\n","import fsSync from 'fs';\nimport fs from 'fs/promises';\nimport path from 'path';\n\nexport let readJsonFile = async <T>(inPath: string): Promise<T> => {\n let content = await fs.readFile(path.join(process.cwd(), inPath), 'utf-8');\n return JSON.parse(content) as T;\n};\n\nexport let readJsonFileOptional = async <T>(inPath: string): Promise<T | null> => {\n if (!(await fileExists(inPath))) {\n return null;\n }\n\n return readJsonFile<T>(inPath);\n};\n\nexport let fileExists = async (inPath: string): Promise<boolean> => {\n try {\n await fs.access(path.join(process.cwd(), inPath));\n return true;\n } catch {\n return false;\n }\n};\n\nexport let fileExistsSync = (inPath: string): boolean => {\n try {\n fsSync.accessSync(path.join(process.cwd(), inPath));\n return true;\n } catch {\n return false;\n }\n};\n"],"mappings":"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","names":["import_build","import_promises","import_path","fs","path","fsSync","_$","fs","path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@function-bay/nodejs",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
package/src/index.ts CHANGED
@@ -60,7 +60,6 @@ export let build = async (): Promise<void> => {
60
60
  }>('package.json');
61
61
  if (!packageJson) {
62
62
  console.log('No package.json found in the current directory. Exiting build.');
63
- packageJson = {};
64
63
  }
65
64
 
66
65
  let functionBayFile =
@@ -77,28 +76,32 @@ export let build = async (): Promise<void> => {
77
76
 
78
77
  await $`bash -c "volta install node@${nodeJsVersionIdentifier}"`.env(env);
79
78
 
80
- if (fileExistsSync('yarn.lock')) {
81
- console.log('Detected yarn.lock, installing dependencies with Yarn...');
82
- await $`bash -c "volta install yarn@1"`.env(env);
83
- await $`bash -c "yarn install"`.env(env);
84
- } else if (fileExistsSync('pnpm-lock.yaml')) {
85
- console.log('Detected pnpm-lock.yaml, installing dependencies with pnpm...');
86
- await $`bash -c "volta install pnpm"`.env(env);
87
- await $`bash -c "pnpm install"`.env(env);
88
- } else if (fileExistsSync('bun.lock')) {
89
- console.log('Detected bun.lock, installing dependencies with Bun...');
90
- await $`bash -c "volta install bun"`.env(env);
91
- await $`bash -c "bun install"`.env(env);
79
+ if (packageJson) {
80
+ if (fileExistsSync('yarn.lock')) {
81
+ console.log('Detected yarn.lock, installing dependencies with Yarn...');
82
+ await $`bash -c "volta install yarn@1"`.env(env);
83
+ await $`bash -c "yarn install"`.env(env);
84
+ } else if (fileExistsSync('pnpm-lock.yaml')) {
85
+ console.log('Detected pnpm-lock.yaml, installing dependencies with pnpm...');
86
+ await $`bash -c "volta install pnpm"`.env(env);
87
+ await $`bash -c "pnpm install"`.env(env);
88
+ } else if (fileExistsSync('bun.lock')) {
89
+ console.log('Detected bun.lock, installing dependencies with Bun...');
90
+ await $`bash -c "volta install bun"`.env(env);
91
+ await $`bash -c "bun install"`.env(env);
92
+ } else {
93
+ console.log('Installing dependencies with npm...');
94
+ await $`bash -c "npm install"`.env(env);
95
+ }
92
96
  } else {
93
- console.log('Installing dependencies with npm...');
94
- await $`bash -c "npm install"`.env(env);
97
+ console.log('No package.json found, skipping dependency installation.');
95
98
  }
96
99
 
97
100
  if (functionBayFile?.scripts?.build) {
98
101
  let buildScript = functionBayFile.scripts.build;
99
102
  console.log(`Detected build script: "${buildScript}"`);
100
103
  await $`bash -c ${buildScript}`.env(env);
101
- } else if (packageJson.scripts?.build) {
104
+ } else if (packageJson?.scripts?.build) {
102
105
  console.log(`Detected build script in package.json: "${packageJson.scripts.build}"`);
103
106
  await $`bash -c "npm run build"`.env(env);
104
107
  } else {
@@ -107,7 +110,7 @@ export let build = async (): Promise<void> => {
107
110
 
108
111
  let potentialEntrypoints = cleanup([
109
112
  functionBayFile?.entrypoint,
110
- packageJson.main,
113
+ packageJson?.main,
111
114
 
112
115
  ...tryDirs(tryExtensions('index')),
113
116
  ...tryDirs(tryExtensions('main')),
package/src/launcher.ts CHANGED
@@ -53,17 +53,14 @@ exports.handler = async (event) => {
53
53
 
54
54
  return {
55
55
  statusCode: 200,
56
- body: JSON.stringify({
57
- message: "Payload received",
58
- received: data
59
- })
56
+ body: JSON.stringify({ result })
60
57
  };
61
58
  } catch (err) {
62
59
  if (typeof err == 'object' && err.__function_bay_error) {
63
60
  let result = err.toResponse();
64
61
  return {
65
- statusCode: result.statusCode || 500,
66
- body: JSON.stringify(result)
62
+ statusCode: 500,
63
+ body: JSON.stringify({ error: result })
67
64
  };
68
65
  }
69
66