@medusajs/http-types-generator 2.13.6-preview-20260402101111
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +135 -0
- package/dist/__tests__/compatibility-checker.spec.d.ts +2 -0
- package/dist/__tests__/compatibility-checker.spec.d.ts.map +1 -0
- package/dist/__tests__/compatibility-checker.spec.js +231 -0
- package/dist/__tests__/compatibility-checker.spec.js.map +1 -0
- package/dist/__tests__/config.spec.d.ts +2 -0
- package/dist/__tests__/config.spec.d.ts.map +1 -0
- package/dist/__tests__/config.spec.js +78 -0
- package/dist/__tests__/config.spec.js.map +1 -0
- package/dist/__tests__/import-tracker.spec.d.ts +2 -0
- package/dist/__tests__/import-tracker.spec.d.ts.map +1 -0
- package/dist/__tests__/import-tracker.spec.js +25 -0
- package/dist/__tests__/import-tracker.spec.js.map +1 -0
- package/dist/__tests__/name-classifier.spec.d.ts +2 -0
- package/dist/__tests__/name-classifier.spec.d.ts.map +1 -0
- package/dist/__tests__/name-classifier.spec.js +77 -0
- package/dist/__tests__/name-classifier.spec.js.map +1 -0
- package/dist/__tests__/name-registry.spec.d.ts +2 -0
- package/dist/__tests__/name-registry.spec.d.ts.map +1 -0
- package/dist/__tests__/name-registry.spec.js +67 -0
- package/dist/__tests__/name-registry.spec.js.map +1 -0
- package/dist/__tests__/path-mapper.spec.d.ts +2 -0
- package/dist/__tests__/path-mapper.spec.d.ts.map +1 -0
- package/dist/__tests__/path-mapper.spec.js +98 -0
- package/dist/__tests__/path-mapper.spec.js.map +1 -0
- package/dist/__tests__/type-emitter.spec.d.ts +2 -0
- package/dist/__tests__/type-emitter.spec.d.ts.map +1 -0
- package/dist/__tests__/type-emitter.spec.js +173 -0
- package/dist/__tests__/type-emitter.spec.js.map +1 -0
- package/dist/__tests__/type-pipeline.spec.d.ts +2 -0
- package/dist/__tests__/type-pipeline.spec.d.ts.map +1 -0
- package/dist/__tests__/type-pipeline.spec.js +239 -0
- package/dist/__tests__/type-pipeline.spec.js.map +1 -0
- package/dist/__tests__/utils/ts-utils.d.ts +22 -0
- package/dist/__tests__/utils/ts-utils.d.ts.map +1 -0
- package/dist/__tests__/utils/ts-utils.js +66 -0
- package/dist/__tests__/utils/ts-utils.js.map +1 -0
- package/dist/commands/generate.d.ts +10 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +215 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/validate.d.ts +14 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +201 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/config/index.d.ts +52 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +119 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/compatibility-checker.d.ts +92 -0
- package/dist/core/compatibility-checker.d.ts.map +1 -0
- package/dist/core/compatibility-checker.js +415 -0
- package/dist/core/compatibility-checker.js.map +1 -0
- package/dist/core/import-tracker.d.ts +11 -0
- package/dist/core/import-tracker.d.ts.map +1 -0
- package/dist/core/import-tracker.js +17 -0
- package/dist/core/import-tracker.js.map +1 -0
- package/dist/core/program-factory.d.ts +23 -0
- package/dist/core/program-factory.d.ts.map +1 -0
- package/dist/core/program-factory.js +80 -0
- package/dist/core/program-factory.js.map +1 -0
- package/dist/core/schema-extractor.d.ts +73 -0
- package/dist/core/schema-extractor.d.ts.map +1 -0
- package/dist/core/schema-extractor.js +205 -0
- package/dist/core/schema-extractor.js.map +1 -0
- package/dist/core/type-emitter.d.ts +73 -0
- package/dist/core/type-emitter.d.ts.map +1 -0
- package/dist/core/type-emitter.js +246 -0
- package/dist/core/type-emitter.js.map +1 -0
- package/dist/core/type-resolver.d.ts +64 -0
- package/dist/core/type-resolver.d.ts.map +1 -0
- package/dist/core/type-resolver.js +163 -0
- package/dist/core/type-resolver.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/mapping/name-classifier.d.ts +34 -0
- package/dist/mapping/name-classifier.d.ts.map +1 -0
- package/dist/mapping/name-classifier.js +72 -0
- package/dist/mapping/name-classifier.js.map +1 -0
- package/dist/mapping/name-registry.d.ts +54 -0
- package/dist/mapping/name-registry.d.ts.map +1 -0
- package/dist/mapping/name-registry.js +251 -0
- package/dist/mapping/name-registry.js.map +1 -0
- package/dist/mapping/path-mapper.d.ts +62 -0
- package/dist/mapping/path-mapper.d.ts.map +1 -0
- package/dist/mapping/path-mapper.js +116 -0
- package/dist/mapping/path-mapper.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/utils/file-merger.d.ts +47 -0
- package/dist/utils/file-merger.d.ts.map +1 -0
- package/dist/utils/file-merger.js +164 -0
- package/dist/utils/file-merger.js.map +1 -0
- package/dist/utils/formatter.d.ts +12 -0
- package/dist/utils/formatter.d.ts.map +1 -0
- package/dist/utils/formatter.js +31 -0
- package/dist/utils/formatter.js.map +1 -0
- package/dist/utils/fs-helpers.d.ts +21 -0
- package/dist/utils/fs-helpers.d.ts.map +1 -0
- package/dist/utils/fs-helpers.js +42 -0
- package/dist/utils/fs-helpers.js.map +1 -0
- package/dist/utils/index-manager.d.ts +24 -0
- package/dist/utils/index-manager.d.ts.map +1 -0
- package/dist/utils/index-manager.js +95 -0
- package/dist/utils/index-manager.js.map +1 -0
- package/dist/utils/ts-helpers.d.ts +87 -0
- package/dist/utils/ts-helpers.d.ts.map +1 -0
- package/dist/utils/ts-helpers.js +216 -0
- package/dist/utils/ts-helpers.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-pipeline.spec.js","sourceRoot":"","sources":["../../src/__tests__/type-pipeline.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
/**
|
|
3
|
+
* Builds an in-memory TypeScript program from a map of filename → source.
|
|
4
|
+
* Returns the program, type checker, and a helper to look up a named type.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createTestProgram(files: Record<string, string>): {
|
|
7
|
+
program: ts.Program;
|
|
8
|
+
checker: ts.TypeChecker;
|
|
9
|
+
getType: (fileName: string, typeName: string) => ts.Type;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Convenience wrapper around `createTestProgram` for tests that only need a
|
|
13
|
+
* single in-memory source file. The file is always named `"input.ts"`.
|
|
14
|
+
*
|
|
15
|
+
* Returns the checker and a `getType(typeName)` helper that omits the file name.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createSingleFileProgram(source: string): {
|
|
18
|
+
program: ts.Program;
|
|
19
|
+
checker: ts.TypeChecker;
|
|
20
|
+
getType: (typeName: string) => ts.Type;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=ts-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ts-utils.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/ts-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;AAE3B;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG;IAChE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAA;IACnB,OAAO,EAAE,EAAE,CAAC,WAAW,CAAA;IACvB,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,EAAE,CAAC,IAAI,CAAA;CACzD,CA8CA;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG;IACvD,OAAO,EAAE,EAAE,CAAC,OAAO,CAAA;IACnB,OAAO,EAAE,EAAE,CAAC,WAAW,CAAA;IACvB,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,EAAE,CAAC,IAAI,CAAA;CACvC,CAQA"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createTestProgram = createTestProgram;
|
|
7
|
+
exports.createSingleFileProgram = createSingleFileProgram;
|
|
8
|
+
const typescript_1 = __importDefault(require("typescript"));
|
|
9
|
+
/**
|
|
10
|
+
* Builds an in-memory TypeScript program from a map of filename → source.
|
|
11
|
+
* Returns the program, type checker, and a helper to look up a named type.
|
|
12
|
+
*/
|
|
13
|
+
function createTestProgram(files) {
|
|
14
|
+
const compilerHost = typescript_1.default.createCompilerHost({});
|
|
15
|
+
const originalGetSourceFile = compilerHost.getSourceFile.bind(compilerHost);
|
|
16
|
+
compilerHost.getSourceFile = (fileName, languageVersion) => {
|
|
17
|
+
if (fileName in files) {
|
|
18
|
+
return typescript_1.default.createSourceFile(fileName, files[fileName], languageVersion, true);
|
|
19
|
+
}
|
|
20
|
+
return originalGetSourceFile(fileName, languageVersion);
|
|
21
|
+
};
|
|
22
|
+
compilerHost.fileExists = (fileName) => fileName in files || typescript_1.default.sys.fileExists(fileName);
|
|
23
|
+
compilerHost.readFile = (fileName) => files[fileName] ?? typescript_1.default.sys.readFile(fileName);
|
|
24
|
+
const program = typescript_1.default.createProgram(Object.keys(files), {
|
|
25
|
+
strict: true,
|
|
26
|
+
target: typescript_1.default.ScriptTarget.ES2020,
|
|
27
|
+
moduleResolution: typescript_1.default.ModuleResolutionKind.Node10,
|
|
28
|
+
}, compilerHost);
|
|
29
|
+
const checker = program.getTypeChecker();
|
|
30
|
+
function getType(fileName, typeName) {
|
|
31
|
+
const sourceFile = program.getSourceFile(fileName);
|
|
32
|
+
if (!sourceFile)
|
|
33
|
+
throw new Error(`Source file not found: ${fileName}`);
|
|
34
|
+
let found;
|
|
35
|
+
typescript_1.default.forEachChild(sourceFile, (node) => {
|
|
36
|
+
if (found)
|
|
37
|
+
return;
|
|
38
|
+
if ((typescript_1.default.isInterfaceDeclaration(node) || typescript_1.default.isTypeAliasDeclaration(node)) &&
|
|
39
|
+
node.name.text === typeName) {
|
|
40
|
+
const symbol = checker.getSymbolAtLocation(node.name);
|
|
41
|
+
if (symbol)
|
|
42
|
+
found = checker.getDeclaredTypeOfSymbol(symbol);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
if (!found)
|
|
46
|
+
throw new Error(`Type '${typeName}' not found in '${fileName}'`);
|
|
47
|
+
return found;
|
|
48
|
+
}
|
|
49
|
+
return { program, checker, getType };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Convenience wrapper around `createTestProgram` for tests that only need a
|
|
53
|
+
* single in-memory source file. The file is always named `"input.ts"`.
|
|
54
|
+
*
|
|
55
|
+
* Returns the checker and a `getType(typeName)` helper that omits the file name.
|
|
56
|
+
*/
|
|
57
|
+
function createSingleFileProgram(source) {
|
|
58
|
+
const fileName = "input.ts";
|
|
59
|
+
const { program, checker, getType: getTypeMulti } = createTestProgram({ [fileName]: source });
|
|
60
|
+
return {
|
|
61
|
+
program,
|
|
62
|
+
checker,
|
|
63
|
+
getType: (typeName) => getTypeMulti(fileName, typeName),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=ts-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ts-utils.js","sourceRoot":"","sources":["../../../src/__tests__/utils/ts-utils.ts"],"names":[],"mappings":";;;;;AAMA,8CAkDC;AAQD,0DAYC;AA5ED,4DAA2B;AAE3B;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,KAA6B;IAK7D,MAAM,YAAY,GAAG,oBAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAA;IAC9C,MAAM,qBAAqB,GAAG,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAE3E,YAAY,CAAC,aAAa,GAAG,CAAC,QAAgB,EAAE,eAAgC,EAAE,EAAE;QAClF,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;YACtB,OAAO,oBAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,CAAA;QAC9E,CAAC;QACD,OAAO,qBAAqB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAA;IACzD,CAAC,CAAA;IAED,YAAY,CAAC,UAAU,GAAG,CAAC,QAAgB,EAAE,EAAE,CAC7C,QAAQ,IAAI,KAAK,IAAI,oBAAE,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;IAElD,YAAY,CAAC,QAAQ,GAAG,CAAC,QAAgB,EAAE,EAAE,CAC3C,KAAK,CAAC,QAAQ,CAAC,IAAI,oBAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAE9C,MAAM,OAAO,GAAG,oBAAE,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QACnD,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,oBAAE,CAAC,YAAY,CAAC,MAAM;QAC9B,gBAAgB,EAAE,oBAAE,CAAC,oBAAoB,CAAC,MAAM;KACjD,EAAE,YAAY,CAAC,CAAA;IAEhB,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAA;IAExC,SAAS,OAAO,CAAC,QAAgB,EAAE,QAAgB;QACjD,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QAClD,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAA;QAEtE,IAAI,KAA0B,CAAA;QAC9B,oBAAE,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;YACnC,IAAI,KAAK;gBAAE,OAAM;YACjB,IACE,CAAC,oBAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,oBAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;gBACpE,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAC3B,CAAC;gBACD,MAAM,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACrD,IAAI,MAAM;oBAAE,KAAK,GAAG,OAAO,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAA;YAC7D,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,QAAQ,mBAAmB,QAAQ,GAAG,CAAC,CAAA;QAC5E,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAA;AACtC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,MAAc;IAKpD,MAAM,QAAQ,GAAG,UAAU,CAAA;IAC3B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,iBAAiB,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAC7F,OAAO;QACL,OAAO;QACP,OAAO;QACP,OAAO,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC;KAChE,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* The `generate` command.
|
|
4
|
+
*
|
|
5
|
+
* Scans all validator files, extracts Zod schema exports, resolves their
|
|
6
|
+
* TypeScript types, and emits TypeScript interface declarations into the
|
|
7
|
+
* corresponding HTTP types files.
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateCommand(): Command;
|
|
10
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAgCnC;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAgCzC"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generateCommand = generateCommand;
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const glob_1 = require("glob");
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
11
|
+
const program_factory_1 = require("../core/program-factory");
|
|
12
|
+
const schema_extractor_1 = require("../core/schema-extractor");
|
|
13
|
+
const type_resolver_1 = require("../core/type-resolver");
|
|
14
|
+
const type_emitter_1 = require("../core/type-emitter");
|
|
15
|
+
const import_tracker_1 = require("../core/import-tracker");
|
|
16
|
+
const path_mapper_1 = require("../mapping/path-mapper");
|
|
17
|
+
const name_classifier_1 = require("../mapping/name-classifier");
|
|
18
|
+
const name_registry_1 = require("../mapping/name-registry");
|
|
19
|
+
const fs_helpers_1 = require("../utils/fs-helpers");
|
|
20
|
+
const index_manager_1 = require("../utils/index-manager");
|
|
21
|
+
const file_merger_1 = require("../utils/file-merger");
|
|
22
|
+
/**
|
|
23
|
+
* The `generate` command.
|
|
24
|
+
*
|
|
25
|
+
* Scans all validator files, extracts Zod schema exports, resolves their
|
|
26
|
+
* TypeScript types, and emits TypeScript interface declarations into the
|
|
27
|
+
* corresponding HTTP types files.
|
|
28
|
+
*/
|
|
29
|
+
function generateCommand() {
|
|
30
|
+
const cmd = new commander_1.Command("generate");
|
|
31
|
+
cmd
|
|
32
|
+
.description("Generate TypeScript HTTP type interfaces from Zod validator schemas")
|
|
33
|
+
.option("--area <area>", "Which API area to process: admin, store, or all", "all")
|
|
34
|
+
.option("--domain <domain>", "Limit generation to a specific domain name")
|
|
35
|
+
.option("--dry-run", "Print what would be generated without writing files", false)
|
|
36
|
+
.option("--force", "Overwrite existing files (default: skip existing files)", false)
|
|
37
|
+
.option("--verbose", "Print detailed output including each processed schema", false)
|
|
38
|
+
.action(async (opts) => {
|
|
39
|
+
const options = {
|
|
40
|
+
area: opts.area,
|
|
41
|
+
domain: opts.domain,
|
|
42
|
+
dryRun: opts.dryRun,
|
|
43
|
+
force: opts.force,
|
|
44
|
+
verbose: opts.verbose,
|
|
45
|
+
};
|
|
46
|
+
await runGenerate(options);
|
|
47
|
+
});
|
|
48
|
+
return cmd;
|
|
49
|
+
}
|
|
50
|
+
async function runGenerate(options) {
|
|
51
|
+
const { area, domain, dryRun, force, verbose } = options;
|
|
52
|
+
console.log(chalk_1.default.bold(`\nGenerating HTTP types (area: ${area}${domain ? `, domain: ${domain}` : ""})\n`));
|
|
53
|
+
// Discover validator files
|
|
54
|
+
const globs = path_mapper_1.PathMapper.getValidatorGlobs(area);
|
|
55
|
+
let validatorFiles = [];
|
|
56
|
+
for (const pattern of globs) {
|
|
57
|
+
const matches = await (0, glob_1.glob)(pattern);
|
|
58
|
+
validatorFiles.push(...matches);
|
|
59
|
+
}
|
|
60
|
+
if (domain) {
|
|
61
|
+
validatorFiles = path_mapper_1.PathMapper.filterValidatorsByDomain(validatorFiles, domain);
|
|
62
|
+
}
|
|
63
|
+
if (validatorFiles.length === 0) {
|
|
64
|
+
console.log(chalk_1.default.yellow("No validator files found."));
|
|
65
|
+
if (domain) {
|
|
66
|
+
console.log(chalk_1.default.yellow(` Hint: make sure "${domain}" matches a route directory name in your configured validator paths.`));
|
|
67
|
+
}
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (verbose) {
|
|
71
|
+
console.log(chalk_1.default.gray(`Found ${validatorFiles.length} validator file(s)`));
|
|
72
|
+
}
|
|
73
|
+
// Create TypeScript program with all validator files
|
|
74
|
+
const { program, checker } = program_factory_1.ProgramFactory.create(validatorFiles);
|
|
75
|
+
const extractor = new schema_extractor_1.SchemaExtractor(checker);
|
|
76
|
+
const resolver = new type_resolver_1.TypeResolver(checker);
|
|
77
|
+
const emitter = new type_emitter_1.TypeEmitter(checker);
|
|
78
|
+
const merger = new file_merger_1.FileMerger();
|
|
79
|
+
const indexManager = new index_manager_1.IndexManager();
|
|
80
|
+
// Group schemas by output file
|
|
81
|
+
const fileGroups = new Map();
|
|
82
|
+
let totalSchemas = 0;
|
|
83
|
+
let skippedSchemas = 0;
|
|
84
|
+
for (const validatorFile of validatorFiles) {
|
|
85
|
+
const mapping = path_mapper_1.PathMapper.mapValidatorToHttpTypes(validatorFile);
|
|
86
|
+
if (!mapping) {
|
|
87
|
+
if (verbose) {
|
|
88
|
+
console.log(chalk_1.default.gray(` Skipping unmapped validator: ${path_1.default.basename(path_1.default.dirname(validatorFile))}`));
|
|
89
|
+
}
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const sourceFile = program.getSourceFile(validatorFile);
|
|
93
|
+
if (!sourceFile) {
|
|
94
|
+
console.log(chalk_1.default.yellow(` Warning: could not load source file: ${validatorFile}. Skipping.`));
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const schemas = extractor.extract(sourceFile);
|
|
98
|
+
for (const schema of schemas) {
|
|
99
|
+
totalSchemas++;
|
|
100
|
+
// Apply name registry override
|
|
101
|
+
const httpTypeName = schema.httpTypeName !== schema.exportName
|
|
102
|
+
? schema.httpTypeName // already set via @http-type-name annotation
|
|
103
|
+
: name_registry_1.NameRegistry.resolveHttpTypeName(schema.exportName);
|
|
104
|
+
const targetFile = name_classifier_1.NameClassifier.classify(schema.exportName);
|
|
105
|
+
if (targetFile === "skip") {
|
|
106
|
+
skippedSchemas++;
|
|
107
|
+
if (verbose) {
|
|
108
|
+
console.log(chalk_1.default.gray(` Skip ${schema.exportName}`));
|
|
109
|
+
}
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const resolved = resolver.resolveSchemaType({
|
|
113
|
+
...schema,
|
|
114
|
+
httpTypeName,
|
|
115
|
+
});
|
|
116
|
+
if (!resolved) {
|
|
117
|
+
console.log(chalk_1.default.yellow(` Warning: could not resolve type for ${schema.exportName}. Skipping.`));
|
|
118
|
+
skippedSchemas++;
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
// Get or create the file group
|
|
122
|
+
const groupKey = `${mapping.outputDir}`;
|
|
123
|
+
if (!fileGroups.has(groupKey)) {
|
|
124
|
+
fileGroups.set(groupKey, {
|
|
125
|
+
mapping,
|
|
126
|
+
payloads: [],
|
|
127
|
+
queries: [],
|
|
128
|
+
payloadsImports: new import_tracker_1.ImportTracker(),
|
|
129
|
+
queriesImports: new import_tracker_1.ImportTracker(),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
const group = fileGroups.get(groupKey);
|
|
133
|
+
const importTracker = targetFile === "payloads"
|
|
134
|
+
? group.payloadsImports
|
|
135
|
+
: group.queriesImports;
|
|
136
|
+
// Emit the interface
|
|
137
|
+
const code = emitter.emitInterface(httpTypeName, resolved, importTracker);
|
|
138
|
+
const emitted = { name: httpTypeName, code };
|
|
139
|
+
if (targetFile === "payloads") {
|
|
140
|
+
group.payloads.push(emitted);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
group.queries.push(emitted);
|
|
144
|
+
}
|
|
145
|
+
if (verbose) {
|
|
146
|
+
console.log(chalk_1.default.green(` Generate ${httpTypeName}`) +
|
|
147
|
+
chalk_1.default.gray(` → ${targetFile}.ts`));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Write (or dry-run) the output files
|
|
152
|
+
let written = 0;
|
|
153
|
+
let updated = 0;
|
|
154
|
+
let skippedFiles = 0;
|
|
155
|
+
for (const [, group] of fileGroups) {
|
|
156
|
+
const filesToWrite = [];
|
|
157
|
+
if (group.payloads.length > 0) {
|
|
158
|
+
filesToWrite.push({
|
|
159
|
+
file: group.mapping.payloadsFile,
|
|
160
|
+
interfaces: group.payloads,
|
|
161
|
+
imports: group.payloadsImports,
|
|
162
|
+
label: "payloads",
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
if (group.queries.length > 0) {
|
|
166
|
+
filesToWrite.push({
|
|
167
|
+
file: group.mapping.queriesFile,
|
|
168
|
+
interfaces: group.queries,
|
|
169
|
+
imports: group.queriesImports,
|
|
170
|
+
label: "queries",
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
for (const { file, interfaces, imports, label } of filesToWrite) {
|
|
174
|
+
const relPath = path_1.default.relative(process.cwd(), file);
|
|
175
|
+
const result = await merger.resolveFileContent(file, interfaces, imports, force);
|
|
176
|
+
if (dryRun) {
|
|
177
|
+
if (result.status === "skipped") {
|
|
178
|
+
console.log(chalk_1.default.gray(` Skip ${relPath} (all types already present)`));
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
const tag = result.status === "created"
|
|
182
|
+
? "[dry-run] Create"
|
|
183
|
+
: result.status === "overwritten"
|
|
184
|
+
? "[dry-run] Overwrite"
|
|
185
|
+
: `[dry-run] Update (+${result.added} interface(s))`;
|
|
186
|
+
console.log(chalk_1.default.cyan(`\n--- ${tag}: ${relPath} ---`));
|
|
187
|
+
console.log(result.content);
|
|
188
|
+
await indexManager.updateIndexFiles(group.mapping, label, true);
|
|
189
|
+
}
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (result.status === "skipped") {
|
|
193
|
+
console.log(chalk_1.default.gray(` Skip ${relPath} (all types already present)`));
|
|
194
|
+
skippedFiles++;
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
fs_helpers_1.FsHelpers.writeFile(file, result.content);
|
|
198
|
+
if (result.status === "created" || result.status === "overwritten") {
|
|
199
|
+
written++;
|
|
200
|
+
console.log(chalk_1.default.green(` Write ${relPath}`) +
|
|
201
|
+
chalk_1.default.gray(` (${interfaces.length} interface(s))`));
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
updated++;
|
|
205
|
+
console.log(chalk_1.default.green(` Update ${relPath}`) +
|
|
206
|
+
chalk_1.default.gray(` (+${result.added} interface(s))`));
|
|
207
|
+
}
|
|
208
|
+
await indexManager.updateIndexFiles(group.mapping, label, false);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
console.log();
|
|
212
|
+
console.log(chalk_1.default.bold(`Done. ${totalSchemas - skippedSchemas} schema(s) processed, ` +
|
|
213
|
+
`${written} file(s) written, ${updated} file(s) updated, ${skippedFiles} file(s) skipped.`));
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":";;;;;AAuCA,0CAgCC;AAvED,yCAAmC;AACnC,+BAA2B;AAC3B,gDAAuB;AACvB,kDAAyB;AACzB,6DAAwD;AACxD,+DAA0D;AAC1D,yDAAoD;AACpD,uDAAyE;AACzE,2DAAsD;AACtD,wDAAqE;AACrE,gEAA2D;AAC3D,4DAAuD;AACvD,oDAA+C;AAC/C,0DAAqD;AACrD,sDAAiD;AAkBjD;;;;;;GAMG;AACH,SAAgB,eAAe;IAC7B,MAAM,GAAG,GAAG,IAAI,mBAAO,CAAC,UAAU,CAAC,CAAA;IAEnC,GAAG;SACA,WAAW,CACV,qEAAqE,CACtE;SACA,MAAM,CACL,eAAe,EACf,iDAAiD,EACjD,KAAK,CACN;SACA,MAAM,CAAC,mBAAmB,EAAE,4CAA4C,CAAC;SACzE,MAAM,CAAC,WAAW,EAAE,qDAAqD,EAAE,KAAK,CAAC;SACjF,MAAM,CACL,SAAS,EACT,yDAAyD,EACzD,KAAK,CACN;SACA,MAAM,CAAC,WAAW,EAAE,uDAAuD,EAAE,KAAK,CAAC;SACnF,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,OAAO,GAAoB;YAC/B,IAAI,EAAE,IAAI,CAAC,IAAc;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAA;QACD,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEJ,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,OAAwB;IACjD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IAExD,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CAAC,kCAAkC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAC9F,CAAA;IAED,2BAA2B;IAC3B,MAAM,KAAK,GAAG,wBAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;IAChD,IAAI,cAAc,GAAa,EAAE,CAAA;IAEjC,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,IAAA,WAAI,EAAC,OAAO,CAAC,CAAA;QACnC,cAAc,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAA;IACjC,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,cAAc,GAAG,wBAAU,CAAC,wBAAwB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;IAC9E,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAA;QACtD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,MAAM,CAAC,sBAAsB,MAAM,sEAAsE,CAAC,CACjH,CAAA;QACH,CAAC;QACD,OAAM;IACR,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,SAAS,cAAc,CAAC,MAAM,oBAAoB,CAAC,CAAC,CAAA;IAC7E,CAAC;IAED,qDAAqD;IACrD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,gCAAc,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;IAElE,MAAM,SAAS,GAAG,IAAI,kCAAe,CAAC,OAAO,CAAC,CAAA;IAC9C,MAAM,QAAQ,GAAG,IAAI,4BAAY,CAAC,OAAO,CAAC,CAAA;IAC1C,MAAM,OAAO,GAAG,IAAI,0BAAW,CAAC,OAAO,CAAC,CAAA;IACxC,MAAM,MAAM,GAAG,IAAI,wBAAU,EAAE,CAAA;IAC/B,MAAM,YAAY,GAAG,IAAI,4BAAY,EAAE,CAAA;IAEvC,+BAA+B;IAC/B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAqB,CAAA;IAE/C,IAAI,YAAY,GAAG,CAAC,CAAA;IACpB,IAAI,cAAc,GAAG,CAAC,CAAA;IAEtB,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,wBAAU,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAA;QACjE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CAAC,kCAAkC,cAAI,CAAC,QAAQ,CAAC,cAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAC3F,CAAA;YACH,CAAC;YACD,SAAQ;QACV,CAAC;QAED,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAA;QACvD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,0CAA0C,aAAa,aAAa,CAAC,CAAC,CAAA;YAC/F,SAAQ;QACV,CAAC;QAED,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QAE7C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,YAAY,EAAE,CAAA;YAEd,+BAA+B;YAC/B,MAAM,YAAY,GAChB,MAAM,CAAC,YAAY,KAAK,MAAM,CAAC,UAAU;gBACvC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,6CAA6C;gBACnE,CAAC,CAAC,4BAAY,CAAC,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;YAEzD,MAAM,UAAU,GAAG,gCAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;YAC7D,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;gBAC1B,cAAc,EAAE,CAAA;gBAChB,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;gBACzD,CAAC;gBACD,SAAQ;YACV,CAAC;YAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,iBAAiB,CAAC;gBAC1C,GAAG,MAAM;gBACT,YAAY;aACb,CAAC,CAAA;YAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,MAAM,CAAC,yCAAyC,MAAM,CAAC,UAAU,aAAa,CAAC,CACtF,CAAA;gBACD,cAAc,EAAE,CAAA;gBAChB,SAAQ;YACV,CAAC;YAED,+BAA+B;YAC/B,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,SAAS,EAAE,CAAA;YACvC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9B,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE;oBACvB,OAAO;oBACP,QAAQ,EAAE,EAAE;oBACZ,OAAO,EAAE,EAAE;oBACX,eAAe,EAAE,IAAI,8BAAa,EAAE;oBACpC,cAAc,EAAE,IAAI,8BAAa,EAAE;iBACpC,CAAC,CAAA;YACJ,CAAC;YAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAA;YACvC,MAAM,aAAa,GACjB,UAAU,KAAK,UAAU;gBACvB,CAAC,CAAC,KAAK,CAAC,eAAe;gBACvB,CAAC,CAAC,KAAK,CAAC,cAAc,CAAA;YAE1B,qBAAqB;YACrB,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAA;YAEzE,MAAM,OAAO,GAAqB,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAA;YAE9D,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;gBAC9B,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC9B,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC7B,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,KAAK,CAAC,eAAe,YAAY,EAAE,CAAC;oBACxC,eAAK,CAAC,IAAI,CAAC,MAAM,UAAU,KAAK,CAAC,CACpC,CAAA;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,IAAI,YAAY,GAAG,CAAC,CAAA;IAEpB,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,YAAY,GAKb,EAAE,CAAA;QAEP,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,YAAY,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY;gBAChC,UAAU,EAAE,KAAK,CAAC,QAAQ;gBAC1B,OAAO,EAAE,KAAK,CAAC,eAAe;gBAC9B,KAAK,EAAE,UAAU;aAClB,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,YAAY,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW;gBAC/B,UAAU,EAAE,KAAK,CAAC,OAAO;gBACzB,OAAO,EAAE,KAAK,CAAC,cAAc;gBAC7B,KAAK,EAAE,SAAS;aACjB,CAAC,CAAA;QACJ,CAAC;QAED,KAAK,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,YAAY,EAAE,CAAC;YAChE,MAAM,OAAO,GAAG,cAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAA;YAElD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;YAEhF,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAChC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,WAAW,OAAO,+BAA+B,CAAC,CAAC,CAAA;gBAC5E,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,GACP,MAAM,CAAC,MAAM,KAAK,SAAS;wBACzB,CAAC,CAAC,kBAAkB;wBACpB,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,aAAa;4BAC/B,CAAC,CAAC,qBAAqB;4BACvB,CAAC,CAAC,sBAAsB,MAAM,CAAC,KAAK,gBAAgB,CAAA;oBAC1D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,OAAO,MAAM,CAAC,CAAC,CAAA;oBACvD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;oBAC3B,MAAM,YAAY,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;gBACjE,CAAC;gBACD,SAAQ;YACV,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,WAAW,OAAO,+BAA+B,CAAC,CAAC,CAAA;gBAC1E,YAAY,EAAE,CAAA;gBACd,SAAQ;YACV,CAAC;YAED,sBAAS,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;YAEzC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;gBACnE,OAAO,EAAE,CAAA;gBACT,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,KAAK,CAAC,YAAY,OAAO,EAAE,CAAC;oBAChC,eAAK,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,MAAM,gBAAgB,CAAC,CACrD,CAAA;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,CAAA;gBACT,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,KAAK,CAAC,aAAa,OAAO,EAAE,CAAC;oBACjC,eAAK,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,KAAK,gBAAgB,CAAC,CACjD,CAAA;YACH,CAAC;YAED,MAAM,YAAY,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;QAClE,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CACR,SAAS,YAAY,GAAG,cAAc,wBAAwB;QAC5D,GAAG,OAAO,qBAAqB,OAAO,qBAAqB,YAAY,mBAAmB,CAC7F,CACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* The `validate` command.
|
|
4
|
+
*
|
|
5
|
+
* Checks that existing HTTP TypeScript types in `packages/core/types/src/http/`
|
|
6
|
+
* are structurally compatible with the Zod schemas in
|
|
7
|
+
* `packages/medusa/src/api/`.
|
|
8
|
+
*
|
|
9
|
+
* Exit codes:
|
|
10
|
+
* - 0: All types are compatible (or --ci is false)
|
|
11
|
+
* - 1: One or more types are incompatible (when --ci is set)
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateCommand(): Command;
|
|
14
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA0BnC;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,IAAI,OAAO,CA8CzC"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.validateCommand = validateCommand;
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const glob_1 = require("glob");
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
11
|
+
const program_factory_1 = require("../core/program-factory");
|
|
12
|
+
const schema_extractor_1 = require("../core/schema-extractor");
|
|
13
|
+
const type_resolver_1 = require("../core/type-resolver");
|
|
14
|
+
const compatibility_checker_1 = require("../core/compatibility-checker");
|
|
15
|
+
const path_mapper_1 = require("../mapping/path-mapper");
|
|
16
|
+
const name_classifier_1 = require("../mapping/name-classifier");
|
|
17
|
+
const name_registry_1 = require("../mapping/name-registry");
|
|
18
|
+
const fs_helpers_1 = require("../utils/fs-helpers");
|
|
19
|
+
const config_1 = require("../config");
|
|
20
|
+
/**
|
|
21
|
+
* The `validate` command.
|
|
22
|
+
*
|
|
23
|
+
* Checks that existing HTTP TypeScript types in `packages/core/types/src/http/`
|
|
24
|
+
* are structurally compatible with the Zod schemas in
|
|
25
|
+
* `packages/medusa/src/api/`.
|
|
26
|
+
*
|
|
27
|
+
* Exit codes:
|
|
28
|
+
* - 0: All types are compatible (or --ci is false)
|
|
29
|
+
* - 1: One or more types are incompatible (when --ci is set)
|
|
30
|
+
*/
|
|
31
|
+
function validateCommand() {
|
|
32
|
+
const cmd = new commander_1.Command("validate");
|
|
33
|
+
cmd
|
|
34
|
+
.description("Validate that existing HTTP types are compatible with Zod validator schemas")
|
|
35
|
+
.option("--area <area>", "Which API area to validate: admin, store, or all", "all")
|
|
36
|
+
.option("--domain <domain>", "Limit validation to a specific domain name")
|
|
37
|
+
.option("--changed-files <paths>", "Comma-separated list of changed validator files (CI optimization)")
|
|
38
|
+
.option("--lenient", "Treat T|null|undefined as compatible with T|null (for legacy types)", false)
|
|
39
|
+
.option("--ci", "Exit with non-zero code if any validation failures are found", false)
|
|
40
|
+
.option("--verbose", "Show passing types in addition to failures", false)
|
|
41
|
+
.action(async (opts) => {
|
|
42
|
+
const isCI = opts.ci ||
|
|
43
|
+
process.env.CI === "true" ||
|
|
44
|
+
process.env.GITHUB_ACTIONS === "true";
|
|
45
|
+
const options = {
|
|
46
|
+
area: opts.area,
|
|
47
|
+
domain: opts.domain,
|
|
48
|
+
changedFiles: opts.changedFiles,
|
|
49
|
+
lenient: opts.lenient,
|
|
50
|
+
ci: isCI,
|
|
51
|
+
verbose: opts.verbose,
|
|
52
|
+
};
|
|
53
|
+
await runValidate(options);
|
|
54
|
+
});
|
|
55
|
+
return cmd;
|
|
56
|
+
}
|
|
57
|
+
async function runValidate(options) {
|
|
58
|
+
const { area, domain, changedFiles, verbose, ci } = options;
|
|
59
|
+
console.log(chalk_1.default.bold(`\nValidating HTTP types (area: ${area}${domain ? `, domain: ${domain}` : ""})\n`));
|
|
60
|
+
// Determine which validator files to process
|
|
61
|
+
let validatorFiles = [];
|
|
62
|
+
if (changedFiles) {
|
|
63
|
+
validatorFiles = changedFiles
|
|
64
|
+
.split(",")
|
|
65
|
+
.map((f) => f.trim())
|
|
66
|
+
.filter(Boolean)
|
|
67
|
+
.map((f) => (path_1.default.isAbsolute(f) ? f : fs_helpers_1.FsHelpers.fromRoot(f)));
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const globs = path_mapper_1.PathMapper.getValidatorGlobs(area);
|
|
71
|
+
for (const pattern of globs) {
|
|
72
|
+
const matches = await (0, glob_1.glob)(pattern);
|
|
73
|
+
validatorFiles.push(...matches);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (domain) {
|
|
77
|
+
validatorFiles = path_mapper_1.PathMapper.filterValidatorsByDomain(validatorFiles, domain);
|
|
78
|
+
}
|
|
79
|
+
if (validatorFiles.length === 0) {
|
|
80
|
+
console.log(chalk_1.default.yellow("No validator files found."));
|
|
81
|
+
if (domain) {
|
|
82
|
+
console.log(chalk_1.default.yellow(` Hint: make sure "${domain}" matches a route directory name in your configured validator paths.`));
|
|
83
|
+
}
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
// Collect HTTP type files to check against
|
|
87
|
+
const httpTypesBase = fs_helpers_1.FsHelpers.fromRoot(config_1.Config.get().outputBase);
|
|
88
|
+
const httpTypeFilesGlob = domain
|
|
89
|
+
? path_1.default.join(httpTypesBase, path_mapper_1.PathMapper.resolveHttpDomain(domain), "**", "*.ts")
|
|
90
|
+
: path_1.default.join(httpTypesBase, "**", "*.ts");
|
|
91
|
+
const httpTypeFiles = await (0, glob_1.glob)(httpTypeFilesGlob);
|
|
92
|
+
// Create TypeScript program with both validator files AND HTTP type files
|
|
93
|
+
const allFiles = [...validatorFiles, ...httpTypeFiles];
|
|
94
|
+
const { program, checker } = program_factory_1.ProgramFactory.create(allFiles);
|
|
95
|
+
const extractor = new schema_extractor_1.SchemaExtractor(checker);
|
|
96
|
+
const resolver = new type_resolver_1.TypeResolver(checker);
|
|
97
|
+
// Build check pairs
|
|
98
|
+
const pairs = [];
|
|
99
|
+
let skippedCount = 0;
|
|
100
|
+
for (const validatorFile of validatorFiles) {
|
|
101
|
+
const mapping = path_mapper_1.PathMapper.mapValidatorToHttpTypes(validatorFile);
|
|
102
|
+
if (!mapping) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const sourceFile = program.getSourceFile(validatorFile);
|
|
106
|
+
if (!sourceFile) {
|
|
107
|
+
console.log(chalk_1.default.yellow(` Warning: could not load: ${path_1.default.basename(validatorFile)}`));
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
const schemas = extractor.extract(sourceFile);
|
|
111
|
+
for (const schema of schemas) {
|
|
112
|
+
const httpTypeName = schema.httpTypeName !== schema.exportName
|
|
113
|
+
? schema.httpTypeName
|
|
114
|
+
: name_registry_1.NameRegistry.resolveHttpTypeName(schema.exportName, mapping.domain);
|
|
115
|
+
if (httpTypeName === "skip") {
|
|
116
|
+
skippedCount++;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
const targetFile = name_classifier_1.NameClassifier.classify(schema.exportName);
|
|
120
|
+
if (targetFile === "skip") {
|
|
121
|
+
skippedCount++;
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const resolved = resolver.resolveSchemaType({
|
|
125
|
+
...schema,
|
|
126
|
+
httpTypeName,
|
|
127
|
+
});
|
|
128
|
+
if (!resolved) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
const httpTypeFile = targetFile === "payloads"
|
|
132
|
+
? mapping.payloadsFile
|
|
133
|
+
: mapping.queriesFile;
|
|
134
|
+
pairs.push({
|
|
135
|
+
validatorName: schema.exportName,
|
|
136
|
+
validatorFile,
|
|
137
|
+
httpTypeName,
|
|
138
|
+
resolvedZodType: resolved.type,
|
|
139
|
+
httpTypeFile,
|
|
140
|
+
hasFindParams: resolved.hasFindParams,
|
|
141
|
+
hasSelectParams: resolved.hasSelectParams,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (pairs.length === 0) {
|
|
146
|
+
console.log(chalk_1.default.yellow("No schemas found to validate."));
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
console.log(chalk_1.default.gray(`Checking ${pairs.length} schema(s) against existing HTTP types...\n`));
|
|
150
|
+
// Run compatibility checks
|
|
151
|
+
const compatChecker = new compatibility_checker_1.CompatibilityChecker(program, checker);
|
|
152
|
+
const results = compatChecker.check(pairs, httpTypeFiles, options.lenient);
|
|
153
|
+
// Report results
|
|
154
|
+
const failures = results.filter((r) => !r.passed);
|
|
155
|
+
const passes = results.filter((r) => r.passed);
|
|
156
|
+
// Group results by domain for cleaner output
|
|
157
|
+
const byDomain = new Map();
|
|
158
|
+
for (const result of results) {
|
|
159
|
+
const domainMatch = result.httpTypeFile.match(/\/http\/([^/]+)\/(admin|store)\//);
|
|
160
|
+
const domainKey = domainMatch
|
|
161
|
+
? `${domainMatch[1]}/${domainMatch[2]}`
|
|
162
|
+
: "unknown";
|
|
163
|
+
if (!byDomain.has(domainKey)) {
|
|
164
|
+
byDomain.set(domainKey, []);
|
|
165
|
+
}
|
|
166
|
+
byDomain.get(domainKey).push(result);
|
|
167
|
+
}
|
|
168
|
+
for (const [domainKey, domainResults] of byDomain) {
|
|
169
|
+
const domainFailures = domainResults.filter((r) => !r.passed);
|
|
170
|
+
if (domainFailures.length === 0 && !verbose) {
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
console.log(chalk_1.default.bold(` ${domainKey}`));
|
|
174
|
+
for (const result of domainResults) {
|
|
175
|
+
const line = compatibility_checker_1.CompatibilityChecker.formatResult(result, verbose);
|
|
176
|
+
if (line) {
|
|
177
|
+
console.log(line);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
console.log();
|
|
181
|
+
}
|
|
182
|
+
// Summary
|
|
183
|
+
console.log(chalk_1.default.bold("Summary:"));
|
|
184
|
+
console.log(chalk_1.default.green(` Passed: ${passes.length}`) +
|
|
185
|
+
" " +
|
|
186
|
+
(failures.length > 0
|
|
187
|
+
? chalk_1.default.red(`Failed: ${failures.length}`)
|
|
188
|
+
: chalk_1.default.green(`Failed: 0`)));
|
|
189
|
+
console.log();
|
|
190
|
+
if (failures.length > 0) {
|
|
191
|
+
console.log(chalk_1.default.yellow("Run the generate command with --dry-run to preview what the correct types should look like.\n" +
|
|
192
|
+
"Run the generate command with --force to overwrite existing types with generated ones."));
|
|
193
|
+
if (ci) {
|
|
194
|
+
process.exit(1);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
console.log(chalk_1.default.green("All HTTP types are compatible with their Zod schemas."));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export interface HttpTypesConfig {
|
|
2
|
+
/** Glob patterns keyed by area name (e.g. "admin", "store"), relative to project root */
|
|
3
|
+
validatorGlobs: Record<string, string>;
|
|
4
|
+
/** Root directory for generated HTTP type files, relative to project root */
|
|
5
|
+
outputBase: string;
|
|
6
|
+
/** tsconfig filename to look up from project root */
|
|
7
|
+
tsconfig: string;
|
|
8
|
+
/** Source paths for generated import statements (package names or project-root-relative paths) */
|
|
9
|
+
importSources: {
|
|
10
|
+
/** Module exporting FindParams, SelectParams */
|
|
11
|
+
commonRequest: string;
|
|
12
|
+
/** Module exporting BaseFilterable, OperatorMap */
|
|
13
|
+
dal: string;
|
|
14
|
+
};
|
|
15
|
+
/** Regex string (no surrounding slashes) that captures (area, routeDir) from a validator path */
|
|
16
|
+
validatorPathPattern: string;
|
|
17
|
+
/** Only schemas whose export name starts with one of these prefixes are processed */
|
|
18
|
+
publicPrefixes: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface ResolvedHttpTypesConfig extends HttpTypesConfig {
|
|
21
|
+
/** Absolute path to the project root (process.cwd()) */
|
|
22
|
+
projectRoot: string;
|
|
23
|
+
}
|
|
24
|
+
export declare class Config {
|
|
25
|
+
/** Package defaults — used when no http-types.config.json is present */
|
|
26
|
+
static readonly DEFAULTS: HttpTypesConfig;
|
|
27
|
+
private static readonly CONFIG_FILE_NAME;
|
|
28
|
+
private static _instance;
|
|
29
|
+
/**
|
|
30
|
+
* Walks up the directory tree from `startDir` to find the nearest ancestor
|
|
31
|
+
* (inclusive) that contains `http-types.config.json`. Returns the directory
|
|
32
|
+
* path and parsed contents, or `undefined` if the file is not found.
|
|
33
|
+
*/
|
|
34
|
+
private static findConfigFile;
|
|
35
|
+
/**
|
|
36
|
+
* Builds a resolved config by deep-merging `override` over DEFAULTS.
|
|
37
|
+
* When `override` is provided the config file is not read and `projectRoot`
|
|
38
|
+
* is set to `process.cwd()`. When omitted, the nearest `http-types.config.json`
|
|
39
|
+
* is found by searching upward from `process.cwd()`; its directory becomes
|
|
40
|
+
* `projectRoot`. Falls back to `process.cwd()` when no config file is found.
|
|
41
|
+
*/
|
|
42
|
+
static load(override?: Partial<HttpTypesConfig>): ResolvedHttpTypesConfig;
|
|
43
|
+
/**
|
|
44
|
+
* Returns the cached config, loading it from the config file on first call.
|
|
45
|
+
*/
|
|
46
|
+
static get(): ResolvedHttpTypesConfig;
|
|
47
|
+
/**
|
|
48
|
+
* Resets the cached config singleton. Primarily used in tests.
|
|
49
|
+
*/
|
|
50
|
+
static reset(): void;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,yFAAyF;IACzF,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAA;IAClB,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAA;IAChB,kGAAkG;IAClG,aAAa,EAAE;QACb,gDAAgD;QAChD,aAAa,EAAE,MAAM,CAAA;QACrB,mDAAmD;QACnD,GAAG,EAAE,MAAM,CAAA;KACZ,CAAA;IACD,iGAAiG;IACjG,oBAAoB,EAAE,MAAM,CAAA;IAC5B,qFAAqF;IACrF,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,uBAAwB,SAAQ,eAAe;IAC9D,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,qBAAa,MAAM;IACjB,wEAAwE;IACxE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAaxC;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAA2B;IAEnE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAuC;IAE/D;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAwB7B;;;;;;OAMG;IACH,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,uBAAuB;IA+CzE;;OAEG;IACH,MAAM,CAAC,GAAG,IAAI,uBAAuB;IAOrC;;OAEG;IACH,MAAM,CAAC,KAAK,IAAI,IAAI;CAGrB"}
|