@nlabs/lex 1.56.2 → 1.57.0

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.
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Copyright (c) 2018-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */ import { execa } from 'execa';
5
+ import { cpSync, existsSync, mkdirSync, rmSync, statSync } from 'fs';
6
+ import { dirname, resolve } from 'path';
7
+ import { log } from '../../utils/log.js';
8
+ const toList = (value)=>{
9
+ if (!value) return [];
10
+ return Array.isArray(value) ? value : [
11
+ value
12
+ ];
13
+ };
14
+ const formatSize = (bytes)=>{
15
+ if (bytes < 1024) return `${bytes} B`;
16
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
17
+ return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
18
+ };
19
+ export const packageLambda = async (cmd, callback = ()=>({}))=>{
20
+ const { bundle = true, cliName = 'Lex', entry, format = 'cjs', mainFields = 'module,main', minify = false, nodeModulesPath = './node_modules', output = './lambda-package.zip', packageDir = './.lex/lambda-package', platform = 'node', quiet, sourcemap = false, target = 'node24' } = cmd;
21
+ if (!entry) {
22
+ log(`\n${cliName} Error: --entry is required.`, 'error', quiet);
23
+ callback(1);
24
+ return 1;
25
+ }
26
+ const entryPath = resolve(process.cwd(), entry);
27
+ if (!existsSync(entryPath)) {
28
+ log(`\n${cliName} Error: Entry file not found, "${entry}".`, 'error', quiet);
29
+ callback(1);
30
+ return 1;
31
+ }
32
+ const outputPath = resolve(process.cwd(), output);
33
+ const packagePath = resolve(process.cwd(), packageDir);
34
+ const outfile = resolve(process.cwd(), cmd.outfile || `${packageDir}/index.js`);
35
+ try {
36
+ log(`${cliName} packaging Lambda bundle...`, 'info', quiet);
37
+ rmSync(packagePath, {
38
+ force: true,
39
+ recursive: true
40
+ });
41
+ rmSync(outputPath, {
42
+ force: true
43
+ });
44
+ mkdirSync(dirname(outfile), {
45
+ recursive: true
46
+ });
47
+ const esbuildArgs = [
48
+ entryPath,
49
+ bundle ? '--bundle' : '--bundle=false',
50
+ `--platform=${platform}`,
51
+ `--target=${target}`,
52
+ `--format=${format}`,
53
+ `--main-fields=${mainFields}`,
54
+ '--tree-shaking=true',
55
+ '--legal-comments=none',
56
+ `--outfile=${outfile}`
57
+ ];
58
+ if (minify) {
59
+ esbuildArgs.push('--minify');
60
+ }
61
+ if (sourcemap) {
62
+ esbuildArgs.push('--sourcemap');
63
+ }
64
+ for (const external of toList(cmd.external)){
65
+ esbuildArgs.push(`--external:${external}`);
66
+ }
67
+ await execa('npx', [
68
+ '--no-install',
69
+ 'esbuild',
70
+ ...esbuildArgs
71
+ ], {
72
+ cwd: process.cwd(),
73
+ stdio: 'inherit'
74
+ });
75
+ for (const moduleName of toList(cmd.copyNodeModule)){
76
+ const source = resolve(process.cwd(), nodeModulesPath, moduleName);
77
+ const destination = resolve(packagePath, 'node_modules', moduleName);
78
+ if (!existsSync(source)) {
79
+ log(`${cliName} warning: node module not found, "${moduleName}".`, 'warn', quiet);
80
+ continue;
81
+ }
82
+ mkdirSync(dirname(destination), {
83
+ recursive: true
84
+ });
85
+ cpSync(source, destination, {
86
+ recursive: true
87
+ });
88
+ }
89
+ mkdirSync(dirname(outputPath), {
90
+ recursive: true
91
+ });
92
+ await execa('zip', [
93
+ '-qr',
94
+ outputPath,
95
+ '.'
96
+ ], {
97
+ cwd: packagePath,
98
+ stdio: 'inherit'
99
+ });
100
+ log(`${cliName} Lambda package created: ${outputPath} (${formatSize(statSync(outputPath).size)})`, 'success', quiet);
101
+ callback(0);
102
+ return 0;
103
+ } catch (error) {
104
+ log(`\n${cliName} Error: Lambda package failed. ${error.message}`, 'error', quiet);
105
+ callback(1);
106
+ return 1;
107
+ }
108
+ };
109
+
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9wYWNrYWdlLWxhbWJkYS9wYWNrYWdlLWxhbWJkYS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtleGVjYX0gZnJvbSAnZXhlY2EnO1xuaW1wb3J0IHtjcFN5bmMsIGV4aXN0c1N5bmMsIG1rZGlyU3luYywgcm1TeW5jLCBzdGF0U3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtkaXJuYW1lLCByZXNvbHZlfSBmcm9tICdwYXRoJztcblxuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUxhbWJkYU9wdGlvbnMge1xuICByZWFkb25seSBidW5kbGU/OiBib29sZWFuO1xuICByZWFkb25seSBjbGlOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBjb3B5Tm9kZU1vZHVsZT86IHN0cmluZyB8IHN0cmluZ1tdO1xuICByZWFkb25seSBlbnRyeT86IHN0cmluZztcbiAgcmVhZG9ubHkgZXh0ZXJuYWw/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgZm9ybWF0PzogJ2NqcycgfCAnZXNtJztcbiAgcmVhZG9ubHkgbWFpbkZpZWxkcz86IHN0cmluZztcbiAgcmVhZG9ubHkgbWluaWZ5PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbm9kZU1vZHVsZXNQYXRoPzogc3RyaW5nO1xuICByZWFkb25seSBvdXRmaWxlPzogc3RyaW5nO1xuICByZWFkb25seSBvdXRwdXQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhY2thZ2VEaXI/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsYXRmb3JtPzogJ25vZGUnO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNvdXJjZW1hcD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRhcmdldD86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgUGFja2FnZUxhbWJkYUNhbGxiYWNrID0gKHN0YXR1czogbnVtYmVyKSA9PiB2b2lkO1xuXG5jb25zdCB0b0xpc3QgPSAodmFsdWU/OiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZ1tdID0+IHtcbiAgaWYoIXZhbHVlKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn07XG5cbmNvbnN0IGZvcm1hdFNpemUgPSAoYnl0ZXM6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGlmKGJ5dGVzIDwgMTAyNCkgcmV0dXJuIGAke2J5dGVzfSBCYDtcbiAgaWYoYnl0ZXMgPCAxMDI0ICogMTAyNCkgcmV0dXJuIGAkeyhieXRlcyAvIDEwMjQpLnRvRml4ZWQoMSl9IEtCYDtcbiAgcmV0dXJuIGAkeyhieXRlcyAvIDEwMjQgLyAxMDI0KS50b0ZpeGVkKDEpfSBNQmA7XG59O1xuXG5leHBvcnQgY29uc3QgcGFja2FnZUxhbWJkYSA9IGFzeW5jIChcbiAgY21kOiBQYWNrYWdlTGFtYmRhT3B0aW9ucyxcbiAgY2FsbGJhY2s6IFBhY2thZ2VMYW1iZGFDYWxsYmFjayA9ICgpID0+ICh7fSlcbik6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IHtcbiAgICBidW5kbGUgPSB0cnVlLFxuICAgIGNsaU5hbWUgPSAnTGV4JyxcbiAgICBlbnRyeSxcbiAgICBmb3JtYXQgPSAnY2pzJyxcbiAgICBtYWluRmllbGRzID0gJ21vZHVsZSxtYWluJyxcbiAgICBtaW5pZnkgPSBmYWxzZSxcbiAgICBub2RlTW9kdWxlc1BhdGggPSAnLi9ub2RlX21vZHVsZXMnLFxuICAgIG91dHB1dCA9ICcuL2xhbWJkYS1wYWNrYWdlLnppcCcsXG4gICAgcGFja2FnZURpciA9ICcuLy5sZXgvbGFtYmRhLXBhY2thZ2UnLFxuICAgIHBsYXRmb3JtID0gJ25vZGUnLFxuICAgIHF1aWV0LFxuICAgIHNvdXJjZW1hcCA9IGZhbHNlLFxuICAgIHRhcmdldCA9ICdub2RlMjQnXG4gIH0gPSBjbWQ7XG5cbiAgaWYoIWVudHJ5KSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAtLWVudHJ5IGlzIHJlcXVpcmVkLmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IGVudHJ5UGF0aCA9IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZW50cnkpO1xuICBpZighZXhpc3RzU3luYyhlbnRyeVBhdGgpKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBFbnRyeSBmaWxlIG5vdCBmb3VuZCwgXCIke2VudHJ5fVwiLmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dFBhdGggPSByZXNvbHZlKHByb2Nlc3MuY3dkKCksIG91dHB1dCk7XG4gIGNvbnN0IHBhY2thZ2VQYXRoID0gcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBwYWNrYWdlRGlyKTtcbiAgY29uc3Qgb3V0ZmlsZSA9IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY21kLm91dGZpbGUgfHwgYCR7cGFja2FnZURpcn0vaW5kZXguanNgKTtcblxuICB0cnkge1xuICAgIGxvZyhgJHtjbGlOYW1lfSBwYWNrYWdpbmcgTGFtYmRhIGJ1bmRsZS4uLmAsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgcm1TeW5jKHBhY2thZ2VQYXRoLCB7Zm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZX0pO1xuICAgIHJtU3luYyhvdXRwdXRQYXRoLCB7Zm9yY2U6IHRydWV9KTtcbiAgICBta2RpclN5bmMoZGlybmFtZShvdXRmaWxlKSwge3JlY3Vyc2l2ZTogdHJ1ZX0pO1xuXG4gICAgY29uc3QgZXNidWlsZEFyZ3MgPSBbXG4gICAgICBlbnRyeVBhdGgsXG4gICAgICBidW5kbGUgPyAnLS1idW5kbGUnIDogJy0tYnVuZGxlPWZhbHNlJyxcbiAgICAgIGAtLXBsYXRmb3JtPSR7cGxhdGZvcm19YCxcbiAgICAgIGAtLXRhcmdldD0ke3RhcmdldH1gLFxuICAgICAgYC0tZm9ybWF0PSR7Zm9ybWF0fWAsXG4gICAgICBgLS1tYWluLWZpZWxkcz0ke21haW5GaWVsZHN9YCxcbiAgICAgICctLXRyZWUtc2hha2luZz10cnVlJyxcbiAgICAgICctLWxlZ2FsLWNvbW1lbnRzPW5vbmUnLFxuICAgICAgYC0tb3V0ZmlsZT0ke291dGZpbGV9YFxuICAgIF07XG5cbiAgICBpZihtaW5pZnkpIHtcbiAgICAgIGVzYnVpbGRBcmdzLnB1c2goJy0tbWluaWZ5Jyk7XG4gICAgfVxuXG4gICAgaWYoc291cmNlbWFwKSB7XG4gICAgICBlc2J1aWxkQXJncy5wdXNoKCctLXNvdXJjZW1hcCcpO1xuICAgIH1cblxuICAgIGZvcihjb25zdCBleHRlcm5hbCBvZiB0b0xpc3QoY21kLmV4dGVybmFsKSkge1xuICAgICAgZXNidWlsZEFyZ3MucHVzaChgLS1leHRlcm5hbDoke2V4dGVybmFsfWApO1xuICAgIH1cblxuICAgIGF3YWl0IGV4ZWNhKCducHgnLCBbJy0tbm8taW5zdGFsbCcsICdlc2J1aWxkJywgLi4uZXNidWlsZEFyZ3NdLCB7XG4gICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgICBzdGRpbzogJ2luaGVyaXQnXG4gICAgfSk7XG5cbiAgICBmb3IoY29uc3QgbW9kdWxlTmFtZSBvZiB0b0xpc3QoY21kLmNvcHlOb2RlTW9kdWxlKSkge1xuICAgICAgY29uc3Qgc291cmNlID0gcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBub2RlTW9kdWxlc1BhdGgsIG1vZHVsZU5hbWUpO1xuICAgICAgY29uc3QgZGVzdGluYXRpb24gPSByZXNvbHZlKHBhY2thZ2VQYXRoLCAnbm9kZV9tb2R1bGVzJywgbW9kdWxlTmFtZSk7XG5cbiAgICAgIGlmKCFleGlzdHNTeW5jKHNvdXJjZSkpIHtcbiAgICAgICAgbG9nKGAke2NsaU5hbWV9IHdhcm5pbmc6IG5vZGUgbW9kdWxlIG5vdCBmb3VuZCwgXCIke21vZHVsZU5hbWV9XCIuYCwgJ3dhcm4nLCBxdWlldCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBta2RpclN5bmMoZGlybmFtZShkZXN0aW5hdGlvbiksIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICAgIGNwU3luYyhzb3VyY2UsIGRlc3RpbmF0aW9uLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gICAgfVxuXG4gICAgbWtkaXJTeW5jKGRpcm5hbWUob3V0cHV0UGF0aCksIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICBhd2FpdCBleGVjYSgnemlwJywgWyctcXInLCBvdXRwdXRQYXRoLCAnLiddLCB7XG4gICAgICBjd2Q6IHBhY2thZ2VQYXRoLFxuICAgICAgc3RkaW86ICdpbmhlcml0J1xuICAgIH0pO1xuXG4gICAgbG9nKGAke2NsaU5hbWV9IExhbWJkYSBwYWNrYWdlIGNyZWF0ZWQ6ICR7b3V0cHV0UGF0aH0gKCR7Zm9ybWF0U2l6ZShzdGF0U3luYyhvdXRwdXRQYXRoKS5zaXplKX0pYCwgJ3N1Y2Nlc3MnLCBxdWlldCk7XG4gICAgY2FsbGJhY2soMCk7XG4gICAgcmV0dXJuIDA7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IExhbWJkYSBwYWNrYWdlIGZhaWxlZC4gJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxufTtcbiJdLCJuYW1lcyI6WyJleGVjYSIsImNwU3luYyIsImV4aXN0c1N5bmMiLCJta2RpclN5bmMiLCJybVN5bmMiLCJzdGF0U3luYyIsImRpcm5hbWUiLCJyZXNvbHZlIiwibG9nIiwidG9MaXN0IiwidmFsdWUiLCJBcnJheSIsImlzQXJyYXkiLCJmb3JtYXRTaXplIiwiYnl0ZXMiLCJ0b0ZpeGVkIiwicGFja2FnZUxhbWJkYSIsImNtZCIsImNhbGxiYWNrIiwiYnVuZGxlIiwiY2xpTmFtZSIsImVudHJ5IiwiZm9ybWF0IiwibWFpbkZpZWxkcyIsIm1pbmlmeSIsIm5vZGVNb2R1bGVzUGF0aCIsIm91dHB1dCIsInBhY2thZ2VEaXIiLCJwbGF0Zm9ybSIsInF1aWV0Iiwic291cmNlbWFwIiwidGFyZ2V0IiwiZW50cnlQYXRoIiwicHJvY2VzcyIsImN3ZCIsIm91dHB1dFBhdGgiLCJwYWNrYWdlUGF0aCIsIm91dGZpbGUiLCJmb3JjZSIsInJlY3Vyc2l2ZSIsImVzYnVpbGRBcmdzIiwicHVzaCIsImV4dGVybmFsIiwic3RkaW8iLCJtb2R1bGVOYW1lIiwiY29weU5vZGVNb2R1bGUiLCJzb3VyY2UiLCJkZXN0aW5hdGlvbiIsInNpemUiLCJlcnJvciIsIm1lc3NhZ2UiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLEtBQUssUUFBTyxRQUFRO0FBQzVCLFNBQVFDLE1BQU0sRUFBRUMsVUFBVSxFQUFFQyxTQUFTLEVBQUVDLE1BQU0sRUFBRUMsUUFBUSxRQUFPLEtBQUs7QUFDbkUsU0FBUUMsT0FBTyxFQUFFQyxPQUFPLFFBQU8sT0FBTztBQUV0QyxTQUFRQyxHQUFHLFFBQU8scUJBQXFCO0FBdUJ2QyxNQUFNQyxTQUFTLENBQUNDO0lBQ2QsSUFBRyxDQUFDQSxPQUFPLE9BQU8sRUFBRTtJQUNwQixPQUFPQyxNQUFNQyxPQUFPLENBQUNGLFNBQVNBLFFBQVE7UUFBQ0E7S0FBTTtBQUMvQztBQUVBLE1BQU1HLGFBQWEsQ0FBQ0M7SUFDbEIsSUFBR0EsUUFBUSxNQUFNLE9BQU8sR0FBR0EsTUFBTSxFQUFFLENBQUM7SUFDcEMsSUFBR0EsUUFBUSxPQUFPLE1BQU0sT0FBTyxHQUFHLEFBQUNBLENBQUFBLFFBQVEsSUFBRyxFQUFHQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDaEUsT0FBTyxHQUFHLEFBQUNELENBQUFB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