ts-runtime-validation 1.8.1 → 1.8.3
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/README.md +38 -38
- package/dist/SchemaGenerator.js +37 -3
- package/dist/SchemaGenerator.js.map +1 -1
- package/dist/services/FileDiscovery.js +33 -2
- package/dist/services/FileDiscovery.js.map +1 -1
- package/dist/services/SchemaProcessor.js +77 -1
- package/dist/services/SchemaProcessor.js.map +1 -1
- package/dist/services/SchemaProcessor.test.js +197 -0
- package/dist/services/SchemaProcessor.test.js.map +1 -1
- package/package.json +1 -1
- package/src/SchemaGenerator.ts +44 -7
- package/src/services/FileDiscovery.ts +38 -6
- package/src/services/SchemaProcessor.test.ts +234 -0
- package/src/services/SchemaProcessor.ts +103 -2
package/README.md
CHANGED
|
@@ -4,36 +4,36 @@
|
|
|
4
4
|
|
|
5
5
|
Automatically generate type-safe runtime validation from your existing TypeScript interfaces. Zero configuration, zero decorators - just add JSDoc comments for validation rules and get bulletproof runtime type checking with full TypeScript support.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
**[Project Marketing Page](https://www.thegalah.com/projects/ts-runtime-validation)**
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Features
|
|
10
10
|
|
|
11
11
|
### Core Features
|
|
12
12
|
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
13
|
+
- **Zero-effort validation** - Automatically generates JSON Schema validators from TypeScript interfaces
|
|
14
|
+
- **Type-safe** - Full TypeScript support with type inference and type guards
|
|
15
|
+
- **Lightweight** - Minimal dependencies, can be installed as a dev dependency
|
|
16
|
+
- **CLI & Programmatic API** - Use as a CLI tool or integrate into your build process
|
|
17
|
+
- **Selective generation** - Control which types to validate using file naming conventions
|
|
18
|
+
- **JSDoc annotations** - Add validation rules (min/max length, patterns, formats) directly in your TypeScript code
|
|
19
19
|
|
|
20
20
|
### Performance & Optimization
|
|
21
21
|
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
22
|
+
- **Incremental builds** - File-based caching for faster subsequent builds
|
|
23
|
+
- **Parallel processing** - Concurrent file processing for improved performance
|
|
24
|
+
- **Progress reporting** - Visual feedback for long-running operations
|
|
25
|
+
- **Tree-shaking friendly** - Generate optimized exports for smaller bundles
|
|
26
|
+
- **Lazy loading** - Optional deferred validator initialization
|
|
27
|
+
- **Minified output** - Compressed JSON schemas for production
|
|
28
|
+
- **Verbose logging** - Detailed debugging information when needed
|
|
29
29
|
|
|
30
|
-
##
|
|
30
|
+
## Prerequisites
|
|
31
31
|
|
|
32
32
|
- Node.js >= 12
|
|
33
33
|
- TypeScript >= 4.0
|
|
34
34
|
- `ajv` >= 8.11.0 (peer dependency for runtime validation)
|
|
35
35
|
|
|
36
|
-
##
|
|
36
|
+
## Installation
|
|
37
37
|
|
|
38
38
|
```bash
|
|
39
39
|
# Using yarn (recommended)
|
|
@@ -45,7 +45,7 @@ npm install --save-dev ts-runtime-validation
|
|
|
45
45
|
npm install ajv # Required peer dependency
|
|
46
46
|
```
|
|
47
47
|
|
|
48
|
-
##
|
|
48
|
+
## Quick Start
|
|
49
49
|
|
|
50
50
|
### 1. Mark your types for validation
|
|
51
51
|
|
|
@@ -155,7 +155,7 @@ if (isValidSchema(userData, "#/definitions/IUser")) {
|
|
|
155
155
|
}
|
|
156
156
|
```
|
|
157
157
|
|
|
158
|
-
##
|
|
158
|
+
## Usage
|
|
159
159
|
|
|
160
160
|
### CLI Options
|
|
161
161
|
|
|
@@ -322,7 +322,7 @@ ts-runtime-validation --cache --minify --no-parallel
|
|
|
322
322
|
ts-runtime-validation --verbose --progress --no-parallel
|
|
323
323
|
```
|
|
324
324
|
|
|
325
|
-
##
|
|
325
|
+
## Performance & Optimization
|
|
326
326
|
|
|
327
327
|
### Caching System
|
|
328
328
|
|
|
@@ -412,13 +412,13 @@ const getValidator = () => {
|
|
|
412
412
|
};
|
|
413
413
|
```
|
|
414
414
|
|
|
415
|
-
##
|
|
415
|
+
## Limitations
|
|
416
416
|
|
|
417
417
|
- **No duplicate type names** - Each interface/type must have a unique name across all schema files
|
|
418
418
|
- **TypeScript-only constructs** - Some advanced TypeScript features (like conditional types) may not be fully supported
|
|
419
419
|
- **Circular references** - Limited support for circular type references
|
|
420
420
|
|
|
421
|
-
##
|
|
421
|
+
## Contributing
|
|
422
422
|
|
|
423
423
|
We welcome contributions! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
|
|
424
424
|
|
|
@@ -461,7 +461,7 @@ See [CONTRIBUTING.md](./CONTRIBUTING.md) for detailed information about:
|
|
|
461
461
|
- Performance optimization techniques
|
|
462
462
|
- Testing approaches and best practices
|
|
463
463
|
|
|
464
|
-
##
|
|
464
|
+
## Acknowledgments
|
|
465
465
|
|
|
466
466
|
Built with modern tools and optimized for performance:
|
|
467
467
|
|
|
@@ -471,7 +471,7 @@ Built with modern tools and optimized for performance:
|
|
|
471
471
|
- [fdir](https://github.com/thecodrr/fdir) - Fast file system traversal
|
|
472
472
|
- [picomatch](https://github.com/micromatch/picomatch) - Efficient glob pattern matching
|
|
473
473
|
|
|
474
|
-
##
|
|
474
|
+
## Related Projects & Comparisons
|
|
475
475
|
|
|
476
476
|
### How ts-runtime-validation differs from alternatives:
|
|
477
477
|
|
|
@@ -486,21 +486,21 @@ Built with modern tools and optimized for performance:
|
|
|
486
486
|
|
|
487
487
|
**ts-runtime-validation**:
|
|
488
488
|
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
489
|
+
-**Zero runtime API** - Works with your existing TypeScript interfaces
|
|
490
|
+
-**Build-time generation** - No runtime overhead for schema creation
|
|
491
|
+
-**JSDoc validation rules** - Add constraints via comments
|
|
492
|
+
-**Intelligent caching** - Fast incremental builds with change detection
|
|
493
|
+
-**Performance optimized** - Parallel processing and bundle optimization
|
|
494
|
+
-**Requires build step** - Must regenerate when types change
|
|
495
|
+
-**No runtime schema composition** - Can't dynamically create schemas
|
|
496
496
|
|
|
497
497
|
**zod/io-ts/yup**:
|
|
498
498
|
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
499
|
+
-**Runtime flexibility** - Create and compose schemas dynamically
|
|
500
|
+
-**Single source of truth** - Schema and type defined together
|
|
501
|
+
-**No build step** - Works immediately in your code
|
|
502
|
+
-**Runtime overhead** - Schemas created at runtime
|
|
503
|
+
-**Duplicate type definitions** - Can't reuse existing TypeScript interfaces
|
|
504
504
|
|
|
505
505
|
Choose **ts-runtime-validation** when you:
|
|
506
506
|
|
|
@@ -519,7 +519,7 @@ Choose **alternatives** when you:
|
|
|
519
519
|
- Need complex runtime transformations or coercions
|
|
520
520
|
- Want extensive built-in validation methods and error messages
|
|
521
521
|
|
|
522
|
-
##
|
|
522
|
+
## Troubleshooting
|
|
523
523
|
|
|
524
524
|
### Generated files are not updating
|
|
525
525
|
|
|
@@ -533,7 +533,7 @@ ts-runtime-validation --cache
|
|
|
533
533
|
|
|
534
534
|
### Hash inconsistencies between runs
|
|
535
535
|
|
|
536
|
-
Version 1.8.
|
|
536
|
+
Version 1.8.2+ includes fixes for deterministic output generation. If you're experiencing different file hashes between runs, ensure you're using the latest version.
|
|
537
537
|
|
|
538
538
|
### Performance issues with large projects
|
|
539
539
|
|
package/dist/SchemaGenerator.js
CHANGED
|
@@ -43,10 +43,42 @@ class SchemaGenerator {
|
|
|
43
43
|
console.log(`Found ${files.length} schema file(s)`);
|
|
44
44
|
files.forEach(file => console.log(` - ${file.path}`));
|
|
45
45
|
}
|
|
46
|
+
// Separate changed and unchanged files when caching is enabled
|
|
47
|
+
const cacheEnabled = this.options.cache || false;
|
|
48
|
+
let filesToProcess;
|
|
49
|
+
const cachedSchemas = new Map();
|
|
50
|
+
if (cacheEnabled) {
|
|
51
|
+
filesToProcess = files.filter(f => f.changed !== false);
|
|
52
|
+
const unchangedFiles = files.filter(f => f.changed === false);
|
|
53
|
+
for (const file of unchangedFiles) {
|
|
54
|
+
const cached = this.fileDiscovery.getCachedSchema(file.path);
|
|
55
|
+
if (cached) {
|
|
56
|
+
cachedSchemas.set(file.path, cached);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// No cached schema available, must reprocess
|
|
60
|
+
filesToProcess.push(file);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (this.options.verbose) {
|
|
64
|
+
console.log(`Cache: ${cachedSchemas.size} unchanged, ${filesToProcess.length} to process`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
filesToProcess = files;
|
|
69
|
+
}
|
|
46
70
|
// Process schemas
|
|
47
71
|
this.progressReporter.update(1, "Processing TypeScript files...");
|
|
48
|
-
this.progressReporter.options.total =
|
|
49
|
-
const
|
|
72
|
+
this.progressReporter.options.total = filesToProcess.length + 4; // files + 4 generation steps
|
|
73
|
+
const processedSchemas = filesToProcess.length > 0
|
|
74
|
+
? yield this.schemaProcessor.processFiles(filesToProcess)
|
|
75
|
+
: new Map();
|
|
76
|
+
// Merge processed and cached schemas
|
|
77
|
+
const schemaMap = new Map([...cachedSchemas, ...processedSchemas]);
|
|
78
|
+
// Save all schemas to cache for next run
|
|
79
|
+
if (cacheEnabled) {
|
|
80
|
+
yield this.fileDiscovery.saveSchemasToCache(schemaMap);
|
|
81
|
+
}
|
|
50
82
|
if (schemaMap.size === 0) {
|
|
51
83
|
console.log("No types found to generate schemas for");
|
|
52
84
|
return;
|
|
@@ -90,7 +122,9 @@ class SchemaGenerator {
|
|
|
90
122
|
additionalProperties: options.additionalProperties,
|
|
91
123
|
tsconfigPath: options.tsconfigPath || undefined,
|
|
92
124
|
parallel: options.parallel !== false,
|
|
93
|
-
verbose: options.verbose || false
|
|
125
|
+
verbose: options.verbose || false,
|
|
126
|
+
glob: options.glob,
|
|
127
|
+
rootPath: options.rootPath
|
|
94
128
|
});
|
|
95
129
|
this.codeGenerator = new CodeGenerator_1.CodeGenerator({
|
|
96
130
|
outputPath: this.outputPath,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaGenerator.js","sourceRoot":"","sources":["../src/SchemaGenerator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,gDAAwB;AACxB,
|
|
1
|
+
{"version":3,"file":"SchemaGenerator.js","sourceRoot":"","sources":["../src/SchemaGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,7 +23,10 @@ class FileDiscovery {
|
|
|
23
23
|
constructor(options) {
|
|
24
24
|
this.options = options;
|
|
25
25
|
this.fileCache = new Map();
|
|
26
|
-
this.
|
|
26
|
+
this.schemaCache = new Map();
|
|
27
|
+
const cacheDir = options.cachePath || ".ts-runtime-validation-cache";
|
|
28
|
+
this.cacheFile = path_1.default.join(cacheDir, "file-hashes.json");
|
|
29
|
+
this.schemaCacheFile = path_1.default.join(cacheDir, "schema-cache.json");
|
|
27
30
|
if (options.cacheEnabled) {
|
|
28
31
|
this.loadCache();
|
|
29
32
|
}
|
|
@@ -64,10 +67,12 @@ class FileDiscovery {
|
|
|
64
67
|
const enrichedFiles = yield Promise.all(files.map((filePath) => __awaiter(this, void 0, void 0, function* () {
|
|
65
68
|
const stats = yield fs_1.default.promises.stat(filePath);
|
|
66
69
|
const hash = yield this.getFileHash(filePath);
|
|
70
|
+
const cachedHash = this.fileCache.get(filePath);
|
|
67
71
|
return {
|
|
68
72
|
path: filePath,
|
|
69
73
|
hash,
|
|
70
|
-
lastModified: stats.mtime
|
|
74
|
+
lastModified: stats.mtime,
|
|
75
|
+
changed: cachedHash !== hash
|
|
71
76
|
};
|
|
72
77
|
})));
|
|
73
78
|
yield this.saveCache(enrichedFiles);
|
|
@@ -84,16 +89,38 @@ class FileDiscovery {
|
|
|
84
89
|
const cachedHash = this.fileCache.get(filePath);
|
|
85
90
|
return cachedHash !== currentHash;
|
|
86
91
|
}
|
|
92
|
+
getCachedSchema(filePath) {
|
|
93
|
+
return this.schemaCache.get(filePath);
|
|
94
|
+
}
|
|
95
|
+
saveSchemasToCache(schemas) {
|
|
96
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
97
|
+
const cacheDir = path_1.default.dirname(this.schemaCacheFile);
|
|
98
|
+
if (!fs_1.default.existsSync(cacheDir)) {
|
|
99
|
+
yield fs_1.default.promises.mkdir(cacheDir, { recursive: true });
|
|
100
|
+
}
|
|
101
|
+
const data = {};
|
|
102
|
+
for (const [key, value] of schemas) {
|
|
103
|
+
data[key] = value;
|
|
104
|
+
this.schemaCache.set(key, value);
|
|
105
|
+
}
|
|
106
|
+
yield fs_1.default.promises.writeFile(this.schemaCacheFile, JSON.stringify(data));
|
|
107
|
+
});
|
|
108
|
+
}
|
|
87
109
|
loadCache() {
|
|
88
110
|
try {
|
|
89
111
|
if (fs_1.default.existsSync(this.cacheFile)) {
|
|
90
112
|
const cacheData = JSON.parse(fs_1.default.readFileSync(this.cacheFile, 'utf-8'));
|
|
91
113
|
this.fileCache = new Map(Object.entries(cacheData));
|
|
92
114
|
}
|
|
115
|
+
if (fs_1.default.existsSync(this.schemaCacheFile)) {
|
|
116
|
+
const schemaData = JSON.parse(fs_1.default.readFileSync(this.schemaCacheFile, 'utf-8'));
|
|
117
|
+
this.schemaCache = new Map(Object.entries(schemaData));
|
|
118
|
+
}
|
|
93
119
|
}
|
|
94
120
|
catch (error) {
|
|
95
121
|
console.warn('Failed to load cache, starting fresh');
|
|
96
122
|
this.fileCache.clear();
|
|
123
|
+
this.schemaCache.clear();
|
|
97
124
|
}
|
|
98
125
|
}
|
|
99
126
|
saveCache(files) {
|
|
@@ -114,9 +141,13 @@ class FileDiscovery {
|
|
|
114
141
|
}
|
|
115
142
|
clearCache() {
|
|
116
143
|
this.fileCache.clear();
|
|
144
|
+
this.schemaCache.clear();
|
|
117
145
|
if (fs_1.default.existsSync(this.cacheFile)) {
|
|
118
146
|
fs_1.default.unlinkSync(this.cacheFile);
|
|
119
147
|
}
|
|
148
|
+
if (fs_1.default.existsSync(this.schemaCacheFile)) {
|
|
149
|
+
fs_1.default.unlinkSync(this.schemaCacheFile);
|
|
150
|
+
}
|
|
120
151
|
}
|
|
121
152
|
}
|
|
122
153
|
exports.FileDiscovery = FileDiscovery;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileDiscovery.js","sourceRoot":"","sources":["../../src/services/FileDiscovery.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,+BAA4B;AAC5B,0DAAkC;AAClC,gDAAwB;AACxB,4CAAoB;AACpB,oDAA4B;AAC5B,sCAA+C;
|
|
1
|
+
{"version":3,"file":"FileDiscovery.js","sourceRoot":"","sources":["../../src/services/FileDiscovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,6 +48,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
48
48
|
exports.SchemaProcessor = void 0;
|
|
49
49
|
const tsj = __importStar(require("ts-json-schema-generator"));
|
|
50
50
|
const assert_1 = __importDefault(require("assert"));
|
|
51
|
+
const path_1 = __importDefault(require("path"));
|
|
52
|
+
const ts_morph_1 = require("ts-morph");
|
|
51
53
|
const errors_1 = require("../errors");
|
|
52
54
|
class SchemaProcessor {
|
|
53
55
|
constructor(options) {
|
|
@@ -55,18 +57,92 @@ class SchemaProcessor {
|
|
|
55
57
|
}
|
|
56
58
|
processFiles(files) {
|
|
57
59
|
return __awaiter(this, void 0, void 0, function* () {
|
|
58
|
-
const { parallel = true, verbose = false } = this.options;
|
|
60
|
+
const { parallel = true, verbose = false, glob, rootPath } = this.options;
|
|
59
61
|
if (verbose) {
|
|
60
62
|
console.log(`Processing ${files.length} files...`);
|
|
61
63
|
}
|
|
62
64
|
// Sort files by path to ensure consistent processing order
|
|
63
65
|
const sortedFiles = [...files].sort((a, b) => a.path.localeCompare(b.path));
|
|
66
|
+
// Use single-pass processing when possible (avoids creating N TypeScript programs)
|
|
67
|
+
if (glob && rootPath && sortedFiles.length > 1) {
|
|
68
|
+
try {
|
|
69
|
+
return yield this.processSinglePass(sortedFiles, rootPath, glob);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (verbose) {
|
|
73
|
+
console.log(`Single-pass processing failed, falling back to per-file processing: ${error instanceof Error ? error.message : String(error)}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
64
77
|
const results = parallel
|
|
65
78
|
? yield this.processInParallel(sortedFiles)
|
|
66
79
|
: yield this.processSequentially(sortedFiles);
|
|
67
80
|
return this.consolidateSchemas(results);
|
|
68
81
|
});
|
|
69
82
|
}
|
|
83
|
+
processSinglePass(files, rootPath, glob) {
|
|
84
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
85
|
+
const { additionalProperties, tsconfigPath, verbose } = this.options;
|
|
86
|
+
// Pre-check: scan all TS files in rootPath for duplicate exported type names.
|
|
87
|
+
// If duplicates exist, per-file processing is needed to detect schema conflicts.
|
|
88
|
+
if (this.hasDuplicateTypeNames(rootPath)) {
|
|
89
|
+
throw new Error("Duplicate type names detected across source files");
|
|
90
|
+
}
|
|
91
|
+
const resolvedRoot = path_1.default.resolve(rootPath);
|
|
92
|
+
const globPattern = path_1.default.join(resolvedRoot, "**", glob);
|
|
93
|
+
if (verbose) {
|
|
94
|
+
console.log(`Single-pass processing with pattern: ${globPattern}`);
|
|
95
|
+
}
|
|
96
|
+
const config = Object.assign({ path: globPattern, type: "*", additionalProperties, encodeRefs: false, sortProps: true }, (tsconfigPath ? { tsconfig: tsconfigPath } : {}));
|
|
97
|
+
const schemaGenerator = tsj.createGenerator(config);
|
|
98
|
+
const fullSchema = schemaGenerator.createSchema(config.type);
|
|
99
|
+
return this.partitionSchemaByFile(files, fullSchema);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
hasDuplicateTypeNames(rootPath) {
|
|
103
|
+
const project = new ts_morph_1.Project({ skipAddingFilesFromTsConfig: true });
|
|
104
|
+
const allTsFiles = project.addSourceFilesAtPaths(path_1.default.join(path_1.default.resolve(rootPath), "**/*.{ts,tsx}"));
|
|
105
|
+
const seen = new Set();
|
|
106
|
+
for (const sf of allTsFiles) {
|
|
107
|
+
const names = [];
|
|
108
|
+
for (const t of sf.getTypeAliases()) {
|
|
109
|
+
if (t.isExported())
|
|
110
|
+
names.push(t.getName());
|
|
111
|
+
}
|
|
112
|
+
for (const i of sf.getInterfaces()) {
|
|
113
|
+
if (i.isExported())
|
|
114
|
+
names.push(i.getName());
|
|
115
|
+
}
|
|
116
|
+
for (const e of sf.getEnums()) {
|
|
117
|
+
if (e.isExported())
|
|
118
|
+
names.push(e.getName());
|
|
119
|
+
}
|
|
120
|
+
for (const name of names) {
|
|
121
|
+
if (seen.has(name))
|
|
122
|
+
return true;
|
|
123
|
+
seen.add(name);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
partitionSchemaByFile(files, fullSchema) {
|
|
129
|
+
var _a;
|
|
130
|
+
const defs = (_a = fullSchema.definitions) !== null && _a !== void 0 ? _a : {};
|
|
131
|
+
const schemaVersion = fullSchema.$schema || "http://json-schema.org/draft-07/schema#";
|
|
132
|
+
const schemaMap = new Map();
|
|
133
|
+
if (Object.keys(defs).length === 0)
|
|
134
|
+
return schemaMap;
|
|
135
|
+
// Since we've verified no duplicate type names exist, assign all definitions
|
|
136
|
+
// to each file. Downstream code (extractTypeInfo) uses ts-morph to correctly
|
|
137
|
+
// attribute each definition to its actual source file.
|
|
138
|
+
for (const file of files) {
|
|
139
|
+
schemaMap.set(file.path, {
|
|
140
|
+
$schema: schemaVersion,
|
|
141
|
+
definitions: Object.assign({}, defs),
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
return schemaMap;
|
|
145
|
+
}
|
|
70
146
|
processInParallel(files) {
|
|
71
147
|
return __awaiter(this, void 0, void 0, function* () {
|
|
72
148
|
const promises = files.map(file => this.processFile(file));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaProcessor.js","sourceRoot":"","sources":["../../src/services/SchemaProcessor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8DAAgD;AAEhD,oDAA4B;AAC5B,sCAAwE;
|
|
1
|
+
{"version":3,"file":"SchemaProcessor.js","sourceRoot":"","sources":["../../src/services/SchemaProcessor.ts"],"names":[],"mappings":"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"}
|