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,251 @@
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 SchemaGenerator_1 = require("./SchemaGenerator");
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ const crypto = __importStar(require("crypto"));
49
+ describe("SchemaGenerator - Deterministic Output", () => {
50
+ const testOutputPath1 = path.join(__dirname, "../.test-tmp/deterministic-output-1");
51
+ const testOutputPath2 = path.join(__dirname, "../.test-tmp/deterministic-output-2");
52
+ beforeEach(() => {
53
+ // Clean up test directories before each test
54
+ [testOutputPath1, testOutputPath2].forEach((dir) => {
55
+ if (fs.existsSync(dir)) {
56
+ fs.rmSync(dir, { recursive: true, force: true });
57
+ }
58
+ });
59
+ });
60
+ afterEach(() => {
61
+ // Clean up test directories after each test
62
+ [testOutputPath1, testOutputPath2].forEach((dir) => {
63
+ if (fs.existsSync(dir)) {
64
+ fs.rmSync(dir, { recursive: true, force: true });
65
+ }
66
+ });
67
+ });
68
+ const getFileHash = (filePath) => {
69
+ if (!fs.existsSync(filePath)) {
70
+ return "";
71
+ }
72
+ const content = fs.readFileSync(filePath, "utf-8");
73
+ return crypto.createHash("md5").update(content).digest("hex");
74
+ };
75
+ const getDirectoryHashes = (dir) => {
76
+ const hashes = new Map();
77
+ if (!fs.existsSync(dir)) {
78
+ return hashes;
79
+ }
80
+ const files = fs.readdirSync(dir);
81
+ files.forEach((file) => {
82
+ const filePath = path.join(dir, file);
83
+ if (fs.statSync(filePath).isFile()) {
84
+ hashes.set(file, getFileHash(filePath));
85
+ }
86
+ });
87
+ return hashes;
88
+ };
89
+ it("should generate identical output for single file on multiple runs", () => __awaiter(void 0, void 0, void 0, function* () {
90
+ const options1 = {
91
+ glob: "test/basic-scenario/*.jsonschema.ts",
92
+ rootPath: path.join(__dirname),
93
+ output: "../.test-tmp/deterministic-output-1",
94
+ tsconfigPath: "",
95
+ helpers: true,
96
+ additionalProperties: false,
97
+ verbose: false,
98
+ progress: false,
99
+ minify: false,
100
+ cache: false,
101
+ parallel: true,
102
+ treeShaking: false,
103
+ lazyLoad: false,
104
+ };
105
+ const options2 = Object.assign(Object.assign({}, options1), { output: "../.test-tmp/deterministic-output-2" });
106
+ // First generation
107
+ const generator1 = new SchemaGenerator_1.SchemaGenerator(options1);
108
+ yield generator1.Generate();
109
+ // Second generation
110
+ const generator2 = new SchemaGenerator_1.SchemaGenerator(options2);
111
+ yield generator2.Generate();
112
+ // Compare hashes
113
+ const hashes1 = getDirectoryHashes(testOutputPath1);
114
+ const hashes2 = getDirectoryHashes(testOutputPath2);
115
+ expect(hashes1.size).toBeGreaterThan(0);
116
+ expect(hashes1.size).toBe(hashes2.size);
117
+ hashes1.forEach((hash, fileName) => {
118
+ expect(hashes2.get(fileName)).toBe(hash);
119
+ });
120
+ }));
121
+ it("should generate identical output for multiple files with identical symbols", () => __awaiter(void 0, void 0, void 0, function* () {
122
+ const options1 = {
123
+ glob: "test/duplicate-symbols-identitcal-implementation/*.jsonschema.ts",
124
+ rootPath: path.join(__dirname),
125
+ output: "../.test-tmp/deterministic-output-1",
126
+ tsconfigPath: "",
127
+ helpers: true,
128
+ additionalProperties: false,
129
+ verbose: false,
130
+ progress: false,
131
+ minify: false,
132
+ cache: false,
133
+ parallel: true,
134
+ treeShaking: false,
135
+ lazyLoad: false,
136
+ };
137
+ const options2 = Object.assign(Object.assign({}, options1), { output: "../.test-tmp/deterministic-output-2" });
138
+ // First generation
139
+ const generator1 = new SchemaGenerator_1.SchemaGenerator(options1);
140
+ yield generator1.Generate();
141
+ // Second generation
142
+ const generator2 = new SchemaGenerator_1.SchemaGenerator(options2);
143
+ yield generator2.Generate();
144
+ // Compare hashes
145
+ const hashes1 = getDirectoryHashes(testOutputPath1);
146
+ const hashes2 = getDirectoryHashes(testOutputPath2);
147
+ expect(hashes1.size).toBeGreaterThan(0);
148
+ expect(hashes1.size).toBe(hashes2.size);
149
+ hashes1.forEach((hash, fileName) => {
150
+ expect(hashes2.get(fileName)).toStrictEqual(hash);
151
+ });
152
+ }));
153
+ it("should generate identical output regardless of parallel vs sequential processing", () => __awaiter(void 0, void 0, void 0, function* () {
154
+ const baseOptions = {
155
+ glob: "test/basic-scenario/*.jsonschema.ts",
156
+ rootPath: path.join(__dirname),
157
+ tsconfigPath: "",
158
+ helpers: true,
159
+ additionalProperties: false,
160
+ verbose: false,
161
+ progress: false,
162
+ minify: false,
163
+ cache: false,
164
+ treeShaking: false,
165
+ lazyLoad: false,
166
+ };
167
+ const optionsParallel = Object.assign(Object.assign({}, baseOptions), { output: "../.test-tmp/deterministic-output-1", parallel: true });
168
+ const optionsSequential = Object.assign(Object.assign({}, baseOptions), { output: "../.test-tmp/deterministic-output-2", parallel: false });
169
+ // Parallel generation
170
+ const generatorParallel = new SchemaGenerator_1.SchemaGenerator(optionsParallel);
171
+ yield generatorParallel.Generate();
172
+ // Sequential generation
173
+ const generatorSequential = new SchemaGenerator_1.SchemaGenerator(optionsSequential);
174
+ yield generatorSequential.Generate();
175
+ // Compare hashes
176
+ const hashesParallel = getDirectoryHashes(testOutputPath1);
177
+ const hashesSequential = getDirectoryHashes(testOutputPath2);
178
+ expect(hashesParallel.size).toBeGreaterThan(0);
179
+ expect(hashesParallel.size).toBe(hashesSequential.size);
180
+ hashesParallel.forEach((hash, fileName) => {
181
+ expect(hashesSequential.get(fileName)).toBe(hash);
182
+ });
183
+ }));
184
+ it("should generate identical output with different output generation options", () => __awaiter(void 0, void 0, void 0, function* () {
185
+ // Test that tree-shaking and lazy-load options produce deterministic output
186
+ const baseOptions = {
187
+ glob: "test/basic-scenario/*.jsonschema.ts",
188
+ rootPath: path.join(__dirname),
189
+ tsconfigPath: "",
190
+ helpers: true,
191
+ additionalProperties: false,
192
+ verbose: false,
193
+ progress: false,
194
+ minify: false,
195
+ cache: false,
196
+ parallel: true,
197
+ };
198
+ const optionsTreeShaking1 = Object.assign(Object.assign({}, baseOptions), { output: "../.test-tmp/deterministic-output-1", treeShaking: true, lazyLoad: false });
199
+ const optionsTreeShaking2 = Object.assign(Object.assign({}, baseOptions), { output: "../.test-tmp/deterministic-output-2", treeShaking: true, lazyLoad: false });
200
+ // First generation with tree-shaking
201
+ const generator1 = new SchemaGenerator_1.SchemaGenerator(optionsTreeShaking1);
202
+ yield generator1.Generate();
203
+ // Second generation with tree-shaking
204
+ const generator2 = new SchemaGenerator_1.SchemaGenerator(optionsTreeShaking2);
205
+ yield generator2.Generate();
206
+ // Compare hashes
207
+ const hashes1 = getDirectoryHashes(testOutputPath1);
208
+ const hashes2 = getDirectoryHashes(testOutputPath2);
209
+ expect(hashes1.size).toBeGreaterThan(0);
210
+ expect(hashes1.size).toBe(hashes2.size);
211
+ hashes1.forEach((hash, fileName) => {
212
+ expect(hashes2.get(fileName)).toBe(hash);
213
+ });
214
+ }));
215
+ it("should maintain consistent import order in generated files", () => __awaiter(void 0, void 0, void 0, function* () {
216
+ const options = {
217
+ glob: "test/duplicate-symbols-identitcal-implementation/*.jsonschema.ts",
218
+ rootPath: path.join(__dirname),
219
+ output: "../.test-tmp/deterministic-output-1",
220
+ tsconfigPath: "",
221
+ helpers: true,
222
+ additionalProperties: false,
223
+ verbose: false,
224
+ progress: false,
225
+ minify: false,
226
+ cache: false,
227
+ parallel: true,
228
+ treeShaking: false,
229
+ lazyLoad: false,
230
+ };
231
+ const generator = new SchemaGenerator_1.SchemaGenerator(options);
232
+ yield generator.Generate();
233
+ // Check that SchemaDefinition.ts has sorted imports
234
+ const schemaDefPath = path.join(testOutputPath1, "SchemaDefinition.ts");
235
+ expect(fs.existsSync(schemaDefPath)).toBe(true);
236
+ const schemaDefContent = fs.readFileSync(schemaDefPath, "utf-8");
237
+ const importLines = schemaDefContent.split("\n").filter((line) => line.startsWith("import"));
238
+ // Verify imports are in alphabetical order
239
+ const sortedImports = [...importLines].sort();
240
+ expect(importLines).toEqual(sortedImports);
241
+ // Check that ValidationType.ts has sorted imports
242
+ const validationTypePath = path.join(testOutputPath1, "ValidationType.ts");
243
+ expect(fs.existsSync(validationTypePath)).toBe(true);
244
+ const validationTypeContent = fs.readFileSync(validationTypePath, "utf-8");
245
+ const validationImportLines = validationTypeContent.split("\n").filter((line) => line.startsWith("import"));
246
+ // Verify imports are in alphabetical order
247
+ const sortedValidationImports = [...validationImportLines].sort();
248
+ expect(validationImportLines).toEqual(sortedValidationImports);
249
+ }));
250
+ });
251
+ //# sourceMappingURL=SchemaGenerator.deterministic.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaGenerator.deterministic.test.js","sourceRoot":"","sources":["../src/SchemaGenerator.deterministic.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,323 @@
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 testDir = path_1.default.resolve(__dirname, "../.test-tmp/integration");
19
+ const createTestFile = (filePath, content) => __awaiter(void 0, void 0, void 0, function* () {
20
+ const fullPath = path_1.default.resolve(testDir, filePath);
21
+ yield fs_1.default.promises.mkdir(path_1.default.dirname(fullPath), { recursive: true });
22
+ yield fs_1.default.promises.writeFile(fullPath, content);
23
+ return fullPath;
24
+ });
25
+ const cleanup = () => __awaiter(void 0, void 0, void 0, function* () {
26
+ if (fs_1.default.existsSync(testDir)) {
27
+ yield fs_1.default.promises.rm(testDir, { recursive: true, force: true });
28
+ }
29
+ });
30
+ const getGeneratorConfig = (overrides = {}) => (Object.assign({ glob: "*.jsonschema.ts", rootPath: testDir, output: "./output", helpers: true, additionalProperties: false, tsconfigPath: "", verbose: false, progress: false, minify: false, cache: false, parallel: false, treeShaking: false, lazyLoad: false }, overrides));
31
+ beforeEach(cleanup);
32
+ afterAll(cleanup);
33
+ describe("SchemaGenerator Integration Tests", () => {
34
+ describe("new CLI options", () => {
35
+ it("should work with verbose mode enabled", () => __awaiter(void 0, void 0, void 0, function* () {
36
+ const consoleSpy = jest.spyOn(console, 'log').mockImplementation();
37
+ yield createTestFile("user.jsonschema.ts", `
38
+ export interface IUser {
39
+ id: string;
40
+ name: string;
41
+ }
42
+ `);
43
+ const generator = new SchemaGenerator_1.SchemaGenerator(getGeneratorConfig({
44
+ verbose: true
45
+ }));
46
+ yield generator.Generate();
47
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("Found 1 schema file(s)"));
48
+ consoleSpy.mockRestore();
49
+ }));
50
+ it("should work with progress reporting enabled", () => __awaiter(void 0, void 0, void 0, function* () {
51
+ yield createTestFile("user.jsonschema.ts", `
52
+ export interface IUser {
53
+ id: string;
54
+ name: string;
55
+ }
56
+ `);
57
+ const generator = new SchemaGenerator_1.SchemaGenerator(getGeneratorConfig({
58
+ progress: true
59
+ }));
60
+ yield generator.Generate();
61
+ // Check that output files were generated
62
+ const outputDir = path_1.default.join(testDir, "output");
63
+ expect(fs_1.default.existsSync(path_1.default.join(outputDir, "validation.schema.json"))).toBe(true);
64
+ expect(fs_1.default.existsSync(path_1.default.join(outputDir, "SchemaDefinition.ts"))).toBe(true);
65
+ }));
66
+ it("should work with caching enabled", () => __awaiter(void 0, void 0, void 0, function* () {
67
+ yield createTestFile("user.jsonschema.ts", `
68
+ export interface IUser {
69
+ id: string;
70
+ name: string;
71
+ }
72
+ `);
73
+ const generator = new SchemaGenerator_1.SchemaGenerator(getGeneratorConfig({
74
+ cache: true
75
+ }));
76
+ yield generator.Generate();
77
+ // Check that cache was created
78
+ const cacheDir = path_1.default.join(testDir, ".ts-runtime-validation-cache");
79
+ expect(fs_1.default.existsSync(path_1.default.join(cacheDir, "file-hashes.json"))).toBe(true);
80
+ // Run again to test cache usage
81
+ yield generator.Generate();
82
+ const outputDir = path_1.default.join(testDir, "output");
83
+ expect(fs_1.default.existsSync(path_1.default.join(outputDir, "validation.schema.json"))).toBe(true);
84
+ }));
85
+ it("should work with parallel processing enabled", () => __awaiter(void 0, void 0, void 0, function* () {
86
+ yield createTestFile("user.jsonschema.ts", `
87
+ export interface IUser {
88
+ id: string;
89
+ name: string;
90
+ }
91
+ `);
92
+ yield createTestFile("product.jsonschema.ts", `
93
+ export interface IProduct {
94
+ id: string;
95
+ title: string;
96
+ price: number;
97
+ }
98
+ `);
99
+ const generator = new SchemaGenerator_1.SchemaGenerator(getGeneratorConfig({
100
+ parallel: true
101
+ }));
102
+ yield generator.Generate();
103
+ // Check that both interfaces were processed
104
+ const schemaFile = path_1.default.join(testDir, "output", "validation.schema.json");
105
+ const schemaContent = JSON.parse(fs_1.default.readFileSync(schemaFile, 'utf-8'));
106
+ expect(schemaContent.definitions.IUser).toBeDefined();
107
+ expect(schemaContent.definitions.IProduct).toBeDefined();
108
+ }));
109
+ it("should work with minified output", () => __awaiter(void 0, void 0, void 0, function* () {
110
+ yield createTestFile("user.jsonschema.ts", `
111
+ export interface IUser {
112
+ id: string;
113
+ name: string;
114
+ }
115
+ `);
116
+ const generator = new SchemaGenerator_1.SchemaGenerator(getGeneratorConfig({
117
+ minify: true
118
+ }));
119
+ yield generator.Generate();
120
+ // Check that JSON schema is minified (no pretty formatting)
121
+ const schemaFile = path_1.default.join(testDir, "output", "validation.schema.json");
122
+ const schemaContent = fs_1.default.readFileSync(schemaFile, 'utf-8');
123
+ // Minified JSON shouldn't have indentation
124
+ expect(schemaContent).not.toMatch(/\n /);
125
+ // But should still be valid JSON
126
+ expect(() => JSON.parse(schemaContent)).not.toThrow();
127
+ }));
128
+ it("should work with tree-shaking enabled", () => __awaiter(void 0, void 0, void 0, function* () {
129
+ yield createTestFile("user.jsonschema.ts", `
130
+ export interface IUser {
131
+ id: string;
132
+ name: string;
133
+ }
134
+ `);
135
+ const generator = new SchemaGenerator_1.SchemaGenerator(getGeneratorConfig({
136
+ treeShaking: true
137
+ }));
138
+ yield generator.Generate();
139
+ // Check that ValidationType.ts has individual exports instead of namespace
140
+ const validationTypesFile = path_1.default.join(testDir, "output", "ValidationType.ts");
141
+ const content = fs_1.default.readFileSync(validationTypesFile, 'utf-8');
142
+ expect(content).toContain("export type IUser");
143
+ expect(content).not.toContain("namespace ValidationType");
144
+ }));
145
+ it("should work with lazy loading enabled", () => __awaiter(void 0, void 0, void 0, function* () {
146
+ yield createTestFile("user.jsonschema.ts", `
147
+ export interface IUser {
148
+ id: string;
149
+ name: string;
150
+ }
151
+ `);
152
+ const generator = new SchemaGenerator_1.SchemaGenerator(getGeneratorConfig({
153
+ lazyLoad: true
154
+ }));
155
+ yield generator.Generate();
156
+ // Check that isValidSchema.ts uses lazy loading
157
+ const validatorFile = path_1.default.join(testDir, "output", "isValidSchema.ts");
158
+ const content = fs_1.default.readFileSync(validatorFile, 'utf-8');
159
+ expect(content).toContain("let validator");
160
+ expect(content).toContain("getValidator");
161
+ expect(content).toContain("require(\"ajv\")");
162
+ }));
163
+ });
164
+ describe("combined options", () => {
165
+ it("should work with multiple options enabled", () => __awaiter(void 0, void 0, void 0, function* () {
166
+ yield createTestFile("user.jsonschema.ts", `
167
+ export interface IUser {
168
+ id: string;
169
+ name: string;
170
+ }
171
+ `);
172
+ yield createTestFile("product.jsonschema.ts", `
173
+ export interface IProduct {
174
+ id: string;
175
+ title: string;
176
+ }
177
+ `);
178
+ const generator = new SchemaGenerator_1.SchemaGenerator(getGeneratorConfig({
179
+ verbose: true,
180
+ progress: true,
181
+ cache: true,
182
+ parallel: true,
183
+ minify: true,
184
+ treeShaking: true
185
+ }));
186
+ yield generator.Generate();
187
+ // Verify all features work together
188
+ const outputDir = path_1.default.join(testDir, "output");
189
+ const cacheDir = path_1.default.join(testDir, ".ts-runtime-validation-cache");
190
+ // Check files exist
191
+ expect(fs_1.default.existsSync(path_1.default.join(outputDir, "validation.schema.json"))).toBe(true);
192
+ expect(fs_1.default.existsSync(path_1.default.join(outputDir, "SchemaDefinition.ts"))).toBe(true);
193
+ expect(fs_1.default.existsSync(path_1.default.join(outputDir, "ValidationType.ts"))).toBe(true);
194
+ expect(fs_1.default.existsSync(path_1.default.join(cacheDir, "file-hashes.json"))).toBe(true);
195
+ // Check minification
196
+ const schemaContent = fs_1.default.readFileSync(path_1.default.join(outputDir, "validation.schema.json"), 'utf-8');
197
+ expect(schemaContent).not.toMatch(/\n /);
198
+ // Check tree-shaking
199
+ const validationTypesContent = fs_1.default.readFileSync(path_1.default.join(outputDir, "ValidationType.ts"), 'utf-8');
200
+ expect(validationTypesContent).toContain("export type IUser");
201
+ expect(validationTypesContent).not.toContain("namespace ValidationType");
202
+ }));
203
+ });
204
+ describe("error handling with new options", () => {
205
+ it("should handle errors gracefully with verbose mode", () => __awaiter(void 0, void 0, void 0, function* () {
206
+ const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation();
207
+ // Use non-existent glob pattern to trigger error
208
+ const generator = new SchemaGenerator_1.SchemaGenerator(getGeneratorConfig({
209
+ glob: "*.nonexistent.ts",
210
+ verbose: true
211
+ }));
212
+ yield expect(generator.Generate()).rejects.toThrow();
213
+ consoleErrorSpy.mockRestore();
214
+ }));
215
+ it("should provide detailed error context", () => __awaiter(void 0, void 0, void 0, function* () {
216
+ const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation();
217
+ const generator = new SchemaGenerator_1.SchemaGenerator(getGeneratorConfig({
218
+ glob: "*.nonexistent.ts", // Pattern that won't match any files
219
+ verbose: true
220
+ }));
221
+ yield expect(generator.Generate()).rejects.toThrow();
222
+ consoleErrorSpy.mockRestore();
223
+ }));
224
+ });
225
+ describe("cache functionality", () => {
226
+ it("should invalidate cache when file changes", () => __awaiter(void 0, void 0, void 0, function* () {
227
+ const filePath = yield createTestFile("user.jsonschema.ts", `
228
+ export interface IUser {
229
+ id: string;
230
+ name: string;
231
+ }
232
+ `);
233
+ const generator = new SchemaGenerator_1.SchemaGenerator(getGeneratorConfig({
234
+ cache: true
235
+ }));
236
+ // First run
237
+ yield generator.Generate();
238
+ const cacheFile = path_1.default.join(testDir, ".ts-runtime-validation-cache", "file-hashes.json");
239
+ expect(fs_1.default.existsSync(cacheFile)).toBe(true);
240
+ const originalCache = JSON.parse(fs_1.default.readFileSync(cacheFile, 'utf-8'));
241
+ // Modify file
242
+ yield fs_1.default.promises.writeFile(filePath, `
243
+ export interface IUser {
244
+ id: string;
245
+ name: string;
246
+ email: string; // Added field
247
+ }
248
+ `);
249
+ // Second run
250
+ yield generator.Generate();
251
+ const updatedCache = JSON.parse(fs_1.default.readFileSync(cacheFile, 'utf-8'));
252
+ // Hash should have changed
253
+ expect(originalCache[filePath]).not.toBe(updatedCache[filePath]);
254
+ }));
255
+ it("should clear cache correctly", () => __awaiter(void 0, void 0, void 0, function* () {
256
+ yield createTestFile("user.jsonschema.ts", `
257
+ export interface IUser {
258
+ id: string;
259
+ name: string;
260
+ }
261
+ `);
262
+ const generator = new SchemaGenerator_1.SchemaGenerator(getGeneratorConfig({
263
+ cache: true
264
+ }));
265
+ yield generator.Generate();
266
+ const cacheFile = path_1.default.join(testDir, ".ts-runtime-validation-cache", "file-hashes.json");
267
+ expect(fs_1.default.existsSync(cacheFile)).toBe(true);
268
+ generator.clearCache();
269
+ expect(fs_1.default.existsSync(cacheFile)).toBe(false);
270
+ }));
271
+ });
272
+ describe("output management", () => {
273
+ it("should clean output directory", () => __awaiter(void 0, void 0, void 0, function* () {
274
+ yield createTestFile("user.jsonschema.ts", `
275
+ export interface IUser {
276
+ id: string;
277
+ name: string;
278
+ }
279
+ `);
280
+ const generator = new SchemaGenerator_1.SchemaGenerator(getGeneratorConfig());
281
+ // Generate first time
282
+ yield generator.Generate();
283
+ const outputDir = path_1.default.join(testDir, "output");
284
+ expect(fs_1.default.existsSync(path_1.default.join(outputDir, "validation.schema.json"))).toBe(true);
285
+ // Clean output
286
+ yield generator.cleanOutput();
287
+ // TypeScript and JSON files should be removed
288
+ expect(fs_1.default.existsSync(path_1.default.join(outputDir, "validation.schema.json"))).toBe(false);
289
+ expect(fs_1.default.existsSync(path_1.default.join(outputDir, "SchemaDefinition.ts"))).toBe(false);
290
+ }));
291
+ });
292
+ describe("performance with different options", () => {
293
+ it("should process multiple files efficiently with parallel mode", () => __awaiter(void 0, void 0, void 0, function* () {
294
+ // Create multiple test files
295
+ const numFiles = 5;
296
+ for (let i = 0; i < numFiles; i++) {
297
+ yield createTestFile(`interface${i}.jsonschema.ts`, `
298
+ export interface IInterface${i} {
299
+ id: string;
300
+ name: string;
301
+ value${i}: number;
302
+ }
303
+ `);
304
+ }
305
+ const startTime = Date.now();
306
+ const generator = new SchemaGenerator_1.SchemaGenerator(getGeneratorConfig({
307
+ parallel: true
308
+ }));
309
+ yield generator.Generate();
310
+ const endTime = Date.now();
311
+ const duration = endTime - startTime;
312
+ // Should complete reasonably quickly (less than 20 seconds)
313
+ expect(duration).toBeLessThan(20000);
314
+ // Verify all files were processed
315
+ const schemaFile = path_1.default.join(testDir, "output", "validation.schema.json");
316
+ const schemaContent = JSON.parse(fs_1.default.readFileSync(schemaFile, 'utf-8'));
317
+ for (let i = 0; i < numFiles; i++) {
318
+ expect(schemaContent.definitions[`IInterface${i}`]).toBeDefined();
319
+ }
320
+ }));
321
+ });
322
+ });
323
+ //# sourceMappingURL=SchemaGenerator.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaGenerator.integration.test.js","sourceRoot":"","sources":["../src/SchemaGenerator.integration.test.ts"],"names":[],"mappings":"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"}