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.
- package/CONTRIBUTING.md +430 -0
- package/README.md +505 -62
- package/dist/ICommandOptions.js +3 -0
- package/dist/ICommandOptions.js.map +1 -0
- package/dist/SchemaGenerator.deterministic-extended.test.js +420 -0
- package/dist/SchemaGenerator.deterministic-extended.test.js.map +1 -0
- package/dist/SchemaGenerator.deterministic.test.js +251 -0
- package/dist/SchemaGenerator.deterministic.test.js.map +1 -0
- package/dist/SchemaGenerator.integration.test.js +323 -0
- package/dist/SchemaGenerator.integration.test.js.map +1 -0
- package/dist/SchemaGenerator.js +120 -0
- package/dist/SchemaGenerator.js.map +1 -0
- package/dist/SchemaGenerator.test.js +226 -0
- package/dist/SchemaGenerator.test.js.map +1 -0
- package/dist/cli.test.js +155 -0
- package/dist/cli.test.js.map +1 -0
- package/dist/errors/index.js +95 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/index.test.js +232 -0
- package/dist/errors/index.test.js.map +1 -0
- package/dist/getPosixPath.js +13 -0
- package/dist/getPosixPath.js.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/lib.js.map +1 -0
- package/dist/services/CodeGenerator.js +321 -0
- package/dist/services/CodeGenerator.js.map +1 -0
- package/dist/services/FileDiscovery.js +123 -0
- package/dist/services/FileDiscovery.js.map +1 -0
- package/dist/services/FileDiscovery.test.js +184 -0
- package/dist/services/FileDiscovery.test.js.map +1 -0
- package/dist/services/SchemaProcessor.js +198 -0
- package/dist/services/SchemaProcessor.js.map +1 -0
- package/dist/services/SchemaProcessor.test.js +455 -0
- package/dist/services/SchemaProcessor.test.js.map +1 -0
- package/dist/services/SchemaWriter.js +76 -0
- package/dist/services/SchemaWriter.js.map +1 -0
- package/dist/services/SchemaWriter.test.js +255 -0
- package/dist/services/SchemaWriter.test.js.map +1 -0
- package/dist/test/basic-scenario/types.jsonschema.js +3 -0
- package/dist/test/basic-scenario/types.jsonschema.js.map +1 -0
- package/dist/test/duplicate-symbols-different-implementation/IBaseType.js +3 -0
- package/dist/test/duplicate-symbols-different-implementation/IBaseType.js.map +1 -0
- package/dist/test/duplicate-symbols-different-implementation/IBaseTypeDefinitionReplicated.js +3 -0
- package/dist/test/duplicate-symbols-different-implementation/IBaseTypeDefinitionReplicated.js.map +1 -0
- package/dist/test/duplicate-symbols-different-implementation/IBasicTypesA.jsonschema.js +3 -0
- package/dist/test/duplicate-symbols-different-implementation/IBasicTypesA.jsonschema.js.map +1 -0
- package/dist/test/duplicate-symbols-different-implementation/IBasicTypesB.jsonschema.js +3 -0
- package/dist/test/duplicate-symbols-different-implementation/IBasicTypesB.jsonschema.js.map +1 -0
- package/dist/test/duplicate-symbols-identitcal-implementation/IBaseType.js +3 -0
- package/dist/test/duplicate-symbols-identitcal-implementation/IBaseType.js.map +1 -0
- package/dist/test/duplicate-symbols-identitcal-implementation/IBaseTypeDefinitionReplicated.js +3 -0
- package/dist/test/duplicate-symbols-identitcal-implementation/IBaseTypeDefinitionReplicated.js.map +1 -0
- package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesA.jsonschema.js +3 -0
- package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesA.jsonschema.js.map +1 -0
- package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesB.jsonschema.js +3 -0
- package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesB.jsonschema.js.map +1 -0
- package/dist/utils/ProgressReporter.js +67 -0
- package/dist/utils/ProgressReporter.js.map +1 -0
- package/dist/utils/ProgressReporter.test.js +267 -0
- package/dist/utils/ProgressReporter.test.js.map +1 -0
- package/dist/writeLine.js +12 -0
- package/dist/writeLine.js.map +1 -0
- package/package.json +2 -2
- package/src/ICommandOptions.ts +7 -0
- package/src/SchemaGenerator.deterministic-extended.test.ts +429 -0
- package/src/SchemaGenerator.deterministic.test.ts +276 -0
- package/src/SchemaGenerator.integration.test.ts +411 -0
- package/src/SchemaGenerator.test.ts +118 -0
- package/src/SchemaGenerator.ts +112 -298
- package/src/cli.test.ts +130 -0
- package/src/errors/index.test.ts +319 -0
- package/src/errors/index.ts +92 -0
- package/src/index.ts +8 -1
- package/src/services/CodeGenerator.ts +370 -0
- package/src/services/FileDiscovery.test.ts +216 -0
- package/src/services/FileDiscovery.ts +140 -0
- package/src/services/SchemaProcessor.test.ts +536 -0
- package/src/services/SchemaProcessor.ts +194 -0
- package/src/services/SchemaWriter.test.ts +304 -0
- package/src/services/SchemaWriter.ts +75 -0
- package/src/utils/ProgressReporter.test.ts +357 -0
- 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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"}
|