@geekmidas/cli 0.1.0 → 0.2.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.
Files changed (146) hide show
  1. package/README.md +63 -13
  2. package/dist/{CronGenerator-Ctl4USy4.cjs → CronGenerator-1PflEYe2.cjs} +8 -7
  3. package/dist/CronGenerator-1PflEYe2.cjs.map +1 -0
  4. package/dist/{CronGenerator-ClbRcmz_.mjs → CronGenerator-DXRfHQcV.mjs} +6 -5
  5. package/dist/CronGenerator-DXRfHQcV.mjs.map +1 -0
  6. package/dist/{EndpointGenerator-Dj7AumHi.cjs → EndpointGenerator-BbGrDiCP.cjs} +134 -34
  7. package/dist/EndpointGenerator-BbGrDiCP.cjs.map +1 -0
  8. package/dist/{EndpointGenerator-uBA1ixUw.mjs → EndpointGenerator-BmZ9BxbO.mjs} +132 -32
  9. package/dist/EndpointGenerator-BmZ9BxbO.mjs.map +1 -0
  10. package/dist/{FunctionGenerator-DN681IUn.cjs → FunctionGenerator-Clw64SwQ.cjs} +8 -7
  11. package/dist/FunctionGenerator-Clw64SwQ.cjs.map +1 -0
  12. package/dist/{FunctionGenerator-crAa-JC7.mjs → FunctionGenerator-DOEB_yPh.mjs} +6 -5
  13. package/dist/FunctionGenerator-DOEB_yPh.mjs.map +1 -0
  14. package/dist/{Generator-C3tYSTQY.cjs → Generator-CDoEXCDg.cjs} +2 -2
  15. package/dist/Generator-CDoEXCDg.cjs.map +1 -0
  16. package/dist/{Generator-CDt4pB3W.mjs → Generator-UanJW0_V.mjs} +1 -1
  17. package/dist/Generator-UanJW0_V.mjs.map +1 -0
  18. package/dist/SubscriberGenerator-CB-NHtZW.cjs +205 -0
  19. package/dist/SubscriberGenerator-CB-NHtZW.cjs.map +1 -0
  20. package/dist/SubscriberGenerator-Cuu4co3-.mjs +199 -0
  21. package/dist/SubscriberGenerator-Cuu4co3-.mjs.map +1 -0
  22. package/dist/build/index.cjs +10 -9
  23. package/dist/build/index.mjs +8 -7
  24. package/dist/build/manifests.cjs +1 -1
  25. package/dist/build/manifests.mjs +1 -1
  26. package/dist/build/providerResolver.cjs +1 -1
  27. package/dist/build-Ajg356_5.cjs +89 -0
  28. package/dist/build-Ajg356_5.cjs.map +1 -0
  29. package/dist/build-zpABVsc0.mjs +83 -0
  30. package/dist/build-zpABVsc0.mjs.map +1 -0
  31. package/dist/{chunk-CsX-DzYB.cjs → chunk-CUT6urMc.cjs} +0 -12
  32. package/dist/{config-RcNESK0T.cjs → config-D1EpSGk6.cjs} +2 -2
  33. package/dist/{config-RcNESK0T.cjs.map → config-D1EpSGk6.cjs.map} +1 -1
  34. package/dist/{config-CXxYmz_o.mjs → config-U-mdW-7Y.mjs} +1 -1
  35. package/dist/{config-CXxYmz_o.mjs.map → config-U-mdW-7Y.mjs.map} +1 -1
  36. package/dist/config.cjs +1 -1
  37. package/dist/config.mjs +1 -1
  38. package/dist/generators/CronGenerator.cjs +2 -2
  39. package/dist/generators/CronGenerator.mjs +2 -2
  40. package/dist/generators/EndpointGenerator.cjs +2 -2
  41. package/dist/generators/EndpointGenerator.mjs +2 -2
  42. package/dist/generators/FunctionGenerator.cjs +2 -2
  43. package/dist/generators/FunctionGenerator.mjs +2 -2
  44. package/dist/generators/Generator.cjs +1 -1
  45. package/dist/generators/Generator.mjs +1 -1
  46. package/dist/generators/SubscriberGenerator.cjs +4 -0
  47. package/dist/generators/SubscriberGenerator.mjs +4 -0
  48. package/dist/generators/index.cjs +8 -6
  49. package/dist/generators/index.mjs +6 -5
  50. package/dist/index.cjs +18 -14
  51. package/dist/index.cjs.map +1 -1
  52. package/dist/index.mjs +15 -11
  53. package/dist/index.mjs.map +1 -1
  54. package/dist/{manifests-HX4z4kkz.mjs → manifests-BrJXpHrf.mjs} +5 -4
  55. package/dist/manifests-BrJXpHrf.mjs.map +1 -0
  56. package/dist/{manifests-BTtfDMX8.cjs → manifests-D0saShvH.cjs} +6 -5
  57. package/dist/manifests-D0saShvH.cjs.map +1 -0
  58. package/dist/{openapi-BivnatiC.mjs → openapi-BQx3_JbM.mjs} +4 -4
  59. package/dist/openapi-BQx3_JbM.mjs.map +1 -0
  60. package/dist/{openapi-DW-qF3oW.cjs → openapi-CMLr04cz.cjs} +6 -6
  61. package/dist/openapi-CMLr04cz.cjs.map +1 -0
  62. package/dist/{openapi-react-query-lgS7AVEz.mjs → openapi-react-query-DbrWwQzb.mjs} +3 -2
  63. package/dist/openapi-react-query-DbrWwQzb.mjs.map +1 -0
  64. package/dist/{openapi-react-query-J0BzBHhN.cjs → openapi-react-query-Dvjqx_Eo.cjs} +4 -3
  65. package/dist/openapi-react-query-Dvjqx_Eo.cjs.map +1 -0
  66. package/dist/openapi-react-query.cjs +1 -1
  67. package/dist/openapi-react-query.mjs +1 -1
  68. package/dist/openapi.cjs +4 -4
  69. package/dist/openapi.mjs +4 -4
  70. package/dist/{providerResolver-Cs-0YCaP.cjs → providerResolver-DgvzNfP4.cjs} +1 -1
  71. package/dist/{providerResolver-Cs-0YCaP.cjs.map → providerResolver-DgvzNfP4.cjs.map} +1 -1
  72. package/examples/cron-example.ts +1 -1
  73. package/examples/function-example.ts +1 -1
  74. package/examples/logger.ts +1 -1
  75. package/package.json +6 -3
  76. package/src/__tests__/openapi-react-query.spec.ts +506 -0
  77. package/src/__tests__/openapi.spec.ts +362 -0
  78. package/src/__tests__/test-helpers.ts +10 -8
  79. package/src/build/__tests__/index-new.spec.ts +41 -42
  80. package/src/build/index.ts +89 -28
  81. package/src/build/manifests.ts +4 -1
  82. package/src/build/types.ts +2 -2
  83. package/src/generators/CronGenerator.ts +3 -2
  84. package/src/generators/EndpointGenerator.ts +141 -42
  85. package/src/generators/FunctionGenerator.ts +3 -2
  86. package/src/generators/Generator.ts +1 -1
  87. package/src/generators/SubscriberGenerator.ts +274 -0
  88. package/src/generators/__tests__/CronGenerator.spec.ts +1 -1
  89. package/src/generators/__tests__/EndpointGenerator.spec.ts +33 -11
  90. package/src/generators/__tests__/FunctionGenerator.spec.ts +21 -22
  91. package/src/generators/__tests__/SubscriberGenerator.spec.ts +392 -0
  92. package/src/generators/index.ts +1 -0
  93. package/src/openapi-react-query.ts +2 -1
  94. package/src/openapi.ts +1 -1
  95. package/src/types.ts +18 -0
  96. package/dist/CronGenerator-ClbRcmz_.mjs.map +0 -1
  97. package/dist/CronGenerator-Ctl4USy4.cjs.map +0 -1
  98. package/dist/EndpointGenerator-Dj7AumHi.cjs.map +0 -1
  99. package/dist/EndpointGenerator-uBA1ixUw.mjs.map +0 -1
  100. package/dist/FunctionGenerator-DN681IUn.cjs.map +0 -1
  101. package/dist/FunctionGenerator-crAa-JC7.mjs.map +0 -1
  102. package/dist/Generator-C3tYSTQY.cjs.map +0 -1
  103. package/dist/Generator-CDt4pB3W.mjs.map +0 -1
  104. package/dist/__tests__/config.spec.cjs +0 -98
  105. package/dist/__tests__/config.spec.cjs.map +0 -1
  106. package/dist/__tests__/config.spec.mjs +0 -97
  107. package/dist/__tests__/config.spec.mjs.map +0 -1
  108. package/dist/__tests__/test-helpers.cjs +0 -14
  109. package/dist/__tests__/test-helpers.mjs +0 -4
  110. package/dist/build/__tests__/index-new.spec.cjs +0 -286
  111. package/dist/build/__tests__/index-new.spec.cjs.map +0 -1
  112. package/dist/build/__tests__/index-new.spec.mjs +0 -285
  113. package/dist/build/__tests__/index-new.spec.mjs.map +0 -1
  114. package/dist/build-BZdwxCLW.mjs +0 -64
  115. package/dist/build-BZdwxCLW.mjs.map +0 -1
  116. package/dist/build-BfQFnU5-.cjs +0 -70
  117. package/dist/build-BfQFnU5-.cjs.map +0 -1
  118. package/dist/esm-9eeZntth.mjs +0 -3777
  119. package/dist/esm-9eeZntth.mjs.map +0 -1
  120. package/dist/esm-Crmo4h9t.cjs +0 -4392
  121. package/dist/esm-Crmo4h9t.cjs.map +0 -1
  122. package/dist/esm-CsJbr7gi.mjs +0 -3
  123. package/dist/esm-w09tAC4l.cjs +0 -8
  124. package/dist/generators/__tests__/CronGenerator.spec.cjs +0 -216
  125. package/dist/generators/__tests__/CronGenerator.spec.cjs.map +0 -1
  126. package/dist/generators/__tests__/CronGenerator.spec.mjs +0 -215
  127. package/dist/generators/__tests__/CronGenerator.spec.mjs.map +0 -1
  128. package/dist/generators/__tests__/EndpointGenerator.spec.cjs +0 -182
  129. package/dist/generators/__tests__/EndpointGenerator.spec.cjs.map +0 -1
  130. package/dist/generators/__tests__/EndpointGenerator.spec.mjs +0 -181
  131. package/dist/generators/__tests__/EndpointGenerator.spec.mjs.map +0 -1
  132. package/dist/generators/__tests__/FunctionGenerator.spec.cjs +0 -152
  133. package/dist/generators/__tests__/FunctionGenerator.spec.cjs.map +0 -1
  134. package/dist/generators/__tests__/FunctionGenerator.spec.mjs +0 -151
  135. package/dist/generators/__tests__/FunctionGenerator.spec.mjs.map +0 -1
  136. package/dist/manifests-BTtfDMX8.cjs.map +0 -1
  137. package/dist/manifests-HX4z4kkz.mjs.map +0 -1
  138. package/dist/openapi-BivnatiC.mjs.map +0 -1
  139. package/dist/openapi-DW-qF3oW.cjs.map +0 -1
  140. package/dist/openapi-react-query-J0BzBHhN.cjs.map +0 -1
  141. package/dist/openapi-react-query-lgS7AVEz.mjs.map +0 -1
  142. package/dist/test-helpers-ARd8GDgx.cjs +0 -199
  143. package/dist/test-helpers-ARd8GDgx.cjs.map +0 -1
  144. package/dist/test-helpers-DdVBk23F.mjs +0 -133
  145. package/dist/test-helpers-DdVBk23F.mjs.map +0 -1
  146. /package/dist/{generators-_pY7sHy1.cjs → generators-CEKtVh81.cjs} +0 -0
@@ -1,182 +0,0 @@
1
- const require_chunk = require('../../chunk-CsX-DzYB.cjs');
2
- require('../../Generator-C3tYSTQY.cjs');
3
- const require_EndpointGenerator = require('../../EndpointGenerator-Dj7AumHi.cjs');
4
- require('../../esm-Crmo4h9t.cjs');
5
- const require_test_helpers = require('../../test-helpers-ARd8GDgx.cjs');
6
- const node_fs_promises = require_chunk.__toESM(require("node:fs/promises"));
7
- const node_path = require_chunk.__toESM(require("node:path"));
8
- const vitest = require_chunk.__toESM(require("vitest"));
9
- const __geekmidas_testkit_os = require_chunk.__toESM(require("@geekmidas/testkit/os"));
10
-
11
- //#region src/generators/__tests__/EndpointGenerator.spec.ts
12
- (0, vitest.describe)("EndpointGenerator", () => {
13
- let tempDir;
14
- let outputDir;
15
- let generator;
16
- let context;
17
- (0, vitest.beforeEach)(async () => {
18
- generator = new require_EndpointGenerator.EndpointGenerator();
19
- context = require_test_helpers.createMockBuildContext();
20
- });
21
- (0, vitest.afterEach)(async () => {});
22
- (0, vitest.it)("should identify valid endpoints", () => {
23
- const testEndpoint = require_test_helpers.createTestEndpoint("/test", "GET");
24
- (0, vitest.expect)(generator.isConstruct(testEndpoint)).toBe(true);
25
- });
26
- (0, vitest.it)("should reject invalid constructs", () => {
27
- (0, vitest.expect)(generator.isConstruct({})).toBe(false);
28
- (0, vitest.expect)(generator.isConstruct("string")).toBe(false);
29
- (0, vitest.expect)(generator.isConstruct(null)).toBe(false);
30
- });
31
- const createTestEndpointConstruct = (key, path, method, dir) => ({
32
- key,
33
- name: key.toLowerCase(),
34
- construct: require_test_helpers.createTestEndpoint(path, method),
35
- path: {
36
- absolute: (0, node_path.join)(dir, `${key}.ts`),
37
- relative: `./${key}.ts`
38
- }
39
- });
40
- (0, __geekmidas_testkit_os.itWithDir)("should generate a single server app file", async ({ dir }) => {
41
- const outputDir$1 = (0, node_path.join)(dir, "output");
42
- const routesDir = (0, node_path.join)(dir, "routes");
43
- await (0, node_fs_promises.mkdir)(outputDir$1, { recursive: true });
44
- await Promise.all([require_test_helpers.createMockEndpointFile(routesDir, "testEndpoint.ts", "testEndpoint", "/test", "GET"), require_test_helpers.createMockEndpointFile(routesDir, "anotherEndpoint.ts", "anotherEndpoint", "/another", "POST")]);
45
- const constructs = await generator.load("**/routes/*.ts", dir);
46
- const routes = await generator.build(context, constructs, outputDir$1, {
47
- provider: "server",
48
- enableOpenApi: true
49
- });
50
- (0, vitest.expect)(routes).toHaveLength(1);
51
- (0, vitest.expect)(routes[0]).toMatchObject({
52
- path: "*",
53
- method: "ALL",
54
- handler: vitest.expect.stringContaining("app.ts")
55
- });
56
- const appPath = (0, node_path.join)(outputDir$1, "app.ts");
57
- const appContent = await (0, node_fs_promises.readFile)(appPath, "utf-8");
58
- (0, vitest.expect)(appContent).toContain("import { HonoEndpoint }");
59
- (0, vitest.expect)(appContent).toContain("import { testEndpoint }");
60
- (0, vitest.expect)(appContent).toContain("import { anotherEndpoint }");
61
- (0, vitest.expect)(appContent).toContain("enableOpenApi: boolean = true");
62
- (0, vitest.expect)(appContent).toContain("docsPath: '/docs'");
63
- });
64
- (0, __geekmidas_testkit_os.itWithDir)("should generate server app without OpenAPI when disabled", async ({ dir }) => {
65
- const outputDir$1 = (0, node_path.join)(dir, "output");
66
- const routesDir = (0, node_path.join)(dir, "routes");
67
- await (0, node_fs_promises.mkdir)(outputDir$1, { recursive: true });
68
- await require_test_helpers.createMockEndpointFile(routesDir, "testEndpoint.ts", "testEndpoint", "/test", "GET");
69
- const constructs = await generator.load("**/routes/*.ts", dir);
70
- await generator.build(context, constructs, outputDir$1, {
71
- provider: "server",
72
- enableOpenApi: false
73
- });
74
- const appPath = (0, node_path.join)(outputDir$1, "app.ts");
75
- const appContent = await (0, node_fs_promises.readFile)(appPath, "utf-8");
76
- (0, vitest.expect)(appContent).toContain("enableOpenApi: boolean = false");
77
- (0, vitest.expect)(appContent).toContain("docsPath: false");
78
- });
79
- (0, __geekmidas_testkit_os.itWithDir)("should generate individual handlers in routes subdirectory", async ({ dir }) => {
80
- const outputDir$1 = (0, node_path.join)(dir, "output");
81
- const routesDir = (0, node_path.join)(dir, "routes");
82
- await (0, node_fs_promises.mkdir)(outputDir$1, { recursive: true });
83
- await Promise.all([require_test_helpers.createMockEndpointFile(routesDir, "testEndpoint.ts", "testEndpoint", "/test", "GET"), require_test_helpers.createMockEndpointFile(routesDir, "anotherEndpoint.ts", "anotherEndpoint", "/another", "POST")]);
84
- const constructs = await generator.load("**/routes/*.ts", dir);
85
- const routes = await generator.build(context, constructs, outputDir$1, { provider: "aws-lambda" });
86
- (0, vitest.expect)(routes).toHaveLength(2);
87
- const testRoute = routes.find((r) => r.path === "/test");
88
- const anotherRoute = routes.find((r) => r.path === "/another");
89
- (0, vitest.expect)(testRoute).toMatchObject({
90
- path: "/test",
91
- method: "GET",
92
- handler: vitest.expect.stringContaining("routes/testEndpoint.handler")
93
- });
94
- (0, vitest.expect)(anotherRoute).toMatchObject({
95
- path: "/another",
96
- method: "POST",
97
- handler: vitest.expect.stringContaining("routes/anotherEndpoint.handler")
98
- });
99
- const testHandlerPath = (0, node_path.join)(outputDir$1, "routes", "testEndpoint.ts");
100
- const testHandlerContent = await (0, node_fs_promises.readFile)(testHandlerPath, "utf-8");
101
- (0, vitest.expect)(testHandlerContent).toContain("AmazonApiGatewayV2Endpoint");
102
- (0, vitest.expect)(testHandlerContent).toContain("import { testEndpoint }");
103
- const anotherHandlerPath = (0, node_path.join)(outputDir$1, "routes", "anotherEndpoint.ts");
104
- const anotherHandlerContent = await (0, node_fs_promises.readFile)(anotherHandlerPath, "utf-8");
105
- (0, vitest.expect)(anotherHandlerContent).toContain("AmazonApiGatewayV2Endpoint");
106
- (0, vitest.expect)(anotherHandlerContent).toContain("import { anotherEndpoint }");
107
- });
108
- (0, __geekmidas_testkit_os.itWithDir)("should generate individual handlers with v1 adapter", async ({ dir }) => {
109
- const outputDir$1 = (0, node_path.join)(dir, "output");
110
- const routesDir = (0, node_path.join)(dir, "routes");
111
- await (0, node_fs_promises.mkdir)(outputDir$1, { recursive: true });
112
- await require_test_helpers.createMockEndpointFile(routesDir, "testEndpoint.ts", "testEndpoint", "/test", "GET");
113
- const constructs = await generator.load("**/routes/*.ts", dir);
114
- const routes = await generator.build(context, constructs, outputDir$1, { provider: "aws-apigatewayv1" });
115
- (0, vitest.expect)(routes).toHaveLength(1);
116
- const handlerPath = (0, node_path.join)(outputDir$1, "testEndpoint.ts");
117
- const handlerContent = await (0, node_fs_promises.readFile)(handlerPath, "utf-8");
118
- (0, vitest.expect)(handlerContent).toContain("AmazonApiGatewayV1Endpoint");
119
- (0, vitest.expect)(handlerContent).toContain("import { testEndpoint }");
120
- });
121
- (0, __geekmidas_testkit_os.itWithDir)("should generate individual handlers with v2 adapter", async ({ dir }) => {
122
- const outputDir$1 = (0, node_path.join)(dir, "output");
123
- const routesDir = (0, node_path.join)(dir, "routes");
124
- await (0, node_fs_promises.mkdir)(outputDir$1, { recursive: true });
125
- await require_test_helpers.createMockEndpointFile(routesDir, "testEndpoint.ts", "testEndpoint", "/test", "GET");
126
- const constructs = await generator.load("**/routes/*.ts", dir);
127
- const routes = await generator.build(context, constructs, outputDir$1, { provider: "aws-apigatewayv2" });
128
- (0, vitest.expect)(routes).toHaveLength(1);
129
- const handlerPath = (0, node_path.join)(outputDir$1, "testEndpoint.ts");
130
- const handlerContent = await (0, node_fs_promises.readFile)(handlerPath, "utf-8");
131
- (0, vitest.expect)(handlerContent).toContain("AmazonApiGatewayV2Endpoint");
132
- (0, vitest.expect)(handlerContent).toContain("import { testEndpoint }");
133
- });
134
- (0, __geekmidas_testkit_os.itWithDir)("should return empty array for empty constructs", async ({ dir }) => {
135
- const outputDir$1 = (0, node_path.join)(dir, "output");
136
- const routes = await generator.build(context, [], outputDir$1);
137
- (0, vitest.expect)(routes).toEqual([]);
138
- });
139
- (0, __geekmidas_testkit_os.itWithDir)("should use default provider when none specified", async ({ dir }) => {
140
- const outputDir$1 = (0, node_path.join)(dir, "output");
141
- const routesDir = (0, node_path.join)(dir, "routes");
142
- await (0, node_fs_promises.mkdir)(outputDir$1, { recursive: true });
143
- await require_test_helpers.createMockEndpointFile(routesDir, "testEndpoint.ts", "testEndpoint", "/test", "GET");
144
- const constructs = await generator.load("**/routes/*.ts", dir);
145
- const routes = await generator.build(context, constructs, outputDir$1);
146
- (0, vitest.expect)(routes).toHaveLength(1);
147
- const handlerPath = (0, node_path.join)(outputDir$1, "testEndpoint.ts");
148
- const handlerContent = await (0, node_fs_promises.readFile)(handlerPath, "utf-8");
149
- (0, vitest.expect)(handlerContent).toContain("AmazonApiGatewayV2Endpoint");
150
- });
151
- (0, __geekmidas_testkit_os.itWithDir)("should throw error for unsupported provider", async ({ dir }) => {
152
- const outputDir$1 = (0, node_path.join)(dir, "output");
153
- const constructs = [createTestEndpointConstruct("testEndpoint", "/test", "GET", dir)];
154
- await (0, vitest.expect)(generator.build(context, constructs, outputDir$1, { provider: "unsupported" })).rejects.toThrow("Unsupported provider: unsupported");
155
- });
156
- (0, __geekmidas_testkit_os.itWithDir)("should generate correct import paths for nested files", async ({ dir }) => {
157
- const outputDir$1 = (0, node_path.join)(dir, "output");
158
- const nestedDir = (0, node_path.join)(dir, "src", "api", "endpoints");
159
- await (0, node_fs_promises.mkdir)(outputDir$1, { recursive: true });
160
- await require_test_helpers.createMockEndpointFile(nestedDir, "deepEndpoint.ts", "deepEndpoint", "/deep", "GET");
161
- const constructs = await generator.load("**/src/api/endpoints/*.ts", dir);
162
- await generator.build(context, constructs, outputDir$1, { provider: "aws-apigatewayv2" });
163
- const handlerPath = (0, node_path.join)(outputDir$1, "deepEndpoint.ts");
164
- const handlerContent = await (0, node_fs_promises.readFile)(handlerPath, "utf-8");
165
- (0, vitest.expect)(handlerContent).toContain("from '../src/api/endpoints/deepEndpoint.js'");
166
- (0, vitest.expect)(handlerContent).toMatch(/from ['"]\.\.\/\.\.\/\.\.\/.*\/env['"]/);
167
- });
168
- (0, __geekmidas_testkit_os.itWithDir)("should log generation progress", async ({ dir }) => {
169
- const logSpy = vitest.vi.spyOn(console, "log");
170
- const outputDir$1 = (0, node_path.join)(dir, "output");
171
- const routesDir = (0, node_path.join)(dir, "routes");
172
- await (0, node_fs_promises.mkdir)(outputDir$1, { recursive: true });
173
- await Promise.all([require_test_helpers.createMockEndpointFile(routesDir, "endpoint1.ts", "endpoint1", "/test1", "GET"), require_test_helpers.createMockEndpointFile(routesDir, "endpoint2.ts", "endpoint2", "/test2", "POST")]);
174
- const constructs = await generator.load("**/routes/*.ts", dir);
175
- await generator.build(context, constructs, outputDir$1, { provider: "server" });
176
- (0, vitest.expect)(logSpy).toHaveBeenCalledWith("Generated server app with 2 endpoints");
177
- logSpy.mockRestore();
178
- });
179
- });
180
-
181
- //#endregion
182
- //# sourceMappingURL=EndpointGenerator.spec.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EndpointGenerator.spec.cjs","names":["tempDir: string","outputDir: string","generator: EndpointGenerator","context: ReturnType<typeof createMockBuildContext>","EndpointGenerator","key: string","path: string","method: HttpMethod","dir: string","outputDir"],"sources":["../../../src/generators/__tests__/EndpointGenerator.spec.ts"],"sourcesContent":["import { mkdir, readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Endpoint } from '@geekmidas/api/server';\nimport { itWithDir } from '@geekmidas/testkit/os';\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';\nimport type { HttpMethod } from '../../../../api/src/constructs/types';\nimport {\n createMockBuildContext,\n createMockEndpointFile,\n createTestEndpoint,\n} from '../../__tests__/test-helpers';\nimport { EndpointGenerator } from '../EndpointGenerator';\nimport type { GeneratedConstruct } from '../Generator';\n\ndescribe('EndpointGenerator', () => {\n let tempDir: string;\n let outputDir: string;\n let generator: EndpointGenerator;\n let context: ReturnType<typeof createMockBuildContext>;\n\n beforeEach(async () => {\n generator = new EndpointGenerator();\n context = createMockBuildContext();\n });\n\n afterEach(async () => {});\n\n it('should identify valid endpoints', () => {\n const testEndpoint = createTestEndpoint('/test', 'GET');\n expect(generator.isConstruct(testEndpoint)).toBe(true);\n });\n\n it('should reject invalid constructs', () => {\n expect(generator.isConstruct({})).toBe(false);\n expect(generator.isConstruct('string')).toBe(false);\n expect(generator.isConstruct(null)).toBe(false);\n });\n\n const createTestEndpointConstruct = (\n key: string,\n path: string,\n method: HttpMethod,\n dir: string,\n ): GeneratedConstruct<Endpoint<any, any, any, any, any, any>> => ({\n key,\n name: key.toLowerCase(),\n construct: createTestEndpoint(path, method),\n path: {\n absolute: join(dir, `${key}.ts`),\n relative: `./${key}.ts`,\n },\n });\n\n itWithDir('should generate a single server app file', async ({ dir }) => {\n const outputDir = join(dir, 'output');\n const routesDir = join(dir, 'routes');\n await mkdir(outputDir, { recursive: true });\n\n await Promise.all([\n createMockEndpointFile(\n routesDir,\n 'testEndpoint.ts',\n 'testEndpoint',\n '/test',\n 'GET',\n ),\n createMockEndpointFile(\n routesDir,\n 'anotherEndpoint.ts',\n 'anotherEndpoint',\n '/another',\n 'POST',\n ),\n ]);\n\n const constructs = await generator.load('**/routes/*.ts', dir);\n\n const routes = await generator.build(context, constructs, outputDir, {\n provider: 'server',\n enableOpenApi: true,\n });\n\n expect(routes).toHaveLength(1);\n expect(routes[0]).toMatchObject({\n path: '*',\n method: 'ALL',\n handler: expect.stringContaining('app.ts'),\n });\n\n // Check that the app.ts file was created\n const appPath = join(outputDir, 'app.ts');\n const appContent = await readFile(appPath, 'utf-8');\n\n expect(appContent).toContain('import { HonoEndpoint }');\n expect(appContent).toContain('import { testEndpoint }');\n expect(appContent).toContain('import { anotherEndpoint }');\n expect(appContent).toContain('enableOpenApi: boolean = true');\n expect(appContent).toContain(\"docsPath: '/docs'\");\n });\n\n itWithDir(\n 'should generate server app without OpenAPI when disabled',\n async ({ dir }) => {\n const outputDir = join(dir, 'output');\n const routesDir = join(dir, 'routes');\n await mkdir(outputDir, { recursive: true });\n\n await createMockEndpointFile(\n routesDir,\n 'testEndpoint.ts',\n 'testEndpoint',\n '/test',\n 'GET',\n );\n\n const constructs = await generator.load('**/routes/*.ts', dir);\n\n await generator.build(context, constructs, outputDir, {\n provider: 'server',\n enableOpenApi: false,\n });\n\n const appPath = join(outputDir, 'app.ts');\n const appContent = await readFile(appPath, 'utf-8');\n\n expect(appContent).toContain('enableOpenApi: boolean = false');\n expect(appContent).toContain('docsPath: false');\n },\n );\n\n itWithDir(\n 'should generate individual handlers in routes subdirectory',\n async ({ dir }) => {\n const outputDir = join(dir, 'output');\n const routesDir = join(dir, 'routes');\n await mkdir(outputDir, { recursive: true });\n\n await Promise.all([\n createMockEndpointFile(\n routesDir,\n 'testEndpoint.ts',\n 'testEndpoint',\n '/test',\n 'GET',\n ),\n createMockEndpointFile(\n routesDir,\n 'anotherEndpoint.ts',\n 'anotherEndpoint',\n '/another',\n 'POST',\n ),\n ]);\n\n const constructs = await generator.load('**/routes/*.ts', dir);\n\n const routes = await generator.build(context, constructs, outputDir, {\n provider: 'aws-lambda',\n });\n\n expect(routes).toHaveLength(2);\n\n // Find routes by their path since order may vary\n const testRoute = routes.find((r) => r.path === '/test');\n const anotherRoute = routes.find((r) => r.path === '/another');\n\n expect(testRoute).toMatchObject({\n path: '/test',\n method: 'GET',\n handler: expect.stringContaining('routes/testEndpoint.handler'),\n });\n expect(anotherRoute).toMatchObject({\n path: '/another',\n method: 'POST',\n handler: expect.stringContaining('routes/anotherEndpoint.handler'),\n });\n\n // Check that handler files were created\n const testHandlerPath = join(outputDir, 'routes', 'testEndpoint.ts');\n const testHandlerContent = await readFile(testHandlerPath, 'utf-8');\n expect(testHandlerContent).toContain('AmazonApiGatewayV2Endpoint');\n expect(testHandlerContent).toContain('import { testEndpoint }');\n\n const anotherHandlerPath = join(\n outputDir,\n 'routes',\n 'anotherEndpoint.ts',\n );\n const anotherHandlerContent = await readFile(anotherHandlerPath, 'utf-8');\n expect(anotherHandlerContent).toContain('AmazonApiGatewayV2Endpoint');\n expect(anotherHandlerContent).toContain('import { anotherEndpoint }');\n },\n );\n\n itWithDir(\n 'should generate individual handlers with v1 adapter',\n async ({ dir }) => {\n const outputDir = join(dir, 'output');\n const routesDir = join(dir, 'routes');\n await mkdir(outputDir, { recursive: true });\n\n await createMockEndpointFile(\n routesDir,\n 'testEndpoint.ts',\n 'testEndpoint',\n '/test',\n 'GET',\n );\n\n const constructs = await generator.load('**/routes/*.ts', dir);\n\n const routes = await generator.build(context, constructs, outputDir, {\n provider: 'aws-apigatewayv1',\n });\n\n expect(routes).toHaveLength(1);\n\n const handlerPath = join(outputDir, 'testEndpoint.ts');\n const handlerContent = await readFile(handlerPath, 'utf-8');\n expect(handlerContent).toContain('AmazonApiGatewayV1Endpoint');\n expect(handlerContent).toContain('import { testEndpoint }');\n },\n );\n\n itWithDir(\n 'should generate individual handlers with v2 adapter',\n async ({ dir }) => {\n const outputDir = join(dir, 'output');\n const routesDir = join(dir, 'routes');\n await mkdir(outputDir, { recursive: true });\n\n await createMockEndpointFile(\n routesDir,\n 'testEndpoint.ts',\n 'testEndpoint',\n '/test',\n 'GET',\n );\n\n const constructs = await generator.load('**/routes/*.ts', dir);\n\n const routes = await generator.build(context, constructs, outputDir, {\n provider: 'aws-apigatewayv2',\n });\n\n expect(routes).toHaveLength(1);\n\n const handlerPath = join(outputDir, 'testEndpoint.ts');\n const handlerContent = await readFile(handlerPath, 'utf-8');\n expect(handlerContent).toContain('AmazonApiGatewayV2Endpoint');\n expect(handlerContent).toContain('import { testEndpoint }');\n },\n );\n\n itWithDir(\n 'should return empty array for empty constructs',\n async ({ dir }) => {\n const outputDir = join(dir, 'output');\n const routes = await generator.build(context, [], outputDir);\n expect(routes).toEqual([]);\n },\n );\n\n itWithDir(\n 'should use default provider when none specified',\n async ({ dir }) => {\n const outputDir = join(dir, 'output');\n const routesDir = join(dir, 'routes');\n await mkdir(outputDir, { recursive: true });\n\n await createMockEndpointFile(\n routesDir,\n 'testEndpoint.ts',\n 'testEndpoint',\n '/test',\n 'GET',\n );\n\n const constructs = await generator.load('**/routes/*.ts', dir);\n\n const routes = await generator.build(context, constructs, outputDir);\n\n expect(routes).toHaveLength(1);\n\n // Should use default aws-apigatewayv2\n const handlerPath = join(outputDir, 'testEndpoint.ts');\n const handlerContent = await readFile(handlerPath, 'utf-8');\n expect(handlerContent).toContain('AmazonApiGatewayV2Endpoint');\n },\n );\n\n itWithDir('should throw error for unsupported provider', async ({ dir }) => {\n const outputDir = join(dir, 'output');\n const constructs = [\n createTestEndpointConstruct('testEndpoint', '/test', 'GET', dir),\n ];\n\n await expect(\n generator.build(context, constructs, outputDir, {\n provider: 'unsupported' as any,\n }),\n ).rejects.toThrow('Unsupported provider: unsupported');\n });\n\n itWithDir(\n 'should generate correct import paths for nested files',\n async ({ dir }) => {\n const outputDir = join(dir, 'output');\n const nestedDir = join(dir, 'src', 'api', 'endpoints');\n await mkdir(outputDir, { recursive: true });\n\n await createMockEndpointFile(\n nestedDir,\n 'deepEndpoint.ts',\n 'deepEndpoint',\n '/deep',\n 'GET',\n );\n\n const constructs = await generator.load('**/src/api/endpoints/*.ts', dir);\n\n await generator.build(context, constructs, outputDir, {\n provider: 'aws-apigatewayv2',\n });\n\n const handlerPath = join(outputDir, 'deepEndpoint.ts');\n const handlerContent = await readFile(handlerPath, 'utf-8');\n\n // Check that relative imports are correct\n expect(handlerContent).toContain(\n \"from '../src/api/endpoints/deepEndpoint.js'\",\n );\n expect(handlerContent).toMatch(/from ['\"]\\.\\.\\/\\.\\.\\/\\.\\.\\/.*\\/env['\"]/);\n },\n );\n\n itWithDir('should log generation progress', async ({ dir }) => {\n const logSpy = vi.spyOn(console, 'log');\n const outputDir = join(dir, 'output');\n const routesDir = join(dir, 'routes');\n await mkdir(outputDir, { recursive: true });\n\n await Promise.all([\n createMockEndpointFile(\n routesDir,\n 'endpoint1.ts',\n 'endpoint1',\n '/test1',\n 'GET',\n ),\n createMockEndpointFile(\n routesDir,\n 'endpoint2.ts',\n 'endpoint2',\n '/test2',\n 'POST',\n ),\n ]);\n\n const constructs = await generator.load('**/routes/*.ts', dir);\n\n await generator.build(context, constructs, outputDir, {\n provider: 'server',\n });\n\n expect(logSpy).toHaveBeenCalledWith(\n 'Generated server app with 2 endpoints',\n );\n\n logSpy.mockRestore();\n });\n});\n"],"mappings":"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"}
@@ -1,181 +0,0 @@
1
- import "../../esm-9eeZntth.mjs";
2
- import "../../Generator-CDt4pB3W.mjs";
3
- import { EndpointGenerator } from "../../EndpointGenerator-uBA1ixUw.mjs";
4
- import { createMockBuildContext, createMockEndpointFile, createTestEndpoint } from "../../test-helpers-DdVBk23F.mjs";
5
- import { mkdir, readFile } from "node:fs/promises";
6
- import { join } from "node:path";
7
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
8
- import { itWithDir } from "@geekmidas/testkit/os";
9
-
10
- //#region src/generators/__tests__/EndpointGenerator.spec.ts
11
- describe("EndpointGenerator", () => {
12
- let tempDir;
13
- let outputDir;
14
- let generator;
15
- let context;
16
- beforeEach(async () => {
17
- generator = new EndpointGenerator();
18
- context = createMockBuildContext();
19
- });
20
- afterEach(async () => {});
21
- it("should identify valid endpoints", () => {
22
- const testEndpoint = createTestEndpoint("/test", "GET");
23
- expect(generator.isConstruct(testEndpoint)).toBe(true);
24
- });
25
- it("should reject invalid constructs", () => {
26
- expect(generator.isConstruct({})).toBe(false);
27
- expect(generator.isConstruct("string")).toBe(false);
28
- expect(generator.isConstruct(null)).toBe(false);
29
- });
30
- const createTestEndpointConstruct = (key, path, method, dir) => ({
31
- key,
32
- name: key.toLowerCase(),
33
- construct: createTestEndpoint(path, method),
34
- path: {
35
- absolute: join(dir, `${key}.ts`),
36
- relative: `./${key}.ts`
37
- }
38
- });
39
- itWithDir("should generate a single server app file", async ({ dir }) => {
40
- const outputDir$1 = join(dir, "output");
41
- const routesDir = join(dir, "routes");
42
- await mkdir(outputDir$1, { recursive: true });
43
- await Promise.all([createMockEndpointFile(routesDir, "testEndpoint.ts", "testEndpoint", "/test", "GET"), createMockEndpointFile(routesDir, "anotherEndpoint.ts", "anotherEndpoint", "/another", "POST")]);
44
- const constructs = await generator.load("**/routes/*.ts", dir);
45
- const routes = await generator.build(context, constructs, outputDir$1, {
46
- provider: "server",
47
- enableOpenApi: true
48
- });
49
- expect(routes).toHaveLength(1);
50
- expect(routes[0]).toMatchObject({
51
- path: "*",
52
- method: "ALL",
53
- handler: expect.stringContaining("app.ts")
54
- });
55
- const appPath = join(outputDir$1, "app.ts");
56
- const appContent = await readFile(appPath, "utf-8");
57
- expect(appContent).toContain("import { HonoEndpoint }");
58
- expect(appContent).toContain("import { testEndpoint }");
59
- expect(appContent).toContain("import { anotherEndpoint }");
60
- expect(appContent).toContain("enableOpenApi: boolean = true");
61
- expect(appContent).toContain("docsPath: '/docs'");
62
- });
63
- itWithDir("should generate server app without OpenAPI when disabled", async ({ dir }) => {
64
- const outputDir$1 = join(dir, "output");
65
- const routesDir = join(dir, "routes");
66
- await mkdir(outputDir$1, { recursive: true });
67
- await createMockEndpointFile(routesDir, "testEndpoint.ts", "testEndpoint", "/test", "GET");
68
- const constructs = await generator.load("**/routes/*.ts", dir);
69
- await generator.build(context, constructs, outputDir$1, {
70
- provider: "server",
71
- enableOpenApi: false
72
- });
73
- const appPath = join(outputDir$1, "app.ts");
74
- const appContent = await readFile(appPath, "utf-8");
75
- expect(appContent).toContain("enableOpenApi: boolean = false");
76
- expect(appContent).toContain("docsPath: false");
77
- });
78
- itWithDir("should generate individual handlers in routes subdirectory", async ({ dir }) => {
79
- const outputDir$1 = join(dir, "output");
80
- const routesDir = join(dir, "routes");
81
- await mkdir(outputDir$1, { recursive: true });
82
- await Promise.all([createMockEndpointFile(routesDir, "testEndpoint.ts", "testEndpoint", "/test", "GET"), createMockEndpointFile(routesDir, "anotherEndpoint.ts", "anotherEndpoint", "/another", "POST")]);
83
- const constructs = await generator.load("**/routes/*.ts", dir);
84
- const routes = await generator.build(context, constructs, outputDir$1, { provider: "aws-lambda" });
85
- expect(routes).toHaveLength(2);
86
- const testRoute = routes.find((r) => r.path === "/test");
87
- const anotherRoute = routes.find((r) => r.path === "/another");
88
- expect(testRoute).toMatchObject({
89
- path: "/test",
90
- method: "GET",
91
- handler: expect.stringContaining("routes/testEndpoint.handler")
92
- });
93
- expect(anotherRoute).toMatchObject({
94
- path: "/another",
95
- method: "POST",
96
- handler: expect.stringContaining("routes/anotherEndpoint.handler")
97
- });
98
- const testHandlerPath = join(outputDir$1, "routes", "testEndpoint.ts");
99
- const testHandlerContent = await readFile(testHandlerPath, "utf-8");
100
- expect(testHandlerContent).toContain("AmazonApiGatewayV2Endpoint");
101
- expect(testHandlerContent).toContain("import { testEndpoint }");
102
- const anotherHandlerPath = join(outputDir$1, "routes", "anotherEndpoint.ts");
103
- const anotherHandlerContent = await readFile(anotherHandlerPath, "utf-8");
104
- expect(anotherHandlerContent).toContain("AmazonApiGatewayV2Endpoint");
105
- expect(anotherHandlerContent).toContain("import { anotherEndpoint }");
106
- });
107
- itWithDir("should generate individual handlers with v1 adapter", async ({ dir }) => {
108
- const outputDir$1 = join(dir, "output");
109
- const routesDir = join(dir, "routes");
110
- await mkdir(outputDir$1, { recursive: true });
111
- await createMockEndpointFile(routesDir, "testEndpoint.ts", "testEndpoint", "/test", "GET");
112
- const constructs = await generator.load("**/routes/*.ts", dir);
113
- const routes = await generator.build(context, constructs, outputDir$1, { provider: "aws-apigatewayv1" });
114
- expect(routes).toHaveLength(1);
115
- const handlerPath = join(outputDir$1, "testEndpoint.ts");
116
- const handlerContent = await readFile(handlerPath, "utf-8");
117
- expect(handlerContent).toContain("AmazonApiGatewayV1Endpoint");
118
- expect(handlerContent).toContain("import { testEndpoint }");
119
- });
120
- itWithDir("should generate individual handlers with v2 adapter", async ({ dir }) => {
121
- const outputDir$1 = join(dir, "output");
122
- const routesDir = join(dir, "routes");
123
- await mkdir(outputDir$1, { recursive: true });
124
- await createMockEndpointFile(routesDir, "testEndpoint.ts", "testEndpoint", "/test", "GET");
125
- const constructs = await generator.load("**/routes/*.ts", dir);
126
- const routes = await generator.build(context, constructs, outputDir$1, { provider: "aws-apigatewayv2" });
127
- expect(routes).toHaveLength(1);
128
- const handlerPath = join(outputDir$1, "testEndpoint.ts");
129
- const handlerContent = await readFile(handlerPath, "utf-8");
130
- expect(handlerContent).toContain("AmazonApiGatewayV2Endpoint");
131
- expect(handlerContent).toContain("import { testEndpoint }");
132
- });
133
- itWithDir("should return empty array for empty constructs", async ({ dir }) => {
134
- const outputDir$1 = join(dir, "output");
135
- const routes = await generator.build(context, [], outputDir$1);
136
- expect(routes).toEqual([]);
137
- });
138
- itWithDir("should use default provider when none specified", async ({ dir }) => {
139
- const outputDir$1 = join(dir, "output");
140
- const routesDir = join(dir, "routes");
141
- await mkdir(outputDir$1, { recursive: true });
142
- await createMockEndpointFile(routesDir, "testEndpoint.ts", "testEndpoint", "/test", "GET");
143
- const constructs = await generator.load("**/routes/*.ts", dir);
144
- const routes = await generator.build(context, constructs, outputDir$1);
145
- expect(routes).toHaveLength(1);
146
- const handlerPath = join(outputDir$1, "testEndpoint.ts");
147
- const handlerContent = await readFile(handlerPath, "utf-8");
148
- expect(handlerContent).toContain("AmazonApiGatewayV2Endpoint");
149
- });
150
- itWithDir("should throw error for unsupported provider", async ({ dir }) => {
151
- const outputDir$1 = join(dir, "output");
152
- const constructs = [createTestEndpointConstruct("testEndpoint", "/test", "GET", dir)];
153
- await expect(generator.build(context, constructs, outputDir$1, { provider: "unsupported" })).rejects.toThrow("Unsupported provider: unsupported");
154
- });
155
- itWithDir("should generate correct import paths for nested files", async ({ dir }) => {
156
- const outputDir$1 = join(dir, "output");
157
- const nestedDir = join(dir, "src", "api", "endpoints");
158
- await mkdir(outputDir$1, { recursive: true });
159
- await createMockEndpointFile(nestedDir, "deepEndpoint.ts", "deepEndpoint", "/deep", "GET");
160
- const constructs = await generator.load("**/src/api/endpoints/*.ts", dir);
161
- await generator.build(context, constructs, outputDir$1, { provider: "aws-apigatewayv2" });
162
- const handlerPath = join(outputDir$1, "deepEndpoint.ts");
163
- const handlerContent = await readFile(handlerPath, "utf-8");
164
- expect(handlerContent).toContain("from '../src/api/endpoints/deepEndpoint.js'");
165
- expect(handlerContent).toMatch(/from ['"]\.\.\/\.\.\/\.\.\/.*\/env['"]/);
166
- });
167
- itWithDir("should log generation progress", async ({ dir }) => {
168
- const logSpy = vi.spyOn(console, "log");
169
- const outputDir$1 = join(dir, "output");
170
- const routesDir = join(dir, "routes");
171
- await mkdir(outputDir$1, { recursive: true });
172
- await Promise.all([createMockEndpointFile(routesDir, "endpoint1.ts", "endpoint1", "/test1", "GET"), createMockEndpointFile(routesDir, "endpoint2.ts", "endpoint2", "/test2", "POST")]);
173
- const constructs = await generator.load("**/routes/*.ts", dir);
174
- await generator.build(context, constructs, outputDir$1, { provider: "server" });
175
- expect(logSpy).toHaveBeenCalledWith("Generated server app with 2 endpoints");
176
- logSpy.mockRestore();
177
- });
178
- });
179
-
180
- //#endregion
181
- //# sourceMappingURL=EndpointGenerator.spec.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EndpointGenerator.spec.mjs","names":["tempDir: string","outputDir: string","generator: EndpointGenerator","context: ReturnType<typeof createMockBuildContext>","key: string","path: string","method: HttpMethod","dir: string","outputDir"],"sources":["../../../src/generators/__tests__/EndpointGenerator.spec.ts"],"sourcesContent":["import { mkdir, readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Endpoint } from '@geekmidas/api/server';\nimport { itWithDir } from '@geekmidas/testkit/os';\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';\nimport type { HttpMethod } from '../../../../api/src/constructs/types';\nimport {\n createMockBuildContext,\n createMockEndpointFile,\n createTestEndpoint,\n} from '../../__tests__/test-helpers';\nimport { EndpointGenerator } from '../EndpointGenerator';\nimport type { GeneratedConstruct } from '../Generator';\n\ndescribe('EndpointGenerator', () => {\n let tempDir: string;\n let outputDir: string;\n let generator: EndpointGenerator;\n let context: ReturnType<typeof createMockBuildContext>;\n\n beforeEach(async () => {\n generator = new EndpointGenerator();\n context = createMockBuildContext();\n });\n\n afterEach(async () => {});\n\n it('should identify valid endpoints', () => {\n const testEndpoint = createTestEndpoint('/test', 'GET');\n expect(generator.isConstruct(testEndpoint)).toBe(true);\n });\n\n it('should reject invalid constructs', () => {\n expect(generator.isConstruct({})).toBe(false);\n expect(generator.isConstruct('string')).toBe(false);\n expect(generator.isConstruct(null)).toBe(false);\n });\n\n const createTestEndpointConstruct = (\n key: string,\n path: string,\n method: HttpMethod,\n dir: string,\n ): GeneratedConstruct<Endpoint<any, any, any, any, any, any>> => ({\n key,\n name: key.toLowerCase(),\n construct: createTestEndpoint(path, method),\n path: {\n absolute: join(dir, `${key}.ts`),\n relative: `./${key}.ts`,\n },\n });\n\n itWithDir('should generate a single server app file', async ({ dir }) => {\n const outputDir = join(dir, 'output');\n const routesDir = join(dir, 'routes');\n await mkdir(outputDir, { recursive: true });\n\n await Promise.all([\n createMockEndpointFile(\n routesDir,\n 'testEndpoint.ts',\n 'testEndpoint',\n '/test',\n 'GET',\n ),\n createMockEndpointFile(\n routesDir,\n 'anotherEndpoint.ts',\n 'anotherEndpoint',\n '/another',\n 'POST',\n ),\n ]);\n\n const constructs = await generator.load('**/routes/*.ts', dir);\n\n const routes = await generator.build(context, constructs, outputDir, {\n provider: 'server',\n enableOpenApi: true,\n });\n\n expect(routes).toHaveLength(1);\n expect(routes[0]).toMatchObject({\n path: '*',\n method: 'ALL',\n handler: expect.stringContaining('app.ts'),\n });\n\n // Check that the app.ts file was created\n const appPath = join(outputDir, 'app.ts');\n const appContent = await readFile(appPath, 'utf-8');\n\n expect(appContent).toContain('import { HonoEndpoint }');\n expect(appContent).toContain('import { testEndpoint }');\n expect(appContent).toContain('import { anotherEndpoint }');\n expect(appContent).toContain('enableOpenApi: boolean = true');\n expect(appContent).toContain(\"docsPath: '/docs'\");\n });\n\n itWithDir(\n 'should generate server app without OpenAPI when disabled',\n async ({ dir }) => {\n const outputDir = join(dir, 'output');\n const routesDir = join(dir, 'routes');\n await mkdir(outputDir, { recursive: true });\n\n await createMockEndpointFile(\n routesDir,\n 'testEndpoint.ts',\n 'testEndpoint',\n '/test',\n 'GET',\n );\n\n const constructs = await generator.load('**/routes/*.ts', dir);\n\n await generator.build(context, constructs, outputDir, {\n provider: 'server',\n enableOpenApi: false,\n });\n\n const appPath = join(outputDir, 'app.ts');\n const appContent = await readFile(appPath, 'utf-8');\n\n expect(appContent).toContain('enableOpenApi: boolean = false');\n expect(appContent).toContain('docsPath: false');\n },\n );\n\n itWithDir(\n 'should generate individual handlers in routes subdirectory',\n async ({ dir }) => {\n const outputDir = join(dir, 'output');\n const routesDir = join(dir, 'routes');\n await mkdir(outputDir, { recursive: true });\n\n await Promise.all([\n createMockEndpointFile(\n routesDir,\n 'testEndpoint.ts',\n 'testEndpoint',\n '/test',\n 'GET',\n ),\n createMockEndpointFile(\n routesDir,\n 'anotherEndpoint.ts',\n 'anotherEndpoint',\n '/another',\n 'POST',\n ),\n ]);\n\n const constructs = await generator.load('**/routes/*.ts', dir);\n\n const routes = await generator.build(context, constructs, outputDir, {\n provider: 'aws-lambda',\n });\n\n expect(routes).toHaveLength(2);\n\n // Find routes by their path since order may vary\n const testRoute = routes.find((r) => r.path === '/test');\n const anotherRoute = routes.find((r) => r.path === '/another');\n\n expect(testRoute).toMatchObject({\n path: '/test',\n method: 'GET',\n handler: expect.stringContaining('routes/testEndpoint.handler'),\n });\n expect(anotherRoute).toMatchObject({\n path: '/another',\n method: 'POST',\n handler: expect.stringContaining('routes/anotherEndpoint.handler'),\n });\n\n // Check that handler files were created\n const testHandlerPath = join(outputDir, 'routes', 'testEndpoint.ts');\n const testHandlerContent = await readFile(testHandlerPath, 'utf-8');\n expect(testHandlerContent).toContain('AmazonApiGatewayV2Endpoint');\n expect(testHandlerContent).toContain('import { testEndpoint }');\n\n const anotherHandlerPath = join(\n outputDir,\n 'routes',\n 'anotherEndpoint.ts',\n );\n const anotherHandlerContent = await readFile(anotherHandlerPath, 'utf-8');\n expect(anotherHandlerContent).toContain('AmazonApiGatewayV2Endpoint');\n expect(anotherHandlerContent).toContain('import { anotherEndpoint }');\n },\n );\n\n itWithDir(\n 'should generate individual handlers with v1 adapter',\n async ({ dir }) => {\n const outputDir = join(dir, 'output');\n const routesDir = join(dir, 'routes');\n await mkdir(outputDir, { recursive: true });\n\n await createMockEndpointFile(\n routesDir,\n 'testEndpoint.ts',\n 'testEndpoint',\n '/test',\n 'GET',\n );\n\n const constructs = await generator.load('**/routes/*.ts', dir);\n\n const routes = await generator.build(context, constructs, outputDir, {\n provider: 'aws-apigatewayv1',\n });\n\n expect(routes).toHaveLength(1);\n\n const handlerPath = join(outputDir, 'testEndpoint.ts');\n const handlerContent = await readFile(handlerPath, 'utf-8');\n expect(handlerContent).toContain('AmazonApiGatewayV1Endpoint');\n expect(handlerContent).toContain('import { testEndpoint }');\n },\n );\n\n itWithDir(\n 'should generate individual handlers with v2 adapter',\n async ({ dir }) => {\n const outputDir = join(dir, 'output');\n const routesDir = join(dir, 'routes');\n await mkdir(outputDir, { recursive: true });\n\n await createMockEndpointFile(\n routesDir,\n 'testEndpoint.ts',\n 'testEndpoint',\n '/test',\n 'GET',\n );\n\n const constructs = await generator.load('**/routes/*.ts', dir);\n\n const routes = await generator.build(context, constructs, outputDir, {\n provider: 'aws-apigatewayv2',\n });\n\n expect(routes).toHaveLength(1);\n\n const handlerPath = join(outputDir, 'testEndpoint.ts');\n const handlerContent = await readFile(handlerPath, 'utf-8');\n expect(handlerContent).toContain('AmazonApiGatewayV2Endpoint');\n expect(handlerContent).toContain('import { testEndpoint }');\n },\n );\n\n itWithDir(\n 'should return empty array for empty constructs',\n async ({ dir }) => {\n const outputDir = join(dir, 'output');\n const routes = await generator.build(context, [], outputDir);\n expect(routes).toEqual([]);\n },\n );\n\n itWithDir(\n 'should use default provider when none specified',\n async ({ dir }) => {\n const outputDir = join(dir, 'output');\n const routesDir = join(dir, 'routes');\n await mkdir(outputDir, { recursive: true });\n\n await createMockEndpointFile(\n routesDir,\n 'testEndpoint.ts',\n 'testEndpoint',\n '/test',\n 'GET',\n );\n\n const constructs = await generator.load('**/routes/*.ts', dir);\n\n const routes = await generator.build(context, constructs, outputDir);\n\n expect(routes).toHaveLength(1);\n\n // Should use default aws-apigatewayv2\n const handlerPath = join(outputDir, 'testEndpoint.ts');\n const handlerContent = await readFile(handlerPath, 'utf-8');\n expect(handlerContent).toContain('AmazonApiGatewayV2Endpoint');\n },\n );\n\n itWithDir('should throw error for unsupported provider', async ({ dir }) => {\n const outputDir = join(dir, 'output');\n const constructs = [\n createTestEndpointConstruct('testEndpoint', '/test', 'GET', dir),\n ];\n\n await expect(\n generator.build(context, constructs, outputDir, {\n provider: 'unsupported' as any,\n }),\n ).rejects.toThrow('Unsupported provider: unsupported');\n });\n\n itWithDir(\n 'should generate correct import paths for nested files',\n async ({ dir }) => {\n const outputDir = join(dir, 'output');\n const nestedDir = join(dir, 'src', 'api', 'endpoints');\n await mkdir(outputDir, { recursive: true });\n\n await createMockEndpointFile(\n nestedDir,\n 'deepEndpoint.ts',\n 'deepEndpoint',\n '/deep',\n 'GET',\n );\n\n const constructs = await generator.load('**/src/api/endpoints/*.ts', dir);\n\n await generator.build(context, constructs, outputDir, {\n provider: 'aws-apigatewayv2',\n });\n\n const handlerPath = join(outputDir, 'deepEndpoint.ts');\n const handlerContent = await readFile(handlerPath, 'utf-8');\n\n // Check that relative imports are correct\n expect(handlerContent).toContain(\n \"from '../src/api/endpoints/deepEndpoint.js'\",\n );\n expect(handlerContent).toMatch(/from ['\"]\\.\\.\\/\\.\\.\\/\\.\\.\\/.*\\/env['\"]/);\n },\n );\n\n itWithDir('should log generation progress', async ({ dir }) => {\n const logSpy = vi.spyOn(console, 'log');\n const outputDir = join(dir, 'output');\n const routesDir = join(dir, 'routes');\n await mkdir(outputDir, { recursive: true });\n\n await Promise.all([\n createMockEndpointFile(\n routesDir,\n 'endpoint1.ts',\n 'endpoint1',\n '/test1',\n 'GET',\n ),\n createMockEndpointFile(\n routesDir,\n 'endpoint2.ts',\n 'endpoint2',\n '/test2',\n 'POST',\n ),\n ]);\n\n const constructs = await generator.load('**/routes/*.ts', dir);\n\n await generator.build(context, constructs, outputDir, {\n provider: 'server',\n });\n\n expect(logSpy).toHaveBeenCalledWith(\n 'Generated server app with 2 endpoints',\n );\n\n logSpy.mockRestore();\n });\n});\n"],"mappings":";;;;;;;;;;AAcA,SAAS,qBAAqB,MAAM;CAClC,IAAIA;CACJ,IAAIC;CACJ,IAAIC;CACJ,IAAIC;AAEJ,YAAW,YAAY;AACrB,cAAY,IAAI;AAChB,YAAU,wBAAwB;CACnC,EAAC;AAEF,WAAU,YAAY,CAAE,EAAC;AAEzB,IAAG,mCAAmC,MAAM;EAC1C,MAAM,eAAe,mBAAmB,SAAS,MAAM;AACvD,SAAO,UAAU,YAAY,aAAa,CAAC,CAAC,KAAK,KAAK;CACvD,EAAC;AAEF,IAAG,oCAAoC,MAAM;AAC3C,SAAO,UAAU,YAAY,CAAE,EAAC,CAAC,CAAC,KAAK,MAAM;AAC7C,SAAO,UAAU,YAAY,SAAS,CAAC,CAAC,KAAK,MAAM;AACnD,SAAO,UAAU,YAAY,KAAK,CAAC,CAAC,KAAK,MAAM;CAChD,EAAC;CAEF,MAAM,8BAA8B,CAClCC,KACAC,MACAC,QACAC,SACgE;EAChE;EACA,MAAM,IAAI,aAAa;EACvB,WAAW,mBAAmB,MAAM,OAAO;EAC3C,MAAM;GACJ,UAAU,KAAK,MAAM,EAAE,IAAI,KAAK;GAChC,WAAW,IAAI,IAAI;EACpB;CACF;AAED,WAAU,4CAA4C,OAAO,EAAE,KAAK,KAAK;EACvE,MAAMC,cAAY,KAAK,KAAK,SAAS;EACrC,MAAM,YAAY,KAAK,KAAK,SAAS;AACrC,QAAM,MAAMA,aAAW,EAAE,WAAW,KAAM,EAAC;AAE3C,QAAM,QAAQ,IAAI,CAChB,uBACE,WACA,mBACA,gBACA,SACA,MACD,EACD,uBACE,WACA,sBACA,mBACA,YACA,OACD,AACF,EAAC;EAEF,MAAM,aAAa,MAAM,UAAU,KAAK,kBAAkB,IAAI;EAE9D,MAAM,SAAS,MAAM,UAAU,MAAM,SAAS,YAAYA,aAAW;GACnE,UAAU;GACV,eAAe;EAChB,EAAC;AAEF,SAAO,OAAO,CAAC,aAAa,EAAE;AAC9B,SAAO,OAAO,GAAG,CAAC,cAAc;GAC9B,MAAM;GACN,QAAQ;GACR,SAAS,OAAO,iBAAiB,SAAS;EAC3C,EAAC;EAGF,MAAM,UAAU,KAAKA,aAAW,SAAS;EACzC,MAAM,aAAa,MAAM,SAAS,SAAS,QAAQ;AAEnD,SAAO,WAAW,CAAC,UAAU,0BAA0B;AACvD,SAAO,WAAW,CAAC,UAAU,0BAA0B;AACvD,SAAO,WAAW,CAAC,UAAU,6BAA6B;AAC1D,SAAO,WAAW,CAAC,UAAU,gCAAgC;AAC7D,SAAO,WAAW,CAAC,UAAU,oBAAoB;CAClD,EAAC;AAEF,WACE,4DACA,OAAO,EAAE,KAAK,KAAK;EACjB,MAAMA,cAAY,KAAK,KAAK,SAAS;EACrC,MAAM,YAAY,KAAK,KAAK,SAAS;AACrC,QAAM,MAAMA,aAAW,EAAE,WAAW,KAAM,EAAC;AAE3C,QAAM,uBACJ,WACA,mBACA,gBACA,SACA,MACD;EAED,MAAM,aAAa,MAAM,UAAU,KAAK,kBAAkB,IAAI;AAE9D,QAAM,UAAU,MAAM,SAAS,YAAYA,aAAW;GACpD,UAAU;GACV,eAAe;EAChB,EAAC;EAEF,MAAM,UAAU,KAAKA,aAAW,SAAS;EACzC,MAAM,aAAa,MAAM,SAAS,SAAS,QAAQ;AAEnD,SAAO,WAAW,CAAC,UAAU,iCAAiC;AAC9D,SAAO,WAAW,CAAC,UAAU,kBAAkB;CAChD,EACF;AAED,WACE,8DACA,OAAO,EAAE,KAAK,KAAK;EACjB,MAAMA,cAAY,KAAK,KAAK,SAAS;EACrC,MAAM,YAAY,KAAK,KAAK,SAAS;AACrC,QAAM,MAAMA,aAAW,EAAE,WAAW,KAAM,EAAC;AAE3C,QAAM,QAAQ,IAAI,CAChB,uBACE,WACA,mBACA,gBACA,SACA,MACD,EACD,uBACE,WACA,sBACA,mBACA,YACA,OACD,AACF,EAAC;EAEF,MAAM,aAAa,MAAM,UAAU,KAAK,kBAAkB,IAAI;EAE9D,MAAM,SAAS,MAAM,UAAU,MAAM,SAAS,YAAYA,aAAW,EACnE,UAAU,aACX,EAAC;AAEF,SAAO,OAAO,CAAC,aAAa,EAAE;EAG9B,MAAM,YAAY,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;EACxD,MAAM,eAAe,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW;AAE9D,SAAO,UAAU,CAAC,cAAc;GAC9B,MAAM;GACN,QAAQ;GACR,SAAS,OAAO,iBAAiB,8BAA8B;EAChE,EAAC;AACF,SAAO,aAAa,CAAC,cAAc;GACjC,MAAM;GACN,QAAQ;GACR,SAAS,OAAO,iBAAiB,iCAAiC;EACnE,EAAC;EAGF,MAAM,kBAAkB,KAAKA,aAAW,UAAU,kBAAkB;EACpE,MAAM,qBAAqB,MAAM,SAAS,iBAAiB,QAAQ;AACnE,SAAO,mBAAmB,CAAC,UAAU,6BAA6B;AAClE,SAAO,mBAAmB,CAAC,UAAU,0BAA0B;EAE/D,MAAM,qBAAqB,KACzBA,aACA,UACA,qBACD;EACD,MAAM,wBAAwB,MAAM,SAAS,oBAAoB,QAAQ;AACzE,SAAO,sBAAsB,CAAC,UAAU,6BAA6B;AACrE,SAAO,sBAAsB,CAAC,UAAU,6BAA6B;CACtE,EACF;AAED,WACE,uDACA,OAAO,EAAE,KAAK,KAAK;EACjB,MAAMA,cAAY,KAAK,KAAK,SAAS;EACrC,MAAM,YAAY,KAAK,KAAK,SAAS;AACrC,QAAM,MAAMA,aAAW,EAAE,WAAW,KAAM,EAAC;AAE3C,QAAM,uBACJ,WACA,mBACA,gBACA,SACA,MACD;EAED,MAAM,aAAa,MAAM,UAAU,KAAK,kBAAkB,IAAI;EAE9D,MAAM,SAAS,MAAM,UAAU,MAAM,SAAS,YAAYA,aAAW,EACnE,UAAU,mBACX,EAAC;AAEF,SAAO,OAAO,CAAC,aAAa,EAAE;EAE9B,MAAM,cAAc,KAAKA,aAAW,kBAAkB;EACtD,MAAM,iBAAiB,MAAM,SAAS,aAAa,QAAQ;AAC3D,SAAO,eAAe,CAAC,UAAU,6BAA6B;AAC9D,SAAO,eAAe,CAAC,UAAU,0BAA0B;CAC5D,EACF;AAED,WACE,uDACA,OAAO,EAAE,KAAK,KAAK;EACjB,MAAMA,cAAY,KAAK,KAAK,SAAS;EACrC,MAAM,YAAY,KAAK,KAAK,SAAS;AACrC,QAAM,MAAMA,aAAW,EAAE,WAAW,KAAM,EAAC;AAE3C,QAAM,uBACJ,WACA,mBACA,gBACA,SACA,MACD;EAED,MAAM,aAAa,MAAM,UAAU,KAAK,kBAAkB,IAAI;EAE9D,MAAM,SAAS,MAAM,UAAU,MAAM,SAAS,YAAYA,aAAW,EACnE,UAAU,mBACX,EAAC;AAEF,SAAO,OAAO,CAAC,aAAa,EAAE;EAE9B,MAAM,cAAc,KAAKA,aAAW,kBAAkB;EACtD,MAAM,iBAAiB,MAAM,SAAS,aAAa,QAAQ;AAC3D,SAAO,eAAe,CAAC,UAAU,6BAA6B;AAC9D,SAAO,eAAe,CAAC,UAAU,0BAA0B;CAC5D,EACF;AAED,WACE,kDACA,OAAO,EAAE,KAAK,KAAK;EACjB,MAAMA,cAAY,KAAK,KAAK,SAAS;EACrC,MAAM,SAAS,MAAM,UAAU,MAAM,SAAS,CAAE,GAAEA,YAAU;AAC5D,SAAO,OAAO,CAAC,QAAQ,CAAE,EAAC;CAC3B,EACF;AAED,WACE,mDACA,OAAO,EAAE,KAAK,KAAK;EACjB,MAAMA,cAAY,KAAK,KAAK,SAAS;EACrC,MAAM,YAAY,KAAK,KAAK,SAAS;AACrC,QAAM,MAAMA,aAAW,EAAE,WAAW,KAAM,EAAC;AAE3C,QAAM,uBACJ,WACA,mBACA,gBACA,SACA,MACD;EAED,MAAM,aAAa,MAAM,UAAU,KAAK,kBAAkB,IAAI;EAE9D,MAAM,SAAS,MAAM,UAAU,MAAM,SAAS,YAAYA,YAAU;AAEpE,SAAO,OAAO,CAAC,aAAa,EAAE;EAG9B,MAAM,cAAc,KAAKA,aAAW,kBAAkB;EACtD,MAAM,iBAAiB,MAAM,SAAS,aAAa,QAAQ;AAC3D,SAAO,eAAe,CAAC,UAAU,6BAA6B;CAC/D,EACF;AAED,WAAU,+CAA+C,OAAO,EAAE,KAAK,KAAK;EAC1E,MAAMA,cAAY,KAAK,KAAK,SAAS;EACrC,MAAM,aAAa,CACjB,4BAA4B,gBAAgB,SAAS,OAAO,IAAI,AACjE;AAED,QAAM,OACJ,UAAU,MAAM,SAAS,YAAYA,aAAW,EAC9C,UAAU,cACX,EAAC,CACH,CAAC,QAAQ,QAAQ,oCAAoC;CACvD,EAAC;AAEF,WACE,yDACA,OAAO,EAAE,KAAK,KAAK;EACjB,MAAMA,cAAY,KAAK,KAAK,SAAS;EACrC,MAAM,YAAY,KAAK,KAAK,OAAO,OAAO,YAAY;AACtD,QAAM,MAAMA,aAAW,EAAE,WAAW,KAAM,EAAC;AAE3C,QAAM,uBACJ,WACA,mBACA,gBACA,SACA,MACD;EAED,MAAM,aAAa,MAAM,UAAU,KAAK,6BAA6B,IAAI;AAEzE,QAAM,UAAU,MAAM,SAAS,YAAYA,aAAW,EACpD,UAAU,mBACX,EAAC;EAEF,MAAM,cAAc,KAAKA,aAAW,kBAAkB;EACtD,MAAM,iBAAiB,MAAM,SAAS,aAAa,QAAQ;AAG3D,SAAO,eAAe,CAAC,UACrB,8CACD;AACD,SAAO,eAAe,CAAC,QAAQ,yCAAyC;CACzE,EACF;AAED,WAAU,kCAAkC,OAAO,EAAE,KAAK,KAAK;EAC7D,MAAM,SAAS,GAAG,MAAM,SAAS,MAAM;EACvC,MAAMA,cAAY,KAAK,KAAK,SAAS;EACrC,MAAM,YAAY,KAAK,KAAK,SAAS;AACrC,QAAM,MAAMA,aAAW,EAAE,WAAW,KAAM,EAAC;AAE3C,QAAM,QAAQ,IAAI,CAChB,uBACE,WACA,gBACA,aACA,UACA,MACD,EACD,uBACE,WACA,gBACA,aACA,UACA,OACD,AACF,EAAC;EAEF,MAAM,aAAa,MAAM,UAAU,KAAK,kBAAkB,IAAI;AAE9D,QAAM,UAAU,MAAM,SAAS,YAAYA,aAAW,EACpD,UAAU,SACX,EAAC;AAEF,SAAO,OAAO,CAAC,qBACb,wCACD;AAED,SAAO,aAAa;CACrB,EAAC;AACH,EAAC"}
@@ -1,152 +0,0 @@
1
- const require_chunk = require('../../chunk-CsX-DzYB.cjs');
2
- require('../../Generator-C3tYSTQY.cjs');
3
- const require_FunctionGenerator = require('../../FunctionGenerator-DN681IUn.cjs');
4
- require('../../esm-Crmo4h9t.cjs');
5
- const require_test_helpers = require('../../test-helpers-ARd8GDgx.cjs');
6
- const node_fs_promises = require_chunk.__toESM(require("node:fs/promises"));
7
- const node_path = require_chunk.__toESM(require("node:path"));
8
- const __geekmidas_api_constructs = require_chunk.__toESM(require("@geekmidas/api/constructs"));
9
- const vitest = require_chunk.__toESM(require("vitest"));
10
-
11
- //#region src/generators/__tests__/FunctionGenerator.spec.ts
12
- (0, vitest.describe)("FunctionGenerator", () => {
13
- let tempDir;
14
- let outputDir;
15
- let generator;
16
- let context;
17
- (0, vitest.beforeEach)(async () => {
18
- tempDir = await require_test_helpers.createTempDir();
19
- outputDir = (0, node_path.join)(tempDir, "output");
20
- generator = new require_FunctionGenerator.FunctionGenerator();
21
- context = require_test_helpers.createMockBuildContext();
22
- });
23
- (0, vitest.afterEach)(async () => {
24
- await require_test_helpers.cleanupDir(tempDir);
25
- });
26
- (0, vitest.describe)("isConstruct", () => {
27
- (0, vitest.it)("should identify valid functions", async () => {
28
- const { z } = await Promise.resolve().then(() => require("../../esm-w09tAC4l.cjs"));
29
- const testFunction = new __geekmidas_api_constructs.FunctionBuilder().input(z.object({ name: z.string() })).output(z.object({ greeting: z.string() })).timeout(30).handle(async ({ input }) => ({ greeting: `Hello, ${input.name}!` }));
30
- (0, vitest.expect)(generator.isConstruct(testFunction)).toBe(true);
31
- });
32
- (0, vitest.it)("should reject invalid constructs", () => {
33
- (0, vitest.expect)(generator.isConstruct({})).toBe(false);
34
- (0, vitest.expect)(generator.isConstruct("string")).toBe(false);
35
- (0, vitest.expect)(generator.isConstruct(null)).toBe(false);
36
- });
37
- });
38
- (0, vitest.describe)("build", () => {
39
- const createTestFunctionConstruct = (key, timeout = 30) => ({
40
- key,
41
- name: key.toLowerCase(),
42
- construct: {
43
- __IS_FUNCTION__: true,
44
- type: "dev.geekmidas.function.function",
45
- timeout,
46
- handle: async () => ({ greeting: "Hello!" })
47
- },
48
- path: {
49
- absolute: (0, node_path.join)(tempDir, `${key}.ts`),
50
- relative: `${key}.ts`
51
- }
52
- });
53
- (0, vitest.describe)("aws-lambda provider", () => {
54
- (0, vitest.it)("should generate function handlers", async () => {
55
- const constructs = [createTestFunctionConstruct("processData", 60), createTestFunctionConstruct("sendEmail", 30)];
56
- const functionInfos = await generator.build(context, constructs, outputDir, { provider: "aws-lambda" });
57
- (0, vitest.expect)(functionInfos).toHaveLength(2);
58
- (0, vitest.expect)(functionInfos[0]).toMatchObject({
59
- name: "processData",
60
- handler: vitest.expect.stringContaining("functions/processData.handler"),
61
- timeout: 60
62
- });
63
- (0, vitest.expect)(functionInfos[1]).toMatchObject({
64
- name: "sendEmail",
65
- handler: vitest.expect.stringContaining("functions/sendEmail.handler"),
66
- timeout: 30
67
- });
68
- const processDataHandlerPath = (0, node_path.join)(outputDir, "functions", "processData.ts");
69
- const processDataContent = await (0, node_fs_promises.readFile)(processDataHandlerPath, "utf-8");
70
- (0, vitest.expect)(processDataContent).toContain("AWSLambdaFunction");
71
- (0, vitest.expect)(processDataContent).toContain("import { processData }");
72
- (0, vitest.expect)(processDataContent).toContain("import envParser");
73
- (0, vitest.expect)(processDataContent).toContain("import logger");
74
- const sendEmailHandlerPath = (0, node_path.join)(outputDir, "functions", "sendEmail.ts");
75
- const sendEmailContent = await (0, node_fs_promises.readFile)(sendEmailHandlerPath, "utf-8");
76
- (0, vitest.expect)(sendEmailContent).toContain("AWSLambdaFunction");
77
- (0, vitest.expect)(sendEmailContent).toContain("import { sendEmail }");
78
- });
79
- (0, vitest.it)("should generate correct relative import paths", async () => {
80
- const construct = {
81
- key: "deepFunction",
82
- name: "deep-function",
83
- construct: createTestFunctionConstruct("deepFunction", 45).construct,
84
- path: {
85
- absolute: (0, node_path.join)(tempDir, "src/functions/deep/processor.ts"),
86
- relative: "src/functions/deep/processor.ts"
87
- }
88
- };
89
- await generator.build(context, [construct], outputDir, { provider: "aws-lambda" });
90
- const handlerPath = (0, node_path.join)(outputDir, "functions", "deepFunction.ts");
91
- const handlerContent = await (0, node_fs_promises.readFile)(handlerPath, "utf-8");
92
- (0, vitest.expect)(handlerContent).toMatch(/from ['"].*src\/functions\/deep\/processor\.js['"]/);
93
- (0, vitest.expect)(handlerContent).toMatch(/from ['"].*\/env['"]/);
94
- (0, vitest.expect)(handlerContent).toMatch(/from ['"].*\/logger['"]/);
95
- });
96
- (0, vitest.it)("should log generation progress", async () => {
97
- const logSpy = vitest.vi.spyOn(console, "log");
98
- const constructs = [createTestFunctionConstruct("testFunction", 30)];
99
- await generator.build(context, constructs, outputDir, { provider: "aws-lambda" });
100
- (0, vitest.expect)(logSpy).toHaveBeenCalledWith("Generated function handler: testFunction");
101
- logSpy.mockRestore();
102
- });
103
- });
104
- (0, vitest.describe)("non aws-lambda provider", () => {
105
- (0, vitest.it)("should return empty array for server provider", async () => {
106
- const constructs = [createTestFunctionConstruct("testFunction", 30)];
107
- const functionInfos = await generator.build(context, constructs, outputDir, { provider: "server" });
108
- (0, vitest.expect)(functionInfos).toEqual([]);
109
- });
110
- (0, vitest.it)("should return empty array for aws-apigatewayv1 provider", async () => {
111
- const constructs = [createTestFunctionConstruct("testFunction", 30)];
112
- const functionInfos = await generator.build(context, constructs, outputDir, { provider: "aws-apigatewayv1" });
113
- (0, vitest.expect)(functionInfos).toEqual([]);
114
- });
115
- });
116
- (0, vitest.it)("should return empty array for empty constructs", async () => {
117
- const functionInfos = await generator.build(context, [], outputDir, { provider: "aws-lambda" });
118
- (0, vitest.expect)(functionInfos).toEqual([]);
119
- });
120
- (0, vitest.it)("should use default provider when none specified", async () => {
121
- const constructs = [createTestFunctionConstruct("defaultFunction", 30)];
122
- const functionInfos = await generator.build(context, constructs, outputDir);
123
- (0, vitest.expect)(functionInfos).toHaveLength(1);
124
- (0, vitest.expect)(functionInfos[0].name).toBe("defaultFunction");
125
- const handlerPath = (0, node_path.join)(outputDir, "functions", "defaultFunction.ts");
126
- const handlerContent = await (0, node_fs_promises.readFile)(handlerPath, "utf-8");
127
- (0, vitest.expect)(handlerContent).toContain("AWSLambdaFunction");
128
- });
129
- (0, vitest.it)("should handle functions with different timeout values", async () => {
130
- const constructs = [createTestFunctionConstruct("quickFunction", 15), createTestFunctionConstruct("slowFunction", 300)];
131
- const functionInfos = await generator.build(context, constructs, outputDir, { provider: "aws-lambda" });
132
- (0, vitest.expect)(functionInfos[0].timeout).toBe(15);
133
- (0, vitest.expect)(functionInfos[1].timeout).toBe(300);
134
- });
135
- (0, vitest.it)("should handle functions with custom environment parser patterns", async () => {
136
- const customContext = {
137
- ...context,
138
- envParserImportPattern: "{ customParser as envParser }",
139
- loggerImportPattern: "{ customLogger as logger }"
140
- };
141
- const constructs = [createTestFunctionConstruct("customFunction", 30)];
142
- await generator.build(customContext, constructs, outputDir, { provider: "aws-lambda" });
143
- const handlerPath = (0, node_path.join)(outputDir, "functions", "customFunction.ts");
144
- const handlerContent = await (0, node_fs_promises.readFile)(handlerPath, "utf-8");
145
- (0, vitest.expect)(handlerContent).toContain("import { customParser as envParser }");
146
- (0, vitest.expect)(handlerContent).toContain("import { customLogger as logger }");
147
- });
148
- });
149
- });
150
-
151
- //#endregion
152
- //# sourceMappingURL=FunctionGenerator.spec.cjs.map