ts-runtime-validation 1.6.16 → 1.7.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/.claude/settings.local.json +9 -0
- package/CONTRIBUTING.md +430 -0
- package/README.md +444 -64
- package/dist/ICommandOptions.js +3 -0
- package/dist/ICommandOptions.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 +132 -0
- package/dist/SchemaGenerator.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 +305 -0
- package/dist/services/CodeGenerator.js.map +1 -0
- package/dist/services/FileDiscovery.js +121 -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 +182 -0
- package/dist/services/SchemaProcessor.js.map +1 -0
- package/dist/services/SchemaProcessor.test.js +395 -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/test/output/duplicate-symbols-identitcal-implementation/ValidationType.js +3 -0
- package/dist/test/output/duplicate-symbols-identitcal-implementation/ValidationType.js.map +1 -0
- package/dist/test/output/duplicate-symbols-identitcal-implementation/isValidSchema.js +49 -0
- package/dist/test/output/duplicate-symbols-identitcal-implementation/isValidSchema.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.integration.test.ts +411 -0
- package/src/SchemaGenerator.test.ts +7 -0
- package/src/SchemaGenerator.ts +112 -298
- package/src/errors/index.test.ts +319 -0
- package/src/errors/index.ts +92 -0
- package/src/index.ts +7 -0
- package/src/services/CodeGenerator.ts +352 -0
- package/src/services/FileDiscovery.test.ts +216 -0
- package/src/services/FileDiscovery.ts +137 -0
- package/src/services/SchemaProcessor.test.ts +464 -0
- package/src/services/SchemaProcessor.ts +173 -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,182 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
45
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
46
|
+
};
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.SchemaProcessor = void 0;
|
|
49
|
+
const tsj = __importStar(require("ts-json-schema-generator"));
|
|
50
|
+
const assert_1 = __importDefault(require("assert"));
|
|
51
|
+
const errors_1 = require("../errors");
|
|
52
|
+
class SchemaProcessor {
|
|
53
|
+
constructor(options) {
|
|
54
|
+
this.options = options;
|
|
55
|
+
}
|
|
56
|
+
processFiles(files) {
|
|
57
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
58
|
+
const { parallel = true, verbose = false } = this.options;
|
|
59
|
+
if (verbose) {
|
|
60
|
+
console.log(`Processing ${files.length} files...`);
|
|
61
|
+
}
|
|
62
|
+
const results = parallel
|
|
63
|
+
? yield this.processInParallel(files)
|
|
64
|
+
: yield this.processSequentially(files);
|
|
65
|
+
return this.consolidateSchemas(results);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
processInParallel(files) {
|
|
69
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
70
|
+
const promises = files.map(file => this.processFile(file));
|
|
71
|
+
const results = yield Promise.allSettled(promises);
|
|
72
|
+
return results.map((result, index) => {
|
|
73
|
+
if (result.status === 'fulfilled') {
|
|
74
|
+
return result.value;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
return {
|
|
78
|
+
file: files[index].path,
|
|
79
|
+
schema: null,
|
|
80
|
+
error: result.reason
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
processSequentially(files) {
|
|
87
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
88
|
+
const results = [];
|
|
89
|
+
for (const file of files) {
|
|
90
|
+
try {
|
|
91
|
+
const result = yield this.processFile(file);
|
|
92
|
+
results.push(result);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
results.push({
|
|
96
|
+
file: file.path,
|
|
97
|
+
schema: null,
|
|
98
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return results;
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
processFile(file) {
|
|
106
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
107
|
+
const { additionalProperties, tsconfigPath, verbose } = this.options;
|
|
108
|
+
try {
|
|
109
|
+
if (verbose) {
|
|
110
|
+
console.log(`Processing: ${file.path}`);
|
|
111
|
+
}
|
|
112
|
+
const config = Object.assign({ path: file.path, type: "*", additionalProperties, encodeRefs: false, sortProps: true }, (tsconfigPath ? { tsconfig: tsconfigPath } : {}));
|
|
113
|
+
const schemaGenerator = tsj.createGenerator(config);
|
|
114
|
+
const schema = schemaGenerator.createSchema(config.type);
|
|
115
|
+
return {
|
|
116
|
+
file: file.path,
|
|
117
|
+
schema,
|
|
118
|
+
error: undefined
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
throw new errors_1.SchemaGenerationError(`Failed to process ${file.path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
consolidateSchemas(results) {
|
|
127
|
+
const schemaMap = new Map();
|
|
128
|
+
const errors = [];
|
|
129
|
+
for (const result of results) {
|
|
130
|
+
if (result.error) {
|
|
131
|
+
errors.push(result.error);
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (result.schema) {
|
|
135
|
+
schemaMap.set(result.file, result.schema);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (errors.length > 0 && this.options.verbose) {
|
|
139
|
+
console.warn(`Encountered ${errors.length} errors during processing:`);
|
|
140
|
+
errors.forEach(error => console.warn(` - ${error.message}`));
|
|
141
|
+
}
|
|
142
|
+
return schemaMap;
|
|
143
|
+
}
|
|
144
|
+
validateSchemaCompatibility(schemaMap) {
|
|
145
|
+
const definitions = {};
|
|
146
|
+
schemaMap.forEach((fileSchema, filePath) => {
|
|
147
|
+
var _a;
|
|
148
|
+
const defs = (_a = fileSchema.definitions) !== null && _a !== void 0 ? _a : {};
|
|
149
|
+
Object.keys(defs).forEach((key) => {
|
|
150
|
+
if (definitions[key] !== undefined) {
|
|
151
|
+
try {
|
|
152
|
+
assert_1.default.deepEqual(definitions[key], defs[key]);
|
|
153
|
+
}
|
|
154
|
+
catch (e) {
|
|
155
|
+
throw new errors_1.DuplicateSymbolError(`Duplicate symbol '${key}' found with different implementations`, key, filePath, definitions[key], defs[key]);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
definitions[key] = defs[key];
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
mergeSchemas(schemaMap) {
|
|
163
|
+
const definitions = {};
|
|
164
|
+
let schemaVersion = "";
|
|
165
|
+
schemaMap.forEach((fileSchema) => {
|
|
166
|
+
var _a;
|
|
167
|
+
if (!schemaVersion && fileSchema["$schema"]) {
|
|
168
|
+
schemaVersion = fileSchema["$schema"];
|
|
169
|
+
}
|
|
170
|
+
const defs = (_a = fileSchema.definitions) !== null && _a !== void 0 ? _a : {};
|
|
171
|
+
Object.keys(defs).forEach((key) => {
|
|
172
|
+
definitions[key] = defs[key];
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
return {
|
|
176
|
+
$schema: schemaVersion || "http://json-schema.org/draft-07/schema#",
|
|
177
|
+
definitions,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
exports.SchemaProcessor = SchemaProcessor;
|
|
182
|
+
//# sourceMappingURL=SchemaProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaProcessor.js","sourceRoot":"","sources":["../../src/services/SchemaProcessor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,395 @@
|
|
|
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 SchemaProcessor_1 = require("./SchemaProcessor");
|
|
18
|
+
const errors_1 = require("../errors");
|
|
19
|
+
const testDir = path_1.default.resolve(__dirname, "../test-tmp/schema-processor");
|
|
20
|
+
const createTestFile = (filePath, content) => __awaiter(void 0, void 0, void 0, function* () {
|
|
21
|
+
const fullPath = path_1.default.resolve(testDir, filePath);
|
|
22
|
+
yield fs_1.default.promises.mkdir(path_1.default.dirname(fullPath), { recursive: true });
|
|
23
|
+
yield fs_1.default.promises.writeFile(fullPath, content);
|
|
24
|
+
return fullPath;
|
|
25
|
+
});
|
|
26
|
+
const cleanup = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
27
|
+
if (fs_1.default.existsSync(testDir)) {
|
|
28
|
+
yield fs_1.default.promises.rm(testDir, { recursive: true, force: true });
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
beforeEach(cleanup);
|
|
32
|
+
afterAll(cleanup);
|
|
33
|
+
describe("SchemaProcessor", () => {
|
|
34
|
+
describe("processFiles", () => {
|
|
35
|
+
it("should process valid TypeScript files", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
36
|
+
const filePath = yield createTestFile("user.jsonschema.ts", `
|
|
37
|
+
export interface IUser {
|
|
38
|
+
id: string;
|
|
39
|
+
name: string;
|
|
40
|
+
email?: string;
|
|
41
|
+
}
|
|
42
|
+
`);
|
|
43
|
+
const processor = new SchemaProcessor_1.SchemaProcessor({
|
|
44
|
+
additionalProperties: false,
|
|
45
|
+
parallel: false,
|
|
46
|
+
verbose: false
|
|
47
|
+
});
|
|
48
|
+
const files = [{ path: filePath }];
|
|
49
|
+
const schemaMap = yield processor.processFiles(files);
|
|
50
|
+
expect(schemaMap.size).toBe(1);
|
|
51
|
+
expect(schemaMap.has(filePath)).toBe(true);
|
|
52
|
+
const schema = schemaMap.get(filePath);
|
|
53
|
+
expect(schema.definitions).toBeDefined();
|
|
54
|
+
expect(schema.definitions.IUser).toBeDefined();
|
|
55
|
+
expect(schema.definitions.IUser).toMatchObject({
|
|
56
|
+
type: "object",
|
|
57
|
+
properties: {
|
|
58
|
+
id: { type: "string" },
|
|
59
|
+
name: { type: "string" },
|
|
60
|
+
email: { type: "string" }
|
|
61
|
+
},
|
|
62
|
+
required: ["id", "name"],
|
|
63
|
+
additionalProperties: false
|
|
64
|
+
});
|
|
65
|
+
}));
|
|
66
|
+
it("should handle parallel processing", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
67
|
+
const file1 = yield createTestFile("user.jsonschema.ts", `
|
|
68
|
+
export interface IUser {
|
|
69
|
+
id: string;
|
|
70
|
+
name: string;
|
|
71
|
+
}
|
|
72
|
+
`);
|
|
73
|
+
const file2 = yield createTestFile("product.jsonschema.ts", `
|
|
74
|
+
export interface IProduct {
|
|
75
|
+
id: string;
|
|
76
|
+
title: string;
|
|
77
|
+
price: number;
|
|
78
|
+
}
|
|
79
|
+
`);
|
|
80
|
+
const processor = new SchemaProcessor_1.SchemaProcessor({
|
|
81
|
+
additionalProperties: false,
|
|
82
|
+
parallel: true,
|
|
83
|
+
verbose: false
|
|
84
|
+
});
|
|
85
|
+
const files = [
|
|
86
|
+
{ path: file1 },
|
|
87
|
+
{ path: file2 }
|
|
88
|
+
];
|
|
89
|
+
const schemaMap = yield processor.processFiles(files);
|
|
90
|
+
expect(schemaMap.size).toBe(2);
|
|
91
|
+
expect(schemaMap.has(file1)).toBe(true);
|
|
92
|
+
expect(schemaMap.has(file2)).toBe(true);
|
|
93
|
+
}));
|
|
94
|
+
it("should handle sequential processing", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
95
|
+
const file1 = yield createTestFile("user.jsonschema.ts", `
|
|
96
|
+
export interface IUser {
|
|
97
|
+
id: string;
|
|
98
|
+
name: string;
|
|
99
|
+
}
|
|
100
|
+
`);
|
|
101
|
+
const processor = new SchemaProcessor_1.SchemaProcessor({
|
|
102
|
+
additionalProperties: false,
|
|
103
|
+
parallel: false,
|
|
104
|
+
verbose: false
|
|
105
|
+
});
|
|
106
|
+
const files = [{ path: file1 }];
|
|
107
|
+
const schemaMap = yield processor.processFiles(files);
|
|
108
|
+
expect(schemaMap.size).toBe(1);
|
|
109
|
+
}));
|
|
110
|
+
it("should handle files with syntax errors gracefully", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
111
|
+
const validFile = yield createTestFile("valid.jsonschema.ts", `
|
|
112
|
+
export interface IValid {
|
|
113
|
+
id: string;
|
|
114
|
+
}
|
|
115
|
+
`);
|
|
116
|
+
const invalidFile = yield createTestFile("invalid.jsonschema.ts", `
|
|
117
|
+
export interface IInvalid {
|
|
118
|
+
id: string
|
|
119
|
+
// missing semicolon and other syntax errors
|
|
120
|
+
name string;
|
|
121
|
+
}
|
|
122
|
+
`);
|
|
123
|
+
const processor = new SchemaProcessor_1.SchemaProcessor({
|
|
124
|
+
additionalProperties: false,
|
|
125
|
+
parallel: false,
|
|
126
|
+
verbose: false
|
|
127
|
+
});
|
|
128
|
+
const files = [
|
|
129
|
+
{ path: validFile },
|
|
130
|
+
{ path: invalidFile }
|
|
131
|
+
];
|
|
132
|
+
// Should not throw but should process valid files
|
|
133
|
+
const schemaMap = yield processor.processFiles(files);
|
|
134
|
+
// At least valid file should be processed
|
|
135
|
+
expect(schemaMap.size).toBeGreaterThan(0);
|
|
136
|
+
expect(schemaMap.has(validFile)).toBe(true);
|
|
137
|
+
}));
|
|
138
|
+
it("should respect additionalProperties setting", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
139
|
+
const filePath = yield createTestFile("user.jsonschema.ts", `
|
|
140
|
+
export interface IUser {
|
|
141
|
+
id: string;
|
|
142
|
+
name: string;
|
|
143
|
+
}
|
|
144
|
+
`);
|
|
145
|
+
const processorStrict = new SchemaProcessor_1.SchemaProcessor({
|
|
146
|
+
additionalProperties: false,
|
|
147
|
+
parallel: false
|
|
148
|
+
});
|
|
149
|
+
const processorLoose = new SchemaProcessor_1.SchemaProcessor({
|
|
150
|
+
additionalProperties: true,
|
|
151
|
+
parallel: false
|
|
152
|
+
});
|
|
153
|
+
const files = [{ path: filePath }];
|
|
154
|
+
const strictSchema = yield processorStrict.processFiles(files);
|
|
155
|
+
const looseSchema = yield processorLoose.processFiles(files);
|
|
156
|
+
const strictUser = strictSchema.get(filePath).definitions.IUser;
|
|
157
|
+
const looseUser = looseSchema.get(filePath).definitions.IUser;
|
|
158
|
+
expect(strictUser.additionalProperties).toBe(false);
|
|
159
|
+
// Note: ts-json-schema-generator may not set additionalProperties: true explicitly
|
|
160
|
+
expect(looseUser.additionalProperties === true || looseUser.additionalProperties === undefined).toBe(true);
|
|
161
|
+
}));
|
|
162
|
+
});
|
|
163
|
+
describe("validateSchemaCompatibility", () => {
|
|
164
|
+
it("should pass with identical schemas", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
165
|
+
const file1 = yield createTestFile("user1.jsonschema.ts", `
|
|
166
|
+
export interface IUser {
|
|
167
|
+
id: string;
|
|
168
|
+
name: string;
|
|
169
|
+
}
|
|
170
|
+
`);
|
|
171
|
+
const file2 = yield createTestFile("user2.jsonschema.ts", `
|
|
172
|
+
export interface IUser {
|
|
173
|
+
id: string;
|
|
174
|
+
name: string;
|
|
175
|
+
}
|
|
176
|
+
`);
|
|
177
|
+
const processor = new SchemaProcessor_1.SchemaProcessor({
|
|
178
|
+
additionalProperties: false,
|
|
179
|
+
parallel: false
|
|
180
|
+
});
|
|
181
|
+
const files = [
|
|
182
|
+
{ path: file1 },
|
|
183
|
+
{ path: file2 }
|
|
184
|
+
];
|
|
185
|
+
const schemaMap = yield processor.processFiles(files);
|
|
186
|
+
expect(() => {
|
|
187
|
+
processor.validateSchemaCompatibility(schemaMap);
|
|
188
|
+
}).not.toThrow();
|
|
189
|
+
}));
|
|
190
|
+
it("should throw DuplicateSymbolError for conflicting schemas", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
191
|
+
const file1 = yield createTestFile("user1.jsonschema.ts", `
|
|
192
|
+
export interface IUser {
|
|
193
|
+
id: string;
|
|
194
|
+
name: string;
|
|
195
|
+
}
|
|
196
|
+
`);
|
|
197
|
+
const file2 = yield createTestFile("user2.jsonschema.ts", `
|
|
198
|
+
export interface IUser {
|
|
199
|
+
id: string;
|
|
200
|
+
email: string;
|
|
201
|
+
}
|
|
202
|
+
`);
|
|
203
|
+
const processor = new SchemaProcessor_1.SchemaProcessor({
|
|
204
|
+
additionalProperties: false,
|
|
205
|
+
parallel: false
|
|
206
|
+
});
|
|
207
|
+
const files = [
|
|
208
|
+
{ path: file1 },
|
|
209
|
+
{ path: file2 }
|
|
210
|
+
];
|
|
211
|
+
const schemaMap = yield processor.processFiles(files);
|
|
212
|
+
expect(() => {
|
|
213
|
+
processor.validateSchemaCompatibility(schemaMap);
|
|
214
|
+
}).toThrow(errors_1.DuplicateSymbolError);
|
|
215
|
+
}));
|
|
216
|
+
it("should allow different symbols with same name in different contexts", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
217
|
+
const file1 = yield createTestFile("api/user.jsonschema.ts", `
|
|
218
|
+
export interface IUser {
|
|
219
|
+
id: string;
|
|
220
|
+
name: string;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export interface IProduct {
|
|
224
|
+
id: string;
|
|
225
|
+
title: string;
|
|
226
|
+
}
|
|
227
|
+
`);
|
|
228
|
+
const processor = new SchemaProcessor_1.SchemaProcessor({
|
|
229
|
+
additionalProperties: false,
|
|
230
|
+
parallel: false
|
|
231
|
+
});
|
|
232
|
+
const files = [{ path: file1 }];
|
|
233
|
+
const schemaMap = yield processor.processFiles(files);
|
|
234
|
+
expect(() => {
|
|
235
|
+
processor.validateSchemaCompatibility(schemaMap);
|
|
236
|
+
}).not.toThrow();
|
|
237
|
+
}));
|
|
238
|
+
});
|
|
239
|
+
describe("mergeSchemas", () => {
|
|
240
|
+
it("should merge multiple schemas correctly", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
241
|
+
const file1 = yield createTestFile("user.jsonschema.ts", `
|
|
242
|
+
export interface IUser {
|
|
243
|
+
id: string;
|
|
244
|
+
name: string;
|
|
245
|
+
}
|
|
246
|
+
`);
|
|
247
|
+
const file2 = yield createTestFile("product.jsonschema.ts", `
|
|
248
|
+
export interface IProduct {
|
|
249
|
+
id: string;
|
|
250
|
+
title: string;
|
|
251
|
+
price: number;
|
|
252
|
+
}
|
|
253
|
+
`);
|
|
254
|
+
const processor = new SchemaProcessor_1.SchemaProcessor({
|
|
255
|
+
additionalProperties: false,
|
|
256
|
+
parallel: false
|
|
257
|
+
});
|
|
258
|
+
const files = [
|
|
259
|
+
{ path: file1 },
|
|
260
|
+
{ path: file2 }
|
|
261
|
+
];
|
|
262
|
+
const schemaMap = yield processor.processFiles(files);
|
|
263
|
+
const mergedSchema = processor.mergeSchemas(schemaMap);
|
|
264
|
+
expect(mergedSchema.$schema).toBe("http://json-schema.org/draft-07/schema#");
|
|
265
|
+
expect(mergedSchema.definitions).toBeDefined();
|
|
266
|
+
expect(mergedSchema.definitions.IUser).toBeDefined();
|
|
267
|
+
expect(mergedSchema.definitions.IProduct).toBeDefined();
|
|
268
|
+
}));
|
|
269
|
+
it("should preserve schema version from first file", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
270
|
+
const file1 = yield createTestFile("user.jsonschema.ts", `
|
|
271
|
+
export interface IUser {
|
|
272
|
+
id: string;
|
|
273
|
+
name: string;
|
|
274
|
+
}
|
|
275
|
+
`);
|
|
276
|
+
const processor = new SchemaProcessor_1.SchemaProcessor({
|
|
277
|
+
additionalProperties: false,
|
|
278
|
+
parallel: false
|
|
279
|
+
});
|
|
280
|
+
const files = [{ path: file1 }];
|
|
281
|
+
const schemaMap = yield processor.processFiles(files);
|
|
282
|
+
const mergedSchema = processor.mergeSchemas(schemaMap);
|
|
283
|
+
expect(mergedSchema.$schema).toMatch(/json-schema\.org/);
|
|
284
|
+
}));
|
|
285
|
+
it("should handle empty schema map", () => {
|
|
286
|
+
const processor = new SchemaProcessor_1.SchemaProcessor({
|
|
287
|
+
additionalProperties: false,
|
|
288
|
+
parallel: false
|
|
289
|
+
});
|
|
290
|
+
const schemaMap = new Map();
|
|
291
|
+
const mergedSchema = processor.mergeSchemas(schemaMap);
|
|
292
|
+
expect(mergedSchema.$schema).toBe("http://json-schema.org/draft-07/schema#");
|
|
293
|
+
expect(mergedSchema.definitions).toEqual({});
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
describe("error handling", () => {
|
|
297
|
+
it("should handle missing files gracefully", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
298
|
+
const processor = new SchemaProcessor_1.SchemaProcessor({
|
|
299
|
+
additionalProperties: false,
|
|
300
|
+
parallel: false,
|
|
301
|
+
verbose: false
|
|
302
|
+
});
|
|
303
|
+
const files = [
|
|
304
|
+
{ path: "/nonexistent/file.ts" }
|
|
305
|
+
];
|
|
306
|
+
// Should not throw but return empty map
|
|
307
|
+
const schemaMap = yield processor.processFiles(files);
|
|
308
|
+
expect(schemaMap.size).toBe(0);
|
|
309
|
+
}));
|
|
310
|
+
it("should provide verbose error information", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
311
|
+
const consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation();
|
|
312
|
+
const processor = new SchemaProcessor_1.SchemaProcessor({
|
|
313
|
+
additionalProperties: false,
|
|
314
|
+
parallel: false,
|
|
315
|
+
verbose: true
|
|
316
|
+
});
|
|
317
|
+
const files = [
|
|
318
|
+
{ path: "/nonexistent/file.ts" }
|
|
319
|
+
];
|
|
320
|
+
yield processor.processFiles(files);
|
|
321
|
+
expect(consoleWarnSpy).toHaveBeenCalled();
|
|
322
|
+
consoleWarnSpy.mockRestore();
|
|
323
|
+
}));
|
|
324
|
+
});
|
|
325
|
+
describe("TypeScript features", () => {
|
|
326
|
+
it("should handle union types", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
327
|
+
const filePath = yield createTestFile("types.jsonschema.ts", `
|
|
328
|
+
export type Status = "active" | "inactive" | "pending";
|
|
329
|
+
|
|
330
|
+
export interface IUser {
|
|
331
|
+
id: string;
|
|
332
|
+
status: Status;
|
|
333
|
+
}
|
|
334
|
+
`);
|
|
335
|
+
const processor = new SchemaProcessor_1.SchemaProcessor({
|
|
336
|
+
additionalProperties: false,
|
|
337
|
+
parallel: false
|
|
338
|
+
});
|
|
339
|
+
const files = [{ path: filePath }];
|
|
340
|
+
const schemaMap = yield processor.processFiles(files);
|
|
341
|
+
expect(schemaMap.size).toBe(1);
|
|
342
|
+
const schema = schemaMap.get(filePath);
|
|
343
|
+
expect(schema.definitions.Status).toBeDefined();
|
|
344
|
+
expect(schema.definitions.IUser).toBeDefined();
|
|
345
|
+
}));
|
|
346
|
+
it("should handle optional properties", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
347
|
+
const filePath = yield createTestFile("user.jsonschema.ts", `
|
|
348
|
+
export interface IUser {
|
|
349
|
+
id: string;
|
|
350
|
+
name?: string;
|
|
351
|
+
email?: string;
|
|
352
|
+
age: number;
|
|
353
|
+
}
|
|
354
|
+
`);
|
|
355
|
+
const processor = new SchemaProcessor_1.SchemaProcessor({
|
|
356
|
+
additionalProperties: false,
|
|
357
|
+
parallel: false
|
|
358
|
+
});
|
|
359
|
+
const files = [{ path: filePath }];
|
|
360
|
+
const schemaMap = yield processor.processFiles(files);
|
|
361
|
+
const schema = schemaMap.get(filePath);
|
|
362
|
+
const userSchema = schema.definitions.IUser;
|
|
363
|
+
expect(userSchema.required).toEqual(expect.arrayContaining(["id", "age"]));
|
|
364
|
+
expect(userSchema.required).not.toContain("name");
|
|
365
|
+
expect(userSchema.required).not.toContain("email");
|
|
366
|
+
}));
|
|
367
|
+
it("should handle nested interfaces", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
368
|
+
const filePath = yield createTestFile("nested.jsonschema.ts", `
|
|
369
|
+
export interface IAddress {
|
|
370
|
+
street: string;
|
|
371
|
+
city: string;
|
|
372
|
+
country: string;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
export interface IUser {
|
|
376
|
+
id: string;
|
|
377
|
+
name: string;
|
|
378
|
+
address: IAddress;
|
|
379
|
+
}
|
|
380
|
+
`);
|
|
381
|
+
const processor = new SchemaProcessor_1.SchemaProcessor({
|
|
382
|
+
additionalProperties: false,
|
|
383
|
+
parallel: false
|
|
384
|
+
});
|
|
385
|
+
const files = [{ path: filePath }];
|
|
386
|
+
const schemaMap = yield processor.processFiles(files);
|
|
387
|
+
const schema = schemaMap.get(filePath);
|
|
388
|
+
expect(schema.definitions.IAddress).toBeDefined();
|
|
389
|
+
expect(schema.definitions.IUser).toBeDefined();
|
|
390
|
+
const userSchema = schema.definitions.IUser;
|
|
391
|
+
expect(userSchema.properties.address.$ref).toBe("#/definitions/IAddress");
|
|
392
|
+
}));
|
|
393
|
+
});
|
|
394
|
+
});
|
|
395
|
+
//# sourceMappingURL=SchemaProcessor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaProcessor.test.js","sourceRoot":"","sources":["../../src/services/SchemaProcessor.test.ts"],"names":[],"mappings":"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"}
|