ts-runtime-validation 1.6.16 → 1.8.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 (83) hide show
  1. package/CONTRIBUTING.md +430 -0
  2. package/README.md +505 -62
  3. package/dist/ICommandOptions.js +3 -0
  4. package/dist/ICommandOptions.js.map +1 -0
  5. package/dist/SchemaGenerator.deterministic-extended.test.js +420 -0
  6. package/dist/SchemaGenerator.deterministic-extended.test.js.map +1 -0
  7. package/dist/SchemaGenerator.deterministic.test.js +251 -0
  8. package/dist/SchemaGenerator.deterministic.test.js.map +1 -0
  9. package/dist/SchemaGenerator.integration.test.js +323 -0
  10. package/dist/SchemaGenerator.integration.test.js.map +1 -0
  11. package/dist/SchemaGenerator.js +120 -0
  12. package/dist/SchemaGenerator.js.map +1 -0
  13. package/dist/SchemaGenerator.test.js +226 -0
  14. package/dist/SchemaGenerator.test.js.map +1 -0
  15. package/dist/cli.test.js +155 -0
  16. package/dist/cli.test.js.map +1 -0
  17. package/dist/errors/index.js +95 -0
  18. package/dist/errors/index.js.map +1 -0
  19. package/dist/errors/index.test.js +232 -0
  20. package/dist/errors/index.test.js.map +1 -0
  21. package/dist/getPosixPath.js +13 -0
  22. package/dist/getPosixPath.js.map +1 -0
  23. package/dist/index.js +27 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/lib.js.map +1 -0
  26. package/dist/services/CodeGenerator.js +321 -0
  27. package/dist/services/CodeGenerator.js.map +1 -0
  28. package/dist/services/FileDiscovery.js +123 -0
  29. package/dist/services/FileDiscovery.js.map +1 -0
  30. package/dist/services/FileDiscovery.test.js +184 -0
  31. package/dist/services/FileDiscovery.test.js.map +1 -0
  32. package/dist/services/SchemaProcessor.js +198 -0
  33. package/dist/services/SchemaProcessor.js.map +1 -0
  34. package/dist/services/SchemaProcessor.test.js +455 -0
  35. package/dist/services/SchemaProcessor.test.js.map +1 -0
  36. package/dist/services/SchemaWriter.js +76 -0
  37. package/dist/services/SchemaWriter.js.map +1 -0
  38. package/dist/services/SchemaWriter.test.js +255 -0
  39. package/dist/services/SchemaWriter.test.js.map +1 -0
  40. package/dist/test/basic-scenario/types.jsonschema.js +3 -0
  41. package/dist/test/basic-scenario/types.jsonschema.js.map +1 -0
  42. package/dist/test/duplicate-symbols-different-implementation/IBaseType.js +3 -0
  43. package/dist/test/duplicate-symbols-different-implementation/IBaseType.js.map +1 -0
  44. package/dist/test/duplicate-symbols-different-implementation/IBaseTypeDefinitionReplicated.js +3 -0
  45. package/dist/test/duplicate-symbols-different-implementation/IBaseTypeDefinitionReplicated.js.map +1 -0
  46. package/dist/test/duplicate-symbols-different-implementation/IBasicTypesA.jsonschema.js +3 -0
  47. package/dist/test/duplicate-symbols-different-implementation/IBasicTypesA.jsonschema.js.map +1 -0
  48. package/dist/test/duplicate-symbols-different-implementation/IBasicTypesB.jsonschema.js +3 -0
  49. package/dist/test/duplicate-symbols-different-implementation/IBasicTypesB.jsonschema.js.map +1 -0
  50. package/dist/test/duplicate-symbols-identitcal-implementation/IBaseType.js +3 -0
  51. package/dist/test/duplicate-symbols-identitcal-implementation/IBaseType.js.map +1 -0
  52. package/dist/test/duplicate-symbols-identitcal-implementation/IBaseTypeDefinitionReplicated.js +3 -0
  53. package/dist/test/duplicate-symbols-identitcal-implementation/IBaseTypeDefinitionReplicated.js.map +1 -0
  54. package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesA.jsonschema.js +3 -0
  55. package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesA.jsonschema.js.map +1 -0
  56. package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesB.jsonschema.js +3 -0
  57. package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesB.jsonschema.js.map +1 -0
  58. package/dist/utils/ProgressReporter.js +67 -0
  59. package/dist/utils/ProgressReporter.js.map +1 -0
  60. package/dist/utils/ProgressReporter.test.js +267 -0
  61. package/dist/utils/ProgressReporter.test.js.map +1 -0
  62. package/dist/writeLine.js +12 -0
  63. package/dist/writeLine.js.map +1 -0
  64. package/package.json +2 -2
  65. package/src/ICommandOptions.ts +7 -0
  66. package/src/SchemaGenerator.deterministic-extended.test.ts +429 -0
  67. package/src/SchemaGenerator.deterministic.test.ts +276 -0
  68. package/src/SchemaGenerator.integration.test.ts +411 -0
  69. package/src/SchemaGenerator.test.ts +118 -0
  70. package/src/SchemaGenerator.ts +112 -298
  71. package/src/cli.test.ts +130 -0
  72. package/src/errors/index.test.ts +319 -0
  73. package/src/errors/index.ts +92 -0
  74. package/src/index.ts +8 -1
  75. package/src/services/CodeGenerator.ts +370 -0
  76. package/src/services/FileDiscovery.test.ts +216 -0
  77. package/src/services/FileDiscovery.ts +140 -0
  78. package/src/services/SchemaProcessor.test.ts +536 -0
  79. package/src/services/SchemaProcessor.ts +194 -0
  80. package/src/services/SchemaWriter.test.ts +304 -0
  81. package/src/services/SchemaWriter.ts +75 -0
  82. package/src/utils/ProgressReporter.test.ts +357 -0
  83. package/src/utils/ProgressReporter.ts +76 -0
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.SchemaGenerator = void 0;
16
+ const path_1 = __importDefault(require("path"));
17
+ const FileDiscovery_1 = require("./services/FileDiscovery");
18
+ const SchemaProcessor_1 = require("./services/SchemaProcessor");
19
+ const CodeGenerator_1 = require("./services/CodeGenerator");
20
+ const SchemaWriter_1 = require("./services/SchemaWriter");
21
+ const ProgressReporter_1 = require("./utils/ProgressReporter");
22
+ const errors_1 = require("./errors");
23
+ const validationSchemaFileName = "validation.schema.json";
24
+ const schemaDefinitionFileName = "SchemaDefinition.ts";
25
+ const validationInterfacesFile = "ValidationType.ts";
26
+ const isValidSchemaFileName = "isValidSchema.ts";
27
+ class SchemaGenerator {
28
+ constructor(options) {
29
+ this.options = options;
30
+ this.outputPath = path_1.default.join(this.options.rootPath, this.options.output);
31
+ this.jsonSchemaOutputFile = path_1.default.join(this.outputPath, validationSchemaFileName);
32
+ this.tsSchemaDefinitionOutputFile = path_1.default.join(this.outputPath, schemaDefinitionFileName);
33
+ this.validationTypesOutputFile = path_1.default.join(this.outputPath, validationInterfacesFile);
34
+ this.isValidSchemaOutputFile = path_1.default.join(this.outputPath, isValidSchemaFileName);
35
+ this.Generate = () => __awaiter(this, void 0, void 0, function* () {
36
+ try {
37
+ this.progressReporter.start("Starting schema generation...");
38
+ const { helpers } = this.options;
39
+ // Discover files
40
+ this.progressReporter.update(0, "Discovering files...");
41
+ const files = yield this.fileDiscovery.discoverFiles();
42
+ if (this.options.verbose) {
43
+ console.log(`Found ${files.length} schema file(s)`);
44
+ files.forEach(file => console.log(` - ${file.path}`));
45
+ }
46
+ // Process schemas
47
+ this.progressReporter.update(1, "Processing TypeScript files...");
48
+ this.progressReporter.options.total = files.length + 4; // files + 4 generation steps
49
+ const schemaMap = yield this.schemaProcessor.processFiles(files);
50
+ if (schemaMap.size === 0) {
51
+ console.log("No types found to generate schemas for");
52
+ return;
53
+ }
54
+ // Validate schema compatibility
55
+ this.progressReporter.update(files.length + 1, "Validating schema compatibility...");
56
+ this.schemaProcessor.validateSchemaCompatibility(schemaMap);
57
+ // Merge and write JSON schema
58
+ this.progressReporter.update(files.length + 2, "Writing JSON schema...");
59
+ const mergedSchema = this.schemaProcessor.mergeSchemas(schemaMap);
60
+ yield this.schemaWriter.writeJsonSchema(mergedSchema, this.jsonSchemaOutputFile);
61
+ if (helpers === false) {
62
+ this.progressReporter.complete("Schema generation completed (helpers skipped)");
63
+ return;
64
+ }
65
+ // Generate TypeScript helpers
66
+ this.progressReporter.update(files.length + 3, "Generating TypeScript helpers...");
67
+ yield Promise.all([
68
+ this.codeGenerator.generateSchemaDefinition(schemaMap, this.tsSchemaDefinitionOutputFile),
69
+ this.codeGenerator.generateValidatorFunction(this.isValidSchemaOutputFile),
70
+ this.codeGenerator.generateValidationTypes(schemaMap, this.validationTypesOutputFile)
71
+ ]);
72
+ this.progressReporter.complete("Schema generation completed successfully");
73
+ }
74
+ catch (error) {
75
+ const formattedError = (0, errors_1.formatError)(error, this.options.verbose || false);
76
+ console.error(`Schema generation failed: ${formattedError}`);
77
+ if (!(0, errors_1.isKnownError)(error) && this.options.verbose) {
78
+ console.error(error);
79
+ }
80
+ throw error;
81
+ }
82
+ });
83
+ this.fileDiscovery = new FileDiscovery_1.FileDiscovery({
84
+ glob: options.glob,
85
+ rootPath: options.rootPath,
86
+ cacheEnabled: options.cache || false,
87
+ cachePath: path_1.default.join(options.rootPath, ".ts-runtime-validation-cache")
88
+ });
89
+ this.schemaProcessor = new SchemaProcessor_1.SchemaProcessor({
90
+ additionalProperties: options.additionalProperties,
91
+ tsconfigPath: options.tsconfigPath || undefined,
92
+ parallel: options.parallel !== false,
93
+ verbose: options.verbose || false
94
+ });
95
+ this.codeGenerator = new CodeGenerator_1.CodeGenerator({
96
+ outputPath: this.outputPath,
97
+ minify: options.minify || false,
98
+ treeShaking: options.treeShaking || false,
99
+ lazyLoad: options.lazyLoad || false
100
+ });
101
+ this.schemaWriter = new SchemaWriter_1.SchemaWriter({
102
+ outputPath: this.outputPath,
103
+ minify: options.minify || false
104
+ });
105
+ this.progressReporter = new ProgressReporter_1.ProgressReporter({
106
+ enabled: options.progress || false,
107
+ showBar: true
108
+ });
109
+ }
110
+ clearCache() {
111
+ this.fileDiscovery.clearCache();
112
+ }
113
+ cleanOutput() {
114
+ return __awaiter(this, void 0, void 0, function* () {
115
+ yield this.schemaWriter.cleanOutputDirectory();
116
+ });
117
+ }
118
+ }
119
+ exports.SchemaGenerator = SchemaGenerator;
120
+ //# sourceMappingURL=SchemaGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaGenerator.js","sourceRoot":"","sources":["../src/SchemaGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const fs_1 = __importDefault(require("fs"));
16
+ const path_1 = __importDefault(require("path"));
17
+ const SchemaGenerator_1 = require("./SchemaGenerator");
18
+ const cleanupTestOutput = () => {
19
+ const outputDir = path_1.default.posix.resolve(__dirname, "./test/output");
20
+ const doesDirectoryExist = fs_1.default.existsSync(outputDir);
21
+ if (doesDirectoryExist) {
22
+ fs_1.default.rmSync(outputDir, { recursive: true });
23
+ }
24
+ };
25
+ const getGeneratorConfig = (scenarioPath) => {
26
+ const options = {
27
+ glob: "*.jsonschema.ts",
28
+ rootPath: path_1.default.resolve(__dirname, `./test/${scenarioPath}`),
29
+ output: `../output/${scenarioPath}`,
30
+ helpers: true,
31
+ additionalProperties: false,
32
+ tsconfigPath: "",
33
+ verbose: false,
34
+ progress: false,
35
+ minify: false,
36
+ cache: false,
37
+ parallel: false,
38
+ treeShaking: false,
39
+ lazyLoad: false
40
+ };
41
+ return options;
42
+ };
43
+ const getOutputSchemaPath = (scenarioPath) => {
44
+ return path_1.default.resolve(__dirname, `./test/output/${scenarioPath}`, "validation.schema.json");
45
+ };
46
+ beforeAll(cleanupTestOutput);
47
+ afterAll(cleanupTestOutput);
48
+ describe("SchemaGenerator", () => {
49
+ test("it should generate the correct schema for a basic interface", () => __awaiter(void 0, void 0, void 0, function* () {
50
+ const scenarioPath = "basic-scenario";
51
+ const options = getGeneratorConfig(scenarioPath);
52
+ const generator = new SchemaGenerator_1.SchemaGenerator(options);
53
+ yield generator.Generate();
54
+ const rawFile = fs_1.default.readFileSync(getOutputSchemaPath(scenarioPath)).toString();
55
+ const result = JSON.parse(rawFile);
56
+ const expected = {
57
+ $schema: "http://json-schema.org/draft-07/schema#",
58
+ definitions: {
59
+ IBasicTypes: {
60
+ type: "object",
61
+ properties: {
62
+ propertyA: {
63
+ type: "string",
64
+ },
65
+ propertyB: {
66
+ type: "string",
67
+ },
68
+ },
69
+ required: ["propertyA", "propertyB"],
70
+ additionalProperties: false,
71
+ },
72
+ },
73
+ };
74
+ expect(result).toStrictEqual(expected);
75
+ }));
76
+ test("it should throw an error when there are different implementations of an interface", () => __awaiter(void 0, void 0, void 0, function* () {
77
+ const options = getGeneratorConfig("duplicate-symbols-different-implementation");
78
+ const generator = new SchemaGenerator_1.SchemaGenerator(options);
79
+ yield expect(generator.Generate()).rejects.toThrow();
80
+ }));
81
+ test("it should not an error when there are identical definitions interface", () => __awaiter(void 0, void 0, void 0, function* () {
82
+ const scenarioPath = "duplicate-symbols-identitcal-implementation";
83
+ const options = getGeneratorConfig(scenarioPath);
84
+ const generator = new SchemaGenerator_1.SchemaGenerator(options);
85
+ yield generator.Generate();
86
+ const rawFile = fs_1.default.readFileSync(getOutputSchemaPath(scenarioPath)).toString();
87
+ const result = JSON.parse(rawFile);
88
+ const expected = {
89
+ $schema: "http://json-schema.org/draft-07/schema#",
90
+ definitions: {
91
+ IBasicTypesA: {
92
+ type: "object",
93
+ properties: {
94
+ propertyA: {
95
+ $ref: "#/definitions/IBaseType",
96
+ },
97
+ propertyB: {
98
+ $ref: "#/definitions/IBaseType",
99
+ },
100
+ },
101
+ required: ["propertyA", "propertyB"],
102
+ additionalProperties: false,
103
+ },
104
+ IBaseType: {
105
+ type: "object",
106
+ properties: {
107
+ someProperty: {
108
+ type: "string",
109
+ },
110
+ },
111
+ required: ["someProperty"],
112
+ additionalProperties: false,
113
+ },
114
+ IBasicTypesB: {
115
+ type: "object",
116
+ properties: {
117
+ propertyA: {
118
+ $ref: "#/definitions/IBaseType",
119
+ },
120
+ propertyB: {
121
+ $ref: "#/definitions/IBaseType",
122
+ },
123
+ },
124
+ required: ["propertyA", "propertyB"],
125
+ additionalProperties: false,
126
+ },
127
+ },
128
+ };
129
+ expect(result).toStrictEqual(expected);
130
+ }));
131
+ test("it should sort definitions alphabetically in the generated schema", () => __awaiter(void 0, void 0, void 0, function* () {
132
+ // Create test directory and files
133
+ const testDir = path_1.default.resolve(__dirname, "./test/alphabetical-sorting");
134
+ // Ensure test directory exists
135
+ fs_1.default.mkdirSync(testDir, { recursive: true });
136
+ // Create test file with unsorted type definitions
137
+ const testFilePath = path_1.default.join(testDir, "types.jsonschema.ts");
138
+ fs_1.default.writeFileSync(testFilePath, `
139
+ export interface ZebraType {
140
+ id: string;
141
+ }
142
+
143
+ export interface AppleType {
144
+ name: string;
145
+ }
146
+
147
+ export interface MiddleType {
148
+ value: number;
149
+ }
150
+
151
+ export interface BananaType {
152
+ flag: boolean;
153
+ }
154
+ `);
155
+ try {
156
+ const options = getGeneratorConfig("alphabetical-sorting");
157
+ const generator = new SchemaGenerator_1.SchemaGenerator(options);
158
+ yield generator.Generate();
159
+ const rawFile = fs_1.default.readFileSync(getOutputSchemaPath("alphabetical-sorting")).toString();
160
+ const result = JSON.parse(rawFile);
161
+ // Check that definitions are sorted alphabetically
162
+ const definitionKeys = Object.keys(result.definitions);
163
+ const sortedKeys = [...definitionKeys].sort();
164
+ expect(definitionKeys).toEqual(sortedKeys);
165
+ expect(definitionKeys).toEqual(['AppleType', 'BananaType', 'MiddleType', 'ZebraType']);
166
+ }
167
+ finally {
168
+ // Clean up test directory
169
+ if (fs_1.default.existsSync(testDir)) {
170
+ fs_1.default.rmSync(testDir, { recursive: true });
171
+ }
172
+ }
173
+ }));
174
+ test("it should sort properties alphabetically in generated TypeScript helpers", () => __awaiter(void 0, void 0, void 0, function* () {
175
+ // Create test directory and files
176
+ const testDir = path_1.default.resolve(__dirname, "./test/alphabetical-helpers");
177
+ const outputDir = path_1.default.resolve(__dirname, "./test/output/alphabetical-helpers");
178
+ // Ensure test directory exists
179
+ fs_1.default.mkdirSync(testDir, { recursive: true });
180
+ // Create test file with unsorted type definitions
181
+ const testFilePath = path_1.default.join(testDir, "types.jsonschema.ts");
182
+ fs_1.default.writeFileSync(testFilePath, `
183
+ export type ZebraType = string;
184
+ export type AppleType = number;
185
+ export type MiddleType = boolean;
186
+ export type BananaType = object;
187
+ `);
188
+ try {
189
+ const options = Object.assign(Object.assign({}, getGeneratorConfig("alphabetical-helpers")), { helpers: true });
190
+ const generator = new SchemaGenerator_1.SchemaGenerator(options);
191
+ yield generator.Generate();
192
+ // Check SchemaDefinition.ts for sorted imports and properties
193
+ const schemaDefPath = path_1.default.resolve(outputDir, "SchemaDefinition.ts");
194
+ if (fs_1.default.existsSync(schemaDefPath)) {
195
+ const schemaDefContent = fs_1.default.readFileSync(schemaDefPath, 'utf-8');
196
+ // Extract type names from the schemas object (looking only at the schemas constant)
197
+ const schemasMatch = schemaDefContent.match(/export const schemas[^{]*{([\s\S]*?)}/);
198
+ let schemaKeys = [];
199
+ if (schemasMatch) {
200
+ const schemaLines = schemasMatch[1].split('\n').filter(line => line.includes('#/definitions/'));
201
+ schemaKeys = schemaLines.map(line => {
202
+ const match = line.match(/\["#\/definitions\/([^"]+)"\]/);
203
+ return match ? match[1] : null;
204
+ }).filter(Boolean);
205
+ }
206
+ const sortedSchemaKeys = [...schemaKeys].sort();
207
+ expect(schemaKeys).toEqual(sortedSchemaKeys);
208
+ expect(schemaKeys).toEqual(['AppleType', 'BananaType', 'MiddleType', 'ZebraType']);
209
+ // Check that imports are sorted
210
+ const importMatch = schemaDefContent.match(/import\s+{\s*([^}]+)\s*}/);
211
+ if (importMatch) {
212
+ const imports = importMatch[1].split(',').map(s => s.trim());
213
+ const sortedImports = [...imports].sort();
214
+ expect(imports).toEqual(sortedImports);
215
+ }
216
+ }
217
+ }
218
+ finally {
219
+ // Clean up test directory
220
+ if (fs_1.default.existsSync(testDir)) {
221
+ fs_1.default.rmSync(testDir, { recursive: true });
222
+ }
223
+ }
224
+ }));
225
+ });
226
+ //# sourceMappingURL=SchemaGenerator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaGenerator.test.js","sourceRoot":"","sources":["../src/SchemaGenerator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ const child_process_1 = require("child_process");
46
+ const path = __importStar(require("path"));
47
+ const fs = __importStar(require("fs"));
48
+ describe("CLI Arguments", () => {
49
+ const cliPath = path.join(__dirname, "..", "dist", "index.js");
50
+ const testOutputPath = path.join(__dirname, "../.test-tmp/cli-output");
51
+ beforeEach(() => {
52
+ if (fs.existsSync(testOutputPath)) {
53
+ fs.rmSync(testOutputPath, { recursive: true, force: true });
54
+ }
55
+ });
56
+ afterEach(() => {
57
+ if (fs.existsSync(testOutputPath)) {
58
+ fs.rmSync(testOutputPath, { recursive: true, force: true });
59
+ }
60
+ });
61
+ const runCLI = (args) => {
62
+ return new Promise((resolve) => {
63
+ const proc = (0, child_process_1.spawn)("node", [cliPath, ...args]);
64
+ let stdout = "";
65
+ let stderr = "";
66
+ proc.stdout.on("data", (data) => {
67
+ stdout += data.toString();
68
+ });
69
+ proc.stderr.on("data", (data) => {
70
+ stderr += data.toString();
71
+ });
72
+ proc.on("close", (code) => {
73
+ resolve({ code: code || 0, stdout, stderr });
74
+ });
75
+ });
76
+ };
77
+ it("should accept glob pattern with --glob parameter", () => __awaiter(void 0, void 0, void 0, function* () {
78
+ const result = yield runCLI([
79
+ "--glob", "test/basic-scenario/*.jsonschema.ts",
80
+ "--rootPath", path.join(__dirname),
81
+ "--output", "../.test-tmp/cli-output"
82
+ ]);
83
+ expect(result.code).toBe(0);
84
+ expect(fs.existsSync(testOutputPath)).toBe(true);
85
+ // Check that files were generated
86
+ const generatedFiles = fs.readdirSync(testOutputPath);
87
+ expect(generatedFiles).toContain("validation.schema.json");
88
+ expect(generatedFiles).toContain("SchemaDefinition.ts");
89
+ expect(generatedFiles).toContain("ValidationType.ts");
90
+ expect(generatedFiles).toContain("isValidSchema.ts");
91
+ }));
92
+ it("should use default glob pattern when --glob is not provided", () => __awaiter(void 0, void 0, void 0, function* () {
93
+ // Create test files matching the default pattern
94
+ const testDir = path.join(__dirname, "test-default-glob");
95
+ const testFile1 = path.join(testDir, "test.jsonschema.ts");
96
+ const testFile2 = path.join(testDir, "test2.jsonschema.tsx");
97
+ if (!fs.existsSync(testDir)) {
98
+ fs.mkdirSync(testDir, { recursive: true });
99
+ }
100
+ fs.writeFileSync(testFile1, "export interface TestInterface { test: string; }");
101
+ fs.writeFileSync(testFile2, "export interface TestInterface2 { test2: number; }");
102
+ try {
103
+ const result = yield runCLI([
104
+ "--rootPath", testDir,
105
+ "--output", path.join("..", "../.test-tmp/cli-output")
106
+ ]);
107
+ expect(result.code).toBe(0);
108
+ expect(fs.existsSync(testOutputPath)).toBe(true);
109
+ }
110
+ finally {
111
+ // Clean up test files and directory
112
+ if (fs.existsSync(testDir)) {
113
+ fs.rmSync(testDir, { recursive: true, force: true });
114
+ }
115
+ }
116
+ }));
117
+ it("should accept all supported CLI options", () => __awaiter(void 0, void 0, void 0, function* () {
118
+ const result = yield runCLI([
119
+ "--glob", "test/basic-scenario/*.jsonschema.ts",
120
+ "--rootPath", path.join(__dirname),
121
+ "--output", "../.test-tmp/cli-output",
122
+ "--additionalProperties",
123
+ "--verbose",
124
+ "--progress",
125
+ "--minify",
126
+ "--cache",
127
+ "--tree-shaking",
128
+ "--lazy-load"
129
+ ]);
130
+ expect(result.code).toBe(0);
131
+ // With verbose flag, we should see output
132
+ expect(result.stdout).toContain("Found");
133
+ }));
134
+ it("should handle parallel processing flags correctly", () => __awaiter(void 0, void 0, void 0, function* () {
135
+ // Test with parallel disabled
136
+ const result = yield runCLI([
137
+ "--glob", "test/basic-scenario/*.jsonschema.ts",
138
+ "--rootPath", path.join(__dirname),
139
+ "--output", "../.test-tmp/cli-output",
140
+ "--no-parallel"
141
+ ]);
142
+ expect(result.code).toBe(0);
143
+ expect(fs.existsSync(testOutputPath)).toBe(true);
144
+ }));
145
+ it("should error gracefully when no matching files are found", () => __awaiter(void 0, void 0, void 0, function* () {
146
+ const result = yield runCLI([
147
+ "--glob", "nonexistent/*.jsonschema.ts",
148
+ "--rootPath", path.join(__dirname),
149
+ "--output", "../.test-tmp/cli-output"
150
+ ]);
151
+ expect(result.code).not.toBe(0);
152
+ expect(result.stderr).toContain("No files found");
153
+ }));
154
+ });
155
+ //# sourceMappingURL=cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../src/cli.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CacheError = exports.ConfigurationError = exports.ValidationError = exports.CodeGenerationError = exports.DuplicateSymbolError = exports.SchemaGenerationError = exports.FileDiscoveryError = exports.BaseError = void 0;
4
+ exports.isKnownError = isKnownError;
5
+ exports.formatError = formatError;
6
+ class BaseError extends Error {
7
+ constructor(message, code) {
8
+ super(message);
9
+ this.code = code;
10
+ this.name = this.constructor.name;
11
+ Error.captureStackTrace(this, this.constructor);
12
+ }
13
+ }
14
+ exports.BaseError = BaseError;
15
+ class FileDiscoveryError extends BaseError {
16
+ constructor(message, path) {
17
+ super(message, 'FILE_DISCOVERY_ERROR');
18
+ this.path = path;
19
+ }
20
+ }
21
+ exports.FileDiscoveryError = FileDiscoveryError;
22
+ class SchemaGenerationError extends BaseError {
23
+ constructor(message, file) {
24
+ super(message, 'SCHEMA_GENERATION_ERROR');
25
+ this.file = file;
26
+ }
27
+ }
28
+ exports.SchemaGenerationError = SchemaGenerationError;
29
+ class DuplicateSymbolError extends BaseError {
30
+ constructor(message, symbol, file, existingDefinition, newDefinition) {
31
+ super(message, 'DUPLICATE_SYMBOL_ERROR');
32
+ this.symbol = symbol;
33
+ this.file = file;
34
+ this.existingDefinition = existingDefinition;
35
+ this.newDefinition = newDefinition;
36
+ }
37
+ getDetailedMessage() {
38
+ return `${this.message}
39
+ Symbol: ${this.symbol}
40
+ File: ${this.file}
41
+ Existing Definition: ${JSON.stringify(this.existingDefinition, null, 2)}
42
+ New Definition: ${JSON.stringify(this.newDefinition, null, 2)}`;
43
+ }
44
+ }
45
+ exports.DuplicateSymbolError = DuplicateSymbolError;
46
+ class CodeGenerationError extends BaseError {
47
+ constructor(message, outputFile) {
48
+ super(message, 'CODE_GENERATION_ERROR');
49
+ this.outputFile = outputFile;
50
+ }
51
+ }
52
+ exports.CodeGenerationError = CodeGenerationError;
53
+ class ValidationError extends BaseError {
54
+ constructor(message, errors) {
55
+ super(message, 'VALIDATION_ERROR');
56
+ this.errors = errors;
57
+ }
58
+ getDetailedMessage() {
59
+ const errorList = this.errors
60
+ .map(err => ` - ${err.path}: ${err.message}`)
61
+ .join('\n');
62
+ return `${this.message}\n${errorList}`;
63
+ }
64
+ }
65
+ exports.ValidationError = ValidationError;
66
+ class ConfigurationError extends BaseError {
67
+ constructor(message, field) {
68
+ super(message, 'CONFIGURATION_ERROR');
69
+ this.field = field;
70
+ }
71
+ }
72
+ exports.ConfigurationError = ConfigurationError;
73
+ class CacheError extends BaseError {
74
+ constructor(message, operation) {
75
+ super(message, 'CACHE_ERROR');
76
+ this.operation = operation;
77
+ }
78
+ }
79
+ exports.CacheError = CacheError;
80
+ function isKnownError(error) {
81
+ return error instanceof BaseError;
82
+ }
83
+ function formatError(error, verbose = false) {
84
+ if (isKnownError(error)) {
85
+ if (verbose && 'getDetailedMessage' in error) {
86
+ return error.getDetailedMessage();
87
+ }
88
+ return `[${error.code}] ${error.message}`;
89
+ }
90
+ if (error instanceof Error) {
91
+ return verbose ? error.stack || error.message : error.message;
92
+ }
93
+ return String(error);
94
+ }
95
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"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"}