ts-runtime-validation 1.6.15 → 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.
Files changed (79) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/CONTRIBUTING.md +430 -0
  3. package/README.md +444 -64
  4. package/dist/ICommandOptions.js +3 -0
  5. package/dist/ICommandOptions.js.map +1 -0
  6. package/dist/SchemaGenerator.integration.test.js +323 -0
  7. package/dist/SchemaGenerator.integration.test.js.map +1 -0
  8. package/dist/SchemaGenerator.js +120 -0
  9. package/dist/SchemaGenerator.js.map +1 -0
  10. package/dist/SchemaGenerator.test.js +132 -0
  11. package/dist/SchemaGenerator.test.js.map +1 -0
  12. package/dist/errors/index.js +95 -0
  13. package/dist/errors/index.js.map +1 -0
  14. package/dist/errors/index.test.js +232 -0
  15. package/dist/errors/index.test.js.map +1 -0
  16. package/dist/getPosixPath.js +13 -0
  17. package/dist/getPosixPath.js.map +1 -0
  18. package/dist/index.js +27 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/lib.js.map +1 -0
  21. package/dist/services/CodeGenerator.js +305 -0
  22. package/dist/services/CodeGenerator.js.map +1 -0
  23. package/dist/services/FileDiscovery.js +121 -0
  24. package/dist/services/FileDiscovery.js.map +1 -0
  25. package/dist/services/FileDiscovery.test.js +184 -0
  26. package/dist/services/FileDiscovery.test.js.map +1 -0
  27. package/dist/services/SchemaProcessor.js +182 -0
  28. package/dist/services/SchemaProcessor.js.map +1 -0
  29. package/dist/services/SchemaProcessor.test.js +395 -0
  30. package/dist/services/SchemaProcessor.test.js.map +1 -0
  31. package/dist/services/SchemaWriter.js +76 -0
  32. package/dist/services/SchemaWriter.js.map +1 -0
  33. package/dist/services/SchemaWriter.test.js +255 -0
  34. package/dist/services/SchemaWriter.test.js.map +1 -0
  35. package/dist/test/basic-scenario/types.jsonschema.js +3 -0
  36. package/dist/test/basic-scenario/types.jsonschema.js.map +1 -0
  37. package/dist/test/duplicate-symbols-different-implementation/IBaseType.js +3 -0
  38. package/dist/test/duplicate-symbols-different-implementation/IBaseType.js.map +1 -0
  39. package/dist/test/duplicate-symbols-different-implementation/IBaseTypeDefinitionReplicated.js +3 -0
  40. package/dist/test/duplicate-symbols-different-implementation/IBaseTypeDefinitionReplicated.js.map +1 -0
  41. package/dist/test/duplicate-symbols-different-implementation/IBasicTypesA.jsonschema.js +3 -0
  42. package/dist/test/duplicate-symbols-different-implementation/IBasicTypesA.jsonschema.js.map +1 -0
  43. package/dist/test/duplicate-symbols-different-implementation/IBasicTypesB.jsonschema.js +3 -0
  44. package/dist/test/duplicate-symbols-different-implementation/IBasicTypesB.jsonschema.js.map +1 -0
  45. package/dist/test/duplicate-symbols-identitcal-implementation/IBaseType.js +3 -0
  46. package/dist/test/duplicate-symbols-identitcal-implementation/IBaseType.js.map +1 -0
  47. package/dist/test/duplicate-symbols-identitcal-implementation/IBaseTypeDefinitionReplicated.js +3 -0
  48. package/dist/test/duplicate-symbols-identitcal-implementation/IBaseTypeDefinitionReplicated.js.map +1 -0
  49. package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesA.jsonschema.js +3 -0
  50. package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesA.jsonschema.js.map +1 -0
  51. package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesB.jsonschema.js +3 -0
  52. package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesB.jsonschema.js.map +1 -0
  53. package/dist/test/output/duplicate-symbols-identitcal-implementation/ValidationType.js +3 -0
  54. package/dist/test/output/duplicate-symbols-identitcal-implementation/ValidationType.js.map +1 -0
  55. package/dist/test/output/duplicate-symbols-identitcal-implementation/isValidSchema.js +49 -0
  56. package/dist/test/output/duplicate-symbols-identitcal-implementation/isValidSchema.js.map +1 -0
  57. package/dist/utils/ProgressReporter.js +67 -0
  58. package/dist/utils/ProgressReporter.js.map +1 -0
  59. package/dist/utils/ProgressReporter.test.js +267 -0
  60. package/dist/utils/ProgressReporter.test.js.map +1 -0
  61. package/dist/writeLine.js +12 -0
  62. package/dist/writeLine.js.map +1 -0
  63. package/package.json +2 -2
  64. package/src/ICommandOptions.ts +7 -0
  65. package/src/SchemaGenerator.integration.test.ts +411 -0
  66. package/src/SchemaGenerator.test.ts +7 -0
  67. package/src/SchemaGenerator.ts +112 -298
  68. package/src/errors/index.test.ts +319 -0
  69. package/src/errors/index.ts +92 -0
  70. package/src/index.ts +7 -0
  71. package/src/services/CodeGenerator.ts +352 -0
  72. package/src/services/FileDiscovery.test.ts +216 -0
  73. package/src/services/FileDiscovery.ts +137 -0
  74. package/src/services/SchemaProcessor.test.ts +464 -0
  75. package/src/services/SchemaProcessor.ts +173 -0
  76. package/src/services/SchemaWriter.test.ts +304 -0
  77. package/src/services/SchemaWriter.ts +75 -0
  78. package/src/utils/ProgressReporter.test.ts +357 -0
  79. package/src/utils/ProgressReporter.ts +76 -0
@@ -0,0 +1,305 @@
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.CodeGenerator = void 0;
16
+ const ts_morph_1 = require("ts-morph");
17
+ const path_1 = __importDefault(require("path"));
18
+ const getPosixPath_1 = require("../getPosixPath");
19
+ const errors_1 = require("../errors");
20
+ const defaultTsMorphProjectSettings = {
21
+ manipulationSettings: {
22
+ indentationText: ts_morph_1.IndentationText.FourSpaces,
23
+ newLineKind: ts_morph_1.NewLineKind.LineFeed,
24
+ quoteKind: ts_morph_1.QuoteKind.Double,
25
+ usePrefixAndSuffixTextForRename: false,
26
+ useTrailingCommas: true,
27
+ },
28
+ };
29
+ const defaultCreateFileOptions = {
30
+ overwrite: true,
31
+ };
32
+ class CodeGenerator {
33
+ constructor(options) {
34
+ this.options = options;
35
+ this.project = new ts_morph_1.Project(defaultTsMorphProjectSettings);
36
+ }
37
+ generateSchemaDefinition(schemaMap, outputFile) {
38
+ return __awaiter(this, void 0, void 0, function* () {
39
+ try {
40
+ const typeInfos = this.extractTypeInfo(schemaMap);
41
+ yield this.writeSchemaDefinitionFile(typeInfos, outputFile);
42
+ }
43
+ catch (error) {
44
+ throw new errors_1.CodeGenerationError(`Failed to generate schema definition: ${error instanceof Error ? error.message : String(error)}`);
45
+ }
46
+ });
47
+ }
48
+ generateValidatorFunction(outputFile) {
49
+ return __awaiter(this, void 0, void 0, function* () {
50
+ try {
51
+ const sourceFile = this.project.createSourceFile(outputFile, {}, defaultCreateFileOptions);
52
+ if (this.options.lazyLoad) {
53
+ this.generateLazyValidator(sourceFile);
54
+ }
55
+ else {
56
+ this.generateStandardValidator(sourceFile);
57
+ }
58
+ yield this.project.save();
59
+ }
60
+ catch (error) {
61
+ throw new errors_1.CodeGenerationError(`Failed to generate validator function: ${error instanceof Error ? error.message : String(error)}`);
62
+ }
63
+ });
64
+ }
65
+ generateValidationTypes(schemaMap, outputFile) {
66
+ return __awaiter(this, void 0, void 0, function* () {
67
+ try {
68
+ const typeInfos = this.extractTypeInfo(schemaMap);
69
+ yield this.writeValidationTypesFile(typeInfos, outputFile);
70
+ }
71
+ catch (error) {
72
+ throw new errors_1.CodeGenerationError(`Failed to generate validation types: ${error instanceof Error ? error.message : String(error)}`);
73
+ }
74
+ });
75
+ }
76
+ extractTypeInfo(schemaMap) {
77
+ const readerProject = new ts_morph_1.Project(defaultTsMorphProjectSettings);
78
+ const typeInfos = [];
79
+ schemaMap.forEach((schema, filePath) => {
80
+ var _a;
81
+ const dir = path_1.default.dirname(filePath);
82
+ const fileWithoutExtension = path_1.default.parse(filePath).name;
83
+ const relativeFilePath = path_1.default.relative(this.options.outputPath, dir);
84
+ const relativeImportPath = `${relativeFilePath}/${fileWithoutExtension}`;
85
+ const defs = (_a = schema.definitions) !== null && _a !== void 0 ? _a : {};
86
+ const readerSourceFile = readerProject.addSourceFileAtPath(filePath);
87
+ Object.keys(defs).forEach((symbol) => {
88
+ const typeAlias = readerSourceFile.getTypeAlias(symbol);
89
+ const typeInterface = readerSourceFile.getInterface(symbol);
90
+ if (typeAlias || typeInterface) {
91
+ typeInfos.push({
92
+ symbol,
93
+ importPath: (0, getPosixPath_1.getPosixPath)(relativeImportPath),
94
+ isInterface: !!typeInterface
95
+ });
96
+ }
97
+ });
98
+ });
99
+ return typeInfos;
100
+ }
101
+ writeSchemaDefinitionFile(typeInfos, outputFile) {
102
+ return __awaiter(this, void 0, void 0, function* () {
103
+ const sourceFile = this.project.createSourceFile(outputFile, {}, defaultCreateFileOptions);
104
+ if (this.options.treeShaking) {
105
+ this.generateTreeShakingImports(sourceFile, typeInfos);
106
+ }
107
+ else {
108
+ this.generateStandardImports(sourceFile, typeInfos);
109
+ }
110
+ sourceFile.addVariableStatement({
111
+ isExported: true,
112
+ declarationKind: ts_morph_1.VariableDeclarationKind.Const,
113
+ declarations: [
114
+ {
115
+ name: "schemas",
116
+ type: "Record<keyof ISchema, string>",
117
+ initializer: (writer) => {
118
+ writer.writeLine(`{`);
119
+ typeInfos.forEach(({ symbol }) => {
120
+ writer.writeLine(`["#/definitions/${symbol}"] : "${symbol}",`);
121
+ });
122
+ writer.writeLine(`}`);
123
+ },
124
+ },
125
+ ],
126
+ });
127
+ sourceFile.addInterface({
128
+ kind: ts_morph_1.StructureKind.Interface,
129
+ name: "ISchema",
130
+ isExported: true,
131
+ properties: typeInfos.map(({ symbol }) => ({
132
+ name: `readonly ["#/definitions/${symbol}"]`,
133
+ type: symbol
134
+ })),
135
+ });
136
+ yield this.project.save();
137
+ });
138
+ }
139
+ generateTreeShakingImports(sourceFile, typeInfos) {
140
+ const importMap = new Map();
141
+ typeInfos.forEach(({ symbol, importPath }) => {
142
+ const existing = importMap.get(importPath) || [];
143
+ existing.push(symbol);
144
+ importMap.set(importPath, existing);
145
+ });
146
+ importMap.forEach((symbols, importPath) => {
147
+ sourceFile.addImportDeclaration({
148
+ namedImports: symbols,
149
+ moduleSpecifier: importPath
150
+ });
151
+ });
152
+ }
153
+ generateStandardImports(sourceFile, typeInfos) {
154
+ const importMap = new Map();
155
+ typeInfos.forEach(({ symbol, importPath }) => {
156
+ const existing = importMap.get(importPath) || [];
157
+ existing.push(symbol);
158
+ importMap.set(importPath, existing);
159
+ });
160
+ importMap.forEach((symbols, importPath) => {
161
+ sourceFile.addImportDeclaration({
162
+ namedImports: symbols,
163
+ moduleSpecifier: importPath
164
+ });
165
+ });
166
+ }
167
+ generateLazyValidator(sourceFile) {
168
+ sourceFile.addImportDeclaration({
169
+ namespaceImport: "schema",
170
+ moduleSpecifier: "./validation.schema.json"
171
+ });
172
+ sourceFile.addImportDeclaration({
173
+ namedImports: ["ISchema", "schemas"],
174
+ moduleSpecifier: "./SchemaDefinition"
175
+ });
176
+ sourceFile.addVariableStatement({
177
+ isExported: true,
178
+ declarationKind: ts_morph_1.VariableDeclarationKind.Let,
179
+ declarations: [
180
+ {
181
+ name: "validator",
182
+ type: "any",
183
+ initializer: "null"
184
+ }
185
+ ]
186
+ });
187
+ sourceFile.addFunction({
188
+ name: "getValidator",
189
+ isExported: false,
190
+ statements: (writer) => {
191
+ writer.writeLine(`if (!validator) {`);
192
+ writer.writeLine(` const Ajv = require("ajv");`);
193
+ writer.writeLine(` validator = new Ajv({ allErrors: true });`);
194
+ writer.writeLine(` validator.compile(schema);`);
195
+ writer.writeLine(`}`);
196
+ writer.writeLine(`return validator;`);
197
+ }
198
+ });
199
+ sourceFile.addVariableStatement({
200
+ declarationKind: ts_morph_1.VariableDeclarationKind.Const,
201
+ isExported: true,
202
+ declarations: [
203
+ {
204
+ name: "isValidSchema",
205
+ initializer: (writer) => {
206
+ writer.writeLine(`<T extends keyof typeof schemas>(data: unknown, schemaKeyRef: T): data is ISchema[T] => {`);
207
+ writer.writeLine(`const v = getValidator();`);
208
+ writer.writeLine(`v.validate(schemaKeyRef as string, data);`);
209
+ writer.writeLine(`return Boolean(v.errors) === false;`);
210
+ writer.writeLine(`}`);
211
+ },
212
+ },
213
+ ],
214
+ });
215
+ }
216
+ generateStandardValidator(sourceFile) {
217
+ sourceFile.addImportDeclaration({
218
+ namespaceImport: "schema",
219
+ moduleSpecifier: "./validation.schema.json"
220
+ });
221
+ sourceFile.addImportDeclaration({
222
+ defaultImport: "Ajv",
223
+ moduleSpecifier: "ajv"
224
+ });
225
+ sourceFile.addImportDeclaration({
226
+ namedImports: ["ISchema", "schemas"],
227
+ moduleSpecifier: "./SchemaDefinition"
228
+ });
229
+ sourceFile.addVariableStatement({
230
+ isExported: true,
231
+ declarationKind: ts_morph_1.VariableDeclarationKind.Const,
232
+ declarations: [
233
+ {
234
+ name: "validator",
235
+ initializer: (writer) => {
236
+ writer.writeLine(`new Ajv({ allErrors: true });`);
237
+ writer.writeLine(`validator.compile(schema)`);
238
+ },
239
+ },
240
+ ],
241
+ });
242
+ sourceFile.addVariableStatement({
243
+ declarationKind: ts_morph_1.VariableDeclarationKind.Const,
244
+ isExported: true,
245
+ declarations: [
246
+ {
247
+ name: "isValidSchema",
248
+ initializer: (writer) => {
249
+ writer.writeLine(`<T extends keyof typeof schemas>(data: unknown, schemaKeyRef: T): data is ISchema[T] => {`);
250
+ writer.writeLine(`validator.validate(schemaKeyRef as string, data);`);
251
+ writer.writeLine(`return Boolean(validator.errors) === false;`);
252
+ writer.writeLine(`}`);
253
+ },
254
+ },
255
+ ],
256
+ });
257
+ }
258
+ writeValidationTypesFile(typeInfos, outputFile) {
259
+ return __awaiter(this, void 0, void 0, function* () {
260
+ const sourceFile = this.project.createSourceFile(outputFile, {}, defaultCreateFileOptions);
261
+ const importMap = new Map();
262
+ typeInfos.forEach(({ symbol, importPath }) => {
263
+ const existing = importMap.get(importPath) || [];
264
+ existing.push(symbol);
265
+ importMap.set(importPath, existing);
266
+ });
267
+ importMap.forEach((symbols, importPath) => {
268
+ const declaration = sourceFile.addImportDeclaration({
269
+ moduleSpecifier: importPath
270
+ });
271
+ symbols.forEach((symbol) => {
272
+ declaration.addNamedImport({
273
+ name: symbol,
274
+ alias: `_${symbol}`
275
+ });
276
+ });
277
+ });
278
+ if (this.options.treeShaking) {
279
+ typeInfos.forEach(({ symbol }) => {
280
+ sourceFile.addTypeAlias({
281
+ name: symbol,
282
+ type: `_${symbol}`,
283
+ isExported: true
284
+ });
285
+ });
286
+ }
287
+ else {
288
+ const namespace = sourceFile.addModule({
289
+ name: "ValidationType",
290
+ isExported: true,
291
+ });
292
+ typeInfos.forEach(({ symbol }) => {
293
+ namespace.addTypeAlias({
294
+ name: symbol,
295
+ type: `_${symbol}`,
296
+ isExported: true
297
+ });
298
+ });
299
+ }
300
+ yield this.project.save();
301
+ });
302
+ }
303
+ }
304
+ exports.CodeGenerator = CodeGenerator;
305
+ //# sourceMappingURL=CodeGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeGenerator.js","sourceRoot":"","sources":["../../src/services/CodeGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
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
+ return this.options.cacheEnabled
49
+ ? yield this.enrichWithCacheInfo(files)
50
+ : files.map(path => ({ path }));
51
+ }
52
+ catch (error) {
53
+ if (error instanceof errors_1.FileDiscoveryError) {
54
+ throw error;
55
+ }
56
+ throw new errors_1.FileDiscoveryError(`Failed to discover files: ${error instanceof Error ? error.message : String(error)}`);
57
+ }
58
+ });
59
+ }
60
+ enrichWithCacheInfo(files) {
61
+ return __awaiter(this, void 0, void 0, function* () {
62
+ const enrichedFiles = yield Promise.all(files.map((filePath) => __awaiter(this, void 0, void 0, function* () {
63
+ const stats = yield fs_1.default.promises.stat(filePath);
64
+ const hash = yield this.getFileHash(filePath);
65
+ return {
66
+ path: filePath,
67
+ hash,
68
+ lastModified: stats.mtime
69
+ };
70
+ })));
71
+ yield this.saveCache(enrichedFiles);
72
+ return enrichedFiles;
73
+ });
74
+ }
75
+ getFileHash(filePath) {
76
+ return __awaiter(this, void 0, void 0, function* () {
77
+ const content = yield fs_1.default.promises.readFile(filePath, 'utf-8');
78
+ return crypto_1.default.createHash('md5').update(content).digest('hex');
79
+ });
80
+ }
81
+ hasFileChanged(filePath, currentHash) {
82
+ const cachedHash = this.fileCache.get(filePath);
83
+ return cachedHash !== currentHash;
84
+ }
85
+ loadCache() {
86
+ try {
87
+ if (fs_1.default.existsSync(this.cacheFile)) {
88
+ const cacheData = JSON.parse(fs_1.default.readFileSync(this.cacheFile, 'utf-8'));
89
+ this.fileCache = new Map(Object.entries(cacheData));
90
+ }
91
+ }
92
+ catch (error) {
93
+ console.warn('Failed to load cache, starting fresh');
94
+ this.fileCache.clear();
95
+ }
96
+ }
97
+ saveCache(files) {
98
+ return __awaiter(this, void 0, void 0, function* () {
99
+ const cacheDir = path_1.default.dirname(this.cacheFile);
100
+ if (!fs_1.default.existsSync(cacheDir)) {
101
+ yield fs_1.default.promises.mkdir(cacheDir, { recursive: true });
102
+ }
103
+ const cacheData = {};
104
+ files.forEach(file => {
105
+ if (file.hash) {
106
+ cacheData[file.path] = file.hash;
107
+ this.fileCache.set(file.path, file.hash);
108
+ }
109
+ });
110
+ yield fs_1.default.promises.writeFile(this.cacheFile, JSON.stringify(cacheData, null, 2));
111
+ });
112
+ }
113
+ clearCache() {
114
+ this.fileCache.clear();
115
+ if (fs_1.default.existsSync(this.cacheFile)) {
116
+ fs_1.default.unlinkSync(this.cacheFile);
117
+ }
118
+ }
119
+ }
120
+ exports.FileDiscovery = FileDiscovery;
121
+ //# 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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"}