@geekmidas/cli 0.0.26 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/FUNCTION_CRON_SUPPORT.md +266 -0
- package/README.md +21 -4
- package/dist/CronGenerator-ClbRcmz_.mjs +53 -0
- package/dist/CronGenerator-ClbRcmz_.mjs.map +1 -0
- package/dist/CronGenerator-Ctl4USy4.cjs +59 -0
- package/dist/CronGenerator-Ctl4USy4.cjs.map +1 -0
- package/dist/EndpointGenerator-Dj7AumHi.cjs +164 -0
- package/dist/EndpointGenerator-Dj7AumHi.cjs.map +1 -0
- package/dist/EndpointGenerator-uBA1ixUw.mjs +158 -0
- package/dist/EndpointGenerator-uBA1ixUw.mjs.map +1 -0
- package/dist/FunctionGenerator-DN681IUn.cjs +58 -0
- package/dist/FunctionGenerator-DN681IUn.cjs.map +1 -0
- package/dist/FunctionGenerator-crAa-JC7.mjs +52 -0
- package/dist/FunctionGenerator-crAa-JC7.mjs.map +1 -0
- package/dist/Generator-C3tYSTQY.cjs +47 -0
- package/dist/Generator-C3tYSTQY.cjs.map +1 -0
- package/dist/Generator-CDt4pB3W.mjs +41 -0
- package/dist/Generator-CDt4pB3W.mjs.map +1 -0
- package/dist/__tests__/config.spec.cjs +98 -0
- package/dist/__tests__/config.spec.cjs.map +1 -0
- package/dist/__tests__/config.spec.mjs +97 -0
- package/dist/__tests__/config.spec.mjs.map +1 -0
- package/dist/__tests__/test-helpers.cjs +14 -0
- package/dist/__tests__/test-helpers.mjs +4 -0
- package/dist/build/__tests__/index-new.spec.cjs +286 -0
- package/dist/build/__tests__/index-new.spec.cjs.map +1 -0
- package/dist/build/__tests__/index-new.spec.mjs +285 -0
- package/dist/build/__tests__/index-new.spec.mjs.map +1 -0
- package/dist/build/index.cjs +11 -0
- package/dist/build/index.mjs +11 -0
- package/dist/build/manifests.cjs +3 -0
- package/dist/build/manifests.mjs +3 -0
- package/dist/build/providerResolver.cjs +5 -0
- package/dist/build/providerResolver.mjs +3 -0
- package/dist/build/types.cjs +0 -0
- package/dist/build/types.mjs +0 -0
- package/dist/build-BZdwxCLW.mjs +64 -0
- package/dist/build-BZdwxCLW.mjs.map +1 -0
- package/dist/build-BfQFnU5-.cjs +70 -0
- package/dist/build-BfQFnU5-.cjs.map +1 -0
- package/dist/{chunk-CUT6urMc.cjs → chunk-CsX-DzYB.cjs} +12 -0
- package/dist/config-CXxYmz_o.mjs +30 -0
- package/dist/config-CXxYmz_o.mjs.map +1 -0
- package/dist/config-RcNESK0T.cjs +36 -0
- package/dist/config-RcNESK0T.cjs.map +1 -0
- package/dist/config.cjs +1 -1
- package/dist/config.mjs +1 -1
- package/dist/esm-9eeZntth.mjs +3777 -0
- package/dist/esm-9eeZntth.mjs.map +1 -0
- package/dist/esm-Crmo4h9t.cjs +4392 -0
- package/dist/esm-Crmo4h9t.cjs.map +1 -0
- package/dist/esm-CsJbr7gi.mjs +3 -0
- package/dist/esm-w09tAC4l.cjs +8 -0
- package/dist/generators/CronGenerator.cjs +4 -0
- package/dist/generators/CronGenerator.mjs +4 -0
- package/dist/generators/EndpointGenerator.cjs +4 -0
- package/dist/generators/EndpointGenerator.mjs +4 -0
- package/dist/generators/FunctionGenerator.cjs +4 -0
- package/dist/generators/FunctionGenerator.mjs +4 -0
- package/dist/generators/Generator.cjs +3 -0
- package/dist/generators/Generator.mjs +3 -0
- package/dist/generators/__tests__/CronGenerator.spec.cjs +216 -0
- package/dist/generators/__tests__/CronGenerator.spec.cjs.map +1 -0
- package/dist/generators/__tests__/CronGenerator.spec.mjs +215 -0
- package/dist/generators/__tests__/CronGenerator.spec.mjs.map +1 -0
- package/dist/generators/__tests__/EndpointGenerator.spec.cjs +182 -0
- package/dist/generators/__tests__/EndpointGenerator.spec.cjs.map +1 -0
- package/dist/generators/__tests__/EndpointGenerator.spec.mjs +181 -0
- package/dist/generators/__tests__/EndpointGenerator.spec.mjs.map +1 -0
- package/dist/generators/__tests__/FunctionGenerator.spec.cjs +152 -0
- package/dist/generators/__tests__/FunctionGenerator.spec.cjs.map +1 -0
- package/dist/generators/__tests__/FunctionGenerator.spec.mjs +151 -0
- package/dist/generators/__tests__/FunctionGenerator.spec.mjs.map +1 -0
- package/dist/generators/index.cjs +10 -0
- package/dist/generators/index.mjs +7 -0
- package/dist/generators-CsLujGXs.mjs +0 -0
- package/dist/generators-_pY7sHy1.cjs +0 -0
- package/dist/index.cjs +68 -26
- package/dist/index.cjs.map +1 -0
- package/dist/index.mjs +67 -25
- package/dist/index.mjs.map +1 -0
- package/dist/manifests-BTtfDMX8.cjs +26 -0
- package/dist/manifests-BTtfDMX8.cjs.map +1 -0
- package/dist/manifests-HX4z4kkz.mjs +20 -0
- package/dist/manifests-HX4z4kkz.mjs.map +1 -0
- package/dist/{openapi-CksVdkh2.mjs → openapi-BivnatiC.mjs} +8 -6
- package/dist/openapi-BivnatiC.mjs.map +1 -0
- package/dist/{openapi-D4QQJUPY.cjs → openapi-DW-qF3oW.cjs} +9 -7
- package/dist/openapi-DW-qF3oW.cjs.map +1 -0
- package/dist/{openapi-react-query-C1JLYUOs.cjs → openapi-react-query-J0BzBHhN.cjs} +4 -3
- package/dist/openapi-react-query-J0BzBHhN.cjs.map +1 -0
- package/dist/{openapi-react-query-DpT3XHFC.mjs → openapi-react-query-lgS7AVEz.mjs} +3 -2
- package/dist/openapi-react-query-lgS7AVEz.mjs.map +1 -0
- package/dist/openapi-react-query.cjs +1 -1
- package/dist/openapi-react-query.mjs +1 -1
- package/dist/openapi.cjs +4 -3
- package/dist/openapi.mjs +4 -3
- package/dist/providerResolver-B_TjNF0_.mjs +96 -0
- package/dist/providerResolver-B_TjNF0_.mjs.map +1 -0
- package/dist/providerResolver-Cs-0YCaP.cjs +114 -0
- package/dist/providerResolver-Cs-0YCaP.cjs.map +1 -0
- package/dist/test-helpers-ARd8GDgx.cjs +199 -0
- package/dist/test-helpers-ARd8GDgx.cjs.map +1 -0
- package/dist/test-helpers-DdVBk23F.mjs +133 -0
- package/dist/test-helpers-DdVBk23F.mjs.map +1 -0
- package/examples/cron-example.ts +45 -0
- package/examples/function-example.ts +40 -0
- package/examples/gkm.config.json +22 -0
- package/examples/gkm.minimal.config.json +7 -0
- package/examples/gkm.production.config.json +27 -0
- package/package.json +35 -14
- package/src/__tests__/config.spec.ts +110 -0
- package/src/__tests__/test-helpers.ts +178 -0
- package/src/build/__tests__/index-new.spec.ts +578 -0
- package/src/build/index.ts +136 -0
- package/src/build/manifests.ts +32 -0
- package/src/build/providerResolver.ts +184 -0
- package/src/build/types.ts +37 -0
- package/src/config.ts +14 -6
- package/src/generators/CronGenerator.ts +97 -0
- package/src/generators/EndpointGenerator.ts +290 -0
- package/src/generators/FunctionGenerator.ts +96 -0
- package/src/generators/Generator.ts +95 -0
- package/src/generators/__tests__/CronGenerator.spec.ts +445 -0
- package/src/generators/__tests__/EndpointGenerator.spec.ts +372 -0
- package/src/generators/__tests__/FunctionGenerator.spec.ts +257 -0
- package/src/generators/index.ts +8 -0
- package/src/index.ts +57 -22
- package/src/openapi.ts +4 -3
- package/src/types.ts +73 -2
- package/dist/build-BTggTCYL.cjs +0 -176
- package/dist/build-Ca4P6_lY.mjs +0 -170
- package/dist/build.cjs +0 -5
- package/dist/build.mjs +0 -5
- package/dist/config-BNqUMsvc.cjs +0 -24
- package/dist/config-BciAdY6_.mjs +0 -18
- package/dist/loadEndpoints-BBIavB9h.cjs +0 -37
- package/dist/loadEndpoints-DAZ53Og2.mjs +0 -31
- package/dist/loadEndpoints.cjs +0 -3
- package/dist/loadEndpoints.mjs +0 -3
- package/src/build.ts +0 -305
- package/src/loadEndpoints.ts +0 -48
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
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;
|
|
@@ -0,0 +1,4 @@
|
|
|
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 };
|
|
@@ -0,0 +1,286 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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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"}
|