@geekmidas/cli 0.1.0 → 0.2.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 (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-BfMZCVNy.cjs +204 -0
  19. package/dist/SubscriberGenerator-BfMZCVNy.cjs.map +1 -0
  20. package/dist/SubscriberGenerator-D2u00NI3.mjs +198 -0
  21. package/dist/SubscriberGenerator-D2u00NI3.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-BBhlEjf5.cjs +89 -0
  28. package/dist/build-BBhlEjf5.cjs.map +1 -0
  29. package/dist/build-kY-lG30Q.mjs +83 -0
  30. package/dist/build-kY-lG30Q.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 +271 -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 +341 -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,98 +0,0 @@
1
- const require_chunk = require('../chunk-CsX-DzYB.cjs');
2
- const require_config = require('../config-RcNESK0T.cjs');
3
- require('../esm-Crmo4h9t.cjs');
4
- const require_test_helpers = require('../test-helpers-ARd8GDgx.cjs');
5
- const node_fs_promises = require_chunk.__toESM(require("node:fs/promises"));
6
- const node_path = require_chunk.__toESM(require("node:path"));
7
- const vitest = require_chunk.__toESM(require("vitest"));
8
-
9
- //#region src/__tests__/config.spec.ts
10
- (0, vitest.describe)("loadConfig", () => {
11
- let tempDir;
12
- let originalCwd;
13
- (0, vitest.beforeEach)(async () => {
14
- tempDir = await require_test_helpers.createTempDir();
15
- originalCwd = process.cwd();
16
- process.chdir(tempDir);
17
- });
18
- (0, vitest.afterEach)(async () => {
19
- process.chdir(originalCwd);
20
- await require_test_helpers.cleanupDir(tempDir);
21
- });
22
- (0, vitest.it)("should load configuration from gkm.config.ts", async () => {
23
- const configContent = `
24
- export default {
25
- routes: './src/endpoints/**/*.ts',
26
- functions: './src/functions/**/*.ts',
27
- crons: './src/crons/**/*.ts',
28
- envParser: './src/config/env',
29
- logger: './src/config/logger',
30
- };
31
- `;
32
- await (0, node_fs_promises.writeFile)((0, node_path.join)(tempDir, "gkm.config.ts"), configContent);
33
- const config = await require_config.loadConfig();
34
- (0, vitest.expect)(config).toEqual({
35
- routes: "./src/endpoints/**/*.ts",
36
- functions: "./src/functions/**/*.ts",
37
- crons: "./src/crons/**/*.ts",
38
- envParser: "./src/config/env",
39
- logger: "./src/config/logger"
40
- });
41
- });
42
- (0, vitest.it)("should load configuration from gkm.config.js", async () => {
43
- const configContent = `
44
- module.exports = {
45
- routes: './api/**/*.js',
46
- envParser: './config/environment',
47
- logger: './config/logging',
48
- };
49
- `;
50
- await (0, node_fs_promises.writeFile)((0, node_path.join)(tempDir, "gkm.config.js"), configContent);
51
- const config = await require_config.loadConfig();
52
- (0, vitest.expect)(config.routes).toBe("./api/**/*.js");
53
- (0, vitest.expect)(config.envParser).toBe("./config/environment");
54
- (0, vitest.expect)(config.logger).toBe("./config/logging");
55
- });
56
- (0, vitest.it)("should handle configuration with only envParser override", async () => {
57
- const configContent = `
58
- export default {
59
- envParser: './my-env#myEnvParser',
60
- logger: './my-logger#myLogger',
61
- };
62
- `;
63
- await (0, node_fs_promises.writeFile)((0, node_path.join)(tempDir, "gkm.config.ts"), configContent);
64
- const config = await require_config.loadConfig();
65
- (0, vitest.expect)(config.envParser).toBe("./my-env#myEnvParser");
66
- (0, vitest.expect)(config.logger).toBe("./my-logger#myLogger");
67
- });
68
- (0, vitest.it)("should handle malformed config file gracefully", async () => {
69
- const invalidConfigContent = `
70
- export default {
71
- routes: './endpoints/**/*.ts'
72
- // Missing comma - syntax error
73
- functions: './functions/**/*.ts'
74
- };
75
- `;
76
- await (0, node_fs_promises.writeFile)((0, node_path.join)(tempDir, "gkm.config.ts"), invalidConfigContent);
77
- await (0, vitest.expect)(require_config.loadConfig()).rejects.toThrow();
78
- });
79
- (0, vitest.it)("should prefer .ts config over .js config", async () => {
80
- const jsConfigContent = `
81
- module.exports = {
82
- routes: './js-routes/**/*.js',
83
- };
84
- `;
85
- const tsConfigContent = `
86
- export default {
87
- routes: './ts-routes/**/*.ts',
88
- };
89
- `;
90
- await (0, node_fs_promises.writeFile)((0, node_path.join)(tempDir, "gkm.config.js"), jsConfigContent);
91
- await (0, node_fs_promises.writeFile)((0, node_path.join)(tempDir, "gkm.config.ts"), tsConfigContent);
92
- const config = await require_config.loadConfig();
93
- (0, vitest.expect)(config.routes).toBe("./ts-routes/**/*.ts");
94
- });
95
- });
96
-
97
- //#endregion
98
- //# sourceMappingURL=config.spec.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.spec.cjs","names":["tempDir: string","originalCwd: string"],"sources":["../../src/__tests__/config.spec.ts"],"sourcesContent":["import { writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { afterEach, beforeEach, describe, expect, it } from 'vitest';\nimport { loadConfig } from '../config';\nimport { cleanupDir, createTempDir } from './test-helpers';\n\ndescribe('loadConfig', () => {\n let tempDir: string;\n let originalCwd: string;\n\n beforeEach(async () => {\n tempDir = await createTempDir();\n originalCwd = process.cwd();\n process.chdir(tempDir);\n });\n\n afterEach(async () => {\n process.chdir(originalCwd);\n await cleanupDir(tempDir);\n });\n\n it('should load configuration from gkm.config.ts', async () => {\n const configContent = `\nexport default {\n routes: './src/endpoints/**/*.ts',\n functions: './src/functions/**/*.ts',\n crons: './src/crons/**/*.ts',\n envParser: './src/config/env',\n logger: './src/config/logger',\n};\n`;\n await writeFile(join(tempDir, 'gkm.config.ts'), configContent);\n\n const config = await loadConfig();\n\n expect(config).toEqual({\n routes: './src/endpoints/**/*.ts',\n functions: './src/functions/**/*.ts',\n crons: './src/crons/**/*.ts',\n envParser: './src/config/env',\n logger: './src/config/logger',\n });\n });\n\n it('should load configuration from gkm.config.js', async () => {\n const configContent = `\nmodule.exports = {\n routes: './api/**/*.js',\n envParser: './config/environment',\n logger: './config/logging',\n};\n`;\n await writeFile(join(tempDir, 'gkm.config.js'), configContent);\n\n const config = await loadConfig();\n\n expect(config.routes).toBe('./api/**/*.js');\n expect(config.envParser).toBe('./config/environment');\n expect(config.logger).toBe('./config/logging');\n });\n\n it('should handle configuration with only envParser override', async () => {\n const configContent = `\nexport default {\n envParser: './my-env#myEnvParser',\n logger: './my-logger#myLogger',\n};\n`;\n await writeFile(join(tempDir, 'gkm.config.ts'), configContent);\n\n const config = await loadConfig();\n\n expect(config.envParser).toBe('./my-env#myEnvParser');\n expect(config.logger).toBe('./my-logger#myLogger');\n });\n\n it('should handle malformed config file gracefully', async () => {\n const invalidConfigContent = `\nexport default {\n routes: './endpoints/**/*.ts'\n // Missing comma - syntax error\n functions: './functions/**/*.ts'\n};\n`;\n await writeFile(join(tempDir, 'gkm.config.ts'), invalidConfigContent);\n\n // Should fall back to defaults when config file has syntax errors\n await expect(loadConfig()).rejects.toThrow();\n });\n\n it('should prefer .ts config over .js config', async () => {\n const jsConfigContent = `\nmodule.exports = {\n routes: './js-routes/**/*.js',\n};\n`;\n const tsConfigContent = `\nexport default {\n routes: './ts-routes/**/*.ts',\n};\n`;\n\n await writeFile(join(tempDir, 'gkm.config.js'), jsConfigContent);\n await writeFile(join(tempDir, 'gkm.config.ts'), tsConfigContent);\n\n const config = await loadConfig();\n\n expect(config.routes).toBe('./ts-routes/**/*.ts');\n });\n});\n"],"mappings":";;;;;;;;;AAMA,qBAAS,cAAc,MAAM;CAC3B,IAAIA;CACJ,IAAIC;AAEJ,wBAAW,YAAY;AACrB,YAAU,MAAM,oCAAe;AAC/B,gBAAc,QAAQ,KAAK;AAC3B,UAAQ,MAAM,QAAQ;CACvB,EAAC;AAEF,uBAAU,YAAY;AACpB,UAAQ,MAAM,YAAY;AAC1B,QAAM,gCAAW,QAAQ;CAC1B,EAAC;AAEF,gBAAG,gDAAgD,YAAY;EAC7D,MAAM,iBAAiB;;;;;;;;;AASvB,QAAM,gCAAU,oBAAK,SAAS,gBAAgB,EAAE,cAAc;EAE9D,MAAM,SAAS,MAAM,2BAAY;AAEjC,qBAAO,OAAO,CAAC,QAAQ;GACrB,QAAQ;GACR,WAAW;GACX,OAAO;GACP,WAAW;GACX,QAAQ;EACT,EAAC;CACH,EAAC;AAEF,gBAAG,gDAAgD,YAAY;EAC7D,MAAM,iBAAiB;;;;;;;AAOvB,QAAM,gCAAU,oBAAK,SAAS,gBAAgB,EAAE,cAAc;EAE9D,MAAM,SAAS,MAAM,2BAAY;AAEjC,qBAAO,OAAO,OAAO,CAAC,KAAK,gBAAgB;AAC3C,qBAAO,OAAO,UAAU,CAAC,KAAK,uBAAuB;AACrD,qBAAO,OAAO,OAAO,CAAC,KAAK,mBAAmB;CAC/C,EAAC;AAEF,gBAAG,4DAA4D,YAAY;EACzE,MAAM,iBAAiB;;;;;;AAMvB,QAAM,gCAAU,oBAAK,SAAS,gBAAgB,EAAE,cAAc;EAE9D,MAAM,SAAS,MAAM,2BAAY;AAEjC,qBAAO,OAAO,UAAU,CAAC,KAAK,uBAAuB;AACrD,qBAAO,OAAO,OAAO,CAAC,KAAK,uBAAuB;CACnD,EAAC;AAEF,gBAAG,kDAAkD,YAAY;EAC/D,MAAM,wBAAwB;;;;;;;AAO9B,QAAM,gCAAU,oBAAK,SAAS,gBAAgB,EAAE,qBAAqB;AAGrE,QAAM,mBAAO,2BAAY,CAAC,CAAC,QAAQ,SAAS;CAC7C,EAAC;AAEF,gBAAG,4CAA4C,YAAY;EACzD,MAAM,mBAAmB;;;;;EAKzB,MAAM,mBAAmB;;;;;AAMzB,QAAM,gCAAU,oBAAK,SAAS,gBAAgB,EAAE,gBAAgB;AAChE,QAAM,gCAAU,oBAAK,SAAS,gBAAgB,EAAE,gBAAgB;EAEhE,MAAM,SAAS,MAAM,2BAAY;AAEjC,qBAAO,OAAO,OAAO,CAAC,KAAK,sBAAsB;CAClD,EAAC;AACH,EAAC"}
@@ -1,97 +0,0 @@
1
- import "../esm-9eeZntth.mjs";
2
- import { loadConfig } from "../config-CXxYmz_o.mjs";
3
- import { cleanupDir, createTempDir } from "../test-helpers-DdVBk23F.mjs";
4
- import { writeFile } from "node:fs/promises";
5
- import { join } from "node:path";
6
- import { afterEach, beforeEach, describe, expect, it } from "vitest";
7
-
8
- //#region src/__tests__/config.spec.ts
9
- describe("loadConfig", () => {
10
- let tempDir;
11
- let originalCwd;
12
- beforeEach(async () => {
13
- tempDir = await createTempDir();
14
- originalCwd = process.cwd();
15
- process.chdir(tempDir);
16
- });
17
- afterEach(async () => {
18
- process.chdir(originalCwd);
19
- await cleanupDir(tempDir);
20
- });
21
- it("should load configuration from gkm.config.ts", async () => {
22
- const configContent = `
23
- export default {
24
- routes: './src/endpoints/**/*.ts',
25
- functions: './src/functions/**/*.ts',
26
- crons: './src/crons/**/*.ts',
27
- envParser: './src/config/env',
28
- logger: './src/config/logger',
29
- };
30
- `;
31
- await writeFile(join(tempDir, "gkm.config.ts"), configContent);
32
- const config = await loadConfig();
33
- expect(config).toEqual({
34
- routes: "./src/endpoints/**/*.ts",
35
- functions: "./src/functions/**/*.ts",
36
- crons: "./src/crons/**/*.ts",
37
- envParser: "./src/config/env",
38
- logger: "./src/config/logger"
39
- });
40
- });
41
- it("should load configuration from gkm.config.js", async () => {
42
- const configContent = `
43
- module.exports = {
44
- routes: './api/**/*.js',
45
- envParser: './config/environment',
46
- logger: './config/logging',
47
- };
48
- `;
49
- await writeFile(join(tempDir, "gkm.config.js"), configContent);
50
- const config = await loadConfig();
51
- expect(config.routes).toBe("./api/**/*.js");
52
- expect(config.envParser).toBe("./config/environment");
53
- expect(config.logger).toBe("./config/logging");
54
- });
55
- it("should handle configuration with only envParser override", async () => {
56
- const configContent = `
57
- export default {
58
- envParser: './my-env#myEnvParser',
59
- logger: './my-logger#myLogger',
60
- };
61
- `;
62
- await writeFile(join(tempDir, "gkm.config.ts"), configContent);
63
- const config = await loadConfig();
64
- expect(config.envParser).toBe("./my-env#myEnvParser");
65
- expect(config.logger).toBe("./my-logger#myLogger");
66
- });
67
- it("should handle malformed config file gracefully", async () => {
68
- const invalidConfigContent = `
69
- export default {
70
- routes: './endpoints/**/*.ts'
71
- // Missing comma - syntax error
72
- functions: './functions/**/*.ts'
73
- };
74
- `;
75
- await writeFile(join(tempDir, "gkm.config.ts"), invalidConfigContent);
76
- await expect(loadConfig()).rejects.toThrow();
77
- });
78
- it("should prefer .ts config over .js config", async () => {
79
- const jsConfigContent = `
80
- module.exports = {
81
- routes: './js-routes/**/*.js',
82
- };
83
- `;
84
- const tsConfigContent = `
85
- export default {
86
- routes: './ts-routes/**/*.ts',
87
- };
88
- `;
89
- await writeFile(join(tempDir, "gkm.config.js"), jsConfigContent);
90
- await writeFile(join(tempDir, "gkm.config.ts"), tsConfigContent);
91
- const config = await loadConfig();
92
- expect(config.routes).toBe("./ts-routes/**/*.ts");
93
- });
94
- });
95
-
96
- //#endregion
97
- //# sourceMappingURL=config.spec.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.spec.mjs","names":["tempDir: string","originalCwd: string"],"sources":["../../src/__tests__/config.spec.ts"],"sourcesContent":["import { writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { afterEach, beforeEach, describe, expect, it } from 'vitest';\nimport { loadConfig } from '../config';\nimport { cleanupDir, createTempDir } from './test-helpers';\n\ndescribe('loadConfig', () => {\n let tempDir: string;\n let originalCwd: string;\n\n beforeEach(async () => {\n tempDir = await createTempDir();\n originalCwd = process.cwd();\n process.chdir(tempDir);\n });\n\n afterEach(async () => {\n process.chdir(originalCwd);\n await cleanupDir(tempDir);\n });\n\n it('should load configuration from gkm.config.ts', async () => {\n const configContent = `\nexport default {\n routes: './src/endpoints/**/*.ts',\n functions: './src/functions/**/*.ts',\n crons: './src/crons/**/*.ts',\n envParser: './src/config/env',\n logger: './src/config/logger',\n};\n`;\n await writeFile(join(tempDir, 'gkm.config.ts'), configContent);\n\n const config = await loadConfig();\n\n expect(config).toEqual({\n routes: './src/endpoints/**/*.ts',\n functions: './src/functions/**/*.ts',\n crons: './src/crons/**/*.ts',\n envParser: './src/config/env',\n logger: './src/config/logger',\n });\n });\n\n it('should load configuration from gkm.config.js', async () => {\n const configContent = `\nmodule.exports = {\n routes: './api/**/*.js',\n envParser: './config/environment',\n logger: './config/logging',\n};\n`;\n await writeFile(join(tempDir, 'gkm.config.js'), configContent);\n\n const config = await loadConfig();\n\n expect(config.routes).toBe('./api/**/*.js');\n expect(config.envParser).toBe('./config/environment');\n expect(config.logger).toBe('./config/logging');\n });\n\n it('should handle configuration with only envParser override', async () => {\n const configContent = `\nexport default {\n envParser: './my-env#myEnvParser',\n logger: './my-logger#myLogger',\n};\n`;\n await writeFile(join(tempDir, 'gkm.config.ts'), configContent);\n\n const config = await loadConfig();\n\n expect(config.envParser).toBe('./my-env#myEnvParser');\n expect(config.logger).toBe('./my-logger#myLogger');\n });\n\n it('should handle malformed config file gracefully', async () => {\n const invalidConfigContent = `\nexport default {\n routes: './endpoints/**/*.ts'\n // Missing comma - syntax error\n functions: './functions/**/*.ts'\n};\n`;\n await writeFile(join(tempDir, 'gkm.config.ts'), invalidConfigContent);\n\n // Should fall back to defaults when config file has syntax errors\n await expect(loadConfig()).rejects.toThrow();\n });\n\n it('should prefer .ts config over .js config', async () => {\n const jsConfigContent = `\nmodule.exports = {\n routes: './js-routes/**/*.js',\n};\n`;\n const tsConfigContent = `\nexport default {\n routes: './ts-routes/**/*.ts',\n};\n`;\n\n await writeFile(join(tempDir, 'gkm.config.js'), jsConfigContent);\n await writeFile(join(tempDir, 'gkm.config.ts'), tsConfigContent);\n\n const config = await loadConfig();\n\n expect(config.routes).toBe('./ts-routes/**/*.ts');\n });\n});\n"],"mappings":";;;;;;;;AAMA,SAAS,cAAc,MAAM;CAC3B,IAAIA;CACJ,IAAIC;AAEJ,YAAW,YAAY;AACrB,YAAU,MAAM,eAAe;AAC/B,gBAAc,QAAQ,KAAK;AAC3B,UAAQ,MAAM,QAAQ;CACvB,EAAC;AAEF,WAAU,YAAY;AACpB,UAAQ,MAAM,YAAY;AAC1B,QAAM,WAAW,QAAQ;CAC1B,EAAC;AAEF,IAAG,gDAAgD,YAAY;EAC7D,MAAM,iBAAiB;;;;;;;;;AASvB,QAAM,UAAU,KAAK,SAAS,gBAAgB,EAAE,cAAc;EAE9D,MAAM,SAAS,MAAM,YAAY;AAEjC,SAAO,OAAO,CAAC,QAAQ;GACrB,QAAQ;GACR,WAAW;GACX,OAAO;GACP,WAAW;GACX,QAAQ;EACT,EAAC;CACH,EAAC;AAEF,IAAG,gDAAgD,YAAY;EAC7D,MAAM,iBAAiB;;;;;;;AAOvB,QAAM,UAAU,KAAK,SAAS,gBAAgB,EAAE,cAAc;EAE9D,MAAM,SAAS,MAAM,YAAY;AAEjC,SAAO,OAAO,OAAO,CAAC,KAAK,gBAAgB;AAC3C,SAAO,OAAO,UAAU,CAAC,KAAK,uBAAuB;AACrD,SAAO,OAAO,OAAO,CAAC,KAAK,mBAAmB;CAC/C,EAAC;AAEF,IAAG,4DAA4D,YAAY;EACzE,MAAM,iBAAiB;;;;;;AAMvB,QAAM,UAAU,KAAK,SAAS,gBAAgB,EAAE,cAAc;EAE9D,MAAM,SAAS,MAAM,YAAY;AAEjC,SAAO,OAAO,UAAU,CAAC,KAAK,uBAAuB;AACrD,SAAO,OAAO,OAAO,CAAC,KAAK,uBAAuB;CACnD,EAAC;AAEF,IAAG,kDAAkD,YAAY;EAC/D,MAAM,wBAAwB;;;;;;;AAO9B,QAAM,UAAU,KAAK,SAAS,gBAAgB,EAAE,qBAAqB;AAGrE,QAAM,OAAO,YAAY,CAAC,CAAC,QAAQ,SAAS;CAC7C,EAAC;AAEF,IAAG,4CAA4C,YAAY;EACzD,MAAM,mBAAmB;;;;;EAKzB,MAAM,mBAAmB;;;;;AAMzB,QAAM,UAAU,KAAK,SAAS,gBAAgB,EAAE,gBAAgB;AAChE,QAAM,UAAU,KAAK,SAAS,gBAAgB,EAAE,gBAAgB;EAEhE,MAAM,SAAS,MAAM,YAAY;AAEjC,SAAO,OAAO,OAAO,CAAC,KAAK,sBAAsB;CAClD,EAAC;AACH,EAAC"}
@@ -1,14 +0,0 @@
1
- require('../esm-Crmo4h9t.cjs');
2
- const require_test_helpers = require('../test-helpers-ARd8GDgx.cjs');
3
-
4
- exports.cleanupDir = require_test_helpers.cleanupDir;
5
- exports.createMockBuildContext = require_test_helpers.createMockBuildContext;
6
- exports.createMockCronFile = require_test_helpers.createMockCronFile;
7
- exports.createMockEndpointFile = require_test_helpers.createMockEndpointFile;
8
- exports.createMockFunctionFile = require_test_helpers.createMockFunctionFile;
9
- exports.createTempDir = require_test_helpers.createTempDir;
10
- exports.createTestCron = require_test_helpers.createTestCron;
11
- exports.createTestEndpoint = require_test_helpers.createTestEndpoint;
12
- exports.createTestFile = require_test_helpers.createTestFile;
13
- exports.createTestFunction = require_test_helpers.createTestFunction;
14
- exports.waitFor = require_test_helpers.waitFor;
@@ -1,4 +0,0 @@
1
- import "../esm-9eeZntth.mjs";
2
- import { cleanupDir, createMockBuildContext, createMockCronFile, createMockEndpointFile, createMockFunctionFile, createTempDir, createTestCron, createTestEndpoint, createTestFile, createTestFunction, waitFor } from "../test-helpers-DdVBk23F.mjs";
3
-
4
- export { cleanupDir, createMockBuildContext, createMockCronFile, createMockEndpointFile, createMockFunctionFile, createTempDir, createTestCron, createTestEndpoint, createTestFile, createTestFunction, waitFor };
@@ -1,286 +0,0 @@
1
- const require_chunk = require('../../chunk-CsX-DzYB.cjs');
2
- require('../../config-RcNESK0T.cjs');
3
- require('../../Generator-C3tYSTQY.cjs');
4
- require('../../CronGenerator-Ctl4USy4.cjs');
5
- require('../../EndpointGenerator-Dj7AumHi.cjs');
6
- require('../../FunctionGenerator-DN681IUn.cjs');
7
- require('../../generators-_pY7sHy1.cjs');
8
- require('../../manifests-BTtfDMX8.cjs');
9
- require('../../providerResolver-Cs-0YCaP.cjs');
10
- const require_build = require('../../build-BfQFnU5-.cjs');
11
- require('../../esm-Crmo4h9t.cjs');
12
- const require_test_helpers = require('../../test-helpers-ARd8GDgx.cjs');
13
- const node_fs_promises = require_chunk.__toESM(require("node:fs/promises"));
14
- const node_path = require_chunk.__toESM(require("node:path"));
15
- const vitest = require_chunk.__toESM(require("vitest"));
16
- const __geekmidas_testkit_os = require_chunk.__toESM(require("@geekmidas/testkit/os"));
17
-
18
- //#region src/build/__tests__/index-new.spec.ts
19
- (0, vitest.describe)("buildCommand", () => {
20
- (0, __geekmidas_testkit_os.itWithDir)("should build endpoints, functions, and crons for multiple providers", async ({ dir }) => {
21
- await require_test_helpers.createMockEndpointFile(dir, "src/endpoints/users.ts", "getUsersEndpoint", "/users", "GET");
22
- await require_test_helpers.createMockEndpointFile(dir, "src/endpoints/posts.ts", "getPostsEndpoint", "/posts", "GET");
23
- await require_test_helpers.createMockFunctionFile(dir, "src/functions/process.ts", "processDataFunction", 60);
24
- await require_test_helpers.createMockCronFile(dir, "src/crons/cleanup.ts", "cleanupCron", "rate(1 day)");
25
- await require_test_helpers.createTestFile(dir, "gkm.config.ts", `
26
- export default {
27
- routes: './src/endpoints/**/*.ts',
28
- functions: './src/functions/**/*.ts',
29
- crons: './src/crons/**/*.ts',
30
- envParser: './config/env',
31
- logger: './config/logger',
32
- };
33
- `);
34
- await require_test_helpers.createTestFile(dir, "config/env.ts", "export default {}");
35
- await require_test_helpers.createTestFile(dir, "config/logger.ts", "export default {}");
36
- const originalCwd = process.cwd();
37
- process.chdir(dir);
38
- try {
39
- await require_build.buildCommand({ provider: "server" });
40
- const serverDir = (0, node_path.join)(dir, ".gkm", "server");
41
- (0, vitest.expect)(await (0, node_fs_promises.readFile)((0, node_path.join)(serverDir, "app.ts"), "utf-8")).toContain("HonoEndpoint");
42
- } finally {
43
- process.chdir(originalCwd);
44
- }
45
- });
46
- (0, __geekmidas_testkit_os.itWithDir)("should perform complete build with all construct types for AWS Lambda", async ({ dir }) => {
47
- await require_test_helpers.createMockEndpointFile(dir, "src/endpoints/users.ts", "getUsersEndpoint", "/users", "GET");
48
- await require_test_helpers.createMockEndpointFile(dir, "src/endpoints/posts.ts", "getPostsEndpoint", "/posts", "POST");
49
- await require_test_helpers.createMockFunctionFile(dir, "src/functions/processData.ts", "processDataFunction", 300);
50
- await require_test_helpers.createMockFunctionFile(dir, "src/functions/sendEmail.ts", "sendEmailFunction", 30);
51
- await require_test_helpers.createMockCronFile(dir, "src/crons/dailyCleanup.ts", "dailyCleanupCron", "rate(1 day)");
52
- await require_test_helpers.createMockCronFile(dir, "src/crons/hourlyReport.ts", "hourlyReportCron", "cron(0 * * * ? *)");
53
- await require_test_helpers.createTestFile(dir, "gkm.config.ts", `
54
- export default {
55
- routes: './src/endpoints/**/*.ts',
56
- functions: './src/functions/**/*.ts',
57
- crons: './src/crons/**/*.ts',
58
- envParser: './config/env',
59
- logger: './config/logger',
60
- };
61
- `);
62
- await require_test_helpers.createTestFile(dir, "config/env.ts", "export default {}");
63
- await require_test_helpers.createTestFile(dir, "config/logger.ts", "export default {}");
64
- const originalCwd = process.cwd();
65
- process.chdir(dir);
66
- try {
67
- await require_build.buildCommand({ provider: "aws" });
68
- const awsLambdaDir = (0, node_path.join)(dir, ".gkm", "aws-lambda");
69
- const awsApiGatewayV2Dir = (0, node_path.join)(dir, ".gkm", "aws-apigatewayv2");
70
- (0, vitest.expect)(await (0, node_fs_promises.readFile)((0, node_path.join)(awsLambdaDir, "functions", "processDataFunction.ts"), "utf-8")).toContain("AWSLambdaFunction");
71
- (0, vitest.expect)(await (0, node_fs_promises.readFile)((0, node_path.join)(awsLambdaDir, "functions", "sendEmailFunction.ts"), "utf-8")).toContain("AWSLambdaFunction");
72
- (0, vitest.expect)(await (0, node_fs_promises.readFile)((0, node_path.join)(awsLambdaDir, "crons", "dailyCleanupCron.ts"), "utf-8")).toContain("AWSScheduledFunction");
73
- (0, vitest.expect)(await (0, node_fs_promises.readFile)((0, node_path.join)(awsLambdaDir, "crons", "hourlyReportCron.ts"), "utf-8")).toContain("AWSScheduledFunction");
74
- (0, vitest.expect)(await (0, node_fs_promises.readFile)((0, node_path.join)(awsApiGatewayV2Dir, "getUsersEndpoint.ts"), "utf-8")).toContain("AmazonApiGatewayV2Endpoint");
75
- (0, vitest.expect)(await (0, node_fs_promises.readFile)((0, node_path.join)(awsApiGatewayV2Dir, "getPostsEndpoint.ts"), "utf-8")).toContain("AmazonApiGatewayV2Endpoint");
76
- const lambdaManifestPath = (0, node_path.join)(awsLambdaDir, "manifest.json");
77
- const apiGatewayManifestPath = (0, node_path.join)(awsApiGatewayV2Dir, "manifest.json");
78
- const lambdaManifest = JSON.parse(await (0, node_fs_promises.readFile)(lambdaManifestPath, "utf-8"));
79
- const apiGatewayManifest = JSON.parse(await (0, node_fs_promises.readFile)(apiGatewayManifestPath, "utf-8"));
80
- (0, vitest.expect)(lambdaManifest).toMatchObject({
81
- routes: vitest.expect.arrayContaining([vitest.expect.objectContaining({
82
- path: "/users",
83
- method: "GET",
84
- handler: vitest.expect.stringContaining("routes/getUsersEndpoint.handler")
85
- }), vitest.expect.objectContaining({
86
- path: "/posts",
87
- method: "POST",
88
- handler: vitest.expect.stringContaining("routes/getPostsEndpoint.handler")
89
- })]),
90
- functions: vitest.expect.arrayContaining([vitest.expect.objectContaining({
91
- name: "processDataFunction",
92
- handler: vitest.expect.stringContaining("functions/processDataFunction.handler"),
93
- timeout: 300
94
- }), vitest.expect.objectContaining({
95
- name: "sendEmailFunction",
96
- handler: vitest.expect.stringContaining("functions/sendEmailFunction.handler"),
97
- timeout: 30
98
- })]),
99
- crons: vitest.expect.arrayContaining([vitest.expect.objectContaining({
100
- name: "dailyCleanupCron",
101
- handler: vitest.expect.stringContaining("crons/dailyCleanupCron.handler"),
102
- schedule: "rate(1 day)"
103
- }), vitest.expect.objectContaining({
104
- name: "hourlyReportCron",
105
- handler: vitest.expect.stringContaining("crons/hourlyReportCron.handler"),
106
- schedule: "cron(0 * * * ? *)"
107
- })])
108
- });
109
- (0, vitest.expect)(apiGatewayManifest).toMatchObject({
110
- routes: vitest.expect.arrayContaining([vitest.expect.objectContaining({
111
- path: "/users",
112
- method: "GET",
113
- handler: vitest.expect.stringContaining("getUsersEndpoint.handler")
114
- }), vitest.expect.objectContaining({
115
- path: "/posts",
116
- method: "POST",
117
- handler: vitest.expect.stringContaining("getPostsEndpoint.handler")
118
- })]),
119
- functions: [],
120
- crons: []
121
- });
122
- (0, vitest.expect)(lambdaManifest.routes).toHaveLength(2);
123
- (0, vitest.expect)(lambdaManifest.functions).toHaveLength(2);
124
- (0, vitest.expect)(lambdaManifest.crons).toHaveLength(2);
125
- (0, vitest.expect)(apiGatewayManifest.routes).toHaveLength(2);
126
- (0, vitest.expect)(apiGatewayManifest.functions).toHaveLength(0);
127
- (0, vitest.expect)(apiGatewayManifest.crons).toHaveLength(0);
128
- } finally {
129
- process.chdir(originalCwd);
130
- }
131
- });
132
- (0, __geekmidas_testkit_os.itWithDir)("should handle case with no constructs found", async ({ dir }) => {
133
- await require_test_helpers.createTestFile(dir, "gkm.config.ts", `
134
- export default {
135
- routes: './src/endpoints/**/*.ts',
136
- functions: './src/functions/**/*.ts',
137
- crons: './src/crons/**/*.ts',
138
- envParser: './config/env',
139
- logger: './config/logger',
140
- };
141
- `);
142
- await require_test_helpers.createTestFile(dir, "config/env.ts", "export default {}");
143
- await require_test_helpers.createTestFile(dir, "config/logger.ts", "export default {}");
144
- const originalCwd = process.cwd();
145
- process.chdir(dir);
146
- const logSpy = vitest.vi.spyOn(console, "log");
147
- try {
148
- await require_build.buildCommand({ provider: "server" });
149
- (0, vitest.expect)(logSpy).toHaveBeenCalledWith("Found 0 endpoints");
150
- (0, vitest.expect)(logSpy).toHaveBeenCalledWith("Found 0 functions");
151
- (0, vitest.expect)(logSpy).toHaveBeenCalledWith("Found 0 crons");
152
- (0, vitest.expect)(logSpy).toHaveBeenCalledWith("No endpoints, functions, or crons found to process");
153
- } finally {
154
- process.chdir(originalCwd);
155
- logSpy.mockRestore();
156
- }
157
- });
158
- (0, __geekmidas_testkit_os.itWithDir)("should handle optional functions and crons config", async ({ dir }) => {
159
- await require_test_helpers.createTestFile(dir, "gkm.config.ts", `
160
- export default {
161
- routes: './src/endpoints/**/*.ts',
162
- functions: undefined,
163
- crons: undefined,
164
- envParser: './config/env',
165
- logger: './config/logger',
166
- };
167
- `);
168
- await require_test_helpers.createMockEndpointFile(dir, "src/endpoints/test.ts", "testEndpoint", "/test", "GET");
169
- await require_test_helpers.createTestFile(dir, "config/env.ts", "export default {}");
170
- await require_test_helpers.createTestFile(dir, "config/logger.ts", "export default {}");
171
- const originalCwd = process.cwd();
172
- process.chdir(dir);
173
- const logSpy = vitest.vi.spyOn(console, "log");
174
- try {
175
- await require_build.buildCommand({ provider: "server" });
176
- (0, vitest.expect)(logSpy).toHaveBeenCalledWith("Found 1 endpoints");
177
- (0, vitest.expect)(logSpy).toHaveBeenCalledWith("Found 0 functions");
178
- (0, vitest.expect)(logSpy).toHaveBeenCalledWith("Found 0 crons");
179
- (0, vitest.expect)(logSpy).not.toHaveBeenCalledWith(vitest.expect.stringContaining("Loading functions"));
180
- (0, vitest.expect)(logSpy).not.toHaveBeenCalledWith(vitest.expect.stringContaining("Loading crons"));
181
- } finally {
182
- process.chdir(originalCwd);
183
- logSpy.mockRestore();
184
- }
185
- });
186
- (0, __geekmidas_testkit_os.itWithDir)("should parse envParser configuration correctly", async ({ dir }) => {
187
- await require_test_helpers.createTestFile(dir, "gkm.config.ts", `
188
- export default {
189
- routes: './src/endpoints/**/*.ts',
190
- functions: undefined,
191
- crons: undefined,
192
- envParser: './config/env#customEnvParser',
193
- logger: './config/logger#customLogger',
194
- };
195
- `);
196
- await require_test_helpers.createMockEndpointFile(dir, "src/endpoints/test.ts", "testEndpoint", "/test", "GET");
197
- await require_test_helpers.createTestFile(dir, "config/env.ts", "export const customEnvParser = {}");
198
- await require_test_helpers.createTestFile(dir, "config/logger.ts", "export const customLogger = {}");
199
- const originalCwd = process.cwd();
200
- process.chdir(dir);
201
- try {
202
- await require_build.buildCommand({ provider: "aws" });
203
- const handlerFile = (0, node_path.join)(dir, ".gkm/aws-apigatewayv2/testEndpoint.ts");
204
- const handlerContent = await (0, node_fs_promises.readFile)(handlerFile, "utf-8");
205
- (0, vitest.expect)(handlerContent).toContain("{ customEnvParser as envParser }");
206
- } finally {
207
- process.chdir(originalCwd);
208
- }
209
- });
210
- (0, __geekmidas_testkit_os.itWithDir)("should create output directories for each provider", async ({ dir }) => {
211
- await require_test_helpers.createTestFile(dir, "gkm.config.ts", `
212
- export default {
213
- routes: './src/endpoints/**/*.ts',
214
- functions: undefined,
215
- crons: undefined,
216
- envParser: './config/env',
217
- logger: './config/logger',
218
- };
219
- `);
220
- await require_test_helpers.createMockEndpointFile(dir, "src/endpoints/test.ts", "testEndpoint", "/test", "GET");
221
- await require_test_helpers.createTestFile(dir, "config/env.ts", "export default {}");
222
- await require_test_helpers.createTestFile(dir, "config/logger.ts", "export default {}");
223
- const originalCwd = process.cwd();
224
- process.chdir(dir);
225
- try {
226
- await require_build.buildCommand({ provider: "aws" });
227
- const v2HandlerFile = (0, node_path.join)(dir, ".gkm/aws-apigatewayv2/testEndpoint.ts");
228
- const v2Content = await (0, node_fs_promises.readFile)(v2HandlerFile, "utf-8");
229
- (0, vitest.expect)(v2Content).toContain("AmazonApiGatewayV2Endpoint");
230
- } finally {
231
- process.chdir(originalCwd);
232
- }
233
- });
234
- (0, __geekmidas_testkit_os.itWithDir)("should handle default import patterns for envParser and logger", async ({ dir }) => {
235
- await require_test_helpers.createTestFile(dir, "gkm.config.ts", `
236
- export default {
237
- routes: './src/endpoints/**/*.ts',
238
- functions: undefined,
239
- crons: undefined,
240
- envParser: './config/env',
241
- logger: './config/logger',
242
- };
243
- `);
244
- await require_test_helpers.createMockEndpointFile(dir, "src/endpoints/test.ts", "testEndpoint", "/test", "GET");
245
- await require_test_helpers.createTestFile(dir, "config/env.ts", "export default {}");
246
- await require_test_helpers.createTestFile(dir, "config/logger.ts", "export default {}");
247
- const originalCwd = process.cwd();
248
- process.chdir(dir);
249
- try {
250
- await require_build.buildCommand({ provider: "aws" });
251
- const handlerFile = (0, node_path.join)(dir, ".gkm/aws-apigatewayv2/testEndpoint.ts");
252
- const handlerContent = await (0, node_fs_promises.readFile)(handlerFile, "utf-8");
253
- (0, vitest.expect)(handlerContent).toContain("import envParser");
254
- (0, vitest.expect)(handlerContent).not.toContain("{ envParser }");
255
- } finally {
256
- process.chdir(originalCwd);
257
- }
258
- });
259
- (0, __geekmidas_testkit_os.itWithDir)("should handle envParser pattern with same name as expected", async ({ dir }) => {
260
- await require_test_helpers.createTestFile(dir, "gkm.config.ts", `
261
- export default {
262
- routes: './src/endpoints/**/*.ts',
263
- functions: undefined,
264
- crons: undefined,
265
- envParser: './config/env#envParser',
266
- logger: './config/logger#logger',
267
- };
268
- `);
269
- await require_test_helpers.createMockEndpointFile(dir, "src/endpoints/test.ts", "testEndpoint", "/test", "GET");
270
- await require_test_helpers.createTestFile(dir, "config/env.ts", "export const envParser = {}");
271
- await require_test_helpers.createTestFile(dir, "config/logger.ts", "export const logger = {}");
272
- const originalCwd = process.cwd();
273
- process.chdir(dir);
274
- try {
275
- await require_build.buildCommand({ provider: "aws" });
276
- const handlerFile = (0, node_path.join)(dir, ".gkm/aws-apigatewayv2/testEndpoint.ts");
277
- const handlerContent = await (0, node_fs_promises.readFile)(handlerFile, "utf-8");
278
- (0, vitest.expect)(handlerContent).toContain("{ envParser }");
279
- } finally {
280
- process.chdir(originalCwd);
281
- }
282
- });
283
- });
284
-
285
- //#endregion
286
- //# sourceMappingURL=index-new.spec.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-new.spec.cjs","names":[],"sources":["../../../src/build/__tests__/index-new.spec.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { itWithDir } from '@geekmidas/testkit/os';\nimport { describe, expect, vi } from 'vitest';\nimport {\n createMockCronFile,\n createMockEndpointFile,\n createMockFunctionFile,\n createTestFile,\n} from '../../__tests__/test-helpers';\nimport { buildCommand } from '../index';\n\ndescribe('buildCommand', () => {\n itWithDir(\n 'should build endpoints, functions, and crons for multiple providers',\n async ({ dir }) => {\n // Create test files that will be discovered\n await createMockEndpointFile(\n dir,\n 'src/endpoints/users.ts',\n 'getUsersEndpoint',\n '/users',\n 'GET',\n );\n await createMockEndpointFile(\n dir,\n 'src/endpoints/posts.ts',\n 'getPostsEndpoint',\n '/posts',\n 'GET',\n );\n await createMockFunctionFile(\n dir,\n 'src/functions/process.ts',\n 'processDataFunction',\n 60,\n );\n await createMockCronFile(\n dir,\n 'src/crons/cleanup.ts',\n 'cleanupCron',\n 'rate(1 day)',\n );\n\n // Create a basic config file\n await createTestFile(\n dir,\n 'gkm.config.ts',\n `\nexport default {\n routes: './src/endpoints/**/*.ts',\n functions: './src/functions/**/*.ts',\n crons: './src/crons/**/*.ts',\n envParser: './config/env',\n logger: './config/logger',\n};\n`,\n );\n\n // Create env and logger files\n await createTestFile(dir, 'config/env.ts', 'export default {}');\n await createTestFile(dir, 'config/logger.ts', 'export default {}');\n\n const originalCwd = process.cwd();\n process.chdir(dir);\n\n try {\n await buildCommand({ provider: 'server' });\n\n // Check that output directories were created\n const serverDir = join(dir, '.gkm', 'server');\n expect(await readFile(join(serverDir, 'app.ts'), 'utf-8')).toContain(\n 'HonoEndpoint',\n );\n } finally {\n process.chdir(originalCwd);\n }\n },\n );\n\n itWithDir(\n 'should perform complete build with all construct types for AWS Lambda',\n async ({ dir }) => {\n // Create comprehensive test setup with all construct types\n await createMockEndpointFile(\n dir,\n 'src/endpoints/users.ts',\n 'getUsersEndpoint',\n '/users',\n 'GET',\n );\n await createMockEndpointFile(\n dir,\n 'src/endpoints/posts.ts',\n 'getPostsEndpoint',\n '/posts',\n 'POST',\n );\n await createMockFunctionFile(\n dir,\n 'src/functions/processData.ts',\n 'processDataFunction',\n 300,\n );\n await createMockFunctionFile(\n dir,\n 'src/functions/sendEmail.ts',\n 'sendEmailFunction',\n 30,\n );\n await createMockCronFile(\n dir,\n 'src/crons/dailyCleanup.ts',\n 'dailyCleanupCron',\n 'rate(1 day)',\n );\n await createMockCronFile(\n dir,\n 'src/crons/hourlyReport.ts',\n 'hourlyReportCron',\n 'cron(0 * * * ? *)',\n );\n\n // Create config\n await createTestFile(\n dir,\n 'gkm.config.ts',\n `\nexport default {\n routes: './src/endpoints/**/*.ts',\n functions: './src/functions/**/*.ts',\n crons: './src/crons/**/*.ts',\n envParser: './config/env',\n logger: './config/logger',\n};\n`,\n );\n\n // Create env and logger files\n await createTestFile(dir, 'config/env.ts', 'export default {}');\n await createTestFile(dir, 'config/logger.ts', 'export default {}');\n\n const originalCwd = process.cwd();\n process.chdir(dir);\n\n try {\n // Build for AWS Lambda\n await buildCommand({ provider: 'aws' });\n\n const awsLambdaDir = join(dir, '.gkm', 'aws-lambda');\n const awsApiGatewayV2Dir = join(dir, '.gkm', 'aws-apigatewayv2');\n\n // Verify Lambda handlers were created\n expect(\n await readFile(\n join(awsLambdaDir, 'functions', 'processDataFunction.ts'),\n 'utf-8',\n ),\n ).toContain('AWSLambdaFunction');\n expect(\n await readFile(\n join(awsLambdaDir, 'functions', 'sendEmailFunction.ts'),\n 'utf-8',\n ),\n ).toContain('AWSLambdaFunction');\n\n // Verify Cron handlers were created\n expect(\n await readFile(\n join(awsLambdaDir, 'crons', 'dailyCleanupCron.ts'),\n 'utf-8',\n ),\n ).toContain('AWSScheduledFunction');\n expect(\n await readFile(\n join(awsLambdaDir, 'crons', 'hourlyReportCron.ts'),\n 'utf-8',\n ),\n ).toContain('AWSScheduledFunction');\n\n // Verify API Gateway handlers were created\n expect(\n await readFile(\n join(awsApiGatewayV2Dir, 'getUsersEndpoint.ts'),\n 'utf-8',\n ),\n ).toContain('AmazonApiGatewayV2Endpoint');\n expect(\n await readFile(\n join(awsApiGatewayV2Dir, 'getPostsEndpoint.ts'),\n 'utf-8',\n ),\n ).toContain('AmazonApiGatewayV2Endpoint');\n\n // Verify unified manifests were created with all construct types\n const lambdaManifestPath = join(awsLambdaDir, 'manifest.json');\n const apiGatewayManifestPath = join(awsApiGatewayV2Dir, 'manifest.json');\n\n const lambdaManifest = JSON.parse(\n await readFile(lambdaManifestPath, 'utf-8'),\n );\n const apiGatewayManifest = JSON.parse(\n await readFile(apiGatewayManifestPath, 'utf-8'),\n );\n\n // Verify Lambda manifest structure\n expect(lambdaManifest).toMatchObject({\n routes: expect.arrayContaining([\n expect.objectContaining({\n path: '/users',\n method: 'GET',\n handler: expect.stringContaining('routes/getUsersEndpoint.handler'),\n }),\n expect.objectContaining({\n path: '/posts',\n method: 'POST',\n handler: expect.stringContaining('routes/getPostsEndpoint.handler'),\n }),\n ]),\n functions: expect.arrayContaining([\n expect.objectContaining({\n name: 'processDataFunction',\n handler: expect.stringContaining(\n 'functions/processDataFunction.handler',\n ),\n timeout: 300,\n }),\n expect.objectContaining({\n name: 'sendEmailFunction',\n handler: expect.stringContaining(\n 'functions/sendEmailFunction.handler',\n ),\n timeout: 30,\n }),\n ]),\n crons: expect.arrayContaining([\n expect.objectContaining({\n name: 'dailyCleanupCron',\n handler: expect.stringContaining(\n 'crons/dailyCleanupCron.handler',\n ),\n schedule: 'rate(1 day)',\n }),\n expect.objectContaining({\n name: 'hourlyReportCron',\n handler: expect.stringContaining(\n 'crons/hourlyReportCron.handler',\n ),\n schedule: 'cron(0 * * * ? *)',\n }),\n ]),\n });\n\n // Verify API Gateway manifest structure\n expect(apiGatewayManifest).toMatchObject({\n routes: expect.arrayContaining([\n expect.objectContaining({\n path: '/users',\n method: 'GET',\n handler: expect.stringContaining('getUsersEndpoint.handler'),\n }),\n expect.objectContaining({\n path: '/posts',\n method: 'POST',\n handler: expect.stringContaining('getPostsEndpoint.handler'),\n }),\n ]),\n functions: [],\n crons: [],\n });\n\n // Verify counts\n expect(lambdaManifest.routes).toHaveLength(2);\n expect(lambdaManifest.functions).toHaveLength(2);\n expect(lambdaManifest.crons).toHaveLength(2);\n expect(apiGatewayManifest.routes).toHaveLength(2);\n expect(apiGatewayManifest.functions).toHaveLength(0);\n expect(apiGatewayManifest.crons).toHaveLength(0);\n } finally {\n process.chdir(originalCwd);\n }\n },\n );\n\n itWithDir('should handle case with no constructs found', async ({ dir }) => {\n // Create a basic config file with no actual construct files\n await createTestFile(\n dir,\n 'gkm.config.ts',\n `\nexport default {\n routes: './src/endpoints/**/*.ts',\n functions: './src/functions/**/*.ts',\n crons: './src/crons/**/*.ts',\n envParser: './config/env',\n logger: './config/logger',\n};\n`,\n );\n\n // Create env and logger files\n await createTestFile(dir, 'config/env.ts', 'export default {}');\n await createTestFile(dir, 'config/logger.ts', 'export default {}');\n\n const originalCwd = process.cwd();\n process.chdir(dir);\n\n const logSpy = vi.spyOn(console, 'log');\n\n try {\n await buildCommand({ provider: 'server' });\n\n expect(logSpy).toHaveBeenCalledWith('Found 0 endpoints');\n expect(logSpy).toHaveBeenCalledWith('Found 0 functions');\n expect(logSpy).toHaveBeenCalledWith('Found 0 crons');\n expect(logSpy).toHaveBeenCalledWith(\n 'No endpoints, functions, or crons found to process',\n );\n } finally {\n process.chdir(originalCwd);\n logSpy.mockRestore();\n }\n });\n\n itWithDir(\n 'should handle optional functions and crons config',\n async ({ dir }) => {\n // Create config with undefined functions and crons\n await createTestFile(\n dir,\n 'gkm.config.ts',\n `\nexport default {\n routes: './src/endpoints/**/*.ts',\n functions: undefined,\n crons: undefined,\n envParser: './config/env',\n logger: './config/logger',\n};\n`,\n );\n\n await createMockEndpointFile(\n dir,\n 'src/endpoints/test.ts',\n 'testEndpoint',\n '/test',\n 'GET',\n );\n\n // Create env and logger files\n await createTestFile(dir, 'config/env.ts', 'export default {}');\n await createTestFile(dir, 'config/logger.ts', 'export default {}');\n\n const originalCwd = process.cwd();\n process.chdir(dir);\n\n const logSpy = vi.spyOn(console, 'log');\n\n try {\n await buildCommand({ provider: 'server' });\n\n expect(logSpy).toHaveBeenCalledWith('Found 1 endpoints');\n expect(logSpy).toHaveBeenCalledWith('Found 0 functions');\n expect(logSpy).toHaveBeenCalledWith('Found 0 crons');\n\n // Should not log functions or crons loading messages\n expect(logSpy).not.toHaveBeenCalledWith(\n expect.stringContaining('Loading functions'),\n );\n expect(logSpy).not.toHaveBeenCalledWith(\n expect.stringContaining('Loading crons'),\n );\n } finally {\n process.chdir(originalCwd);\n logSpy.mockRestore();\n }\n },\n );\n\n itWithDir(\n 'should parse envParser configuration correctly',\n async ({ dir }) => {\n // Create config with custom named exports\n await createTestFile(\n dir,\n 'gkm.config.ts',\n `\nexport default {\n routes: './src/endpoints/**/*.ts',\n functions: undefined,\n crons: undefined,\n envParser: './config/env#customEnvParser',\n logger: './config/logger#customLogger',\n};\n`,\n );\n\n await createMockEndpointFile(\n dir,\n 'src/endpoints/test.ts',\n 'testEndpoint',\n '/test',\n 'GET',\n );\n\n // Create env and logger files with named exports\n await createTestFile(\n dir,\n 'config/env.ts',\n 'export const customEnvParser = {}',\n );\n await createTestFile(\n dir,\n 'config/logger.ts',\n 'export const customLogger = {}',\n );\n\n const originalCwd = process.cwd();\n process.chdir(dir);\n\n try {\n await buildCommand({ provider: 'aws' });\n\n // Verify that a handler file was generated with correct imports\n const handlerFile = join(dir, '.gkm/aws-apigatewayv2/testEndpoint.ts');\n const handlerContent = await readFile(handlerFile, 'utf-8');\n expect(handlerContent).toContain('{ customEnvParser as envParser }');\n } finally {\n process.chdir(originalCwd);\n }\n },\n );\n\n itWithDir(\n 'should create output directories for each provider',\n async ({ dir }) => {\n // Create config with multiple providers\n await createTestFile(\n dir,\n 'gkm.config.ts',\n `\nexport default {\n routes: './src/endpoints/**/*.ts',\n functions: undefined,\n crons: undefined,\n envParser: './config/env',\n logger: './config/logger',\n};\n`,\n );\n\n await createMockEndpointFile(\n dir,\n 'src/endpoints/test.ts',\n 'testEndpoint',\n '/test',\n 'GET',\n );\n\n // Create env and logger files\n await createTestFile(dir, 'config/env.ts', 'export default {}');\n await createTestFile(dir, 'config/logger.ts', 'export default {}');\n\n const originalCwd = process.cwd();\n process.chdir(dir);\n\n try {\n await buildCommand({ provider: 'aws' });\n\n const v2HandlerFile = join(\n dir,\n '.gkm/aws-apigatewayv2/testEndpoint.ts',\n );\n\n const v2Content = await readFile(v2HandlerFile, 'utf-8');\n\n expect(v2Content).toContain('AmazonApiGatewayV2Endpoint');\n } finally {\n process.chdir(originalCwd);\n }\n },\n );\n\n itWithDir(\n 'should handle default import patterns for envParser and logger',\n async ({ dir }) => {\n // Create config with default import patterns\n await createTestFile(\n dir,\n 'gkm.config.ts',\n `\nexport default {\n routes: './src/endpoints/**/*.ts',\n functions: undefined,\n crons: undefined,\n envParser: './config/env',\n logger: './config/logger',\n};\n`,\n );\n\n await createMockEndpointFile(\n dir,\n 'src/endpoints/test.ts',\n 'testEndpoint',\n '/test',\n 'GET',\n );\n\n // Create env and logger files with default exports\n await createTestFile(dir, 'config/env.ts', 'export default {}');\n await createTestFile(dir, 'config/logger.ts', 'export default {}');\n\n const originalCwd = process.cwd();\n process.chdir(dir);\n\n try {\n await buildCommand({ provider: 'aws' });\n\n // Verify that a handler file was generated with default imports\n const handlerFile = join(dir, '.gkm/aws-apigatewayv2/testEndpoint.ts');\n const handlerContent = await readFile(handlerFile, 'utf-8');\n expect(handlerContent).toContain('import envParser');\n expect(handlerContent).not.toContain('{ envParser }');\n } finally {\n process.chdir(originalCwd);\n }\n },\n );\n\n itWithDir(\n 'should handle envParser pattern with same name as expected',\n async ({ dir }) => {\n // Create config with named exports that match expected names\n await createTestFile(\n dir,\n 'gkm.config.ts',\n `\nexport default {\n routes: './src/endpoints/**/*.ts',\n functions: undefined,\n crons: undefined,\n envParser: './config/env#envParser',\n logger: './config/logger#logger',\n};\n`,\n );\n\n await createMockEndpointFile(\n dir,\n 'src/endpoints/test.ts',\n 'testEndpoint',\n '/test',\n 'GET',\n );\n\n // Create env and logger files with named exports\n await createTestFile(dir, 'config/env.ts', 'export const envParser = {}');\n await createTestFile(dir, 'config/logger.ts', 'export const logger = {}');\n\n const originalCwd = process.cwd();\n process.chdir(dir);\n\n try {\n await buildCommand({ provider: 'aws' });\n\n // Verify that a handler file was generated with named imports\n const handlerFile = join(dir, '.gkm/aws-apigatewayv2/testEndpoint.ts');\n const handlerContent = await readFile(handlerFile, 'utf-8');\n\n expect(handlerContent).toContain('{ envParser }');\n } finally {\n process.chdir(originalCwd);\n }\n },\n );\n});\n"],"mappings":"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"}