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,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.FileDiscovery = void 0;
|
|
16
|
+
const fdir_1 = require("fdir");
|
|
17
|
+
const picomatch_1 = __importDefault(require("picomatch"));
|
|
18
|
+
const path_1 = __importDefault(require("path"));
|
|
19
|
+
const fs_1 = __importDefault(require("fs"));
|
|
20
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
21
|
+
const errors_1 = require("../errors");
|
|
22
|
+
class FileDiscovery {
|
|
23
|
+
constructor(options) {
|
|
24
|
+
this.options = options;
|
|
25
|
+
this.fileCache = new Map();
|
|
26
|
+
this.cacheFile = path_1.default.join(options.cachePath || ".ts-runtime-validation-cache", "file-hashes.json");
|
|
27
|
+
if (options.cacheEnabled) {
|
|
28
|
+
this.loadCache();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
discoverFiles() {
|
|
32
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
33
|
+
const { glob, rootPath } = this.options;
|
|
34
|
+
try {
|
|
35
|
+
const api = new fdir_1.fdir({
|
|
36
|
+
includeBasePath: true,
|
|
37
|
+
includeDirs: false,
|
|
38
|
+
filters: [
|
|
39
|
+
(filePath) => {
|
|
40
|
+
return picomatch_1.default.isMatch(filePath, glob, { contains: true });
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
}).crawl(rootPath);
|
|
44
|
+
const files = yield api.withPromise();
|
|
45
|
+
if (files.length === 0) {
|
|
46
|
+
throw new errors_1.FileDiscoveryError(`No files found matching pattern: ${glob} in ${rootPath}`);
|
|
47
|
+
}
|
|
48
|
+
// Sort files alphabetically to ensure consistent ordering
|
|
49
|
+
const sortedFiles = [...files].sort();
|
|
50
|
+
return this.options.cacheEnabled
|
|
51
|
+
? yield this.enrichWithCacheInfo(sortedFiles)
|
|
52
|
+
: sortedFiles.map(path => ({ path }));
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (error instanceof errors_1.FileDiscoveryError) {
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
throw new errors_1.FileDiscoveryError(`Failed to discover files: ${error instanceof Error ? error.message : String(error)}`);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
enrichWithCacheInfo(files) {
|
|
63
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
const enrichedFiles = yield Promise.all(files.map((filePath) => __awaiter(this, void 0, void 0, function* () {
|
|
65
|
+
const stats = yield fs_1.default.promises.stat(filePath);
|
|
66
|
+
const hash = yield this.getFileHash(filePath);
|
|
67
|
+
return {
|
|
68
|
+
path: filePath,
|
|
69
|
+
hash,
|
|
70
|
+
lastModified: stats.mtime
|
|
71
|
+
};
|
|
72
|
+
})));
|
|
73
|
+
yield this.saveCache(enrichedFiles);
|
|
74
|
+
return enrichedFiles;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
getFileHash(filePath) {
|
|
78
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
79
|
+
const content = yield fs_1.default.promises.readFile(filePath, 'utf-8');
|
|
80
|
+
return crypto_1.default.createHash('md5').update(content).digest('hex');
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
hasFileChanged(filePath, currentHash) {
|
|
84
|
+
const cachedHash = this.fileCache.get(filePath);
|
|
85
|
+
return cachedHash !== currentHash;
|
|
86
|
+
}
|
|
87
|
+
loadCache() {
|
|
88
|
+
try {
|
|
89
|
+
if (fs_1.default.existsSync(this.cacheFile)) {
|
|
90
|
+
const cacheData = JSON.parse(fs_1.default.readFileSync(this.cacheFile, 'utf-8'));
|
|
91
|
+
this.fileCache = new Map(Object.entries(cacheData));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
console.warn('Failed to load cache, starting fresh');
|
|
96
|
+
this.fileCache.clear();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
saveCache(files) {
|
|
100
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
101
|
+
const cacheDir = path_1.default.dirname(this.cacheFile);
|
|
102
|
+
if (!fs_1.default.existsSync(cacheDir)) {
|
|
103
|
+
yield fs_1.default.promises.mkdir(cacheDir, { recursive: true });
|
|
104
|
+
}
|
|
105
|
+
const cacheData = {};
|
|
106
|
+
files.forEach(file => {
|
|
107
|
+
if (file.hash) {
|
|
108
|
+
cacheData[file.path] = file.hash;
|
|
109
|
+
this.fileCache.set(file.path, file.hash);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
yield fs_1.default.promises.writeFile(this.cacheFile, JSON.stringify(cacheData, null, 2));
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
clearCache() {
|
|
116
|
+
this.fileCache.clear();
|
|
117
|
+
if (fs_1.default.existsSync(this.cacheFile)) {
|
|
118
|
+
fs_1.default.unlinkSync(this.cacheFile);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
exports.FileDiscovery = FileDiscovery;
|
|
123
|
+
//# sourceMappingURL=FileDiscovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileDiscovery.js","sourceRoot":"","sources":["../../src/services/FileDiscovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,184 @@
|
|
|
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 FileDiscovery_1 = require("./FileDiscovery");
|
|
18
|
+
const errors_1 = require("../errors");
|
|
19
|
+
const testDir = path_1.default.resolve(__dirname, "../../.test-tmp/file-discovery");
|
|
20
|
+
const cacheDir = path_1.default.resolve(testDir, ".cache");
|
|
21
|
+
const createTestFile = (filePath_1, ...args_1) => __awaiter(void 0, [filePath_1, ...args_1], void 0, function* (filePath, content = "test content") {
|
|
22
|
+
const fullPath = path_1.default.resolve(testDir, filePath);
|
|
23
|
+
yield fs_1.default.promises.mkdir(path_1.default.dirname(fullPath), { recursive: true });
|
|
24
|
+
yield fs_1.default.promises.writeFile(fullPath, content);
|
|
25
|
+
return fullPath;
|
|
26
|
+
});
|
|
27
|
+
const cleanup = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
28
|
+
if (fs_1.default.existsSync(testDir)) {
|
|
29
|
+
yield fs_1.default.promises.rm(testDir, { recursive: true, force: true });
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
beforeEach(cleanup);
|
|
33
|
+
afterAll(cleanup);
|
|
34
|
+
describe("FileDiscovery", () => {
|
|
35
|
+
describe("discoverFiles", () => {
|
|
36
|
+
it("should find files matching glob pattern", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
37
|
+
yield createTestFile("types/user.jsonschema.ts", "export interface User {}");
|
|
38
|
+
yield createTestFile("types/product.jsonschema.ts", "export interface Product {}");
|
|
39
|
+
yield createTestFile("types/order.ts", "export interface Order {}");
|
|
40
|
+
const discovery = new FileDiscovery_1.FileDiscovery({
|
|
41
|
+
glob: "*.jsonschema.ts",
|
|
42
|
+
rootPath: testDir
|
|
43
|
+
});
|
|
44
|
+
const files = yield discovery.discoverFiles();
|
|
45
|
+
expect(files).toHaveLength(2);
|
|
46
|
+
expect(files.map(f => path_1.default.basename(f.path))).toEqual(expect.arrayContaining(["user.jsonschema.ts", "product.jsonschema.ts"]));
|
|
47
|
+
}));
|
|
48
|
+
it("should handle nested directory patterns", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
49
|
+
yield createTestFile("api/v1/user.jsonschema.ts", "export interface User {}");
|
|
50
|
+
yield createTestFile("api/v2/product.jsonschema.ts", "export interface Product {}");
|
|
51
|
+
yield createTestFile("utils/helper.ts", "export const helper = () => {}");
|
|
52
|
+
const discovery = new FileDiscovery_1.FileDiscovery({
|
|
53
|
+
glob: "**/*.jsonschema.ts",
|
|
54
|
+
rootPath: testDir
|
|
55
|
+
});
|
|
56
|
+
const files = yield discovery.discoverFiles();
|
|
57
|
+
expect(files).toHaveLength(2);
|
|
58
|
+
expect(files.every(f => f.path.includes(".jsonschema.ts"))).toBe(true);
|
|
59
|
+
}));
|
|
60
|
+
it("should throw error when no files found", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
61
|
+
const discovery = new FileDiscovery_1.FileDiscovery({
|
|
62
|
+
glob: "*.jsonschema.ts",
|
|
63
|
+
rootPath: testDir
|
|
64
|
+
});
|
|
65
|
+
yield expect(discovery.discoverFiles()).rejects.toThrow(errors_1.FileDiscoveryError);
|
|
66
|
+
}));
|
|
67
|
+
it("should throw error for invalid directory", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
68
|
+
const discovery = new FileDiscovery_1.FileDiscovery({
|
|
69
|
+
glob: "*.jsonschema.ts",
|
|
70
|
+
rootPath: "/nonexistent/path"
|
|
71
|
+
});
|
|
72
|
+
yield expect(discovery.discoverFiles()).rejects.toThrow(errors_1.FileDiscoveryError);
|
|
73
|
+
}));
|
|
74
|
+
});
|
|
75
|
+
describe("caching", () => {
|
|
76
|
+
it("should generate file hashes when caching enabled", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
77
|
+
yield createTestFile("user.jsonschema.ts", "export interface User {}");
|
|
78
|
+
const discovery = new FileDiscovery_1.FileDiscovery({
|
|
79
|
+
glob: "*.jsonschema.ts",
|
|
80
|
+
rootPath: testDir,
|
|
81
|
+
cacheEnabled: true,
|
|
82
|
+
cachePath: cacheDir
|
|
83
|
+
});
|
|
84
|
+
const files = yield discovery.discoverFiles();
|
|
85
|
+
expect(files).toHaveLength(1);
|
|
86
|
+
expect(files[0].hash).toBeDefined();
|
|
87
|
+
expect(files[0].lastModified).toBeDefined();
|
|
88
|
+
expect(typeof files[0].hash).toBe("string");
|
|
89
|
+
}));
|
|
90
|
+
it("should save and load cache correctly", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
91
|
+
yield createTestFile("user.jsonschema.ts", "export interface User {}");
|
|
92
|
+
const discovery = new FileDiscovery_1.FileDiscovery({
|
|
93
|
+
glob: "*.jsonschema.ts",
|
|
94
|
+
rootPath: testDir,
|
|
95
|
+
cacheEnabled: true,
|
|
96
|
+
cachePath: cacheDir
|
|
97
|
+
});
|
|
98
|
+
// First run - should create cache
|
|
99
|
+
const files1 = yield discovery.discoverFiles();
|
|
100
|
+
expect(fs_1.default.existsSync(path_1.default.join(cacheDir, "file-hashes.json"))).toBe(true);
|
|
101
|
+
// Second run - should load from cache
|
|
102
|
+
const discovery2 = new FileDiscovery_1.FileDiscovery({
|
|
103
|
+
glob: "*.jsonschema.ts",
|
|
104
|
+
rootPath: testDir,
|
|
105
|
+
cacheEnabled: true,
|
|
106
|
+
cachePath: cacheDir
|
|
107
|
+
});
|
|
108
|
+
const files2 = yield discovery2.discoverFiles();
|
|
109
|
+
expect(files1[0].hash).toBe(files2[0].hash);
|
|
110
|
+
}));
|
|
111
|
+
it("should detect file changes", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
112
|
+
const filePath = yield createTestFile("user.jsonschema.ts", "export interface User {}");
|
|
113
|
+
const discovery = new FileDiscovery_1.FileDiscovery({
|
|
114
|
+
glob: "*.jsonschema.ts",
|
|
115
|
+
rootPath: testDir,
|
|
116
|
+
cacheEnabled: true,
|
|
117
|
+
cachePath: cacheDir
|
|
118
|
+
});
|
|
119
|
+
const files1 = yield discovery.discoverFiles();
|
|
120
|
+
const originalHash = files1[0].hash;
|
|
121
|
+
// Modify file
|
|
122
|
+
yield fs_1.default.promises.writeFile(filePath, "export interface User { name: string; }");
|
|
123
|
+
const files2 = yield discovery.discoverFiles();
|
|
124
|
+
const newHash = files2[0].hash;
|
|
125
|
+
expect(discovery.hasFileChanged(filePath, originalHash)).toBe(true);
|
|
126
|
+
expect(originalHash).not.toBe(newHash);
|
|
127
|
+
}));
|
|
128
|
+
it("should clear cache correctly", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
129
|
+
yield createTestFile("user.jsonschema.ts", "export interface User {}");
|
|
130
|
+
const discovery = new FileDiscovery_1.FileDiscovery({
|
|
131
|
+
glob: "*.jsonschema.ts",
|
|
132
|
+
rootPath: testDir,
|
|
133
|
+
cacheEnabled: true,
|
|
134
|
+
cachePath: cacheDir
|
|
135
|
+
});
|
|
136
|
+
yield discovery.discoverFiles();
|
|
137
|
+
expect(fs_1.default.existsSync(path_1.default.join(cacheDir, "file-hashes.json"))).toBe(true);
|
|
138
|
+
discovery.clearCache();
|
|
139
|
+
expect(fs_1.default.existsSync(path_1.default.join(cacheDir, "file-hashes.json"))).toBe(false);
|
|
140
|
+
}));
|
|
141
|
+
it("should handle corrupted cache gracefully", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
142
|
+
yield createTestFile("user.jsonschema.ts", "export interface User {}");
|
|
143
|
+
// Create corrupted cache file
|
|
144
|
+
yield fs_1.default.promises.mkdir(cacheDir, { recursive: true });
|
|
145
|
+
yield fs_1.default.promises.writeFile(path_1.default.join(cacheDir, "file-hashes.json"), "invalid json");
|
|
146
|
+
const discovery = new FileDiscovery_1.FileDiscovery({
|
|
147
|
+
glob: "*.jsonschema.ts",
|
|
148
|
+
rootPath: testDir,
|
|
149
|
+
cacheEnabled: true,
|
|
150
|
+
cachePath: cacheDir
|
|
151
|
+
});
|
|
152
|
+
// Should not throw error and should work normally
|
|
153
|
+
const files = yield discovery.discoverFiles();
|
|
154
|
+
expect(files).toHaveLength(1);
|
|
155
|
+
}));
|
|
156
|
+
});
|
|
157
|
+
describe("file patterns", () => {
|
|
158
|
+
it("should support multiple extensions", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
159
|
+
yield createTestFile("user.jsonschema.ts", "export interface User {}");
|
|
160
|
+
yield createTestFile("product.jsonschema.tsx", "export interface Product {}");
|
|
161
|
+
yield createTestFile("order.types.ts", "export interface Order {}");
|
|
162
|
+
const discovery = new FileDiscovery_1.FileDiscovery({
|
|
163
|
+
glob: "*.{jsonschema.ts,jsonschema.tsx}",
|
|
164
|
+
rootPath: testDir
|
|
165
|
+
});
|
|
166
|
+
const files = yield discovery.discoverFiles();
|
|
167
|
+
expect(files).toHaveLength(2);
|
|
168
|
+
}));
|
|
169
|
+
it("should exclude files not matching pattern", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
170
|
+
yield createTestFile("user.jsonschema.ts", "export interface User {}");
|
|
171
|
+
yield createTestFile("user.test.ts", "test file");
|
|
172
|
+
yield createTestFile("user.spec.ts", "spec file");
|
|
173
|
+
yield createTestFile("README.md", "readme");
|
|
174
|
+
const discovery = new FileDiscovery_1.FileDiscovery({
|
|
175
|
+
glob: "*.jsonschema.ts",
|
|
176
|
+
rootPath: testDir
|
|
177
|
+
});
|
|
178
|
+
const files = yield discovery.discoverFiles();
|
|
179
|
+
expect(files).toHaveLength(1);
|
|
180
|
+
expect(files[0].path).toContain("user.jsonschema.ts");
|
|
181
|
+
}));
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
//# sourceMappingURL=FileDiscovery.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileDiscovery.test.js","sourceRoot":"","sources":["../../src/services/FileDiscovery.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,198 @@
|
|
|
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
|
+
// Sort files by path to ensure consistent processing order
|
|
63
|
+
const sortedFiles = [...files].sort((a, b) => a.path.localeCompare(b.path));
|
|
64
|
+
const results = parallel
|
|
65
|
+
? yield this.processInParallel(sortedFiles)
|
|
66
|
+
: yield this.processSequentially(sortedFiles);
|
|
67
|
+
return this.consolidateSchemas(results);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
processInParallel(files) {
|
|
71
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
72
|
+
const promises = files.map(file => this.processFile(file));
|
|
73
|
+
const results = yield Promise.allSettled(promises);
|
|
74
|
+
// Map results back to original file order to maintain consistency
|
|
75
|
+
return results.map((result, index) => {
|
|
76
|
+
if (result.status === 'fulfilled') {
|
|
77
|
+
return result.value;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
return {
|
|
81
|
+
file: files[index].path,
|
|
82
|
+
schema: null,
|
|
83
|
+
error: result.reason
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
processSequentially(files) {
|
|
90
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
91
|
+
const results = [];
|
|
92
|
+
for (const file of files) {
|
|
93
|
+
try {
|
|
94
|
+
const result = yield this.processFile(file);
|
|
95
|
+
results.push(result);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
results.push({
|
|
99
|
+
file: file.path,
|
|
100
|
+
schema: null,
|
|
101
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return results;
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
processFile(file) {
|
|
109
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
110
|
+
const { additionalProperties, tsconfigPath, verbose } = this.options;
|
|
111
|
+
try {
|
|
112
|
+
if (verbose) {
|
|
113
|
+
console.log(`Processing: ${file.path}`);
|
|
114
|
+
}
|
|
115
|
+
const config = Object.assign({ path: file.path, type: "*", additionalProperties, encodeRefs: false, sortProps: true }, (tsconfigPath ? { tsconfig: tsconfigPath } : {}));
|
|
116
|
+
const schemaGenerator = tsj.createGenerator(config);
|
|
117
|
+
const schema = schemaGenerator.createSchema(config.type);
|
|
118
|
+
return {
|
|
119
|
+
file: file.path,
|
|
120
|
+
schema,
|
|
121
|
+
error: undefined
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
throw new errors_1.SchemaGenerationError(`Failed to process ${file.path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
consolidateSchemas(results) {
|
|
130
|
+
const schemaMap = new Map();
|
|
131
|
+
const errors = [];
|
|
132
|
+
// Sort results by file path to ensure consistent order
|
|
133
|
+
const sortedResults = [...results].sort((a, b) => a.file.localeCompare(b.file));
|
|
134
|
+
for (const result of sortedResults) {
|
|
135
|
+
if (result.error) {
|
|
136
|
+
errors.push(result.error);
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (result.schema) {
|
|
140
|
+
schemaMap.set(result.file, result.schema);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (errors.length > 0 && this.options.verbose) {
|
|
144
|
+
console.warn(`Encountered ${errors.length} errors during processing:`);
|
|
145
|
+
errors.forEach(error => console.warn(` - ${error.message}`));
|
|
146
|
+
}
|
|
147
|
+
return schemaMap;
|
|
148
|
+
}
|
|
149
|
+
validateSchemaCompatibility(schemaMap) {
|
|
150
|
+
var _a;
|
|
151
|
+
const definitions = {};
|
|
152
|
+
// Sort by file path for consistent processing order
|
|
153
|
+
const sortedEntries = [...schemaMap.entries()].sort(([a], [b]) => a.localeCompare(b));
|
|
154
|
+
for (const [filePath, fileSchema] of sortedEntries) {
|
|
155
|
+
const defs = (_a = fileSchema.definitions) !== null && _a !== void 0 ? _a : {};
|
|
156
|
+
// Sort definition keys for consistent processing
|
|
157
|
+
Object.keys(defs).sort().forEach((key) => {
|
|
158
|
+
if (definitions[key] !== undefined) {
|
|
159
|
+
try {
|
|
160
|
+
assert_1.default.deepEqual(definitions[key], defs[key]);
|
|
161
|
+
}
|
|
162
|
+
catch (e) {
|
|
163
|
+
throw new errors_1.DuplicateSymbolError(`Duplicate symbol '${key}' found with different implementations`, key, filePath, definitions[key], defs[key]);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
definitions[key] = defs[key];
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
mergeSchemas(schemaMap) {
|
|
171
|
+
var _a;
|
|
172
|
+
const definitions = {};
|
|
173
|
+
let schemaVersion = "";
|
|
174
|
+
// Sort by file path for consistent processing order
|
|
175
|
+
const sortedEntries = [...schemaMap.entries()].sort(([a], [b]) => a.localeCompare(b));
|
|
176
|
+
for (const [, fileSchema] of sortedEntries) {
|
|
177
|
+
if (!schemaVersion && fileSchema["$schema"]) {
|
|
178
|
+
schemaVersion = fileSchema["$schema"];
|
|
179
|
+
}
|
|
180
|
+
const defs = (_a = fileSchema.definitions) !== null && _a !== void 0 ? _a : {};
|
|
181
|
+
// Sort definition keys for consistent processing
|
|
182
|
+
Object.keys(defs).sort().forEach((key) => {
|
|
183
|
+
definitions[key] = defs[key];
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
// Sort definitions alphabetically
|
|
187
|
+
const sortedDefinitions = {};
|
|
188
|
+
Object.keys(definitions).sort().forEach(key => {
|
|
189
|
+
sortedDefinitions[key] = definitions[key];
|
|
190
|
+
});
|
|
191
|
+
return {
|
|
192
|
+
$schema: schemaVersion || "http://json-schema.org/draft-07/schema#",
|
|
193
|
+
definitions: sortedDefinitions,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
exports.SchemaProcessor = SchemaProcessor;
|
|
198
|
+
//# 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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"}
|