@infodb/lctl 0.9.2 → 0.10.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/README.md CHANGED
@@ -167,6 +167,60 @@ pnpx @infodb/lctl info <config-name> [オプション]
167
167
  pnpx @infodb/lctl info my-function
168
168
  ```
169
169
 
170
+ ### 6. gen-routes - Terraform定義から routes.json を生成
171
+ ```bash
172
+ pnpx @infodb/lctl gen-routes <plan-json> [オプション]
173
+ ```
174
+
175
+ **入力:**
176
+ - `plan-json`: `terraform show -json` を保存したファイルパス
177
+
178
+ **オプション:**
179
+ - `--output <file>`: 生成する `routes.json` の出力先(デフォルト: `routes.json`)
180
+ - `--verbose`: 解析過程を詳細表示
181
+
182
+ **機能:**
183
+ - `aws_apigatewayv2_route` / `aws_apigatewayv2_integration` リソースを走査し、`routeKey` と Lambda の紐付けを抽出
184
+ - Integration URI から Lambda 関数名を解析して `{ "method": "GET", "path": "/foo", "lambda": "lambda_foo" }` 形式に整形
185
+ - 紐付けが不完全な場合はエラー終了し、問題箇所を表示
186
+
187
+ **例:**
188
+ ```bash
189
+ terraform show -json tfplan.out > tfplan.json
190
+ pnpx @infodb/lctl gen-routes tfplan.json --output routes.json
191
+ ```
192
+
193
+ ### 7. serve - HTTP → Lambda ローカルサーバを起動
194
+ ```bash
195
+ pnpx @infodb/lctl serve [オプション]
196
+ ```
197
+
198
+ **オプション:**
199
+ - `--routes <file>`: `routes.json` のパス(デフォルト: `routes.json`)
200
+ - `--port <port>`: 起動ポート(デフォルト: `3000`)
201
+ - `--config-dir <dir>`: `configs/` を別パスに変更したい場合に指定
202
+ - `--functions-dir <dir>`: Lambda ソースが配置されたディレクトリ(デフォルト: `functions/`)
203
+ - `--verbose`: ルーティングや Lambda 実行ログを詳細表示
204
+
205
+ **機能:**
206
+ - `routes.json` と YAML 設定からローカルの Lambda ハンドラーを特定
207
+ - Express ベースの HTTP サーバを起動し、API Gateway HTTP API v2 のイベント(`version`, `routeKey`, `rawPath`, `headers`, `body`, `requestContext.http`)を再現
208
+ - Node.js ランタイムは `require` で直接呼び出し、Python ランタイムは `python3` サブプロセス経由で `handler(event, context)` を実行
209
+ - Lambda の戻り値 `{ statusCode, headers, body }` を HTTP レスポンスへ変換
210
+
211
+ **利用例:**
212
+ ```bash
213
+ # 1. Terraform から routes.json を生成
214
+ pnpx @infodb/lctl gen-routes tfplan.json
215
+
216
+ # 2. ローカル HTTP サーバを起動
217
+ pnpx @infodb/lctl serve --routes routes.json --port 4000
218
+ ```
219
+
220
+ **注意:**
221
+ - `routes.json` に存在しない Lambda、または `handler` がエクスポートされていない場合は起動時/実行時に例外となります。
222
+ - Python モジュールは `functions/` を `PYTHONPATH` に追加してインポートします。依存モジュールは同ディレクトリに配置してください。
223
+
170
224
  ## 使用シナリオ
171
225
 
172
226
  ### ローカル開発
@@ -414,4 +468,4 @@ pnpx @infodb/lctl deploy my-function --verbose
414
468
  # スクリプト出力してデバッグ
415
469
  pnpx @infodb/lctl export my-function --output debug-script.sh
416
470
  bash debug-script.sh
417
- ```
471
+ ```
@@ -0,0 +1,7 @@
1
+ interface GenRoutesOptions {
2
+ output?: string;
3
+ verbose?: boolean;
4
+ }
5
+ export declare function genRoutesCommand(inputFile: string, options: GenRoutesOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=gen-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gen-routes.d.ts","sourceRoot":"","sources":["../../src/commands/gen-routes.ts"],"names":[],"mappings":"AAiCA,UAAU,gBAAgB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
@@ -0,0 +1,244 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.genRoutesCommand = genRoutesCommand;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ const logger_1 = require("../utils/logger");
40
+ async function genRoutesCommand(inputFile, options) {
41
+ const logger = new logger_1.Logger(Boolean(options.verbose));
42
+ const resolvedInput = path.resolve(inputFile);
43
+ const resolvedOutput = path.resolve(options.output || 'routes.json');
44
+ logger.info(`Reading terraform plan: ${resolvedInput}`);
45
+ const raw = await fs.readFile(resolvedInput, 'utf-8');
46
+ const parsed = JSON.parse(raw);
47
+ const moduleNode = getPrimaryModule(parsed);
48
+ const resources = collectResources(moduleNode);
49
+ if (!resources.length) {
50
+ throw new Error('No resources found in terraform plan.');
51
+ }
52
+ const configResources = collectConfigResources(parsed?.configuration?.root_module);
53
+ const routes = buildRoutes(resources, configResources, logger);
54
+ await fs.writeFile(resolvedOutput, JSON.stringify(routes, null, 2) + '\n', 'utf-8');
55
+ logger.success(`✅ Generated ${routes.length} routes -> ${resolvedOutput}`);
56
+ }
57
+ function getPrimaryModule(parsed) {
58
+ return (parsed?.values?.root_module ||
59
+ parsed?.planned_values?.root_module ||
60
+ parsed?.prior_state?.values?.root_module);
61
+ }
62
+ function collectResources(moduleNode) {
63
+ if (!moduleNode) {
64
+ return [];
65
+ }
66
+ const collected = [...(moduleNode.resources || [])];
67
+ for (const child of moduleNode.child_modules || []) {
68
+ collected.push(...collectResources(child));
69
+ }
70
+ return collected;
71
+ }
72
+ function collectConfigResources(moduleNode) {
73
+ if (!moduleNode) {
74
+ return [];
75
+ }
76
+ const collected = [...(moduleNode.resources || [])];
77
+ if (moduleNode.module_calls) {
78
+ for (const call of Object.values(moduleNode.module_calls)) {
79
+ collected.push(...collectConfigResources(call.module));
80
+ }
81
+ }
82
+ return collected;
83
+ }
84
+ function buildRoutes(resources, configResources, logger) {
85
+ const integrationIdToLambda = new Map();
86
+ const integrationKeyToLambda = new Map();
87
+ const lambdaNameByKey = new Map();
88
+ const configResourceIndex = indexConfigResources(configResources);
89
+ for (const resource of resources) {
90
+ if (resource.type === 'aws_lambda_function') {
91
+ const functionName = resource.values?.function_name;
92
+ if (functionName) {
93
+ for (const key of getResourceKeys(resource)) {
94
+ lambdaNameByKey.set(key, functionName);
95
+ }
96
+ }
97
+ }
98
+ }
99
+ for (const resource of resources) {
100
+ if (resource.type !== 'aws_apigatewayv2_integration') {
101
+ continue;
102
+ }
103
+ const values = resource.values || {};
104
+ const lambdaName = extractLambdaName(values.integration_uri) ||
105
+ inferLambdaFromConfig(resource, configResourceIndex, lambdaNameByKey);
106
+ if (!lambdaName) {
107
+ throw new Error(`Unable to determine Lambda target for integration ${resource.address || resource.name}.`);
108
+ }
109
+ const integrationId = values.integration_id || values.id;
110
+ if (!integrationId) {
111
+ logger.verbose('Integration id is unknown (likely from plan output). Using configuration references.');
112
+ }
113
+ else {
114
+ integrationIdToLambda.set(String(integrationId), lambdaName);
115
+ }
116
+ for (const key of getResourceKeys(resource)) {
117
+ integrationKeyToLambda.set(key, lambdaName);
118
+ }
119
+ }
120
+ const routes = [];
121
+ for (const resource of resources) {
122
+ if (resource.type !== 'aws_apigatewayv2_route') {
123
+ continue;
124
+ }
125
+ const values = resource.values || {};
126
+ const routeKey = values.route_key;
127
+ if (!routeKey) {
128
+ throw new Error(`Route resource ${resource.address || resource.name} is missing route_key.`);
129
+ }
130
+ const { method, path } = parseRouteKey(routeKey);
131
+ const lambdaName = findLambdaForRoute(resource, configResourceIndex, integrationKeyToLambda) ||
132
+ findLambdaFromTarget(values.target, integrationIdToLambda);
133
+ if (!lambdaName) {
134
+ throw new Error(`Route ${routeKey} does not have a matching Lambda integration. Ensure the integration exists in the same plan.`);
135
+ }
136
+ routes.push({
137
+ method,
138
+ path,
139
+ lambda: lambdaName,
140
+ });
141
+ }
142
+ if (!routes.length) {
143
+ throw new Error('No aws_apigatewayv2_route resources found in terraform plan.');
144
+ }
145
+ return routes;
146
+ }
147
+ function parseRouteKey(routeKey) {
148
+ if (routeKey === '$default') {
149
+ return { method: 'ANY', path: '$default' };
150
+ }
151
+ const parts = routeKey.trim().split(/\s+/);
152
+ if (parts.length < 2) {
153
+ throw new Error(`Invalid routeKey format: ${routeKey}`);
154
+ }
155
+ const method = parts.shift();
156
+ const path = parts.join(' ');
157
+ if (!path.startsWith('/')) {
158
+ throw new Error(`Route path must start with '/': ${routeKey}`);
159
+ }
160
+ return {
161
+ method: method.toUpperCase(),
162
+ path,
163
+ };
164
+ }
165
+ function extractLambdaName(integrationUri) {
166
+ if (typeof integrationUri !== 'string') {
167
+ return null;
168
+ }
169
+ const match = integrationUri.match(/function:([^:/]+)(?=[:/])/);
170
+ return match ? match[1] : null;
171
+ }
172
+ function inferLambdaFromConfig(integrationResource, configResources, lambdaNameByKey) {
173
+ for (const key of getResourceKeys(integrationResource)) {
174
+ const configResource = configResources.get(key);
175
+ if (!configResource) {
176
+ continue;
177
+ }
178
+ const references = configResource.expressions?.integration_uri?.references || [];
179
+ for (const reference of references) {
180
+ const lambdaKey = findReferencedKey(reference, lambdaNameByKey.keys());
181
+ if (lambdaKey) {
182
+ return lambdaNameByKey.get(lambdaKey) || null;
183
+ }
184
+ }
185
+ }
186
+ return null;
187
+ }
188
+ function findLambdaForRoute(routeResource, configResources, integrationKeyToLambda) {
189
+ for (const key of getResourceKeys(routeResource)) {
190
+ const configResource = configResources.get(key);
191
+ if (!configResource) {
192
+ continue;
193
+ }
194
+ const references = configResource.expressions?.target?.references || [];
195
+ for (const reference of references) {
196
+ const integrationKey = findReferencedKey(reference, integrationKeyToLambda.keys());
197
+ if (integrationKey) {
198
+ return integrationKeyToLambda.get(integrationKey) || null;
199
+ }
200
+ }
201
+ }
202
+ return null;
203
+ }
204
+ function findLambdaFromTarget(target, integrationIdToLambda) {
205
+ if (!target || !target.startsWith('integrations/')) {
206
+ return null;
207
+ }
208
+ const integrationId = target.split('/')[1];
209
+ return integrationIdToLambda.get(integrationId) || null;
210
+ }
211
+ function indexConfigResources(resources) {
212
+ const map = new Map();
213
+ for (const resource of resources) {
214
+ for (const key of getResourceKeys(resource)) {
215
+ map.set(key, resource);
216
+ }
217
+ }
218
+ return map;
219
+ }
220
+ function getResourceKeys(resource) {
221
+ const keys = [];
222
+ if (resource.address) {
223
+ keys.push(resource.address);
224
+ }
225
+ keys.push(`${resource.type}.${resource.name}`);
226
+ return keys;
227
+ }
228
+ function findReferencedKey(reference, candidates) {
229
+ const refs = [reference];
230
+ if (reference.includes('.')) {
231
+ refs.push(reference.substring(0, reference.lastIndexOf('.')));
232
+ }
233
+ for (const candidate of candidates) {
234
+ for (const ref of refs) {
235
+ if (ref === candidate ||
236
+ ref.startsWith(`${candidate}.`) ||
237
+ ref.startsWith(`${candidate}[`)) {
238
+ return candidate;
239
+ }
240
+ }
241
+ }
242
+ return null;
243
+ }
244
+ //# sourceMappingURL=gen-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gen-routes.js","sourceRoot":"","sources":["../../src/commands/gen-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ interface ServeOptions {
2
+ routes?: string;
3
+ port?: number | string;
4
+ configDir?: string;
5
+ functionsDir?: string;
6
+ verbose?: boolean;
7
+ }
8
+ export declare function serveCommand(options: ServeOptions): Promise<void>;
9
+ export {};
10
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAUA,UAAU,YAAY;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA+DD,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBvE"}
@@ -0,0 +1,437 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.serveCommand = serveCommand;
40
+ const express_1 = __importDefault(require("express"));
41
+ const fs = __importStar(require("fs/promises"));
42
+ const path = __importStar(require("path"));
43
+ const child_process_1 = require("child_process");
44
+ const crypto_1 = require("crypto");
45
+ const yaml_1 = __importDefault(require("yaml"));
46
+ const logger_1 = require("../utils/logger");
47
+ const routes_1 = require("../utils/routes");
48
+ const env_1 = require("../utils/env");
49
+ const PYTHON_BRIDGE_SCRIPT = `
50
+ import contextlib
51
+ import importlib
52
+ import io
53
+ import json
54
+ import sys
55
+ import traceback
56
+
57
+ def main():
58
+ module_name = sys.argv[1]
59
+ handler_name = sys.argv[2]
60
+ payload = sys.stdin.read()
61
+ event = json.loads(payload) if payload else None
62
+
63
+ try:
64
+ module = importlib.import_module(module_name)
65
+ handler = getattr(module, handler_name)
66
+ except Exception:
67
+ traceback.print_exc()
68
+ sys.exit(1)
69
+
70
+ log_buffer = io.StringIO()
71
+
72
+ try:
73
+ with contextlib.redirect_stdout(log_buffer):
74
+ result = handler(event, None)
75
+ except Exception:
76
+ traceback.print_exc()
77
+ sys.exit(1)
78
+ finally:
79
+ logs = log_buffer.getvalue()
80
+ if logs:
81
+ sys.stderr.write(logs)
82
+
83
+ try:
84
+ sys.stdout.write(json.dumps(result))
85
+ except Exception:
86
+ traceback.print_exc()
87
+ sys.exit(1)
88
+
89
+ if __name__ == '__main__':
90
+ main()
91
+ `;
92
+ async function serveCommand(options) {
93
+ const logger = new logger_1.Logger(Boolean(options.verbose));
94
+ const routesFile = options.routes || 'routes.json';
95
+ const configDir = options.configDir || 'configs';
96
+ const defaultFunctionsDir = options.functionsDir || 'functions';
97
+ const port = parsePort(options.port);
98
+ const routes = await (0, routes_1.readRoutesFile)(routesFile);
99
+ const lambdaDefinitions = await loadLambdaDefinitions(configDir, defaultFunctionsDir, logger);
100
+ validateRoutes(routes, lambdaDefinitions);
101
+ const lambdaRunner = new LambdaRunner(lambdaDefinitions, logger);
102
+ const app = (0, express_1.default)();
103
+ app.use(express_1.default.raw({ type: '*/*', limit: '10mb' }));
104
+ for (const route of routes) {
105
+ registerRoute(app, route, lambdaRunner, logger);
106
+ }
107
+ app.use((req, res) => {
108
+ res.status(404).json({ message: 'Route not found' });
109
+ });
110
+ await startServer(app, port, logger);
111
+ }
112
+ function parsePort(value) {
113
+ if (!value) {
114
+ return 3000;
115
+ }
116
+ const parsed = typeof value === 'string' ? Number.parseInt(value, 10) : value;
117
+ if (!Number.isFinite(parsed) || parsed <= 0) {
118
+ throw new Error(`Invalid port value: ${value}`);
119
+ }
120
+ return parsed;
121
+ }
122
+ async function loadLambdaDefinitions(configDir, defaultFunctionsDir, logger) {
123
+ const resolvedConfigDir = path.resolve(configDir);
124
+ const resolvedDefaultFunctions = path.resolve(defaultFunctionsDir);
125
+ await ensureDirectory(resolvedConfigDir, `Config directory not found: ${resolvedConfigDir}`);
126
+ const entries = await fs.readdir(resolvedConfigDir, { withFileTypes: true });
127
+ const definitions = new Map();
128
+ for (const entry of entries) {
129
+ if (!entry.isFile()) {
130
+ continue;
131
+ }
132
+ if (!entry.name.endsWith('.yaml') && !entry.name.endsWith('.yml')) {
133
+ continue;
134
+ }
135
+ const absolutePath = path.join(resolvedConfigDir, entry.name);
136
+ const yamlContent = await fs.readFile(absolutePath, 'utf-8');
137
+ const parsed = yaml_1.default.parse(yamlContent) || {};
138
+ const resolvedConfig = (0, env_1.substituteEnvVariables)(parsed);
139
+ const configName = path.basename(entry.name, path.extname(entry.name));
140
+ const lambdaName = resolvedConfig.function_name || configName || entry.name.replace(/\.ya?ml$/, '');
141
+ const runtime = resolvedConfig.runtime || 'python3.12';
142
+ const handler = resolvedConfig.handler || `${configName}.handler`;
143
+ const functionsDir = path.resolve(resolvedConfig.functionsDirectory || resolvedDefaultFunctions);
144
+ const handlerParts = splitHandler(handler, absolutePath);
145
+ const runtimeFamily = detectRuntimeFamily(runtime);
146
+ const nodeEntryPath = runtimeFamily === 'node'
147
+ ? await resolveNodeHandlerPath(functionsDir, handlerParts.moduleName)
148
+ : undefined;
149
+ if (runtimeFamily === 'python') {
150
+ const pythonModulePath = resolvePythonModulePath(functionsDir, handlerParts.moduleName);
151
+ await ensureFile(pythonModulePath, `Python handler file not found for module "${handlerParts.moduleName}" (${pythonModulePath})`);
152
+ }
153
+ const definition = {
154
+ lambdaName,
155
+ runtime,
156
+ handler,
157
+ functionsDir,
158
+ handlerModule: handlerParts.moduleName,
159
+ handlerFunction: handlerParts.functionName,
160
+ runtimeFamily,
161
+ nodeEntryPath,
162
+ };
163
+ if (definitions.has(lambdaName)) {
164
+ throw new Error(`Duplicate Lambda name detected in configs: ${lambdaName}`);
165
+ }
166
+ definitions.set(lambdaName, definition);
167
+ // Allow referencing by config name as a fallback.
168
+ if (!definitions.has(configName)) {
169
+ definitions.set(configName, definition);
170
+ }
171
+ logger.verbose(`Loaded config for ${lambdaName} from ${absolutePath}`);
172
+ }
173
+ if (!definitions.size) {
174
+ throw new Error(`No Lambda configs found under ${resolvedConfigDir}`);
175
+ }
176
+ return definitions;
177
+ }
178
+ function splitHandler(handler, source) {
179
+ const lastDot = handler.lastIndexOf('.');
180
+ if (lastDot === -1) {
181
+ throw new Error(`Invalid handler "${handler}" in ${source}. Expected format <module>.<function>.`);
182
+ }
183
+ const moduleName = handler.slice(0, lastDot);
184
+ const functionName = handler.slice(lastDot + 1);
185
+ if (!moduleName || !functionName) {
186
+ throw new Error(`Invalid handler "${handler}" in ${source}.`);
187
+ }
188
+ return { moduleName, functionName };
189
+ }
190
+ function detectRuntimeFamily(runtime) {
191
+ const normalized = runtime.toLowerCase();
192
+ if (normalized.startsWith('nodejs')) {
193
+ return 'node';
194
+ }
195
+ if (normalized.startsWith('python')) {
196
+ return 'python';
197
+ }
198
+ throw new Error(`Unsupported runtime "${runtime}". Only Node.js and Python Lambdas are supported.`);
199
+ }
200
+ async function resolveNodeHandlerPath(functionsDir, moduleName) {
201
+ const basePath = path.isAbsolute(moduleName)
202
+ ? moduleName
203
+ : path.join(functionsDir, moduleName);
204
+ const hasExtension = Boolean(path.extname(basePath));
205
+ if (hasExtension) {
206
+ await ensureFile(basePath, `Node.js handler file not found: ${basePath}`);
207
+ return basePath;
208
+ }
209
+ const extensions = ['.js', '.cjs', '.mjs'];
210
+ for (const extension of extensions) {
211
+ const candidate = `${basePath}${extension}`;
212
+ if (await fileExists(candidate)) {
213
+ return candidate;
214
+ }
215
+ }
216
+ throw new Error(`Unable to locate Node.js handler file for module "${moduleName}" under ${functionsDir}`);
217
+ }
218
+ function resolvePythonModulePath(functionsDir, moduleName) {
219
+ const relativePath = moduleName.replace(/\./g, path.sep) + '.py';
220
+ return path.isAbsolute(relativePath)
221
+ ? relativePath
222
+ : path.join(functionsDir, relativePath);
223
+ }
224
+ function validateRoutes(routes, definitions) {
225
+ for (const route of routes) {
226
+ if (!definitions.has(route.lambda)) {
227
+ throw new Error(`routes.json references unknown Lambda "${route.lambda}"`);
228
+ }
229
+ }
230
+ }
231
+ class LambdaRunner {
232
+ constructor(definitions, logger) {
233
+ this.definitions = definitions;
234
+ this.logger = logger;
235
+ }
236
+ async invoke(lambdaName, event) {
237
+ const definition = this.definitions.get(lambdaName);
238
+ if (!definition) {
239
+ throw new Error(`Lambda "${lambdaName}" is not defined in local configs.`);
240
+ }
241
+ if (definition.runtimeFamily === 'node') {
242
+ return this.invokeNode(definition, event);
243
+ }
244
+ return this.invokePython(definition, event);
245
+ }
246
+ async invokeNode(definition, event) {
247
+ if (!definition.nodeEntryPath) {
248
+ throw new Error(`Node.js handler path not resolved for ${definition.lambdaName}`);
249
+ }
250
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
251
+ const moduleExports = require(definition.nodeEntryPath);
252
+ const handler = moduleExports?.[definition.handlerFunction] ||
253
+ moduleExports?.default?.[definition.handlerFunction];
254
+ if (typeof handler !== 'function') {
255
+ throw new Error(`Handler "${definition.handlerFunction}" not exported by ${definition.nodeEntryPath}`);
256
+ }
257
+ const context = createLambdaContext(definition.lambdaName);
258
+ const response = await Promise.resolve(handler(event, context));
259
+ return normalizeLambdaResult(response);
260
+ }
261
+ async invokePython(definition, event) {
262
+ const pythonPath = buildPythonPath(definition.functionsDir);
263
+ const payload = JSON.stringify(event ?? {});
264
+ return new Promise((resolve, reject) => {
265
+ const child = (0, child_process_1.spawn)('python3', ['-c', PYTHON_BRIDGE_SCRIPT, definition.handlerModule, definition.handlerFunction], {
266
+ env: {
267
+ ...process.env,
268
+ PYTHONPATH: pythonPath,
269
+ },
270
+ });
271
+ let stdout = '';
272
+ let stderr = '';
273
+ child.stdout.on('data', (chunk) => {
274
+ stdout += chunk.toString();
275
+ });
276
+ child.stderr.on('data', (chunk) => {
277
+ stderr += chunk.toString();
278
+ });
279
+ child.on('close', (code) => {
280
+ if (code !== 0) {
281
+ reject(new Error(`Python handler ${definition.lambdaName} failed (exit ${code}): ${stderr.trim()}`));
282
+ return;
283
+ }
284
+ try {
285
+ const parsed = JSON.parse(stdout.trim());
286
+ resolve(normalizeLambdaResult(parsed));
287
+ }
288
+ catch (error) {
289
+ reject(new Error(`Python handler ${definition.lambdaName} returned invalid JSON: ${stdout.trim()}`));
290
+ }
291
+ });
292
+ child.on('error', (error) => {
293
+ reject(error);
294
+ });
295
+ child.stdin.write(payload);
296
+ child.stdin.end();
297
+ });
298
+ }
299
+ }
300
+ function createLambdaContext(functionName) {
301
+ return {
302
+ awsRequestId: (0, crypto_1.randomUUID)(),
303
+ functionName,
304
+ };
305
+ }
306
+ function normalizeLambdaResult(result) {
307
+ if (!result || typeof result !== 'object') {
308
+ throw new Error('Lambda handler must return an object with statusCode/body fields.');
309
+ }
310
+ const statusCode = typeof result.statusCode === 'number' ? result.statusCode : 200;
311
+ const headers = normalizeHeaders(result.headers || {});
312
+ let body;
313
+ if (typeof result.body === 'string' || result.body === undefined) {
314
+ body = result.body;
315
+ }
316
+ else {
317
+ body = JSON.stringify(result.body);
318
+ }
319
+ return { statusCode, headers, body };
320
+ }
321
+ function buildPythonPath(functionsDir) {
322
+ const existing = process.env.PYTHONPATH || '';
323
+ const components = [functionsDir];
324
+ if (existing) {
325
+ components.push(existing);
326
+ }
327
+ return components.join(path.delimiter);
328
+ }
329
+ function registerRoute(app, route, runner, logger) {
330
+ const expressPath = route.path === '$default' ? '*' : convertApiGatewayPath(route.path);
331
+ const handler = async (req, res) => {
332
+ try {
333
+ const bodyBuffer = req.body;
334
+ const bodyString = bodyBuffer && bodyBuffer.length ? bodyBuffer.toString('utf-8') : undefined;
335
+ const event = {
336
+ version: '2.0',
337
+ routeKey: computeRouteKey(route),
338
+ rawPath: req.path,
339
+ headers: normalizeHeaders(req.headers),
340
+ body: bodyString,
341
+ requestContext: {
342
+ http: {
343
+ method: req.method,
344
+ path: req.path,
345
+ },
346
+ },
347
+ };
348
+ const result = await runner.invoke(route.lambda, event);
349
+ if (result.headers) {
350
+ res.set(result.headers);
351
+ }
352
+ res.status(result.statusCode);
353
+ if (result.body !== undefined) {
354
+ res.send(result.body);
355
+ }
356
+ else {
357
+ res.end();
358
+ }
359
+ }
360
+ catch (error) {
361
+ logger.error(`Error invoking Lambda ${route.lambda}: ${error instanceof Error ? error.message : error}`);
362
+ res.status(500).json({
363
+ message: 'Lambda invocation failed',
364
+ detail: error instanceof Error ? error.message : String(error),
365
+ });
366
+ }
367
+ };
368
+ const method = route.method.toLowerCase();
369
+ if (method === 'any') {
370
+ app.all(expressPath, handler);
371
+ }
372
+ else if (typeof app[method] === 'function') {
373
+ app[method](expressPath, handler);
374
+ }
375
+ else {
376
+ throw new Error(`Unsupported HTTP method in routes.json: ${route.method}`);
377
+ }
378
+ logger.info(`Registered route ${route.method} ${route.path} -> ${route.lambda}`);
379
+ }
380
+ function convertApiGatewayPath(apiPath) {
381
+ return apiPath
382
+ .replace(/\{([^+}]+)\+\}/g, (_match, param) => `:${param}+`)
383
+ .replace(/\{([^}]+)\}/g, (_match, param) => `:${param}`);
384
+ }
385
+ function computeRouteKey(route) {
386
+ if (route.path === '$default') {
387
+ return '$default';
388
+ }
389
+ return `${route.method.toUpperCase()} ${route.path}`;
390
+ }
391
+ function normalizeHeaders(headers) {
392
+ const normalized = {};
393
+ for (const [key, value] of Object.entries(headers)) {
394
+ if (Array.isArray(value)) {
395
+ normalized[key.toLowerCase()] = value.join(', ');
396
+ }
397
+ else if (value !== undefined && value !== null) {
398
+ normalized[key.toLowerCase()] = String(value);
399
+ }
400
+ }
401
+ return normalized;
402
+ }
403
+ async function startServer(app, port, logger) {
404
+ await new Promise((resolve, reject) => {
405
+ const server = app.listen(port, () => {
406
+ logger.success(`🚀 Local API Gateway server listening on http://localhost:${port}`);
407
+ resolve();
408
+ });
409
+ server.on('error', (error) => reject(error));
410
+ });
411
+ }
412
+ async function ensureDirectory(dirPath, errorMessage) {
413
+ try {
414
+ const stats = await fs.stat(dirPath);
415
+ if (!stats.isDirectory()) {
416
+ throw new Error(errorMessage);
417
+ }
418
+ }
419
+ catch (error) {
420
+ throw new Error(errorMessage);
421
+ }
422
+ }
423
+ async function ensureFile(filePath, errorMessage) {
424
+ if (!(await fileExists(filePath))) {
425
+ throw new Error(errorMessage);
426
+ }
427
+ }
428
+ async function fileExists(filePath) {
429
+ try {
430
+ const stats = await fs.stat(filePath);
431
+ return stats.isFile();
432
+ }
433
+ catch {
434
+ return false;
435
+ }
436
+ }
437
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+EA,oCAwBC;AAvGD,sDAA8D;AAC9D,gDAAkC;AAClC,2CAA6B;AAC7B,iDAAsC;AACtC,mCAAoC;AACpC,gDAAwB;AACxB,4CAAyC;AACzC,4CAAkE;AAClE,sCAAsD;AA2BtD,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0C5B,CAAC;AAEK,KAAK,UAAU,YAAY,CAAC,OAAqB;IACtD,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;IACnD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,SAAS,CAAC;IACjD,MAAM,mBAAmB,GAAG,OAAO,CAAC,YAAY,IAAI,WAAW,CAAC;IAChE,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC,MAAM,MAAM,GAAG,MAAM,IAAA,uBAAc,EAAC,UAAU,CAAC,CAAC;IAChD,MAAM,iBAAiB,GAAG,MAAM,qBAAqB,CAAC,SAAS,EAAE,mBAAmB,EAAE,MAAM,CAAC,CAAC;IAC9F,cAAc,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAEjE,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAErD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACnB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,SAAS,CAAC,KAAuB;IACxC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,SAAiB,EACjB,mBAA2B,EAC3B,MAAc;IAEd,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,wBAAwB,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACnE,MAAM,eAAe,CAAC,iBAAiB,EAAE,+BAA+B,iBAAiB,EAAE,CAAC,CAAC;IAE7F,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,MAAM,WAAW,GAAG,IAAI,GAAG,EAAiC,CAAC;IAE7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACpB,SAAS;QACX,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAClE,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,cAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAC7C,MAAM,cAAc,GAAG,IAAA,4BAAsB,EAAC,MAAM,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACvE,MAAM,UAAU,GACd,cAAc,CAAC,aAAa,IAAI,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACnF,MAAM,OAAO,GAAW,cAAc,CAAC,OAAO,IAAI,YAAY,CAAC;QAC/D,MAAM,OAAO,GAAW,cAAc,CAAC,OAAO,IAAI,GAAG,UAAU,UAAU,CAAC;QAC1E,MAAM,YAAY,GAAW,IAAI,CAAC,OAAO,CACvC,cAAc,CAAC,kBAAkB,IAAI,wBAAwB,CAC9D,CAAC;QACF,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACzD,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,aAAa,GACjB,aAAa,KAAK,MAAM;YACtB,CAAC,CAAC,MAAM,sBAAsB,CAAC,YAAY,EAAE,YAAY,CAAC,UAAU,CAAC;YACrE,CAAC,CAAC,SAAS,CAAC;QAEhB,IAAI,aAAa,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,YAAY,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;YACxF,MAAM,UAAU,CACd,gBAAgB,EAChB,6CAA6C,YAAY,CAAC,UAAU,MAAM,gBAAgB,GAAG,CAC9F,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAA0B;YACxC,UAAU;YACV,OAAO;YACP,OAAO;YACP,YAAY;YACZ,aAAa,EAAE,YAAY,CAAC,UAAU;YACtC,eAAe,EAAE,YAAY,CAAC,YAAY;YAC1C,aAAa;YACb,aAAa;SACd,CAAC;QAEF,IAAI,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,8CAA8C,UAAU,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAExC,kDAAkD;QAClD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,qBAAqB,UAAU,SAAS,YAAY,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,iCAAiC,iBAAiB,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,YAAY,CAAC,OAAe,EAAE,MAAc;IACnD,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,QAAQ,MAAM,wCAAwC,CAAC,CAAC;IACrG,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IAEhD,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,QAAQ,MAAM,GAAG,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe;IAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACzC,IAAI,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,wBAAwB,OAAO,mDAAmD,CAAC,CAAC;AACtG,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,YAAoB,EAAE,UAAkB;IAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAC1C,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAErD,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,UAAU,CAAC,QAAQ,EAAE,mCAAmC,QAAQ,EAAE,CAAC,CAAC;QAC1E,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,GAAG,QAAQ,GAAG,SAAS,EAAE,CAAC;QAC5C,IAAI,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb,qDAAqD,UAAU,WAAW,YAAY,EAAE,CACzF,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,YAAoB,EAAE,UAAkB;IACvE,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACjE,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAClC,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,cAAc,CACrB,MAAyB,EACzB,WAA+C;IAE/C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,0CAA0C,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,YAAY;IAChB,YACmB,WAA+C,EAC/C,MAAc;QADd,gBAAW,GAAX,WAAW,CAAoC;QAC/C,WAAM,GAAN,MAAM,CAAQ;IAC9B,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAC,UAAkB,EAAE,KAAU;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,WAAW,UAAU,oCAAoC,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,UAAU,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,UAAiC,EAAE,KAAU;QACpE,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,yCAAyC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,8DAA8D;QAC9D,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACxD,MAAM,OAAO,GACX,aAAa,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC;YAC3C,aAAa,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QAEvD,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CACb,YAAY,UAAU,CAAC,eAAe,qBAAqB,UAAU,CAAC,aAAa,EAAE,CACtF,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QAChE,OAAO,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,UAAiC,EACjC,KAAU;QAEV,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAE5C,OAAO,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACvD,MAAM,KAAK,GAAG,IAAA,qBAAK,EACjB,SAAS,EACT,CAAC,IAAI,EAAE,oBAAoB,EAAE,UAAU,CAAC,aAAa,EAAE,UAAU,CAAC,eAAe,CAAC,EAClF;gBACE,GAAG,EAAE;oBACH,GAAG,OAAO,CAAC,GAAG;oBACd,UAAU,EAAE,UAAU;iBACvB;aACF,CACF,CAAC;YAEF,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAEhB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBAChC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBAChC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,MAAM,CACJ,IAAI,KAAK,CACP,kBAAkB,UAAU,CAAC,UAAU,iBAAiB,IAAI,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAClF,CACF,CAAC;oBACF,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;oBACzC,OAAO,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC;gBACzC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CACJ,IAAI,KAAK,CACP,kBAAkB,UAAU,CAAC,UAAU,2BAA2B,MAAM,CAAC,IAAI,EAAE,EAAE,CAClF,CACF,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC1B,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3B,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,SAAS,mBAAmB,CAAC,YAAoB;IAC/C,OAAO;QACL,YAAY,EAAE,IAAA,mBAAU,GAAE;QAC1B,YAAY;KACb,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAW;IACxC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC;IACnF,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACvD,IAAI,IAAwB,CAAC;IAE7B,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACjE,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,eAAe,CAAC,YAAoB;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;IAC9C,MAAM,UAAU,GAAG,CAAC,YAAY,CAAC,CAAC;IAClC,IAAI,QAAQ,EAAE,CAAC;QACb,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,aAAa,CACpB,GAAY,EACZ,KAAsB,EACtB,MAAoB,EACpB,MAAc;IAEd,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxF,MAAM,OAAO,GAAG,KAAK,EAAE,GAAY,EAAE,GAAa,EAAiB,EAAE;QACnE,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,GAAG,CAAC,IAAc,CAAC;YACtC,MAAM,UAAU,GACd,UAAU,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAE7E,MAAM,KAAK,GAAG;gBACZ,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,eAAe,CAAC,KAAK,CAAC;gBAChC,OAAO,EAAE,GAAG,CAAC,IAAI;gBACjB,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;gBACtC,IAAI,EAAE,UAAU;gBAChB,cAAc,EAAE;oBACd,IAAI,EAAE;wBACJ,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;qBACf;iBACF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACxD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC1B,CAAC;YACD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC9B,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC9B,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,GAAG,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CACV,yBAAyB,KAAK,CAAC,MAAM,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAC3F,CAAC;YACF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,0BAA0B;gBACnC,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC/D,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;SAAM,IAAI,OAAQ,GAAW,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC;QACrD,GAAW,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,oBAAoB,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe;IAC5C,OAAO,OAAO;SACX,OAAO,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC;SAC3D,OAAO,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,eAAe,CAAC,KAAsB;IAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;AACvD,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAgC;IACxD,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACjD,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAY,EAAE,IAAY,EAAE,MAAc;IACnE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YACnC,MAAM,CAAC,OAAO,CAAC,6DAA6D,IAAI,EAAE,CAAC,CAAC;YACpF,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,YAAoB;IAClE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,YAAoB;IAC9D,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
package/dist/index.js CHANGED
@@ -11,11 +11,13 @@ const delete_1 = require("./commands/delete");
11
11
  const info_1 = require("./commands/info");
12
12
  const export_1 = require("./commands/export");
13
13
  const makezip_1 = require("./commands/makezip");
14
+ const gen_routes_1 = require("./commands/gen-routes");
15
+ const serve_1 = require("./commands/serve");
14
16
  const program = new commander_1.Command();
15
17
  program
16
18
  .name('lctl')
17
19
  .description('AWS Lambda Control Tool - Simple CLI for managing Lambda functions')
18
- .version('0.9.2');
20
+ .version('0.10.1');
19
21
  // Deploy command
20
22
  program
21
23
  .command('deploy')
@@ -52,6 +54,28 @@ program
52
54
  .option('--output <file>', 'Output script file path')
53
55
  .option('--verbose', 'Verbose output')
54
56
  .action(export_1.exportCommand);
57
+ // Generate routes command
58
+ program
59
+ .command('gen-routes')
60
+ .description('Generate routes.json from terraform show -json output')
61
+ .argument('<plan-json>', 'Path to terraform show -json output file')
62
+ .option('--output <file>', 'Routes JSON output path', 'routes.json')
63
+ .option('--verbose', 'Verbose output')
64
+ .action(gen_routes_1.genRoutesCommand);
65
+ // Serve command
66
+ program
67
+ .command('serve')
68
+ .description('Start a local HTTP → Lambda bridge using routes.json')
69
+ .option('--routes <file>', 'Path to routes.json', 'routes.json')
70
+ .option('--port <port>', 'Port to listen on', '3000')
71
+ .option('--config-dir <dir>', 'Directory that contains Lambda configs', 'configs')
72
+ .option('--functions-dir <dir>', 'Directory that contains Lambda source files', 'functions')
73
+ .option('--verbose', 'Verbose output')
74
+ .action(serve_1.serveCommand);
75
+ if (process.argv.length <= 2) {
76
+ program.outputHelp();
77
+ process.exit(0);
78
+ }
55
79
  program.parse();
56
80
  // Handle unhandled errors
57
81
  process.on('unhandledRejection', (error) => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,kDAA0B;AAC1B,8CAAkD;AAClD,8CAAkD;AAClD,0CAA8C;AAC9C,8CAAkD;AAClD,gDAAoD;AAEpD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,oEAAoE,CAAC;KACjF,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,2CAA2C,CAAC;KACxD,QAAQ,CAAC,iBAAiB,EAAE,mDAAmD,CAAC;KAChF,MAAM,CAAC,WAAW,EAAE,gBAAgB,CAAC;KACrC,MAAM,CAAC,sBAAa,CAAC,CAAC;AAEzB,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,wBAAwB,CAAC;KACrC,QAAQ,CAAC,iBAAiB,EAAE,mDAAmD,CAAC;KAChF,MAAM,CAAC,WAAW,EAAE,gBAAgB,CAAC;KACrC,MAAM,CAAC,sBAAa,CAAC,CAAC;AAEzB,eAAe;AACf,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,kCAAkC,CAAC;KAC/C,QAAQ,CAAC,iBAAiB,EAAE,mDAAmD,CAAC;KAChF,MAAM,CAAC,WAAW,EAAE,gBAAgB,CAAC;KACrC,MAAM,CAAC,kBAAW,CAAC,CAAC;AAEvB,kBAAkB;AAClB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,QAAQ,CAAC,iBAAiB,EAAE,mDAAmD,CAAC;KAChF,MAAM,CAAC,WAAW,EAAE,gBAAgB,CAAC;KACrC,MAAM,CAAC,wBAAc,CAAC,CAAC;AAE1B,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,0BAA0B,CAAC;KACvC,QAAQ,CAAC,iBAAiB,EAAE,mDAAmD,CAAC;KAChF,MAAM,CAAC,iBAAiB,EAAE,yBAAyB,CAAC;KACpD,MAAM,CAAC,WAAW,EAAE,gBAAgB,CAAC;KACrC,MAAM,CAAC,sBAAa,CAAC,CAAC;AAEzB,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,0BAA0B;AAC1B,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,KAAK,EAAE,EAAE;IACzC,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;IACxC,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,KAAK,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -45,6 +45,5 @@ export declare class ConfigManager {
45
45
  private logger;
46
46
  constructor(functionName: string, logger: Logger);
47
47
  loadConfig(overrides: DeployConfig): Promise<LambdaConfig>;
48
- private substituteVariables;
49
48
  }
50
49
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,CAAC,EAAE;QACJ,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,eAAe,EAAE,MAAM,EAAE,CAAC;KAC3B,CAAC;IACF,iBAAiB,CAAC,EAAE;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAG9B,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IAGH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAGxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,aAAa;IAEtB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,MAAM;gBADN,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM;IAGlB,UAAU,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IA8DhE,OAAO,CAAC,mBAAmB;CA4B5B"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,CAAC,EAAE;QACJ,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,eAAe,EAAE,MAAM,EAAE,CAAC;KAC3B,CAAC;IACF,iBAAiB,CAAC,EAAE;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAG9B,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IAGH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAGxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,aAAa;IAEtB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,MAAM;gBADN,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM;IAGlB,UAAU,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;CA6DjE"}
@@ -37,6 +37,7 @@ exports.ConfigManager = void 0;
37
37
  const fs = __importStar(require("fs/promises"));
38
38
  const path = __importStar(require("path"));
39
39
  const yaml = __importStar(require("yaml"));
40
+ const env_1 = require("./env");
40
41
  class ConfigManager {
41
42
  constructor(functionName, logger) {
42
43
  this.functionName = functionName;
@@ -52,7 +53,7 @@ class ConfigManager {
52
53
  const yamlContent = await fs.readFile(yamlPath, 'utf-8');
53
54
  const parsedYaml = yaml.parse(yamlContent);
54
55
  this.logger.verbose(`Parsed YAML before substitution:`, parsedYaml);
55
- yamlConfig = this.substituteVariables(parsedYaml);
56
+ yamlConfig = (0, env_1.substituteEnvVariables)(parsedYaml);
56
57
  this.logger.verbose(`Loaded YAML config from: ${yamlPath}`);
57
58
  this.logger.verbose(`YAML config after substitution:`, yamlConfig);
58
59
  }
@@ -101,30 +102,6 @@ class ConfigManager {
101
102
  }
102
103
  return config;
103
104
  }
104
- substituteVariables(obj) {
105
- if (typeof obj === 'string') {
106
- // Replace ${ENV_VAR} with environment variables
107
- const result = obj.replace(/\$\{([^}]+)\}/g, (_, envVar) => {
108
- const envValue = process.env[envVar];
109
- if (envValue === undefined) {
110
- throw new Error(`Environment variable ${envVar} is not defined`);
111
- }
112
- return envValue;
113
- });
114
- return result;
115
- }
116
- if (Array.isArray(obj)) {
117
- return obj.map(item => this.substituteVariables(item));
118
- }
119
- if (obj && typeof obj === 'object') {
120
- const result = {};
121
- for (const [key, value] of Object.entries(obj)) {
122
- result[key] = this.substituteVariables(value);
123
- }
124
- return result;
125
- }
126
- return obj;
127
- }
128
105
  }
129
106
  exports.ConfigManager = ConfigManager;
130
107
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function substituteEnvVariables<T = any>(input: T): T;
2
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAAA,wBAAgB,sBAAsB,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAE3D"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.substituteEnvVariables = substituteEnvVariables;
4
+ function substituteEnvVariables(input) {
5
+ return recursiveSubstitute(input);
6
+ }
7
+ function recursiveSubstitute(value) {
8
+ if (typeof value === 'string') {
9
+ return value.replace(/\$\{([^}]+)\}/g, (_, envVar) => {
10
+ const envValue = process.env[envVar];
11
+ if (envValue === undefined) {
12
+ throw new Error(`Environment variable ${envVar} is not defined`);
13
+ }
14
+ return envValue;
15
+ });
16
+ }
17
+ if (Array.isArray(value)) {
18
+ return value.map((item) => recursiveSubstitute(item));
19
+ }
20
+ if (value && typeof value === 'object') {
21
+ const result = {};
22
+ for (const [key, nested] of Object.entries(value)) {
23
+ result[key] = recursiveSubstitute(nested);
24
+ }
25
+ return result;
26
+ }
27
+ return value;
28
+ }
29
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":";;AAAA,wDAEC;AAFD,SAAgB,sBAAsB,CAAU,KAAQ;IACtD,OAAO,mBAAmB,CAAC,KAAK,CAAM,CAAC;AACzC,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAU;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACrC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,iBAAiB,CAAC,CAAC;YACnE,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface RouteDefinition {
2
+ method: string;
3
+ path: string;
4
+ lambda: string;
5
+ }
6
+ export declare function readRoutesFile(routesFilePath: string): Promise<RouteDefinition[]>;
7
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/utils/routes.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAgBvF"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.readRoutesFile = readRoutesFile;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ async function readRoutesFile(routesFilePath) {
40
+ const resolvedPath = path.resolve(routesFilePath);
41
+ const fileContent = await fs.readFile(resolvedPath, 'utf-8');
42
+ let parsed;
43
+ try {
44
+ parsed = JSON.parse(fileContent);
45
+ }
46
+ catch (error) {
47
+ throw new Error(`Failed to parse routes file as JSON: ${resolvedPath}`);
48
+ }
49
+ if (!Array.isArray(parsed)) {
50
+ throw new Error(`Routes file must contain an array: ${resolvedPath}`);
51
+ }
52
+ return parsed.map((item, index) => validateRouteDefinition(item, index, resolvedPath));
53
+ }
54
+ function validateRouteDefinition(item, index, sourcePath) {
55
+ if (!item || typeof item !== 'object') {
56
+ throw new Error(`Invalid route entry at index ${index} in ${sourcePath}`);
57
+ }
58
+ const method = typeof item.method === 'string' ? item.method.trim() : '';
59
+ const routePath = typeof item.path === 'string' ? item.path.trim() : '';
60
+ const lambda = typeof item.lambda === 'string' ? item.lambda.trim() : '';
61
+ if (!method) {
62
+ throw new Error(`Route entry at index ${index} is missing "method" in ${sourcePath}`);
63
+ }
64
+ if (!routePath) {
65
+ throw new Error(`Route entry at index ${index} is missing "path" in ${sourcePath}`);
66
+ }
67
+ if (!lambda) {
68
+ throw new Error(`Route entry at index ${index} is missing "lambda" in ${sourcePath}`);
69
+ }
70
+ const normalizedMethod = method.toUpperCase();
71
+ const allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD', 'ANY'];
72
+ if (!allowedMethods.includes(normalizedMethod)) {
73
+ throw new Error(`Route entry at index ${index} has unsupported method "${method}" in ${sourcePath}`);
74
+ }
75
+ if (routePath !== '$default' && !routePath.startsWith('/')) {
76
+ throw new Error(`Route entry at index ${index} must start with "/" (found "${routePath}") in ${sourcePath}`);
77
+ }
78
+ return {
79
+ method: normalizedMethod,
80
+ path: routePath,
81
+ lambda,
82
+ };
83
+ }
84
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/utils/routes.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@infodb/lctl",
3
- "version": "0.9.2",
3
+ "version": "0.10.1",
4
4
  "description": "AWS Lambda Control Tool - Simple CLI for managing Lambda functions",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -16,16 +16,19 @@
16
16
  "author": "",
17
17
  "license": "MIT",
18
18
  "dependencies": {
19
- "commander": "^11.1.0",
20
- "yaml": "^2.3.4",
21
- "glob": "^10.3.10",
22
- "archiver": "^6.0.1",
23
- "chalk": "^5.3.0"
19
+ "archiver": "^7.0.1",
20
+ "chalk": "^5.6.2",
21
+ "commander": "^14.0.2",
22
+ "express": "^5.1.0",
23
+ "glob": "^13.0.0",
24
+ "yaml": "^2.8.1"
24
25
  },
25
26
  "devDependencies": {
26
- "@types/node": "^20.10.5",
27
- "@types/archiver": "^6.0.2",
28
- "typescript": "^5.3.3"
27
+ "@types/archiver": "^7.0.0",
28
+ "@types/express": "^5.0.5",
29
+ "@types/node": "^24.10.1",
30
+ "tsx": "^4.20.6",
31
+ "typescript": "^5.9.3"
29
32
  },
30
33
  "files": [
31
34
  "dist/**/*",
@@ -35,8 +38,8 @@
35
38
  "access": "public"
36
39
  },
37
40
  "scripts": {
41
+ "dev": "tsx src/index.ts",
38
42
  "build": "tsc",
39
- "dev": "tsc --watch",
40
43
  "start": "node dist/index.js",
41
44
  "test": "npm run build && node dist/index.js",
42
45
  "test-local": "npm run build && cd sample && node ../dist/index.js"