aws-lambda-devkit 0.1.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.
Files changed (183) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/LICENSE +21 -0
  3. package/README.md +214 -0
  4. package/dist/aws/batch-response.d.ts +8 -0
  5. package/dist/aws/batch-response.d.ts.map +1 -0
  6. package/dist/aws/batch-response.js +12 -0
  7. package/dist/aws/batch-response.js.map +1 -0
  8. package/dist/aws/clients.d.ts +6 -0
  9. package/dist/aws/clients.d.ts.map +1 -0
  10. package/dist/aws/clients.js +30 -0
  11. package/dist/aws/clients.js.map +1 -0
  12. package/dist/aws/sns-publish.d.ts +10 -0
  13. package/dist/aws/sns-publish.d.ts.map +1 -0
  14. package/dist/aws/sns-publish.js +17 -0
  15. package/dist/aws/sns-publish.js.map +1 -0
  16. package/dist/aws/sqs-listen.d.ts +17 -0
  17. package/dist/aws/sqs-listen.d.ts.map +1 -0
  18. package/dist/aws/sqs-listen.js +113 -0
  19. package/dist/aws/sqs-listen.js.map +1 -0
  20. package/dist/aws/sqs-process.d.ts +39 -0
  21. package/dist/aws/sqs-process.d.ts.map +1 -0
  22. package/dist/aws/sqs-process.js +95 -0
  23. package/dist/aws/sqs-process.js.map +1 -0
  24. package/dist/aws/sqs-send.d.ts +15 -0
  25. package/dist/aws/sqs-send.d.ts.map +1 -0
  26. package/dist/aws/sqs-send.js +27 -0
  27. package/dist/aws/sqs-send.js.map +1 -0
  28. package/dist/aws/sqs-visibility.d.ts +10 -0
  29. package/dist/aws/sqs-visibility.d.ts.map +1 -0
  30. package/dist/aws/sqs-visibility.js +29 -0
  31. package/dist/aws/sqs-visibility.js.map +1 -0
  32. package/dist/cli.d.ts +3 -0
  33. package/dist/cli.d.ts.map +1 -0
  34. package/dist/cli.js +187 -0
  35. package/dist/cli.js.map +1 -0
  36. package/dist/commands/config-cmd.d.ts +5 -0
  37. package/dist/commands/config-cmd.d.ts.map +1 -0
  38. package/dist/commands/config-cmd.js +8 -0
  39. package/dist/commands/config-cmd.js.map +1 -0
  40. package/dist/commands/config.d.ts +2 -0
  41. package/dist/commands/config.d.ts.map +1 -0
  42. package/dist/commands/config.js +24 -0
  43. package/dist/commands/config.js.map +1 -0
  44. package/dist/commands/init.d.ts +7 -0
  45. package/dist/commands/init.d.ts.map +1 -0
  46. package/dist/commands/init.js +59 -0
  47. package/dist/commands/init.js.map +1 -0
  48. package/dist/commands/list.d.ts +4 -0
  49. package/dist/commands/list.d.ts.map +1 -0
  50. package/dist/commands/list.js +23 -0
  51. package/dist/commands/list.js.map +1 -0
  52. package/dist/commands/listen.d.ts +20 -0
  53. package/dist/commands/listen.d.ts.map +1 -0
  54. package/dist/commands/listen.js +36 -0
  55. package/dist/commands/listen.js.map +1 -0
  56. package/dist/commands/send.d.ts +17 -0
  57. package/dist/commands/send.d.ts.map +1 -0
  58. package/dist/commands/send.js +51 -0
  59. package/dist/commands/send.js.map +1 -0
  60. package/dist/commands/test.d.ts +23 -0
  61. package/dist/commands/test.d.ts.map +1 -0
  62. package/dist/commands/test.js +123 -0
  63. package/dist/commands/test.js.map +1 -0
  64. package/dist/config/env.d.ts +8 -0
  65. package/dist/config/env.d.ts.map +1 -0
  66. package/dist/config/env.js +16 -0
  67. package/dist/config/env.js.map +1 -0
  68. package/dist/config/load.d.ts +9 -0
  69. package/dist/config/load.d.ts.map +1 -0
  70. package/dist/config/load.js +72 -0
  71. package/dist/config/load.js.map +1 -0
  72. package/dist/config/merge.d.ts +36 -0
  73. package/dist/config/merge.d.ts.map +1 -0
  74. package/dist/config/merge.js +89 -0
  75. package/dist/config/merge.js.map +1 -0
  76. package/dist/config/project-env.d.ts +34 -0
  77. package/dist/config/project-env.d.ts.map +1 -0
  78. package/dist/config/project-env.js +90 -0
  79. package/dist/config/project-env.js.map +1 -0
  80. package/dist/config/schema.d.ts +27 -0
  81. package/dist/config/schema.d.ts.map +1 -0
  82. package/dist/config/schema.js +123 -0
  83. package/dist/config/schema.js.map +1 -0
  84. package/dist/config/types.d.ts +167 -0
  85. package/dist/config/types.d.ts.map +1 -0
  86. package/dist/config/types.js +2 -0
  87. package/dist/config/types.js.map +1 -0
  88. package/dist/events/apigw.d.ts +41 -0
  89. package/dist/events/apigw.d.ts.map +1 -0
  90. package/dist/events/apigw.js +43 -0
  91. package/dist/events/apigw.js.map +1 -0
  92. package/dist/events/eventbridge.d.ts +16 -0
  93. package/dist/events/eventbridge.d.ts.map +1 -0
  94. package/dist/events/eventbridge.js +19 -0
  95. package/dist/events/eventbridge.js.map +1 -0
  96. package/dist/events/index.d.ts +17 -0
  97. package/dist/events/index.d.ts.map +1 -0
  98. package/dist/events/index.js +50 -0
  99. package/dist/events/index.js.map +1 -0
  100. package/dist/events/s3.d.ts +45 -0
  101. package/dist/events/s3.d.ts.map +1 -0
  102. package/dist/events/s3.js +44 -0
  103. package/dist/events/s3.js.map +1 -0
  104. package/dist/events/schedule.d.ts +12 -0
  105. package/dist/events/schedule.d.ts.map +1 -0
  106. package/dist/events/schedule.js +15 -0
  107. package/dist/events/schedule.js.map +1 -0
  108. package/dist/events/sns.d.ts +24 -0
  109. package/dist/events/sns.d.ts.map +1 -0
  110. package/dist/events/sns.js +31 -0
  111. package/dist/events/sns.js.map +1 -0
  112. package/dist/events/sqs-record.d.ts +44 -0
  113. package/dist/events/sqs-record.d.ts.map +1 -0
  114. package/dist/events/sqs-record.js +75 -0
  115. package/dist/events/sqs-record.js.map +1 -0
  116. package/dist/events/sqs.d.ts +21 -0
  117. package/dist/events/sqs.d.ts.map +1 -0
  118. package/dist/events/sqs.js +28 -0
  119. package/dist/events/sqs.js.map +1 -0
  120. package/dist/events/util.d.ts +2 -0
  121. package/dist/events/util.d.ts.map +1 -0
  122. package/dist/events/util.js +7 -0
  123. package/dist/events/util.js.map +1 -0
  124. package/dist/index.d.ts +15 -0
  125. package/dist/index.d.ts.map +1 -0
  126. package/dist/index.js +14 -0
  127. package/dist/index.js.map +1 -0
  128. package/dist/peer-resolve.d.ts +5 -0
  129. package/dist/peer-resolve.d.ts.map +1 -0
  130. package/dist/peer-resolve.js +44 -0
  131. package/dist/peer-resolve.js.map +1 -0
  132. package/dist/runtime/asset-links.d.ts +15 -0
  133. package/dist/runtime/asset-links.d.ts.map +1 -0
  134. package/dist/runtime/asset-links.js +42 -0
  135. package/dist/runtime/asset-links.js.map +1 -0
  136. package/dist/runtime/clear-caches.d.ts +5 -0
  137. package/dist/runtime/clear-caches.d.ts.map +1 -0
  138. package/dist/runtime/clear-caches.js +8 -0
  139. package/dist/runtime/clear-caches.js.map +1 -0
  140. package/dist/runtime/context.d.ts +10 -0
  141. package/dist/runtime/context.d.ts.map +1 -0
  142. package/dist/runtime/context.js +42 -0
  143. package/dist/runtime/context.js.map +1 -0
  144. package/dist/runtime/handler-cache.d.ts +6 -0
  145. package/dist/runtime/handler-cache.d.ts.map +1 -0
  146. package/dist/runtime/handler-cache.js +14 -0
  147. package/dist/runtime/handler-cache.js.map +1 -0
  148. package/dist/runtime/invoke.d.ts +32 -0
  149. package/dist/runtime/invoke.d.ts.map +1 -0
  150. package/dist/runtime/invoke.js +111 -0
  151. package/dist/runtime/invoke.js.map +1 -0
  152. package/dist/runtime/loader.d.ts +17 -0
  153. package/dist/runtime/loader.d.ts.map +1 -0
  154. package/dist/runtime/loader.js +76 -0
  155. package/dist/runtime/loader.js.map +1 -0
  156. package/dist/runtime/logs.d.ts +19 -0
  157. package/dist/runtime/logs.d.ts.map +1 -0
  158. package/dist/runtime/logs.js +125 -0
  159. package/dist/runtime/logs.js.map +1 -0
  160. package/dist/util/payload.d.ts +13 -0
  161. package/dist/util/payload.d.ts.map +1 -0
  162. package/dist/util/payload.js +40 -0
  163. package/dist/util/payload.js.map +1 -0
  164. package/dist/util/tsx-register.d.ts +4 -0
  165. package/dist/util/tsx-register.d.ts.map +1 -0
  166. package/dist/util/tsx-register.js +27 -0
  167. package/dist/util/tsx-register.js.map +1 -0
  168. package/dist/version.d.ts +2 -0
  169. package/dist/version.d.ts.map +1 -0
  170. package/dist/version.js +2 -0
  171. package/dist/version.js.map +1 -0
  172. package/docs/README.md +23 -0
  173. package/docs/commands.md +294 -0
  174. package/docs/configuration.md +652 -0
  175. package/docs/getting-started.md +400 -0
  176. package/docs/recipes.md +743 -0
  177. package/docs/troubleshooting.md +393 -0
  178. package/package.json +76 -0
  179. package/templates/.env.example +5 -0
  180. package/templates/.vscode/launch.json +14 -0
  181. package/templates/events/sample.json +4 -0
  182. package/templates/lamkit.config.js +38 -0
  183. package/templates/lamkit.config.ts +27 -0
@@ -0,0 +1,95 @@
1
+ import { isBatchItemFailures } from '../aws/batch-response.js';
2
+ import { buildSqsRecordFromAwsMessage, queueArnFromUrl, } from '../events/sqs-record.js';
3
+ import { invokeHandler } from '../runtime/invoke.js';
4
+ export { isBatchItemFailures, countBatchItemFailures } from '../aws/batch-response.js';
5
+ export function buildSqsRecordFromMessage(message, queueArn, region) {
6
+ return buildSqsRecordFromAwsMessage(message, queueArn, region);
7
+ }
8
+ export function buildSqsEventFromMessage(message, queueArn, region) {
9
+ return {
10
+ Records: [buildSqsRecordFromAwsMessage(message, queueArn, region)],
11
+ };
12
+ }
13
+ export function buildSqsEventFromMessages(messages, queueArn, region) {
14
+ return {
15
+ Records: messages.map((message) => buildSqsRecordFromAwsMessage(message, queueArn, region)),
16
+ };
17
+ }
18
+ export function isMessageFailed(result, messageId) {
19
+ if (!result.success) {
20
+ return true;
21
+ }
22
+ if (isBatchItemFailures(result.result)) {
23
+ return result.result.batchItemFailures.some((entry) => entry.itemIdentifier === messageId);
24
+ }
25
+ return false;
26
+ }
27
+ export async function processSqsMessages(options) {
28
+ const deleteOnSuccess = options.deleteOnSuccess ?? true;
29
+ let processed = 0;
30
+ let failures = 0;
31
+ const logs = [];
32
+ const messagesReceived = options.messages.length;
33
+ if (messagesReceived === 0) {
34
+ return { processed, failures, messagesReceived, logs };
35
+ }
36
+ const receiptHandles = options.messages
37
+ .map((message) => message.ReceiptHandle)
38
+ .filter((handle) => !!handle);
39
+ await options.visibilityHeartbeat?.start(receiptHandles);
40
+ try {
41
+ if (options.batchInvoke) {
42
+ const event = buildSqsEventFromMessages(options.messages, options.queueArn, options.region);
43
+ const result = await invokeHandler(options.handler, event, options.fn);
44
+ for (const line of result.logs) {
45
+ logs.push(line);
46
+ }
47
+ for (const message of options.messages) {
48
+ const messageId = message.MessageId ?? 'unknown';
49
+ const failed = isMessageFailed(result, messageId);
50
+ if (!failed && deleteOnSuccess && message.ReceiptHandle && options.deleteMessage) {
51
+ await options.deleteMessage(message.ReceiptHandle);
52
+ options.onMessage?.(messageId, 'success');
53
+ processed += 1;
54
+ }
55
+ else if (failed) {
56
+ options.onMessage?.(messageId, 'failure');
57
+ failures += 1;
58
+ }
59
+ else if (!failed) {
60
+ options.onMessage?.(messageId, 'success');
61
+ processed += 1;
62
+ }
63
+ }
64
+ return { processed, failures, messagesReceived, logs };
65
+ }
66
+ for (const message of options.messages) {
67
+ const event = buildSqsEventFromMessage(message, options.queueArn, options.region);
68
+ const result = await invokeHandler(options.handler, event, options.fn);
69
+ const messageId = message.MessageId ?? 'unknown';
70
+ const failed = isMessageFailed(result, messageId);
71
+ for (const line of result.logs) {
72
+ logs.push(line);
73
+ }
74
+ if (!failed && deleteOnSuccess && message.ReceiptHandle && options.deleteMessage) {
75
+ await options.deleteMessage(message.ReceiptHandle);
76
+ options.onMessage?.(messageId, 'success');
77
+ processed += 1;
78
+ }
79
+ else if (failed) {
80
+ options.onMessage?.(messageId, 'failure');
81
+ failures += 1;
82
+ }
83
+ else if (!failed) {
84
+ options.onMessage?.(messageId, 'success');
85
+ processed += 1;
86
+ }
87
+ }
88
+ return { processed, failures, messagesReceived, logs };
89
+ }
90
+ finally {
91
+ options.visibilityHeartbeat?.stop();
92
+ }
93
+ }
94
+ export { queueArnFromUrl };
95
+ //# sourceMappingURL=sqs-process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqs-process.js","sourceRoot":"","sources":["../../src/aws/sqs-process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export type SendSqsOptions = {
2
+ queueUrl: string;
3
+ region: string;
4
+ cwd?: string;
5
+ endpoint?: string;
6
+ data?: unknown;
7
+ message?: string;
8
+ };
9
+ export declare function buildSqsSendInput(options: {
10
+ queueUrl: string;
11
+ body: string;
12
+ deduplicationId?: string;
13
+ }): Record<string, unknown>;
14
+ export declare function sendSqsMessage(options: SendSqsOptions): Promise<string>;
15
+ //# sourceMappingURL=sqs-send.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqs-send.d.ts","sourceRoot":"","sources":["../../src/aws/sqs-send.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAY1B;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB7E"}
@@ -0,0 +1,27 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { serializePayload } from '../events/util.js';
3
+ import { importSqsSdk, loadSqsClient } from './clients.js';
4
+ export function buildSqsSendInput(options) {
5
+ const input = {
6
+ QueueUrl: options.queueUrl,
7
+ MessageBody: options.body,
8
+ };
9
+ if (options.queueUrl.endsWith('.fifo')) {
10
+ input.MessageGroupId = 'lamkit-default';
11
+ input.MessageDeduplicationId = options.deduplicationId ?? randomUUID();
12
+ }
13
+ return input;
14
+ }
15
+ export async function sendSqsMessage(options) {
16
+ const cwd = options.cwd ?? process.cwd();
17
+ const { SendMessageCommand } = (await importSqsSdk(cwd));
18
+ const client = (await loadSqsClient(options.region, cwd, options.endpoint));
19
+ const body = options.message ?? serializePayload(options.data ?? { message: 'hello from lamkit' });
20
+ const input = buildSqsSendInput({ queueUrl: options.queueUrl, body });
21
+ const response = (await client.send(new SendMessageCommand(input)));
22
+ if (!response.MessageId) {
23
+ throw new Error('SendMessage succeeded but no MessageId returned');
24
+ }
25
+ return response.MessageId;
26
+ }
27
+ //# sourceMappingURL=sqs-send.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqs-send.js","sourceRoot":"","sources":["../../src/aws/sqs-send.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAW3D,MAAM,UAAU,iBAAiB,CAAC,OAIjC;IACC,MAAM,KAAK,GAA4B;QACrC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,WAAW,EAAE,OAAO,CAAC,IAAI;KAC1B,CAAC;IAEF,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,cAAc,GAAG,gBAAgB,CAAC;QACxC,KAAK,CAAC,sBAAsB,GAAG,OAAO,CAAC,eAAe,IAAI,UAAU,EAAE,CAAC;IACzE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAuB;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,EAAE,kBAAkB,EAAE,GAAG,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,CAEtD,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,MAAM,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,CAEzE,CAAC;IACF,MAAM,IAAI,GACR,OAAO,CAAC,OAAO,IAAI,gBAAgB,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAExF,MAAM,KAAK,GAAG,iBAAiB,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtE,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAA2B,CAAC;IAE9F,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,QAAQ,CAAC,SAAS,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare function resolveVisibilityExtensionSeconds(fnTimeoutSeconds: number, queueVisibilitySeconds?: number): number;
2
+ export type VisibilityHeartbeat = {
3
+ start(receiptHandles: string[]): Promise<void>;
4
+ stop(): void;
5
+ };
6
+ export declare function createVisibilityHeartbeat(options: {
7
+ visibilitySeconds: number;
8
+ extendVisibility: (receiptHandles: string[], visibilitySeconds: number) => Promise<void>;
9
+ }): VisibilityHeartbeat;
10
+ //# sourceMappingURL=sqs-visibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqs-visibility.d.ts","sourceRoot":"","sources":["../../src/aws/sqs-visibility.ts"],"names":[],"mappings":"AAAA,wBAAgB,iCAAiC,CAC/C,gBAAgB,EAAE,MAAM,EACxB,sBAAsB,SAAK,GAC1B,MAAM,CAGR;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,IAAI,IAAI,CAAC;CACd,CAAC;AAEF,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IACjD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1F,GAAG,mBAAmB,CA8BtB"}
@@ -0,0 +1,29 @@
1
+ export function resolveVisibilityExtensionSeconds(fnTimeoutSeconds, queueVisibilitySeconds = 30) {
2
+ const target = Math.max(fnTimeoutSeconds + 30, queueVisibilitySeconds);
3
+ return Math.min(Math.max(target, 30), 43200);
4
+ }
5
+ export function createVisibilityHeartbeat(options) {
6
+ let timer;
7
+ let handles = [];
8
+ return {
9
+ async start(receiptHandles) {
10
+ handles = receiptHandles.filter((handle) => !!handle);
11
+ if (handles.length === 0) {
12
+ return;
13
+ }
14
+ await options.extendVisibility(handles, options.visibilitySeconds);
15
+ const intervalMs = Math.max(5000, Math.floor((options.visibilitySeconds / 2) * 1000));
16
+ timer = setInterval(() => {
17
+ void options.extendVisibility(handles, options.visibilitySeconds);
18
+ }, intervalMs);
19
+ },
20
+ stop() {
21
+ if (timer !== undefined) {
22
+ clearInterval(timer);
23
+ timer = undefined;
24
+ }
25
+ handles = [];
26
+ },
27
+ };
28
+ }
29
+ //# sourceMappingURL=sqs-visibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqs-visibility.js","sourceRoot":"","sources":["../../src/aws/sqs-visibility.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iCAAiC,CAC/C,gBAAwB,EACxB,sBAAsB,GAAG,EAAE;IAE3B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,EAAE,EAAE,sBAAsB,CAAC,CAAC;IACvE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC;AAOD,MAAM,UAAU,yBAAyB,CAAC,OAGzC;IACC,IAAI,KAAiD,CAAC;IACtD,IAAI,OAAO,GAAa,EAAE,CAAC;IAE3B,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,cAAwB;YAClC,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,EAAoB,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACxE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO;YACT,CAAC;YAED,MAAM,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;YAEnE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,IAAI,EACJ,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,iBAAiB,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CACnD,CAAC;YAEF,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;gBACvB,KAAK,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;YACpE,CAAC,EAAE,UAAU,CAAC,CAAC;QACjB,CAAC;QACD,IAAI;YACF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,KAAK,GAAG,SAAS,CAAC;YACpB,CAAC;YACD,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,187 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { Command } from 'commander';
6
+ import { runConfigCommand } from './commands/config.js';
7
+ import { runInitCommand } from './commands/init.js';
8
+ import { runListenCommand } from './commands/listen.js';
9
+ import { runListCommand } from './commands/list.js';
10
+ import { runSendSnsCommand, runSendSqsCommand } from './commands/send.js';
11
+ import { runTestCommand } from './commands/test.js';
12
+ const packageJson = JSON.parse(readFileSync(join(dirname(fileURLToPath(import.meta.url)), '../package.json'), 'utf8'));
13
+ const program = new Command();
14
+ program
15
+ .name('lamkit')
16
+ .description('Local AWS Lambda development toolkit')
17
+ .version(packageJson.version);
18
+ program
19
+ .command('test')
20
+ .description('Invoke a Lambda handler locally with a simulated AWS event')
21
+ .argument('[function-name]', 'Function name from lamkit.config.js')
22
+ .option('--cwd <dir>', 'Project directory containing lamkit.config.js')
23
+ .option('--data <json>', 'JSON payload passed to the event builder (supports @file.json)')
24
+ .option('--data-file <file>', 'Read JSON payload from a file')
25
+ .option('--event <file>', 'Path to a JSON event file (bypasses event builder)')
26
+ .option('--batch-size <n>', 'SQS record count for simulated events', (v) => Number(v))
27
+ .option('--env <key=value>', 'Set environment variable for invoke', collect, [])
28
+ .option('--all', 'Invoke every function in config')
29
+ .option('--dry-run', 'Print resolved event without invoking handler')
30
+ .option('--cold', 'Simulate cold start (Init Duration in logs)')
31
+ .option('--reload', 'Reload handler module (bypass cache)')
32
+ .option('--strict-batch', 'Exit 1 when handler returns batchItemFailures (SQS partial batch)')
33
+ .option('--verbose', 'Print extra invoke diagnostics')
34
+ .option('--no-pretty', 'Disable pretty summary output')
35
+ .option('--inspect', 'Re-run under node --inspect')
36
+ .option('--inspect-brk', 'Re-run under node --inspect-brk')
37
+ .action(async (functionName, options) => {
38
+ try {
39
+ const exitCode = await runTestCommand(functionName, {
40
+ cwd: options.cwd,
41
+ data: options.data,
42
+ dataFile: options.dataFile,
43
+ eventPath: options.event,
44
+ batchSize: options.batchSize,
45
+ env: options.env,
46
+ all: options.all,
47
+ dryRun: options.dryRun,
48
+ cold: options.cold,
49
+ reload: options.reload,
50
+ strictBatch: options.strictBatch,
51
+ verbose: options.verbose,
52
+ pretty: options.pretty,
53
+ inspect: options.inspect,
54
+ inspectBrk: options.inspectBrk,
55
+ });
56
+ process.exitCode = exitCode;
57
+ if (!options.inspect && !options.inspectBrk && process.env.LAMKIT_NO_FORCE_EXIT !== '1') {
58
+ process.exit(exitCode);
59
+ }
60
+ }
61
+ catch (error) {
62
+ const message = error instanceof Error ? error.message : String(error);
63
+ console.error(message);
64
+ process.exitCode = 1;
65
+ }
66
+ });
67
+ program
68
+ .command('list')
69
+ .description('List configured Lambda functions')
70
+ .option('--cwd <dir>', 'Project directory containing lamkit.config.js')
71
+ .action(async (options) => {
72
+ try {
73
+ process.exitCode = await runListCommand(options.cwd);
74
+ }
75
+ catch (error) {
76
+ const message = error instanceof Error ? error.message : String(error);
77
+ console.error(message);
78
+ process.exitCode = 1;
79
+ }
80
+ });
81
+ program
82
+ .command('config')
83
+ .description('Show merged effective config for a function')
84
+ .argument('[function-name]', 'Function name from lamkit.config.js')
85
+ .option('--cwd <dir>', 'Project directory containing lamkit.config.js')
86
+ .action(async (functionName, options) => {
87
+ try {
88
+ process.exitCode = await runConfigCommand(functionName, options.cwd);
89
+ }
90
+ catch (error) {
91
+ const message = error instanceof Error ? error.message : String(error);
92
+ console.error(message);
93
+ process.exitCode = 1;
94
+ }
95
+ });
96
+ program
97
+ .command('init')
98
+ .description('Scaffold lamkit.config.js and local dev files')
99
+ .option('--force', 'Overwrite existing template files')
100
+ .option('--yes', 'Add test:lambda script to package.json when present')
101
+ .option('--cwd <dir>', 'Target directory for scaffold files', process.cwd())
102
+ .action(async (options) => {
103
+ try {
104
+ process.exitCode = await runInitCommand({
105
+ cwd: options.cwd,
106
+ force: options.force,
107
+ yes: options.yes,
108
+ });
109
+ }
110
+ catch (error) {
111
+ const message = error instanceof Error ? error.message : String(error);
112
+ console.error(message);
113
+ process.exitCode = 1;
114
+ }
115
+ });
116
+ const send = program.command('send').description('Send messages to real AWS SQS or SNS');
117
+ send
118
+ .command('sqs')
119
+ .description('Send a message to a real SQS queue')
120
+ .argument('<function-name>', 'Function name from lamkit.config.js')
121
+ .option('--cwd <dir>', 'Project directory containing lamkit.config.js')
122
+ .option('--data <json>', 'JSON message body (supports @file.json)')
123
+ .option('--data-file <file>', 'Read JSON message body from a file')
124
+ .option('--message <text>', 'Raw message body')
125
+ .option('--queue-url <url>', 'Override queue URL from config')
126
+ .action(async (functionName, options) => {
127
+ try {
128
+ process.exitCode = await runSendSqsCommand(functionName, options);
129
+ }
130
+ catch (error) {
131
+ const message = error instanceof Error ? error.message : String(error);
132
+ console.error(message);
133
+ process.exitCode = 1;
134
+ }
135
+ });
136
+ send
137
+ .command('sns')
138
+ .description('Publish a message to a real SNS topic')
139
+ .argument('<function-name>', 'Function name from lamkit.config.js')
140
+ .option('--cwd <dir>', 'Project directory containing lamkit.config.js')
141
+ .option('--data <json>', 'JSON message body (supports @file.json)')
142
+ .option('--data-file <file>', 'Read JSON message body from a file')
143
+ .option('--message <text>', 'Raw message body')
144
+ .option('--topic-arn <arn>', 'Override topic ARN from config')
145
+ .action(async (functionName, options) => {
146
+ try {
147
+ process.exitCode = await runSendSnsCommand(functionName, options);
148
+ }
149
+ catch (error) {
150
+ const message = error instanceof Error ? error.message : String(error);
151
+ console.error(message);
152
+ process.exitCode = 1;
153
+ }
154
+ });
155
+ program
156
+ .command('listen')
157
+ .description('Poll a real SQS queue and invoke the local handler')
158
+ .argument('[function-name]', 'Function name from lamkit.config.js')
159
+ .option('--cwd <dir>', 'Project directory containing lamkit.config.js')
160
+ .option('--batch-size <n>', 'Max messages per SQS poll (default 10)', (v) => Number(v))
161
+ .option('--no-batch-invoke', 'Invoke once per message instead of one SQSEvent per poll batch')
162
+ .option('--batch-invoke', 'Deprecated: batch invoke is the default; use --no-batch-invoke to disable')
163
+ .option('--no-extend-visibility', 'Do not extend SQS visibility timeout during handler invoke')
164
+ .option('--no-delete', 'Do not delete messages after successful processing')
165
+ .option('--once', 'Process one poll batch then exit')
166
+ .option('--expect-messages', 'With --once, exit 1 when the queue poll returns no messages')
167
+ .option('--reload', 'Reload handler module (bypass cache)')
168
+ .option('--queue-url <url>', 'Override queue URL from config')
169
+ .action(async (functionName, options) => {
170
+ try {
171
+ const exitCode = await runListenCommand(functionName, options);
172
+ process.exitCode = exitCode;
173
+ if (options.once && process.env.LAMKIT_NO_FORCE_EXIT !== '1') {
174
+ process.exit(exitCode);
175
+ }
176
+ }
177
+ catch (error) {
178
+ const message = error instanceof Error ? error.message : String(error);
179
+ console.error(message);
180
+ process.exitCode = 1;
181
+ }
182
+ });
183
+ program.parse();
184
+ function collect(value, previous) {
185
+ return previous.concat([value]);
186
+ }
187
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CACV,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAChE,MAAM,CACP,CACqB,CAAC;AAEzB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,sCAAsC,CAAC;KACnD,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAEhC,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,4DAA4D,CAAC;KACzE,QAAQ,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;KAClE,MAAM,CAAC,aAAa,EAAE,+CAA+C,CAAC;KACtE,MAAM,CAAC,eAAe,EAAE,gEAAgE,CAAC;KACzF,MAAM,CAAC,oBAAoB,EAAE,+BAA+B,CAAC;KAC7D,MAAM,CAAC,gBAAgB,EAAE,oDAAoD,CAAC;KAC9E,MAAM,CAAC,kBAAkB,EAAE,uCAAuC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;KACrF,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,EAAE,OAAO,EAAE,EAAE,CAAC;KAC/E,MAAM,CAAC,OAAO,EAAE,iCAAiC,CAAC;KAClD,MAAM,CAAC,WAAW,EAAE,+CAA+C,CAAC;KACpE,MAAM,CAAC,QAAQ,EAAE,6CAA6C,CAAC;KAC/D,MAAM,CAAC,UAAU,EAAE,sCAAsC,CAAC;KAC1D,MAAM,CAAC,gBAAgB,EAAE,mEAAmE,CAAC;KAC7F,MAAM,CAAC,WAAW,EAAE,gCAAgC,CAAC;KACrD,MAAM,CAAC,aAAa,EAAE,+BAA+B,CAAC;KACtD,MAAM,CAAC,WAAW,EAAE,6BAA6B,CAAC;KAClD,MAAM,CAAC,eAAe,EAAE,iCAAiC,CAAC;KAC1D,MAAM,CACL,KAAK,EACH,YAAgC,EAChC,OAgBC,EACD,EAAE;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE;YAClD,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS,EAAE,OAAO,CAAC,KAAK;YACxB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC,CAAC;QACH,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG,EAAE,CAAC;YACxF,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CACF,CAAC;AAEJ,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,aAAa,EAAE,+CAA+C,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;IAC1C,IAAI,CAAC;QACH,OAAO,CAAC,QAAQ,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,6CAA6C,CAAC;KAC1D,QAAQ,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;KAClE,MAAM,CAAC,aAAa,EAAE,+CAA+C,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,YAAgC,EAAE,OAAyB,EAAE,EAAE;IAC5E,IAAI,CAAC;QACH,OAAO,CAAC,QAAQ,GAAG,MAAM,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,SAAS,EAAE,mCAAmC,CAAC;KACtD,MAAM,CAAC,OAAO,EAAE,qDAAqD,CAAC;KACtE,MAAM,CAAC,aAAa,EAAE,qCAAqC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAC3E,MAAM,CAAC,KAAK,EAAE,OAAwD,EAAE,EAAE;IACzE,IAAI,CAAC;QACH,OAAO,CAAC,QAAQ,GAAG,MAAM,cAAc,CAAC;YACtC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,sCAAsC,CAAC,CAAC;AAEzF,IAAI;KACD,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,oCAAoC,CAAC;KACjD,QAAQ,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;KAClE,MAAM,CAAC,aAAa,EAAE,+CAA+C,CAAC;KACtE,MAAM,CAAC,eAAe,EAAE,yCAAyC,CAAC;KAClE,MAAM,CAAC,oBAAoB,EAAE,oCAAoC,CAAC;KAClE,MAAM,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;KAC9C,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,CAAC;KAC7D,MAAM,CACL,KAAK,EACH,YAAoB,EACpB,OAMC,EACD,EAAE;IACF,IAAI,CAAC;QACH,OAAO,CAAC,QAAQ,GAAG,MAAM,iBAAiB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CACF,CAAC;AAEJ,IAAI;KACD,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,uCAAuC,CAAC;KACpD,QAAQ,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;KAClE,MAAM,CAAC,aAAa,EAAE,+CAA+C,CAAC;KACtE,MAAM,CAAC,eAAe,EAAE,yCAAyC,CAAC;KAClE,MAAM,CAAC,oBAAoB,EAAE,oCAAoC,CAAC;KAClE,MAAM,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;KAC9C,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,CAAC;KAC7D,MAAM,CACL,KAAK,EACH,YAAoB,EACpB,OAMC,EACD,EAAE;IACF,IAAI,CAAC;QACH,OAAO,CAAC,QAAQ,GAAG,MAAM,iBAAiB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CACF,CAAC;AAEJ,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,oDAAoD,CAAC;KACjE,QAAQ,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;KAClE,MAAM,CAAC,aAAa,EAAE,+CAA+C,CAAC;KACtE,MAAM,CAAC,kBAAkB,EAAE,wCAAwC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;KACtF,MAAM,CAAC,mBAAmB,EAAE,gEAAgE,CAAC;KAC7F,MAAM,CAAC,gBAAgB,EAAE,2EAA2E,CAAC;KACrG,MAAM,CAAC,wBAAwB,EAAE,4DAA4D,CAAC;KAC9F,MAAM,CAAC,aAAa,EAAE,oDAAoD,CAAC;KAC3E,MAAM,CAAC,QAAQ,EAAE,kCAAkC,CAAC;KACpD,MAAM,CAAC,mBAAmB,EAAE,6DAA6D,CAAC;KAC1F,MAAM,CAAC,UAAU,EAAE,sCAAsC,CAAC;KAC1D,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,CAAC;KAC7D,MAAM,CACL,KAAK,EACH,YAAgC,EAChC,OAWC,EACD,EAAE;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC/D,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC5B,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG,EAAE,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CACF,CAAC;AAEJ,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,SAAS,OAAO,CAAC,KAAa,EAAE,QAAkB;IAChD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function resolveConfigFunction(functionName: string, cwd?: string): Promise<{
2
+ config: import("../config/merge.js").MergedConfig;
3
+ fn: import("../config/merge.js").MergedFunctionConfig;
4
+ }>;
5
+ //# sourceMappingURL=config-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/config-cmd.ts"],"names":[],"mappings":"AAGA,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,GAAG,GAAE,MAAsB;;;GAK5B"}
@@ -0,0 +1,8 @@
1
+ import { loadConfig as loadMergedConfig } from '../config/load.js';
2
+ import { resolveFunction } from '../config/merge.js';
3
+ export async function resolveConfigFunction(functionName, cwd = process.cwd()) {
4
+ const config = await loadMergedConfig(cwd);
5
+ const fn = resolveFunction(config, functionName);
6
+ return { config, fn };
7
+ }
8
+ //# sourceMappingURL=config-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-cmd.js","sourceRoot":"","sources":["../../src/commands/config-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,YAAoB,EACpB,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACjD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACxB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runConfigCommand(functionName: string | undefined, cwd?: string): Promise<number>;
2
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAoBA,wBAAsB,gBAAgB,CACpC,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAUjB"}
@@ -0,0 +1,24 @@
1
+ import { loadConfig } from '../config/load.js';
2
+ import { maskUrl, redactSecrets, resolveFunction } from '../config/merge.js';
3
+ function maskAwsFields(fn) {
4
+ const aws = fn.aws;
5
+ if (!aws || typeof aws !== 'object') {
6
+ return fn;
7
+ }
8
+ const awsRecord = { ...aws };
9
+ if (typeof awsRecord.queueUrl === 'string') {
10
+ awsRecord.queueUrl = maskUrl(awsRecord.queueUrl);
11
+ }
12
+ if (typeof awsRecord.topicArn === 'string') {
13
+ awsRecord.topicArn = maskUrl(awsRecord.topicArn);
14
+ }
15
+ return { ...fn, aws: awsRecord };
16
+ }
17
+ export async function runConfigCommand(functionName, cwd = process.cwd()) {
18
+ const config = await loadConfig(cwd);
19
+ const fn = resolveFunction(config, functionName);
20
+ const output = redactSecrets(maskAwsFields(fn));
21
+ console.log(JSON.stringify(output, null, 2));
22
+ return 0;
23
+ }
24
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE7E,SAAS,aAAa,CAAC,EAA2B;IAChD,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,SAAS,GAAG,EAAE,GAAI,GAA+B,EAAE,CAAC;IAC1D,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC3C,SAAS,CAAC,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC3C,SAAS,CAAC,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,YAAgC,EAChC,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAEjD,MAAM,MAAM,GAAG,aAAa,CAC1B,aAAa,CAAC,EAAwC,CAAC,CACxD,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type InitCommandOptions = {
2
+ cwd?: string;
3
+ force?: boolean;
4
+ yes?: boolean;
5
+ };
6
+ export declare function runInitCommand(options?: InitCommandOptions): Promise<number>;
7
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,CAAC;AA8CF,wBAAsB,cAAc,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBtF"}
@@ -0,0 +1,59 @@
1
+ import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ const packageRoot = join(dirname(fileURLToPath(import.meta.url)), '..', '..');
5
+ const templatesDir = join(packageRoot, 'templates');
6
+ const TEMPLATE_FILES = [
7
+ 'lamkit.config.js',
8
+ '.env.example',
9
+ '.vscode/launch.json',
10
+ 'events/sample.json',
11
+ ];
12
+ function copyTemplate(relativePath, cwd, force) {
13
+ const source = join(templatesDir, relativePath);
14
+ const target = join(cwd, relativePath);
15
+ if (!existsSync(source)) {
16
+ throw new Error(`Missing template file: ${relativePath}`);
17
+ }
18
+ if (existsSync(target) && !force) {
19
+ console.log(`skip ${relativePath} (already exists)`);
20
+ return false;
21
+ }
22
+ mkdirSync(dirname(target), { recursive: true });
23
+ copyFileSync(source, target);
24
+ console.log(`create ${relativePath}`);
25
+ return true;
26
+ }
27
+ function maybeAddPackageScript(cwd, yes) {
28
+ if (!yes) {
29
+ return;
30
+ }
31
+ const packageJsonPath = join(cwd, 'package.json');
32
+ if (!existsSync(packageJsonPath)) {
33
+ console.log('skip package.json scripts (no package.json found)');
34
+ return;
35
+ }
36
+ const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
37
+ pkg.scripts ??= {};
38
+ if (pkg.scripts['test:lambda']) {
39
+ console.log('skip package.json scripts (test:lambda already exists)');
40
+ return;
41
+ }
42
+ pkg.scripts['test:lambda'] = 'lamkit test';
43
+ writeFileSync(packageJsonPath, `${JSON.stringify(pkg, null, 2)}\n`, 'utf8');
44
+ console.log('update package.json scripts.test:lambda');
45
+ }
46
+ export async function runInitCommand(options = {}) {
47
+ const cwd = options.cwd ?? process.cwd();
48
+ for (const relativePath of TEMPLATE_FILES) {
49
+ copyTemplate(relativePath, cwd, options.force ?? false);
50
+ }
51
+ maybeAddPackageScript(cwd, options.yes ?? false);
52
+ console.log('\nNext steps:');
53
+ console.log(' 1. Copy .env.example to .env');
54
+ console.log(' 2. Add a handler at src/lambda/handler.js (must export `handler`)');
55
+ console.log(' 3. Run: lamkit test --data \'{"id":"1"}\'');
56
+ console.log(' 4. Read docs: node_modules/aws-lambda-devkit/docs/getting-started.md');
57
+ return 0;
58
+ }
59
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { MergedConfig } from '../config/merge.js';
2
+ export declare function runListCommand(cwd?: string): Promise<number>;
3
+ export type { MergedConfig };
4
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMvD,wBAAsB,cAAc,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBjF;AAED,YAAY,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,23 @@
1
+ import pc from 'picocolors';
2
+ import { loadConfig } from '../config/load.js';
3
+ function pad(value, width) {
4
+ return value.length >= width ? value : value + ' '.repeat(width - value.length);
5
+ }
6
+ export async function runListCommand(cwd = process.cwd()) {
7
+ const config = await loadConfig(cwd);
8
+ const rows = config.functions.map((fn) => ({
9
+ name: fn.name,
10
+ entry: fn.entry,
11
+ trigger: fn.trigger,
12
+ }));
13
+ const nameWidth = Math.max(4, ...rows.map((row) => row.name.length));
14
+ const entryWidth = Math.max(5, ...rows.map((row) => row.entry.length));
15
+ const triggerWidth = Math.max(7, ...rows.map((row) => row.trigger.length));
16
+ console.log(`${pad('NAME', nameWidth)} ${pad('ENTRY', entryWidth)} ${pad('TRIGGER', triggerWidth)}`);
17
+ console.log(pc.dim('-'.repeat(nameWidth + entryWidth + triggerWidth + 4)));
18
+ for (const row of rows) {
19
+ console.log(`${pad(row.name, nameWidth)} ${pad(row.entry, entryWidth)} ${pad(row.trigger, triggerWidth)}`);
20
+ }
21
+ return 0;
22
+ }
23
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,SAAS,GAAG,CAAC,KAAa,EAAE,KAAa;IACvC,OAAO,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC9D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IAErC,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,KAAK,EAAE,EAAE,CAAC,KAAK;QACf,OAAO,EAAE,EAAE,CAAC,OAAO;KACpB,CAAC,CAAC,CAAC;IAEJ,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACvE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAE3E,OAAO,CAAC,GAAG,CACT,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,CAC1F,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3E,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CACT,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,CAChG,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,20 @@
1
+ export type ListenCommandOptions = {
2
+ cwd?: string;
3
+ batchSize?: number;
4
+ batchInvoke?: boolean;
5
+ noBatchInvoke?: boolean;
6
+ noDelete?: boolean;
7
+ once?: boolean;
8
+ expectMessages?: boolean;
9
+ noExtendVisibility?: boolean;
10
+ reload?: boolean;
11
+ queueUrl?: string;
12
+ };
13
+ export declare function resolveListenExitCode(result: {
14
+ failures: number;
15
+ messagesReceived: number;
16
+ }, options: {
17
+ expectMessages?: boolean;
18
+ }): number;
19
+ export declare function runListenCommand(functionName: string | undefined, options?: ListenCommandOptions): Promise<number>;
20
+ //# sourceMappingURL=listen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listen.d.ts","sourceRoot":"","sources":["../../src/commands/listen.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,oBAAoB,GAAG;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,qBAAqB,CACnC,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,EACtD,OAAO,EAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GACpC,MAAM,CAUR;AAED,wBAAsB,gBAAgB,CACpC,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAyBjB"}