logicstamp-context 0.5.4 → 0.6.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/README.md +8 -11
- package/dist/cli/commands/context/incrementalWatch.d.ts.map +1 -1
- package/dist/cli/commands/context/incrementalWatch.js +25 -2
- package/dist/cli/commands/context/incrementalWatch.js.map +1 -1
- package/dist/cli/commands/context/watchMode.d.ts.map +1 -1
- package/dist/cli/commands/context/watchMode.js +72 -57
- package/dist/cli/commands/context/watchMode.js.map +1 -1
- package/dist/cli/handlers/compareHandler.js +16 -16
- package/dist/cli/handlers/compareHandler.js.map +1 -1
- package/dist/core/pack/loader.d.ts.map +1 -1
- package/dist/core/pack/loader.js +89 -4
- package/dist/core/pack/loader.js.map +1 -1
- package/dist/utils/cleanup.d.ts +17 -0
- package/dist/utils/cleanup.d.ts.map +1 -1
- package/dist/utils/cleanup.js +76 -4
- package/dist/utils/cleanup.js.map +1 -1
- package/dist/utils/config.d.ts +16 -4
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +138 -23
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/fileLock.d.ts +56 -0
- package/dist/utils/fileLock.d.ts.map +1 -0
- package/dist/utils/fileLock.js +189 -0
- package/dist/utils/fileLock.js.map +1 -0
- package/dist/utils/fsx.d.ts +6 -0
- package/dist/utils/fsx.d.ts.map +1 -1
- package/dist/utils/fsx.js +58 -38
- package/dist/utils/fsx.js.map +1 -1
- package/dist/utils/schemaValidator.d.ts +24 -0
- package/dist/utils/schemaValidator.d.ts.map +1 -0
- package/dist/utils/schemaValidator.js +137 -0
- package/dist/utils/schemaValidator.js.map +1 -0
- package/package.json +6 -5
package/dist/utils/fsx.js
CHANGED
|
@@ -31,6 +31,12 @@ import { resolve, relative, join, normalize, isAbsolute } from 'node:path';
|
|
|
31
31
|
import { debugError } from './debug.js';
|
|
32
32
|
/**
|
|
33
33
|
* Find files matching glob patterns
|
|
34
|
+
*
|
|
35
|
+
* Resilient behavior:
|
|
36
|
+
* - Processes all patterns even if some fail
|
|
37
|
+
* - Returns partial results from successful patterns
|
|
38
|
+
* - Only throws if ALL patterns fail
|
|
39
|
+
* - Logs warnings for partial failures (via debugError)
|
|
34
40
|
*/
|
|
35
41
|
export async function globFiles(searchPath, extensions = '.tsx,.ts') {
|
|
36
42
|
const extArray = extensions.split(',').map((ext) => ext.trim());
|
|
@@ -42,50 +48,64 @@ export async function globFiles(searchPath, extensions = '.tsx,.ts') {
|
|
|
42
48
|
return `**/*.${ext}`;
|
|
43
49
|
});
|
|
44
50
|
const files = [];
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
51
|
+
const errors = [];
|
|
52
|
+
for (const pattern of patterns) {
|
|
53
|
+
try {
|
|
54
|
+
const matches = await glob(pattern, {
|
|
55
|
+
cwd: searchPath,
|
|
56
|
+
absolute: false,
|
|
57
|
+
ignore: [
|
|
58
|
+
'**/node_modules/**',
|
|
59
|
+
'**/dist/**',
|
|
60
|
+
'**/build/**',
|
|
61
|
+
'**/.next/**',
|
|
62
|
+
'**/coverage/**',
|
|
63
|
+
'**/*.test.ts',
|
|
64
|
+
'**/*.test.tsx',
|
|
65
|
+
'**/*.spec.ts',
|
|
66
|
+
'**/*.spec.tsx',
|
|
67
|
+
],
|
|
68
|
+
});
|
|
69
|
+
// Convert to relative paths (normalize for consistency)
|
|
70
|
+
const relativeMatches = matches.map(match => normalizeEntryId(match));
|
|
71
|
+
files.push(...relativeMatches);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
const err = error;
|
|
75
|
+
errors.push({ pattern, message: err.message });
|
|
76
|
+
debugError('fsx', 'globFiles pattern failed', {
|
|
77
|
+
pattern,
|
|
78
|
+
searchPath,
|
|
79
|
+
message: err.message,
|
|
80
|
+
});
|
|
81
|
+
// Continue with remaining patterns instead of throwing immediately
|
|
76
82
|
}
|
|
77
|
-
// Remove duplicates and sort
|
|
78
|
-
return [...new Set(files)].sort();
|
|
79
83
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
84
|
+
// If ALL patterns failed, throw an aggregate error
|
|
85
|
+
if (errors.length === patterns.length) {
|
|
86
|
+
const errorMessages = errors.map(e => `Pattern "${e.pattern}": ${e.message}`);
|
|
87
|
+
const aggregateMessage = `All glob patterns failed in "${searchPath}":\n - ${errorMessages.join('\n - ')}`;
|
|
88
|
+
debugError('fsx', 'globFiles all patterns failed', {
|
|
83
89
|
searchPath,
|
|
84
90
|
extensions,
|
|
85
|
-
|
|
91
|
+
patternCount: patterns.length,
|
|
92
|
+
errors,
|
|
93
|
+
});
|
|
94
|
+
throw new Error(aggregateMessage);
|
|
95
|
+
}
|
|
96
|
+
// If some patterns failed but others succeeded, log a warning
|
|
97
|
+
if (errors.length > 0) {
|
|
98
|
+
debugError('fsx', 'globFiles partial failure', {
|
|
99
|
+
searchPath,
|
|
100
|
+
extensions,
|
|
101
|
+
successCount: patterns.length - errors.length,
|
|
102
|
+
failCount: errors.length,
|
|
103
|
+
failedPatterns: errors.map(e => e.pattern),
|
|
86
104
|
});
|
|
87
|
-
|
|
105
|
+
// Continue with partial results - this is intentional resilient behavior
|
|
88
106
|
}
|
|
107
|
+
// Remove duplicates and sort
|
|
108
|
+
return [...new Set(files)].sort();
|
|
89
109
|
}
|
|
90
110
|
/**
|
|
91
111
|
* Read file and return path + content
|
package/dist/utils/fsx.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fsx.js","sourceRoot":"","sources":["../../src/utils/fsx.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAOxC
|
|
1
|
+
{"version":3,"file":"fsx.js","sourceRoot":"","sources":["../../src/utils/fsx.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAOxC;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,UAAkB,EAClB,aAAqB,UAAU;IAE/B,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAEhE,qBAAqB;IACrB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACpC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,OAAO,GAAG,EAAE,CAAC;QACtB,CAAC;QACD,OAAO,QAAQ,GAAG,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAA2C,EAAE,CAAC;IAE1D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE;gBAClC,GAAG,EAAE,UAAU;gBACf,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE;oBACN,oBAAoB;oBACpB,YAAY;oBACZ,aAAa;oBACb,aAAa;oBACb,gBAAgB;oBAChB,cAAc;oBACd,eAAe;oBACf,cAAc;oBACd,eAAe;iBAChB;aACF,CAAC,CAAC;YAEH,wDAAwD;YACxD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;YACtE,KAAK,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAc,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/C,UAAU,CAAC,KAAK,EAAE,0BAA0B,EAAE;gBAC5C,OAAO;gBACP,UAAU;gBACV,OAAO,EAAE,GAAG,CAAC,OAAO;aACrB,CAAC,CAAC;YACH,mEAAmE;QACrE,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;QACtC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9E,MAAM,gBAAgB,GAAG,gCAAgC,UAAU,WAAW,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7G,UAAU,CAAC,KAAK,EAAE,+BAA+B,EAAE;YACjD,UAAU;YACV,UAAU;YACV,YAAY,EAAE,QAAQ,CAAC,MAAM;YAC7B,MAAM;SACP,CAAC,CAAC;QACH,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACpC,CAAC;IAED,8DAA8D;IAC9D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,UAAU,CAAC,KAAK,EAAE,2BAA2B,EAAE;YAC7C,UAAU;YACV,UAAU;YACV,YAAY,EAAE,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;YAC7C,SAAS,EAAE,MAAM,CAAC,MAAM;YACxB,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;SAC3C,CAAC,CAAC;QACH,yEAAyE;IAC3E,CAAC;IAED,6BAA6B;IAC7B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB;IACrD,IAAI,CAAC;QACL,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAA8B,CAAC;QAC3C,UAAU,CAAC,KAAK,EAAE,kBAAkB,EAAE;YACpC,QAAQ;YACR,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC;QAEH,sDAAsD;QACtD,IAAI,WAAmB,CAAC;QACxB,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,QAAQ;gBACX,WAAW,GAAG,oBAAoB,QAAQ,GAAG,CAAC;gBAC9C,MAAM;YACR,KAAK,QAAQ;gBACX,WAAW,GAAG,uBAAuB,QAAQ,GAAG,CAAC;gBACjD,MAAM;YACR,KAAK,QAAQ;gBACX,WAAW,GAAG,qCAAqC,QAAQ,GAAG,CAAC;gBAC/D,MAAM;YACR,KAAK,QAAQ;gBACX,WAAW,GAAG,sCAAsC,QAAQ,GAAG,CAAC;gBAChE,MAAM;YACR,KAAK,QAAQ;gBACX,WAAW,GAAG,uCAAuC,QAAQ,GAAG,CAAC;gBACjE,MAAM;YACR;gBACE,WAAW,GAAG,wBAAwB,QAAQ,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;QACtE,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAkB;IACvD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE;YAC5C,GAAG,EAAE,UAAU;YACf,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,CAAC,oBAAoB,EAAE,YAAY,EAAE,aAAa,CAAC;SAC5D,CAAC,CAAC;QACD,wDAAwD;QACxD,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAc,CAAC;QAC3B,UAAU,CAAC,KAAK,EAAE,kBAAkB,EAAE;YACpC,UAAU;YACV,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC;QACH,wCAAwC;QACxC,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,WAAmB;IACrD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,+BAA+B;QAC/B,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,EAAU;IACtD,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAG,KAAe;IAC5C,OAAO,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAc,CAAC;QAC3B,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE;YAC9B,QAAQ;YACR,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,OAAe;IAChE,+DAA+D;IAC/D,8CAA8C;IAC9C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,OAAO,GAAG,UAAU,WAAW,CAAC;IAClC,CAAC;IACD,gDAAgD;IAChD,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,UAAU,WAAW,CAAC,CAAC;AACjD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC1D,kEAAkE;IAClE,kEAAkE;IAClE,IAAI,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IACtF,+BAA+B;IAC/B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,SAAS,KAAK,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IACjC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAe;IAChD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAEvC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAChC,CAAC;QAED,SAAS,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema validation utilities using AJV
|
|
3
|
+
* Validates JSON data against LogicStamp schemas at runtime
|
|
4
|
+
*/
|
|
5
|
+
import type { UIFContract } from '../types/UIFContract.js';
|
|
6
|
+
/**
|
|
7
|
+
* Validate data against the UIFContract schema
|
|
8
|
+
* Returns validation result with detailed errors if invalid
|
|
9
|
+
*/
|
|
10
|
+
export declare function validateUIFContract(data: unknown): {
|
|
11
|
+
valid: boolean;
|
|
12
|
+
errors: string[];
|
|
13
|
+
data: UIFContract | null;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Type guard that validates and narrows type
|
|
17
|
+
* Use when you just need a boolean check
|
|
18
|
+
*/
|
|
19
|
+
export declare function isValidUIFContract(data: unknown): data is UIFContract;
|
|
20
|
+
/**
|
|
21
|
+
* Clear the cached validator (useful for testing)
|
|
22
|
+
*/
|
|
23
|
+
export declare function clearValidatorCache(): void;
|
|
24
|
+
//# sourceMappingURL=schemaValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaValidator.d.ts","sourceRoot":"","sources":["../../src/utils/schemaValidator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAwD3D;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG;IAClD,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;CAC1B,CA+BA;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,WAAW,CAErE;AAqCD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema validation utilities using AJV
|
|
3
|
+
* Validates JSON data against LogicStamp schemas at runtime
|
|
4
|
+
*/
|
|
5
|
+
import Ajv from 'ajv';
|
|
6
|
+
import { readFileSync } from 'node:fs';
|
|
7
|
+
import { join, dirname } from 'node:path';
|
|
8
|
+
import { fileURLToPath } from 'node:url';
|
|
9
|
+
import { debugError } from './debug.js';
|
|
10
|
+
// Resolve schema path relative to this module
|
|
11
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
const schemaPath = join(__dirname, '../../schema/logicstamp.context.schema.json');
|
|
13
|
+
// Lazy-load schema and validator to avoid startup cost if validation isn't used
|
|
14
|
+
let ajv = null;
|
|
15
|
+
let contractValidator = null;
|
|
16
|
+
let schemaLoadError = null;
|
|
17
|
+
/**
|
|
18
|
+
* Initialize AJV and compile the UIFContract schema
|
|
19
|
+
* Called lazily on first validation attempt
|
|
20
|
+
*/
|
|
21
|
+
function initializeValidator() {
|
|
22
|
+
if (contractValidator)
|
|
23
|
+
return contractValidator;
|
|
24
|
+
if (schemaLoadError)
|
|
25
|
+
return null;
|
|
26
|
+
try {
|
|
27
|
+
const schemaContent = readFileSync(schemaPath, 'utf8');
|
|
28
|
+
const schema = JSON.parse(schemaContent);
|
|
29
|
+
// Guard against malformed schema file
|
|
30
|
+
if (!schema?.definitions?.UIFContract) {
|
|
31
|
+
throw new Error('UIFContract definition not found in schema');
|
|
32
|
+
}
|
|
33
|
+
ajv = new Ajv({
|
|
34
|
+
allErrors: true, // Collect all errors, not just the first
|
|
35
|
+
strict: false, // Allow schema features that aren't strictly spec-compliant
|
|
36
|
+
verbose: true, // Ensures `data` field is present in errors for typeof reporting
|
|
37
|
+
});
|
|
38
|
+
// Compile the UIFContract definition specifically
|
|
39
|
+
// The schema file has definitions at the root level
|
|
40
|
+
contractValidator = ajv.compile({
|
|
41
|
+
$ref: '#/definitions/UIFContract',
|
|
42
|
+
definitions: schema.definitions,
|
|
43
|
+
});
|
|
44
|
+
return contractValidator;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
// Clean up on failure
|
|
48
|
+
ajv = null;
|
|
49
|
+
contractValidator = null;
|
|
50
|
+
schemaLoadError = error;
|
|
51
|
+
debugError('schemaValidator', 'initializeValidator', {
|
|
52
|
+
error: schemaLoadError.message,
|
|
53
|
+
note: 'Schema validation disabled, contracts will not be validated',
|
|
54
|
+
});
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Validate data against the UIFContract schema
|
|
60
|
+
* Returns validation result with detailed errors if invalid
|
|
61
|
+
*/
|
|
62
|
+
export function validateUIFContract(data) {
|
|
63
|
+
const validator = initializeValidator();
|
|
64
|
+
// If schema failed to load, reject validation
|
|
65
|
+
// This ensures corrupted or invalid contracts are never silently accepted
|
|
66
|
+
if (!validator) {
|
|
67
|
+
return {
|
|
68
|
+
valid: false,
|
|
69
|
+
errors: ['Schema validation unavailable: ' + (schemaLoadError?.message || 'failed to load schema')],
|
|
70
|
+
data: null,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const valid = validator(data);
|
|
74
|
+
if (valid) {
|
|
75
|
+
return {
|
|
76
|
+
valid: true,
|
|
77
|
+
errors: [],
|
|
78
|
+
data: data,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// Format errors for readability
|
|
82
|
+
const errors = formatValidationErrors(validator.errors);
|
|
83
|
+
return {
|
|
84
|
+
valid: false,
|
|
85
|
+
errors,
|
|
86
|
+
data: null,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Type guard that validates and narrows type
|
|
91
|
+
* Use when you just need a boolean check
|
|
92
|
+
*/
|
|
93
|
+
export function isValidUIFContract(data) {
|
|
94
|
+
return validateUIFContract(data).valid;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Format AJV errors into human-readable strings
|
|
98
|
+
*/
|
|
99
|
+
function formatValidationErrors(errors) {
|
|
100
|
+
if (!errors || errors.length === 0)
|
|
101
|
+
return [];
|
|
102
|
+
return errors.map((err) => {
|
|
103
|
+
const path = err.instancePath || '(root)';
|
|
104
|
+
const message = err.message || 'unknown error';
|
|
105
|
+
// Add context for common error types
|
|
106
|
+
switch (err.keyword) {
|
|
107
|
+
case 'required':
|
|
108
|
+
return `${path}: missing required property '${err.params.missingProperty}'`;
|
|
109
|
+
case 'type': {
|
|
110
|
+
// typeof null === 'object' and typeof [] === 'object', so handle explicitly
|
|
111
|
+
const got = err.data === null ? 'null' : Array.isArray(err.data) ? 'array' : typeof err.data;
|
|
112
|
+
return `${path}: ${message} (got ${got})`;
|
|
113
|
+
}
|
|
114
|
+
case 'enum':
|
|
115
|
+
return `${path}: ${message}. Allowed: ${err.params.allowedValues?.join(', ')}`;
|
|
116
|
+
case 'const':
|
|
117
|
+
return `${path}: ${message}. Expected: ${err.params.allowedValue}`;
|
|
118
|
+
case 'additionalProperties':
|
|
119
|
+
return `${path}: unexpected property '${err.params.additionalProperty}'`;
|
|
120
|
+
case 'anyOf':
|
|
121
|
+
case 'oneOf':
|
|
122
|
+
// These are notoriously noisy - simplify the message
|
|
123
|
+
return `${path}: ${message} (schema union mismatch)`;
|
|
124
|
+
default:
|
|
125
|
+
return `${path}: ${message}`;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Clear the cached validator (useful for testing)
|
|
131
|
+
*/
|
|
132
|
+
export function clearValidatorCache() {
|
|
133
|
+
ajv = null;
|
|
134
|
+
contractValidator = null;
|
|
135
|
+
schemaLoadError = null;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=schemaValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaValidator.js","sourceRoot":"","sources":["../../src/utils/schemaValidator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "logicstamp-context",
|
|
3
|
-
"version": "0.
|
|
4
|
-
|
|
3
|
+
"version": "0.6.0",
|
|
4
|
+
"description": "Deterministic architectural context for TypeScript. Extract explicit contracts and dependency graphs to prevent AI-driven architectural drift.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"exports": {
|
|
@@ -60,10 +60,11 @@
|
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
62
|
"@toon-format/toon": "^1.0.0",
|
|
63
|
+
"ajv": "^8.18.0",
|
|
63
64
|
"chokidar": "^4.0.3",
|
|
64
65
|
"css-tree": "^3.1.0",
|
|
65
|
-
"glob": "^
|
|
66
|
-
"ts-morph": "^
|
|
66
|
+
"glob": "^13.0.6",
|
|
67
|
+
"ts-morph": "^27.0.2"
|
|
67
68
|
},
|
|
68
69
|
"optionalDependencies": {
|
|
69
70
|
"@anthropic-ai/tokenizer": "^0.0.4",
|
|
@@ -77,6 +78,6 @@
|
|
|
77
78
|
"vitest": "^4.0.16"
|
|
78
79
|
},
|
|
79
80
|
"engines": {
|
|
80
|
-
"node": ">=
|
|
81
|
+
"node": ">=20"
|
|
81
82
|
}
|
|
82
83
|
}
|