@mmnto/totem 1.3.18 → 1.4.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/dist/ast-grep-query.d.ts +2 -2
- package/dist/ast-grep-query.d.ts.map +1 -1
- package/dist/ast-grep-query.js +11 -11
- package/dist/ast-grep-query.js.map +1 -1
- package/dist/ast-grep-query.test.d.ts +2 -0
- package/dist/ast-grep-query.test.d.ts.map +1 -0
- package/dist/ast-grep-query.test.js +53 -0
- package/dist/ast-grep-query.test.js.map +1 -0
- package/dist/ast-query.d.ts +2 -2
- package/dist/ast-query.d.ts.map +1 -1
- package/dist/ast-query.js +12 -12
- package/dist/ast-query.js.map +1 -1
- package/dist/ast-query.test.js +3 -3
- package/dist/ast-query.test.js.map +1 -1
- package/dist/compile-manifest.d.ts +45 -0
- package/dist/compile-manifest.d.ts.map +1 -0
- package/dist/compile-manifest.js +119 -0
- package/dist/compile-manifest.js.map +1 -0
- package/dist/compile-manifest.test.d.ts +2 -0
- package/dist/compile-manifest.test.d.ts.map +1 -0
- package/dist/compile-manifest.test.js +102 -0
- package/dist/compile-manifest.test.js.map +1 -0
- package/dist/config-schema.d.ts +12 -12
- package/dist/errors.d.ts +7 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +14 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/rule-engine.js +2 -2
- package/dist/rule-engine.js.map +1 -1
- package/dist/rule-engine.test.d.ts +2 -0
- package/dist/rule-engine.test.d.ts.map +1 -0
- package/dist/rule-engine.test.js +63 -0
- package/dist/rule-engine.test.js.map +1 -0
- package/dist/rule-tester.d.ts.map +1 -1
- package/dist/rule-tester.js +17 -8
- package/dist/rule-tester.js.map +1 -1
- package/dist/xml-format.d.ts +9 -0
- package/dist/xml-format.d.ts.map +1 -1
- package/dist/xml-format.js +20 -0
- package/dist/xml-format.js.map +1 -1
- package/dist/xml-format.test.js +41 -1
- package/dist/xml-format.test.js.map +1 -1
- package/package.json +1 -1
package/dist/ast-grep-query.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export interface AstGrepMatch {
|
|
|
9
9
|
* Run an ast-grep pattern against file content, filtering to added lines.
|
|
10
10
|
* Accepts either a string pattern or a NapiConfig rule object (compound rules).
|
|
11
11
|
*/
|
|
12
|
-
export declare function matchAstGrepPattern(content: string, ext: string, pattern: AstGrepRule, addedLineNumbers: number[]
|
|
12
|
+
export declare function matchAstGrepPattern(content: string, ext: string, pattern: AstGrepRule, addedLineNumbers: number[]): AstGrepMatch[];
|
|
13
13
|
/**
|
|
14
14
|
* Parse a file once and run multiple ast-grep rules against it.
|
|
15
15
|
* O(M + N) — file parsed exactly once regardless of rule count.
|
|
@@ -18,5 +18,5 @@ export declare function matchAstGrepPattern(content: string, ext: string, patter
|
|
|
18
18
|
export declare function matchAstGrepPatternsBatch(content: string, ext: string, queries: Array<{
|
|
19
19
|
rule: AstGrepRule;
|
|
20
20
|
addedLineNumbers: number[];
|
|
21
|
-
}
|
|
21
|
+
}>): AstGrepMatch[][];
|
|
22
22
|
//# sourceMappingURL=ast-grep-query.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast-grep-query.d.ts","sourceRoot":"","sources":["../src/ast-grep-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"ast-grep-query.d.ts","sourceRoot":"","sources":["../src/ast-grep-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAOjD,gFAAgF;AAChF,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAmED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,EACpB,gBAAgB,EAAE,MAAM,EAAE,GACzB,YAAY,EAAE,CAUhB;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,GAChE,YAAY,EAAE,EAAE,CAkBlB"}
|
package/dist/ast-grep-query.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { Lang, parse } from '@ast-grep/napi';
|
|
2
|
+
import { rethrowAsParseError } from './errors.js';
|
|
3
|
+
// ─── Constants ──────────────────────────────────────
|
|
4
|
+
const AST_GREP_HINT = 'Check the rule pattern syntax. If valid, the source file may contain syntax that crashes the parser.';
|
|
2
5
|
// ─── Language mapping ───────────────────────────────
|
|
3
6
|
/** Map file extensions to ast-grep Lang enum. */
|
|
4
7
|
function extensionToLang(ext) {
|
|
@@ -18,7 +21,7 @@ function extensionToLang(ext) {
|
|
|
18
21
|
}
|
|
19
22
|
}
|
|
20
23
|
// ─── Core matching ──────────────────────────────────
|
|
21
|
-
function executeQuery(root, rule, addedLineNumbers, lines
|
|
24
|
+
function executeQuery(root, rule, addedLineNumbers, lines) {
|
|
22
25
|
if (addedLineNumbers.length === 0)
|
|
23
26
|
return [];
|
|
24
27
|
const addedSet = new Set(addedLineNumbers);
|
|
@@ -42,8 +45,7 @@ function executeQuery(root, rule, addedLineNumbers, lines, onWarn) {
|
|
|
42
45
|
return results;
|
|
43
46
|
}
|
|
44
47
|
catch (err) {
|
|
45
|
-
|
|
46
|
-
return [];
|
|
48
|
+
rethrowAsParseError('ast-grep query failed', err, AST_GREP_HINT);
|
|
47
49
|
}
|
|
48
50
|
}
|
|
49
51
|
// ─── Public API ─────────────────────────────────────
|
|
@@ -51,17 +53,16 @@ function executeQuery(root, rule, addedLineNumbers, lines, onWarn) {
|
|
|
51
53
|
* Run an ast-grep pattern against file content, filtering to added lines.
|
|
52
54
|
* Accepts either a string pattern or a NapiConfig rule object (compound rules).
|
|
53
55
|
*/
|
|
54
|
-
export function matchAstGrepPattern(content, ext, pattern, addedLineNumbers
|
|
56
|
+
export function matchAstGrepPattern(content, ext, pattern, addedLineNumbers) {
|
|
55
57
|
const lang = extensionToLang(ext);
|
|
56
58
|
if (!lang)
|
|
57
59
|
return [];
|
|
58
60
|
try {
|
|
59
61
|
const root = parse(lang, content);
|
|
60
|
-
return executeQuery(root, pattern, addedLineNumbers, content.split('\n')
|
|
62
|
+
return executeQuery(root, pattern, addedLineNumbers, content.split('\n'));
|
|
61
63
|
}
|
|
62
64
|
catch (err) {
|
|
63
|
-
|
|
64
|
-
return [];
|
|
65
|
+
rethrowAsParseError('ast-grep parse failed', err, AST_GREP_HINT);
|
|
65
66
|
}
|
|
66
67
|
}
|
|
67
68
|
/**
|
|
@@ -69,7 +70,7 @@ export function matchAstGrepPattern(content, ext, pattern, addedLineNumbers, onW
|
|
|
69
70
|
* O(M + N) — file parsed exactly once regardless of rule count.
|
|
70
71
|
* Returns results indexed by position in the input array.
|
|
71
72
|
*/
|
|
72
|
-
export function matchAstGrepPatternsBatch(content, ext, queries
|
|
73
|
+
export function matchAstGrepPatternsBatch(content, ext, queries) {
|
|
73
74
|
if (queries.length === 0)
|
|
74
75
|
return [];
|
|
75
76
|
const lang = extensionToLang(ext);
|
|
@@ -79,11 +80,10 @@ export function matchAstGrepPatternsBatch(content, ext, queries, onWarn) {
|
|
|
79
80
|
const lines = content.split('\n');
|
|
80
81
|
try {
|
|
81
82
|
const root = parse(lang, content);
|
|
82
|
-
return queries.map(({ rule, addedLineNumbers }) => executeQuery(root, rule, addedLineNumbers, lines
|
|
83
|
+
return queries.map(({ rule, addedLineNumbers }) => executeQuery(root, rule, addedLineNumbers, lines));
|
|
83
84
|
}
|
|
84
85
|
catch (err) {
|
|
85
|
-
|
|
86
|
-
return queries.map(() => []);
|
|
86
|
+
rethrowAsParseError('ast-grep batch parse failed', err, AST_GREP_HINT);
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
//# sourceMappingURL=ast-grep-query.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast-grep-query.js","sourceRoot":"","sources":["../src/ast-grep-query.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"ast-grep-query.js","sourceRoot":"","sources":["../src/ast-grep-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-grep-query.test.d.ts","sourceRoot":"","sources":["../src/ast-grep-query.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { matchAstGrepPattern, matchAstGrepPatternsBatch } from './ast-grep-query.js';
|
|
3
|
+
import { TotemParseError } from './errors.js';
|
|
4
|
+
// ─── matchAstGrepPattern ─────────────────────────────
|
|
5
|
+
describe('matchAstGrepPattern', () => {
|
|
6
|
+
it('matches a valid pattern against code', () => {
|
|
7
|
+
const content = 'const x = 1;\nconsole.log(x);\nconst y = 2;\n';
|
|
8
|
+
const matches = matchAstGrepPattern(content, '.ts', 'console.log($$$)', [2]);
|
|
9
|
+
expect(matches).toHaveLength(1);
|
|
10
|
+
expect(matches[0].lineNumber).toBe(2);
|
|
11
|
+
});
|
|
12
|
+
it('returns empty array for unsupported extensions', () => {
|
|
13
|
+
const matches = matchAstGrepPattern('x = 1', '.py', '$X = 1', [1]);
|
|
14
|
+
expect(matches).toEqual([]);
|
|
15
|
+
});
|
|
16
|
+
it('returns empty array when no added lines overlap', () => {
|
|
17
|
+
const content = 'console.log(1);\nconst x = 1;\n';
|
|
18
|
+
const matches = matchAstGrepPattern(content, '.ts', 'console.log($$$)', [2]);
|
|
19
|
+
expect(matches).toEqual([]);
|
|
20
|
+
});
|
|
21
|
+
it('throws TotemParseError on query engine failure instead of returning empty array (fail-closed)', () => {
|
|
22
|
+
const invalidRule = { rule: { kind: '!!!INVALID_NODE_KIND!!!' } };
|
|
23
|
+
const content = 'const x = 1;\n';
|
|
24
|
+
expect(() => matchAstGrepPattern(content, '.ts', invalidRule, [1])).toThrow(TotemParseError);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
// ─── matchAstGrepPatternsBatch ───────────────────────
|
|
28
|
+
describe('matchAstGrepPatternsBatch', () => {
|
|
29
|
+
it('returns results for multiple patterns in one parse', () => {
|
|
30
|
+
const content = 'console.log(1);\ndebugger;\nconst x = 1;\n';
|
|
31
|
+
const results = matchAstGrepPatternsBatch(content, '.ts', [
|
|
32
|
+
{ rule: 'console.log($$$)', addedLineNumbers: [1] },
|
|
33
|
+
{ rule: 'debugger', addedLineNumbers: [2] },
|
|
34
|
+
]);
|
|
35
|
+
expect(results).toHaveLength(2);
|
|
36
|
+
expect(results[0]).toHaveLength(1);
|
|
37
|
+
expect(results[1]).toHaveLength(1);
|
|
38
|
+
});
|
|
39
|
+
it('returns empty array for unsupported extensions', () => {
|
|
40
|
+
const results = matchAstGrepPatternsBatch('x = 1', '.py', [
|
|
41
|
+
{ rule: '$X = 1', addedLineNumbers: [1] },
|
|
42
|
+
]);
|
|
43
|
+
expect(results).toEqual([[]]);
|
|
44
|
+
});
|
|
45
|
+
it('throws TotemParseError on batch failure instead of returning empty arrays (fail-closed)', () => {
|
|
46
|
+
const invalidRule = { rule: { kind: '!!!INVALID_NODE_KIND!!!' } };
|
|
47
|
+
const content = 'const x = 1;\n';
|
|
48
|
+
expect(() => matchAstGrepPatternsBatch(content, '.ts', [
|
|
49
|
+
{ rule: invalidRule, addedLineNumbers: [1] },
|
|
50
|
+
])).toThrow(TotemParseError);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=ast-grep-query.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-grep-query.test.js","sourceRoot":"","sources":["../src/ast-grep-query.test.ts"],"names":[],"mappings":"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"}
|
package/dist/ast-query.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export interface AstMatch {
|
|
|
6
6
|
* Convenience wrapper: read + parse + query in one call.
|
|
7
7
|
* For batch operations, use `matchAstQueriesBatch` instead.
|
|
8
8
|
*/
|
|
9
|
-
export declare function matchAstQuery(filePath: string, astQuery: string, addedLineNumbers: number[], cwd: string
|
|
9
|
+
export declare function matchAstQuery(filePath: string, astQuery: string, addedLineNumbers: number[], cwd: string): Promise<AstMatch[]>;
|
|
10
10
|
/**
|
|
11
11
|
* Parse a file once and run multiple AST queries against it efficiently.
|
|
12
12
|
* O(M + N) instead of O(M * N) — file is read and parsed exactly once.
|
|
@@ -14,5 +14,5 @@ export declare function matchAstQuery(filePath: string, astQuery: string, addedL
|
|
|
14
14
|
export declare function matchAstQueriesBatch(filePath: string, queries: Array<{
|
|
15
15
|
astQuery: string;
|
|
16
16
|
addedLineNumbers: number[];
|
|
17
|
-
}>, cwd: string
|
|
17
|
+
}>, cwd: string): Promise<Map<string, AstMatch[]>>;
|
|
18
18
|
//# sourceMappingURL=ast-query.d.ts.map
|
package/dist/ast-query.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast-query.d.ts","sourceRoot":"","sources":["../src/ast-query.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ast-query.d.ts","sourceRoot":"","sources":["../src/ast-query.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAkGD;;;GAGG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,EAAE,EAC1B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,QAAQ,EAAE,CAAC,CA0CrB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,EAChE,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CA6DlC"}
|
package/dist/ast-query.js
CHANGED
|
@@ -3,7 +3,10 @@ import * as fs from 'node:fs/promises';
|
|
|
3
3
|
import * as path from 'node:path';
|
|
4
4
|
import { promisify } from 'node:util';
|
|
5
5
|
import { ensureInit, extensionToLanguage, loadGrammar } from './ast-classifier.js';
|
|
6
|
+
import { rethrowAsParseError } from './errors.js';
|
|
6
7
|
const execFileAsync = promisify(execFile);
|
|
8
|
+
// ─── Constants ──────────────────────────────────────
|
|
9
|
+
const TREE_SITTER_HINT = 'Check the S-expression query syntax. If valid, the source file may contain syntax that crashes tree-sitter.';
|
|
7
10
|
// ─── File reading ───────────────────────────────────
|
|
8
11
|
/**
|
|
9
12
|
* Read file content — try `git show :path` first (staged content), fall back to disk.
|
|
@@ -34,7 +37,7 @@ async function readFileContent(filePath, cwd) {
|
|
|
34
37
|
* Run a single S-expression query against a parsed tree.
|
|
35
38
|
* Returns matches that overlap with added line numbers.
|
|
36
39
|
*/
|
|
37
|
-
function runQuery(QueryClass, grammar, rootNode, lines, astQuery, addedLineNumbers
|
|
40
|
+
function runQuery(QueryClass, grammar, rootNode, lines, astQuery, addedLineNumbers) {
|
|
38
41
|
let query = null;
|
|
39
42
|
try {
|
|
40
43
|
query = new QueryClass(grammar, astQuery);
|
|
@@ -69,8 +72,8 @@ function runQuery(QueryClass, grammar, rootNode, lines, astQuery, addedLineNumbe
|
|
|
69
72
|
return results;
|
|
70
73
|
}
|
|
71
74
|
catch (err) {
|
|
72
|
-
|
|
73
|
-
return
|
|
75
|
+
/* c8 ignore next – rethrowAsParseError always throws; return satisfies TS2366 */
|
|
76
|
+
return rethrowAsParseError('AST query failed', err, TREE_SITTER_HINT);
|
|
74
77
|
}
|
|
75
78
|
finally {
|
|
76
79
|
query?.delete();
|
|
@@ -81,7 +84,7 @@ function runQuery(QueryClass, grammar, rootNode, lines, astQuery, addedLineNumbe
|
|
|
81
84
|
* Convenience wrapper: read + parse + query in one call.
|
|
82
85
|
* For batch operations, use `matchAstQueriesBatch` instead.
|
|
83
86
|
*/
|
|
84
|
-
export async function matchAstQuery(filePath, astQuery, addedLineNumbers, cwd
|
|
87
|
+
export async function matchAstQuery(filePath, astQuery, addedLineNumbers, cwd) {
|
|
85
88
|
if (addedLineNumbers.length === 0)
|
|
86
89
|
return [];
|
|
87
90
|
const ext = path.extname(filePath);
|
|
@@ -104,7 +107,7 @@ export async function matchAstQuery(filePath, astQuery, addedLineNumbers, cwd, o
|
|
|
104
107
|
if (!tree)
|
|
105
108
|
return [];
|
|
106
109
|
try {
|
|
107
|
-
return runQuery(QueryClass, grammar, tree.rootNode, content.split('\n'), astQuery, new Set(addedLineNumbers)
|
|
110
|
+
return runQuery(QueryClass, grammar, tree.rootNode, content.split('\n'), astQuery, new Set(addedLineNumbers));
|
|
108
111
|
}
|
|
109
112
|
finally {
|
|
110
113
|
tree.delete();
|
|
@@ -115,15 +118,14 @@ export async function matchAstQuery(filePath, astQuery, addedLineNumbers, cwd, o
|
|
|
115
118
|
}
|
|
116
119
|
}
|
|
117
120
|
catch (err) {
|
|
118
|
-
|
|
119
|
-
return [];
|
|
121
|
+
rethrowAsParseError('AST parse failed', err, TREE_SITTER_HINT);
|
|
120
122
|
}
|
|
121
123
|
}
|
|
122
124
|
/**
|
|
123
125
|
* Parse a file once and run multiple AST queries against it efficiently.
|
|
124
126
|
* O(M + N) instead of O(M * N) — file is read and parsed exactly once.
|
|
125
127
|
*/
|
|
126
|
-
export async function matchAstQueriesBatch(filePath, queries, cwd
|
|
128
|
+
export async function matchAstQueriesBatch(filePath, queries, cwd) {
|
|
127
129
|
const results = new Map();
|
|
128
130
|
if (queries.length === 0)
|
|
129
131
|
return results;
|
|
@@ -158,7 +160,7 @@ export async function matchAstQueriesBatch(filePath, queries, cwd, onWarn) {
|
|
|
158
160
|
const lines = content.split('\n');
|
|
159
161
|
try {
|
|
160
162
|
for (const { astQuery, addedLineNumbers } of queries) {
|
|
161
|
-
results.set(astQuery, runQuery(QueryClass, grammar, tree.rootNode, lines, astQuery, new Set(addedLineNumbers)
|
|
163
|
+
results.set(astQuery, runQuery(QueryClass, grammar, tree.rootNode, lines, astQuery, new Set(addedLineNumbers)));
|
|
162
164
|
}
|
|
163
165
|
}
|
|
164
166
|
finally {
|
|
@@ -170,9 +172,7 @@ export async function matchAstQueriesBatch(filePath, queries, cwd, onWarn) {
|
|
|
170
172
|
}
|
|
171
173
|
}
|
|
172
174
|
catch (err) {
|
|
173
|
-
|
|
174
|
-
for (const q of queries)
|
|
175
|
-
results.set(q.astQuery, []);
|
|
175
|
+
rethrowAsParseError('AST batch parse failed', err, TREE_SITTER_HINT);
|
|
176
176
|
}
|
|
177
177
|
return results;
|
|
178
178
|
}
|
package/dist/ast-query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast-query.js","sourceRoot":"","sources":["../src/ast-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"ast-query.js","sourceRoot":"","sources":["../src/ast-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAS1C,uDAAuD;AAEvD,MAAM,gBAAgB,GACpB,6GAA6G,CAAC;AAEhH,uDAAuD;AAEvD;;;GAGG;AACH,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,GAAW;IAC1D,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC,EAAE;YACtE,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,kBAAkB;SAChD,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC7C,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,uDAAuD;AAEvD;;;GAGG;AACH,SAAS,QAAQ,CACf,UAGoC,EACpC,OAA2C,EAC3C,QAAwC,EACxC,KAAe,EACf,QAAgB,EAChB,gBAA6B;IAE7B,IAAI,KAAK,GAA2C,IAAI,CAAC;IACzD,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,OAAO,GAAe,EAAE,CAAC;QAE/B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,wDAAwD;YACxD,IAAI,UAAU,GAA0C,IAAI,CAAC;YAE7D,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACrC,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBACjC,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;oBAC1B,MAAM;gBACR,CAAC;YACH,CAAC;YAED,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7C,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;YACvC,CAAC;YAED,IAAI,CAAC,UAAU;gBAAE,SAAS;YAE1B,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC;YAE/C,KAAK,IAAI,OAAO,GAAG,SAAS,EAAE,OAAO,IAAI,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;gBAC5D,IAAI,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBAClC,OAAO,CAAC,IAAI,CAAC;wBACX,UAAU,EAAE,OAAO;wBACnB,QAAQ,EAAE,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE;qBACnC,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,iFAAiF;QACjF,OAAO,mBAAmB,CAAC,kBAAkB,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;IACxE,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,MAAM,EAAE,CAAC;IAClB,CAAC;AACH,CAAC;AAED,uDAAuD;AAEvD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAgB,EAChB,QAAgB,EAChB,gBAA0B,EAC1B,GAAW;IAEX,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,IAAI,GAAkC,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACrE,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAErB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACrD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,IAAI,CAAC;QACH,MAAM,UAAU,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QAExC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC;QACpE,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;QAEjE,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,CAAC;YAErB,IAAI,CAAC;gBACH,OAAO,QAAQ,CACb,UAAU,EACV,OAAO,EACP,IAAI,CAAC,QAAQ,EACb,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EACnB,QAAQ,EACR,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAC1B,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,mBAAmB,CAAC,kBAAkB,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,QAAgB,EAChB,OAAgE,EAChE,GAAW;IAEX,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC9C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAEzC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,IAAI,GAAkC,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACrE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACrD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACrD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACrD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QAExC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC;QACpE,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;QAEjE,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,KAAK,MAAM,CAAC,IAAI,OAAO;oBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACrD,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAElC,IAAI,CAAC;gBACH,KAAK,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,OAAO,EAAE,CAAC;oBACrD,OAAO,CAAC,GAAG,CACT,QAAQ,EACR,QAAQ,CACN,UAAU,EACV,OAAO,EACP,IAAI,CAAC,QAAQ,EACb,KAAK,EACL,QAAQ,EACR,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAC1B,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,mBAAmB,CAAC,wBAAwB,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/ast-query.test.js
CHANGED
|
@@ -3,6 +3,7 @@ import * as os from 'node:os';
|
|
|
3
3
|
import * as path from 'node:path';
|
|
4
4
|
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
5
|
import { matchAstQuery } from './ast-query.js';
|
|
6
|
+
import { TotemParseError } from './errors.js';
|
|
6
7
|
// ─── Helpers ────────────────────────────────────────
|
|
7
8
|
let tmpDir;
|
|
8
9
|
beforeEach(() => {
|
|
@@ -36,10 +37,9 @@ describe('matchAstQuery', () => {
|
|
|
36
37
|
expect(matches).toHaveLength(1);
|
|
37
38
|
expect(matches[0].lineNumber).toBe(3);
|
|
38
39
|
});
|
|
39
|
-
it('
|
|
40
|
+
it('throws TotemParseError on invalid S-expression instead of returning empty array (fail-closed)', async () => {
|
|
40
41
|
const file = writeFile('src/safe.ts', 'const x = 1;\n');
|
|
41
|
-
|
|
42
|
-
expect(matches).toEqual([]);
|
|
42
|
+
await expect(matchAstQuery(file, '(this is not valid!!!', [1], tmpDir)).rejects.toThrow(TotemParseError);
|
|
43
43
|
});
|
|
44
44
|
it('returns empty array for non-JS/TS files', async () => {
|
|
45
45
|
const file = writeFile('config.py', 'import os\nprint("hello")\n');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast-query.test.js","sourceRoot":"","sources":["../src/ast-query.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"ast-query.test.js","sourceRoot":"","sources":["../src/ast-query.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const CompileManifestSchema: z.ZodObject<{
|
|
3
|
+
compiled_at: z.ZodString;
|
|
4
|
+
model: z.ZodString;
|
|
5
|
+
input_hash: z.ZodString;
|
|
6
|
+
output_hash: z.ZodString;
|
|
7
|
+
rule_count: z.ZodNumber;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
compiled_at: string;
|
|
10
|
+
model: string;
|
|
11
|
+
input_hash: string;
|
|
12
|
+
output_hash: string;
|
|
13
|
+
rule_count: number;
|
|
14
|
+
}, {
|
|
15
|
+
compiled_at: string;
|
|
16
|
+
model: string;
|
|
17
|
+
input_hash: string;
|
|
18
|
+
output_hash: string;
|
|
19
|
+
rule_count: number;
|
|
20
|
+
}>;
|
|
21
|
+
export type CompileManifest = z.infer<typeof CompileManifestSchema>;
|
|
22
|
+
/**
|
|
23
|
+
* Generate a deterministic SHA-256 hash of all `.md` lesson files in a directory.
|
|
24
|
+
*
|
|
25
|
+
* Files are discovered recursively, sorted alphabetically by relative path,
|
|
26
|
+
* and line endings are normalized to `\n` before hashing.
|
|
27
|
+
*/
|
|
28
|
+
export declare function generateInputHash(lessonsDir: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Generate a deterministic SHA-256 hash of the compiled rules file.
|
|
31
|
+
*
|
|
32
|
+
* Line endings are normalized to `\n` before hashing.
|
|
33
|
+
*/
|
|
34
|
+
export declare function generateOutputHash(rulesPath: string): string;
|
|
35
|
+
/**
|
|
36
|
+
* Write a compile manifest to disk as pretty-printed JSON.
|
|
37
|
+
*/
|
|
38
|
+
export declare function writeCompileManifest(manifestPath: string, manifest: CompileManifest): void;
|
|
39
|
+
/**
|
|
40
|
+
* Read and validate a compile manifest from disk.
|
|
41
|
+
*
|
|
42
|
+
* @throws {TotemParseError} if the file is missing or contains invalid JSON/schema.
|
|
43
|
+
*/
|
|
44
|
+
export declare function readCompileManifest(manifestPath: string): CompileManifest;
|
|
45
|
+
//# sourceMappingURL=compile-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-manifest.d.ts","sourceRoot":"","sources":["../src/compile-manifest.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;EAMhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AA8BpE;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAmB5D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAiB5D;AAMD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI,CAU1F;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,eAAe,CAoCzE"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import * as crypto from 'node:crypto';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { getErrorMessage, TotemParseError } from './errors.js';
|
|
6
|
+
// ─── Schema ──────────────────────────────────────────
|
|
7
|
+
export const CompileManifestSchema = z.object({
|
|
8
|
+
compiled_at: z.string(),
|
|
9
|
+
model: z.string(),
|
|
10
|
+
input_hash: z.string(),
|
|
11
|
+
output_hash: z.string(),
|
|
12
|
+
rule_count: z.number().int().nonnegative(),
|
|
13
|
+
});
|
|
14
|
+
// ─── Hashing ─────────────────────────────────────────
|
|
15
|
+
/**
|
|
16
|
+
* Walk a directory recursively and collect all `.md` file paths
|
|
17
|
+
* relative to `baseDir`, sorted alphabetically.
|
|
18
|
+
*/
|
|
19
|
+
function collectMdFiles(baseDir, currentDir = baseDir) {
|
|
20
|
+
if (!fs.existsSync(baseDir)) {
|
|
21
|
+
throw new TotemParseError(`Lessons directory not found: ${baseDir}`, 'Run "totem sync" or create .totem/lessons/ with lesson files.');
|
|
22
|
+
}
|
|
23
|
+
const entries = fs.readdirSync(currentDir, { withFileTypes: true });
|
|
24
|
+
const results = [];
|
|
25
|
+
for (const entry of entries) {
|
|
26
|
+
const fullPath = path.join(currentDir, entry.name);
|
|
27
|
+
if (entry.isDirectory()) {
|
|
28
|
+
results.push(...collectMdFiles(baseDir, fullPath));
|
|
29
|
+
}
|
|
30
|
+
else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
31
|
+
results.push(path.relative(baseDir, fullPath).replace(/\\/g, '/'));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return results;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Generate a deterministic SHA-256 hash of all `.md` lesson files in a directory.
|
|
38
|
+
*
|
|
39
|
+
* Files are discovered recursively, sorted alphabetically by relative path,
|
|
40
|
+
* and line endings are normalized to `\n` before hashing.
|
|
41
|
+
*/
|
|
42
|
+
export function generateInputHash(lessonsDir) {
|
|
43
|
+
const files = collectMdFiles(lessonsDir).sort();
|
|
44
|
+
const hash = crypto.createHash('sha256');
|
|
45
|
+
for (const relPath of files) {
|
|
46
|
+
try {
|
|
47
|
+
const content = fs
|
|
48
|
+
.readFileSync(path.join(lessonsDir, relPath), 'utf-8')
|
|
49
|
+
.replace(/\r\n/g, '\n');
|
|
50
|
+
hash.update(`${relPath}\n${content}\n`);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
throw new TotemParseError(`Cannot read lesson file ${relPath}: ${getErrorMessage(err)}`, 'Ensure all lesson files in .totem/lessons/ are readable.');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return hash.digest('hex');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Generate a deterministic SHA-256 hash of the compiled rules file.
|
|
60
|
+
*
|
|
61
|
+
* Line endings are normalized to `\n` before hashing.
|
|
62
|
+
*/
|
|
63
|
+
export function generateOutputHash(rulesPath) {
|
|
64
|
+
try {
|
|
65
|
+
const content = fs.readFileSync(rulesPath, 'utf-8').replace(/\r\n/g, '\n');
|
|
66
|
+
return crypto.createHash('sha256').update(content).digest('hex');
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
const code = err.code;
|
|
70
|
+
if (code === 'ENOENT') {
|
|
71
|
+
throw new TotemParseError(`Cannot hash compiled rules: ${rulesPath} not found`, 'Run "totem compile" to generate compiled-rules.json.');
|
|
72
|
+
}
|
|
73
|
+
throw new TotemParseError(`Cannot read compiled rules: ${getErrorMessage(err)}`, `Check file permissions for ${rulesPath}.`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// ─── I/O ─────────────────────────────────────────────
|
|
77
|
+
const FILE_MODE = 0o644;
|
|
78
|
+
/**
|
|
79
|
+
* Write a compile manifest to disk as pretty-printed JSON.
|
|
80
|
+
*/
|
|
81
|
+
export function writeCompileManifest(manifestPath, manifest) {
|
|
82
|
+
const json = JSON.stringify(manifest, null, 2) + '\n';
|
|
83
|
+
try {
|
|
84
|
+
fs.writeFileSync(manifestPath, json, { encoding: 'utf-8', mode: FILE_MODE });
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
throw new TotemParseError(`Cannot write compile manifest: ${getErrorMessage(err)}`, `Check write permissions for ${manifestPath}.`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Read and validate a compile manifest from disk.
|
|
92
|
+
*
|
|
93
|
+
* @throws {TotemParseError} if the file is missing or contains invalid JSON/schema.
|
|
94
|
+
*/
|
|
95
|
+
export function readCompileManifest(manifestPath) {
|
|
96
|
+
let raw;
|
|
97
|
+
try {
|
|
98
|
+
raw = fs.readFileSync(manifestPath, 'utf-8');
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
if (err.code === 'ENOENT') {
|
|
102
|
+
throw new TotemParseError(`Compile manifest not found: ${manifestPath}`, 'Run "totem compile" to generate the manifest.');
|
|
103
|
+
}
|
|
104
|
+
throw new TotemParseError(`Cannot read compile manifest: ${getErrorMessage(err)}`, `Check file permissions for ${manifestPath}.`);
|
|
105
|
+
}
|
|
106
|
+
let parsed;
|
|
107
|
+
try {
|
|
108
|
+
parsed = JSON.parse(raw);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
throw new TotemParseError(`Invalid JSON in compile manifest: ${manifestPath} (${getErrorMessage(err)})`, 'The manifest file is corrupted. Re-run "totem compile".');
|
|
112
|
+
}
|
|
113
|
+
const result = CompileManifestSchema.safeParse(parsed);
|
|
114
|
+
if (!result.success) {
|
|
115
|
+
throw new TotemParseError(`Invalid compile manifest schema: ${result.error.message}`, 'The manifest file has an unexpected structure. Re-run "totem compile".');
|
|
116
|
+
}
|
|
117
|
+
return result.data;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=compile-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-manifest.js","sourceRoot":"","sources":["../src/compile-manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-manifest.test.d.ts","sourceRoot":"","sources":["../src/compile-manifest.test.ts"],"names":[],"mappings":""}
|