@cesarandreslopez/occ 0.9.3 → 0.11.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 +35 -6
- package/dist/src/cli.d.ts +16 -0
- package/dist/src/cli.js +46 -4
- package/dist/src/cli.js.map +1 -1
- package/dist/src/code/build.d.ts +22 -0
- package/dist/src/code/build.js +47 -13
- package/dist/src/code/build.js.map +1 -1
- package/dist/src/code/cache.js +30 -1
- package/dist/src/code/cache.js.map +1 -1
- package/dist/src/code/check.d.ts +39 -0
- package/dist/src/code/check.js +282 -0
- package/dist/src/code/check.js.map +1 -0
- package/dist/src/code/command.js +156 -64
- package/dist/src/code/command.js.map +1 -1
- package/dist/src/code/context.d.ts +54 -0
- package/dist/src/code/context.js +67 -0
- package/dist/src/code/context.js.map +1 -0
- package/dist/src/code/diff.d.ts +12 -2
- package/dist/src/code/diff.js +15 -3
- package/dist/src/code/diff.js.map +1 -1
- package/dist/src/code/discover.d.ts +2 -2
- package/dist/src/code/discover.js +8 -10
- package/dist/src/code/discover.js.map +1 -1
- package/dist/src/code/focus.js +34 -26
- package/dist/src/code/focus.js.map +1 -1
- package/dist/src/code/incremental.js +1 -1
- package/dist/src/code/incremental.js.map +1 -1
- package/dist/src/code/index-io.js +10 -2
- package/dist/src/code/index-io.js.map +1 -1
- package/dist/src/code/isolated-chunk-runner.js +17 -2
- package/dist/src/code/isolated-chunk-runner.js.map +1 -1
- package/dist/src/code/isolated-runner.js +17 -3
- package/dist/src/code/isolated-runner.js.map +1 -1
- package/dist/src/code/isolated.js +32 -6
- package/dist/src/code/isolated.js.map +1 -1
- package/dist/src/code/languages.d.ts +13 -0
- package/dist/src/code/languages.js +138 -5
- package/dist/src/code/languages.js.map +1 -1
- package/dist/src/code/map.d.ts +56 -0
- package/dist/src/code/map.js +161 -12
- package/dist/src/code/map.js.map +1 -1
- package/dist/src/code/parsers.js +367 -26
- package/dist/src/code/parsers.js.map +1 -1
- package/dist/src/code/preview.js +24 -22
- package/dist/src/code/preview.js.map +1 -1
- package/dist/src/code/query.js +0 -0
- package/dist/src/code/query.js.map +1 -1
- package/dist/src/code/search.d.ts +39 -0
- package/dist/src/code/search.js +154 -0
- package/dist/src/code/search.js.map +1 -0
- package/dist/src/code/session.d.ts +8 -2
- package/dist/src/code/session.js +16 -4
- package/dist/src/code/session.js.map +1 -1
- package/dist/src/code/slim.d.ts +2 -0
- package/dist/src/code/slim.js +16 -1
- package/dist/src/code/slim.js.map +1 -1
- package/dist/src/code/source.d.ts +44 -0
- package/dist/src/code/source.js +102 -0
- package/dist/src/code/source.js.map +1 -0
- package/dist/src/code/store.d.ts +23 -0
- package/dist/src/code/store.js +61 -6
- package/dist/src/code/store.js.map +1 -1
- package/dist/src/code/tree-sitter.d.ts +21 -0
- package/dist/src/code/tree-sitter.js +128 -0
- package/dist/src/code/tree-sitter.js.map +1 -0
- package/dist/src/code/types.d.ts +3 -0
- package/dist/src/code/types.js +2 -0
- package/dist/src/code/types.js.map +1 -1
- package/dist/src/doc/batch.d.ts +2 -0
- package/dist/src/doc/batch.js +3 -1
- package/dist/src/doc/batch.js.map +1 -1
- package/dist/src/doc/discover.js +2 -2
- package/dist/src/doc/discover.js.map +1 -1
- package/dist/src/doc/inspect-odt.js +3 -1
- package/dist/src/doc/inspect-odt.js.map +1 -1
- package/dist/src/doc/inspect-pdf.d.ts +6 -0
- package/dist/src/doc/inspect-pdf.js +11 -1
- package/dist/src/doc/inspect-pdf.js.map +1 -1
- package/dist/src/doc/inspect.js +2 -2
- package/dist/src/doc/inspect.js.map +1 -1
- package/dist/src/doc/types.d.ts +1 -0
- package/dist/src/doc/types.js +7 -0
- package/dist/src/doc/types.js.map +1 -1
- package/dist/src/git/api.d.ts +2 -1
- package/dist/src/git/api.js +15 -9
- package/dist/src/git/api.js.map +1 -1
- package/dist/src/git/client.js +5 -1
- package/dist/src/git/client.js.map +1 -1
- package/dist/src/git/output.js +2 -1
- package/dist/src/git/output.js.map +1 -1
- package/dist/src/git/parse.js +131 -2
- package/dist/src/git/parse.js.map +1 -1
- package/dist/src/git/types.d.ts +5 -5
- package/dist/src/health.d.ts +8 -0
- package/dist/src/health.js +12 -0
- package/dist/src/health.js.map +1 -1
- package/dist/src/index.d.ts +20 -6
- package/dist/src/index.js +13 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/inspect/xlsx-cells.js +4 -2
- package/dist/src/inspect/xlsx-cells.js.map +1 -1
- package/dist/src/markdown/convert.d.ts +9 -0
- package/dist/src/markdown/convert.js +23 -1
- package/dist/src/markdown/convert.js.map +1 -1
- package/dist/src/parsers/odf.js +4 -2
- package/dist/src/parsers/odf.js.map +1 -1
- package/dist/src/skills/command.d.ts +6 -0
- package/dist/src/skills/command.js +18 -3
- package/dist/src/skills/command.js.map +1 -1
- package/dist/src/slide/inspect-odp.js +3 -2
- package/dist/src/slide/inspect-odp.js.map +1 -1
- package/dist/src/slide/inspect-pptx.js +4 -3
- package/dist/src/slide/inspect-pptx.js.map +1 -1
- package/dist/src/stats.js +3 -1
- package/dist/src/stats.js.map +1 -1
- package/dist/src/structure/extract.js +16 -3
- package/dist/src/structure/extract.js.map +1 -1
- package/dist/src/utils.d.ts +7 -0
- package/dist/src/utils.js +19 -0
- package/dist/src/utils.js.map +1 -1
- package/dist/src/walker.js +15 -3
- package/dist/src/walker.js.map +1 -1
- package/dist/src/workspace/analyze.d.ts +3 -0
- package/dist/src/workspace/analyze.js +26 -15
- package/dist/src/workspace/analyze.js.map +1 -1
- package/dist/src/workspace/bundle.js +11 -3
- package/dist/src/workspace/bundle.js.map +1 -1
- package/dist/src/workspace/command.d.ts +6 -0
- package/dist/src/workspace/command.js +73 -44
- package/dist/src/workspace/command.js.map +1 -1
- package/dist/src/workspace/describe.js +22 -13
- package/dist/src/workspace/describe.js.map +1 -1
- package/dist/src/workspace/documents.d.ts +3 -0
- package/dist/src/workspace/documents.js +25 -14
- package/dist/src/workspace/documents.js.map +1 -1
- package/dist/src/workspace/prepare.js +3 -1
- package/dist/src/workspace/prepare.js.map +1 -1
- package/package.json +28 -12
- package/skills/occ/SKILL.md +17 -5
- package/skills/occ/reference/code.md +76 -3
- package/skills/occ/reference/commands.md +3 -1
- package/vendor/tree-sitter/c/grammar.wasm +0 -0
- package/vendor/tree-sitter/c/tags.scm +4 -0
- package/vendor/tree-sitter/c-sharp/grammar.wasm +0 -0
- package/vendor/tree-sitter/c-sharp/tags.scm +6 -0
- package/vendor/tree-sitter/cpp/grammar.wasm +0 -0
- package/vendor/tree-sitter/cpp/tags.scm +5 -0
- package/vendor/tree-sitter/go/grammar.wasm +0 -0
- package/vendor/tree-sitter/go/tags.scm +4 -0
- package/vendor/tree-sitter/java/grammar.wasm +0 -0
- package/vendor/tree-sitter/java/tags.scm +7 -0
- package/vendor/tree-sitter/kotlin/grammar.wasm +0 -0
- package/vendor/tree-sitter/kotlin/tags.scm +4 -0
- package/vendor/tree-sitter/php/grammar.wasm +0 -0
- package/vendor/tree-sitter/php/tags.scm +8 -0
- package/vendor/tree-sitter/python/grammar.wasm +0 -0
- package/vendor/tree-sitter/python/tags.scm +3 -0
- package/vendor/tree-sitter/ruby/grammar.wasm +0 -0
- package/vendor/tree-sitter/ruby/tags.scm +5 -0
- package/vendor/tree-sitter/rust/grammar.wasm +0 -0
- package/vendor/tree-sitter/rust/tags.scm +5 -0
- package/vendor/tree-sitter/scala/grammar.wasm +0 -0
- package/vendor/tree-sitter/scala/tags.scm +5 -0
- package/vendor/tree-sitter/swift/grammar.wasm +0 -0
- package/vendor/tree-sitter/swift/tags.scm +4 -0
package/dist/src/code/cache.js
CHANGED
|
@@ -2,6 +2,7 @@ import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
|
2
2
|
import { createHash } from 'node:crypto';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { buildCodebaseIndex } from './build.js';
|
|
5
|
+
import { mapWithConcurrency } from '../utils.js';
|
|
5
6
|
const CACHE_VERSION = '1';
|
|
6
7
|
function hashContent(content) {
|
|
7
8
|
return createHash('sha256').update(content).digest('hex').slice(0, 16);
|
|
@@ -15,12 +16,40 @@ export async function loadIndexCache(cachePath) {
|
|
|
15
16
|
const parsed = JSON.parse(raw);
|
|
16
17
|
if (parsed.cacheVersion !== CACHE_VERSION)
|
|
17
18
|
return undefined;
|
|
18
|
-
return parsed;
|
|
19
|
+
return await rehydrateIndexCache(parsed);
|
|
19
20
|
}
|
|
20
21
|
catch {
|
|
21
22
|
return undefined;
|
|
22
23
|
}
|
|
23
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Full-mode caches strip `content`/`lines` on write, so a chunk-capable index
|
|
27
|
+
* has to re-read the source to restore them. Re-reading also validates
|
|
28
|
+
* freshness: each file's current bytes are hashed against the stored
|
|
29
|
+
* `fileHashes`, and any mismatch (modified or deleted file) invalidates the
|
|
30
|
+
* whole cache so the caller rebuilds. Excerpt/none caches carry no rehydratable
|
|
31
|
+
* content and are returned unchanged.
|
|
32
|
+
*/
|
|
33
|
+
async function rehydrateIndexCache(cached) {
|
|
34
|
+
if (cached.contentMode !== 'full')
|
|
35
|
+
return cached;
|
|
36
|
+
const rehydrated = await mapWithConcurrency(cached.files, 32, async (file) => {
|
|
37
|
+
let content;
|
|
38
|
+
try {
|
|
39
|
+
content = await readFile(file.path, 'utf8');
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null; // Removed since caching — treat the cache as stale.
|
|
43
|
+
}
|
|
44
|
+
const expected = cached.fileHashes[file.relativePath];
|
|
45
|
+
if (expected != null && hashContent(content) !== expected)
|
|
46
|
+
return null; // Changed since caching.
|
|
47
|
+
return { ...file, content, lines: content.split(/\r?\n/) };
|
|
48
|
+
});
|
|
49
|
+
if (rehydrated.includes(null))
|
|
50
|
+
return undefined;
|
|
51
|
+
return { ...cached, files: rehydrated.filter((file) => file !== null) };
|
|
52
|
+
}
|
|
24
53
|
export async function saveIndexCache(index, cachePath) {
|
|
25
54
|
await mkdir(path.dirname(cachePath), { recursive: true });
|
|
26
55
|
// Strip file content from cache to reduce size - content can be re-read
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/code/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAA6B,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/code/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface CheckCodeSyntaxOptions {
|
|
2
|
+
repoRoot: string;
|
|
3
|
+
file: string;
|
|
4
|
+
}
|
|
5
|
+
export interface CodeSyntaxDiagnostic {
|
|
6
|
+
message: string;
|
|
7
|
+
line?: number;
|
|
8
|
+
column?: number;
|
|
9
|
+
code?: string | number;
|
|
10
|
+
source?: string;
|
|
11
|
+
severity: 'error' | 'warning';
|
|
12
|
+
}
|
|
13
|
+
export type CheckCodeSyntaxResult = {
|
|
14
|
+
status: 'checked';
|
|
15
|
+
supported: true;
|
|
16
|
+
valid: boolean;
|
|
17
|
+
path: string;
|
|
18
|
+
relativePath: string;
|
|
19
|
+
language: string;
|
|
20
|
+
diagnostics: CodeSyntaxDiagnostic[];
|
|
21
|
+
} | {
|
|
22
|
+
status: 'unsupported';
|
|
23
|
+
supported: false;
|
|
24
|
+
valid?: undefined;
|
|
25
|
+
path: string;
|
|
26
|
+
relativePath: string;
|
|
27
|
+
language: string;
|
|
28
|
+
diagnostics: [];
|
|
29
|
+
} | {
|
|
30
|
+
status: 'error';
|
|
31
|
+
supported: false;
|
|
32
|
+
valid: false;
|
|
33
|
+
path?: string;
|
|
34
|
+
relativePath?: string;
|
|
35
|
+
language?: string;
|
|
36
|
+
diagnostics: CodeSyntaxDiagnostic[];
|
|
37
|
+
message: string;
|
|
38
|
+
};
|
|
39
|
+
export declare function checkCodeSyntax(options: CheckCodeSyntaxOptions): Promise<CheckCodeSyntaxResult>;
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { readFile } from 'node:fs/promises';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { promisify } from 'node:util';
|
|
6
|
+
import { getLanguageSpec } from './languages.js';
|
|
7
|
+
import { collectTreeSitterErrorNodes, parseTreeSitterContent } from './tree-sitter.js';
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
9
|
+
let typescriptModulePromise;
|
|
10
|
+
function loadTypescript() {
|
|
11
|
+
typescriptModulePromise ??= import('typescript');
|
|
12
|
+
return typescriptModulePromise;
|
|
13
|
+
}
|
|
14
|
+
function resolveWithinRepo(repoRoot, file) {
|
|
15
|
+
const root = path.resolve(repoRoot);
|
|
16
|
+
const resolved = path.isAbsolute(file) ? path.resolve(file) : path.resolve(root, file);
|
|
17
|
+
const relativePath = path.relative(root, resolved);
|
|
18
|
+
if (relativePath === '' || relativePath.startsWith('..') || path.isAbsolute(relativePath)) {
|
|
19
|
+
return `Resolved path "${file}" is outside repo root "${root}".`;
|
|
20
|
+
}
|
|
21
|
+
return { path: resolved, relativePath: relativePath.split(path.sep).join('/') };
|
|
22
|
+
}
|
|
23
|
+
function stripBom(text) {
|
|
24
|
+
return text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;
|
|
25
|
+
}
|
|
26
|
+
function languageForExtension(filePath) {
|
|
27
|
+
const extension = path.extname(filePath).toLowerCase();
|
|
28
|
+
switch (extension) {
|
|
29
|
+
case '.ts':
|
|
30
|
+
case '.tsx':
|
|
31
|
+
return 'typescript';
|
|
32
|
+
case '.js':
|
|
33
|
+
case '.jsx':
|
|
34
|
+
case '.mjs':
|
|
35
|
+
case '.cjs':
|
|
36
|
+
return 'javascript';
|
|
37
|
+
case '.vue':
|
|
38
|
+
return 'vue';
|
|
39
|
+
case '.py':
|
|
40
|
+
return 'python';
|
|
41
|
+
default:
|
|
42
|
+
return extension.replace(/^\./, '') || 'unknown';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function diagnosticFromError(error, source) {
|
|
46
|
+
const maybeError = error instanceof Error ? error : new Error(String(error));
|
|
47
|
+
const loc = error;
|
|
48
|
+
const start = loc.loc?.start ?? loc.loc;
|
|
49
|
+
const line = typeof start?.line === 'number' ? start.line : undefined;
|
|
50
|
+
const column = typeof start?.column === 'number' ? start.column + 1 : undefined;
|
|
51
|
+
return {
|
|
52
|
+
message: maybeError.message,
|
|
53
|
+
line,
|
|
54
|
+
column,
|
|
55
|
+
source,
|
|
56
|
+
severity: 'error',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async function checkTypeScriptLike(filePath, content, language) {
|
|
60
|
+
const ts = await loadTypescript();
|
|
61
|
+
const extension = path.extname(filePath).toLowerCase();
|
|
62
|
+
const scriptKind = extension === '.tsx'
|
|
63
|
+
? ts.ScriptKind.TSX
|
|
64
|
+
: extension === '.jsx'
|
|
65
|
+
? ts.ScriptKind.JSX
|
|
66
|
+
: language === 'javascript'
|
|
67
|
+
? ts.ScriptKind.JS
|
|
68
|
+
: ts.ScriptKind.TS;
|
|
69
|
+
const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true, scriptKind);
|
|
70
|
+
const parseDiagnostics = sourceFile.parseDiagnostics;
|
|
71
|
+
return parseDiagnostics.map((diagnostic) => {
|
|
72
|
+
const position = diagnostic.start == null ? undefined : sourceFile.getLineAndCharacterOfPosition(diagnostic.start);
|
|
73
|
+
return {
|
|
74
|
+
message: ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n'),
|
|
75
|
+
line: position ? position.line + 1 : undefined,
|
|
76
|
+
column: position ? position.character + 1 : undefined,
|
|
77
|
+
code: diagnostic.code,
|
|
78
|
+
source: 'typescript',
|
|
79
|
+
severity: 'error',
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
async function checkVue(filePath, content) {
|
|
84
|
+
const compiler = await import('@vue/compiler-sfc');
|
|
85
|
+
const parsed = compiler.parse(content, { filename: filePath });
|
|
86
|
+
const diagnostics = parsed.errors.map(error => diagnosticFromError(error, 'vue'));
|
|
87
|
+
if (diagnostics.length > 0)
|
|
88
|
+
return diagnostics;
|
|
89
|
+
if (!parsed.descriptor.script && !parsed.descriptor.scriptSetup)
|
|
90
|
+
return diagnostics;
|
|
91
|
+
try {
|
|
92
|
+
const compiled = compiler.compileScript(parsed.descriptor, { id: 'occ-check' });
|
|
93
|
+
diagnostics.push(...(await checkTypeScriptLike(filePath, compiled.content, 'typescript')));
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
diagnostics.push(diagnosticFromError(error, 'vue'));
|
|
97
|
+
}
|
|
98
|
+
return diagnostics;
|
|
99
|
+
}
|
|
100
|
+
function isMissingExecutable(error) {
|
|
101
|
+
return error instanceof Error && 'code' in error && error.code === 'ENOENT';
|
|
102
|
+
}
|
|
103
|
+
function pythonDiagnostic(stderr) {
|
|
104
|
+
const encodingMatch = stderr.match(/OCC_ENCODING_ERROR:([\s\S]*)/);
|
|
105
|
+
if (encodingMatch) {
|
|
106
|
+
const detail = encodingMatch[1].trim();
|
|
107
|
+
return {
|
|
108
|
+
message: `Unsupported source encoding: ${detail || 'file is not valid UTF-8 and declares no encoding cookie'}`,
|
|
109
|
+
code: 'unsupported-encoding',
|
|
110
|
+
source: 'python',
|
|
111
|
+
severity: 'error',
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const syntaxMatch = stderr.match(/OCC_SYNTAX_ERROR:(\d*):(\d*):([\s\S]*)/);
|
|
115
|
+
if (syntaxMatch) {
|
|
116
|
+
const line = syntaxMatch[1] ? Number(syntaxMatch[1]) : undefined;
|
|
117
|
+
const column = syntaxMatch[2] ? Number(syntaxMatch[2]) : undefined;
|
|
118
|
+
return {
|
|
119
|
+
message: syntaxMatch[3].trim() || 'Python syntax error',
|
|
120
|
+
line,
|
|
121
|
+
column,
|
|
122
|
+
source: 'python',
|
|
123
|
+
severity: 'error',
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
// Fallback for unexpected failure modes: anchor the line to a SyntaxError frame
|
|
127
|
+
// so the harness's own `File "<string>", line N` frame is never reported.
|
|
128
|
+
const lineMatch = stderr.match(/SyntaxError[\s\S]*?\bline (\d+)/) ?? stderr.match(/^\s*File .*, line (\d+)/m);
|
|
129
|
+
const message = stderr
|
|
130
|
+
.split(/\r?\n/)
|
|
131
|
+
.map(line => line.trim())
|
|
132
|
+
.filter(Boolean)
|
|
133
|
+
.at(-1);
|
|
134
|
+
return {
|
|
135
|
+
message: message ?? (stderr.trim() || 'Python syntax error'),
|
|
136
|
+
line: lineMatch ? Number(lineMatch[1]) : undefined,
|
|
137
|
+
source: 'python',
|
|
138
|
+
severity: 'error',
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
async function checkPython(filePath) {
|
|
142
|
+
// Read via tokenize.open so the PEP 263 encoding cookie and a leading BOM are
|
|
143
|
+
// honored, then parse the decoded text. Encoding and syntax failures are
|
|
144
|
+
// reported through distinct markers so a non-UTF-8 file is not mistaken for a
|
|
145
|
+
// syntax error with a fabricated line number.
|
|
146
|
+
const script = [
|
|
147
|
+
'import ast, sys, tokenize',
|
|
148
|
+
'path = sys.argv[1]',
|
|
149
|
+
'try:',
|
|
150
|
+
' with tokenize.open(path) as handle:',
|
|
151
|
+
' source = handle.read()',
|
|
152
|
+
'except (SyntaxError, ValueError, LookupError, UnicodeDecodeError) as exc:',
|
|
153
|
+
" sys.stderr.write('OCC_ENCODING_ERROR:' + str(exc))",
|
|
154
|
+
' sys.exit(1)',
|
|
155
|
+
'try:',
|
|
156
|
+
' ast.parse(source, filename=path)',
|
|
157
|
+
'except SyntaxError as exc:',
|
|
158
|
+
" sys.stderr.write('OCC_SYNTAX_ERROR:%s:%s:%s' % (exc.lineno or '', exc.offset or '', exc.msg or ''))",
|
|
159
|
+
' sys.exit(1)',
|
|
160
|
+
].join('\n');
|
|
161
|
+
try {
|
|
162
|
+
await execFileAsync('python3', ['-c', script, filePath], { timeout: 5_000, maxBuffer: 1_000_000 });
|
|
163
|
+
return [];
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
if (isMissingExecutable(error))
|
|
167
|
+
return 'unsupported';
|
|
168
|
+
const execError = error;
|
|
169
|
+
const stderr = typeof execError.stderr === 'string' ? execError.stderr : String(execError.stderr ?? '');
|
|
170
|
+
return [pythonDiagnostic(stderr)];
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async function checkTreeSitter(grammar, content) {
|
|
174
|
+
const tree = await parseTreeSitterContent(grammar, content);
|
|
175
|
+
if (!tree)
|
|
176
|
+
return 'unsupported';
|
|
177
|
+
// Free the WASM tree handle once the error nodes are copied into plain diagnostics.
|
|
178
|
+
try {
|
|
179
|
+
return collectTreeSitterErrorNodes(tree.rootNode).map(error => ({
|
|
180
|
+
message: error.type === 'ERROR' ? 'Syntax error' : `Missing syntax node: ${error.text || error.type}`,
|
|
181
|
+
line: error.line,
|
|
182
|
+
column: error.column,
|
|
183
|
+
source: 'tree-sitter',
|
|
184
|
+
severity: 'error',
|
|
185
|
+
}));
|
|
186
|
+
}
|
|
187
|
+
finally {
|
|
188
|
+
tree.delete();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
export async function checkCodeSyntax(options) {
|
|
192
|
+
const resolved = resolveWithinRepo(options.repoRoot, options.file);
|
|
193
|
+
if (typeof resolved === 'string') {
|
|
194
|
+
return {
|
|
195
|
+
status: 'error',
|
|
196
|
+
supported: false,
|
|
197
|
+
valid: false,
|
|
198
|
+
diagnostics: [{ message: resolved, severity: 'error', source: 'occ' }],
|
|
199
|
+
message: resolved,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
if (!existsSync(resolved.path)) {
|
|
203
|
+
const message = `File not found: ${resolved.relativePath}`;
|
|
204
|
+
return {
|
|
205
|
+
status: 'error',
|
|
206
|
+
supported: false,
|
|
207
|
+
valid: false,
|
|
208
|
+
path: resolved.path,
|
|
209
|
+
relativePath: resolved.relativePath,
|
|
210
|
+
diagnostics: [{ message, severity: 'error', source: 'occ' }],
|
|
211
|
+
message,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
const language = languageForExtension(resolved.path);
|
|
215
|
+
const extension = path.extname(resolved.path).toLowerCase();
|
|
216
|
+
const spec = getLanguageSpec(resolved.path);
|
|
217
|
+
if (extension === '.py') {
|
|
218
|
+
let diagnostics = await checkPython(resolved.path);
|
|
219
|
+
if (diagnostics === 'unsupported' && spec?.treeSitter) {
|
|
220
|
+
// python3 isn't on PATH (e.g. Windows) — fall back to the vendored tree-sitter grammar.
|
|
221
|
+
const content = stripBom(await readFile(resolved.path, 'utf8'));
|
|
222
|
+
diagnostics = await checkTreeSitter(spec.treeSitter.grammar, content);
|
|
223
|
+
}
|
|
224
|
+
if (diagnostics === 'unsupported') {
|
|
225
|
+
return {
|
|
226
|
+
status: 'unsupported',
|
|
227
|
+
supported: false,
|
|
228
|
+
path: resolved.path,
|
|
229
|
+
relativePath: resolved.relativePath,
|
|
230
|
+
language,
|
|
231
|
+
diagnostics: [],
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
return {
|
|
235
|
+
status: 'checked',
|
|
236
|
+
supported: true,
|
|
237
|
+
valid: diagnostics.length === 0,
|
|
238
|
+
path: resolved.path,
|
|
239
|
+
relativePath: resolved.relativePath,
|
|
240
|
+
language,
|
|
241
|
+
diagnostics,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
if (!['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.vue'].includes(extension) && !spec?.treeSitter) {
|
|
245
|
+
return {
|
|
246
|
+
status: 'unsupported',
|
|
247
|
+
supported: false,
|
|
248
|
+
path: resolved.path,
|
|
249
|
+
relativePath: resolved.relativePath,
|
|
250
|
+
language,
|
|
251
|
+
diagnostics: [],
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
const content = stripBom(await readFile(resolved.path, 'utf8'));
|
|
255
|
+
const diagnostics = extension === '.vue'
|
|
256
|
+
? await checkVue(resolved.path, content)
|
|
257
|
+
: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'].includes(extension)
|
|
258
|
+
? await checkTypeScriptLike(resolved.path, content, language)
|
|
259
|
+
: spec?.treeSitter
|
|
260
|
+
? await checkTreeSitter(spec.treeSitter.grammar, content)
|
|
261
|
+
: 'unsupported';
|
|
262
|
+
if (diagnostics === 'unsupported') {
|
|
263
|
+
return {
|
|
264
|
+
status: 'unsupported',
|
|
265
|
+
supported: false,
|
|
266
|
+
path: resolved.path,
|
|
267
|
+
relativePath: resolved.relativePath,
|
|
268
|
+
language,
|
|
269
|
+
diagnostics: [],
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
return {
|
|
273
|
+
status: 'checked',
|
|
274
|
+
supported: true,
|
|
275
|
+
valid: diagnostics.length === 0,
|
|
276
|
+
path: resolved.path,
|
|
277
|
+
relativePath: resolved.relativePath,
|
|
278
|
+
language,
|
|
279
|
+
diagnostics,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/code/check.ts"],"names":[],"mappings":"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"}
|