flavor-code 1.3.22 → 1.4.0-beta.1
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 +437 -434
- package/README.zh-CN.md +434 -431
- package/dist/{app-MWGRT3BJ.js → app-C5ZQUOKJ.js} +37 -63
- package/dist/astgraph/grammars.mjs +68 -68
- package/dist/astgraph/vendor/tree-sitter.js +3980 -3980
- package/dist/astgraph/vendor/zod/LICENSE +21 -21
- package/dist/astgraph/vendor/zod/index.js +4 -4
- package/dist/astgraph/vendor/zod/locales/index.js +1 -1
- package/dist/astgraph/vendor/zod/locales/package.json +7 -7
- package/dist/astgraph/vendor/zod/package.json +135 -135
- package/dist/astgraph/vendor/zod/v4/classic/checks.js +1 -1
- package/dist/astgraph/vendor/zod/v4/classic/coerce.js +17 -17
- package/dist/astgraph/vendor/zod/v4/classic/compat.js +31 -31
- package/dist/astgraph/vendor/zod/v4/classic/errors.js +48 -48
- package/dist/astgraph/vendor/zod/v4/classic/external.js +20 -20
- package/dist/astgraph/vendor/zod/v4/classic/from-json-schema.js +599 -599
- package/dist/astgraph/vendor/zod/v4/classic/index.js +4 -4
- package/dist/astgraph/vendor/zod/v4/classic/iso.js +30 -30
- package/dist/astgraph/vendor/zod/v4/classic/package.json +7 -7
- package/dist/astgraph/vendor/zod/v4/classic/parse.js +15 -15
- package/dist/astgraph/vendor/zod/v4/classic/schemas.js +1395 -1395
- package/dist/astgraph/vendor/zod/v4/core/api.js +1087 -1087
- package/dist/astgraph/vendor/zod/v4/core/checks.js +575 -575
- package/dist/astgraph/vendor/zod/v4/core/core.js +78 -78
- package/dist/astgraph/vendor/zod/v4/core/doc.js +35 -35
- package/dist/astgraph/vendor/zod/v4/core/errors.js +185 -185
- package/dist/astgraph/vendor/zod/v4/core/index.js +16 -16
- package/dist/astgraph/vendor/zod/v4/core/json-schema-generator.js +95 -95
- package/dist/astgraph/vendor/zod/v4/core/json-schema-processors.js +601 -601
- package/dist/astgraph/vendor/zod/v4/core/json-schema.js +1 -1
- package/dist/astgraph/vendor/zod/v4/core/package.json +7 -7
- package/dist/astgraph/vendor/zod/v4/core/parse.js +93 -93
- package/dist/astgraph/vendor/zod/v4/core/regexes.js +139 -139
- package/dist/astgraph/vendor/zod/v4/core/registries.js +51 -51
- package/dist/astgraph/vendor/zod/v4/core/schemas.js +2239 -2239
- package/dist/astgraph/vendor/zod/v4/core/standard-schema.js +1 -1
- package/dist/astgraph/vendor/zod/v4/core/to-json-schema.js +448 -448
- package/dist/astgraph/vendor/zod/v4/core/util.js +674 -674
- package/dist/astgraph/vendor/zod/v4/core/versions.js +5 -5
- package/dist/astgraph/vendor/zod/v4/index.js +3 -3
- package/dist/astgraph/vendor/zod/v4/locales/ar.js +106 -106
- package/dist/astgraph/vendor/zod/v4/locales/az.js +105 -105
- package/dist/astgraph/vendor/zod/v4/locales/be.js +156 -156
- package/dist/astgraph/vendor/zod/v4/locales/bg.js +120 -120
- package/dist/astgraph/vendor/zod/v4/locales/ca.js +107 -107
- package/dist/astgraph/vendor/zod/v4/locales/cs.js +111 -111
- package/dist/astgraph/vendor/zod/v4/locales/da.js +115 -115
- package/dist/astgraph/vendor/zod/v4/locales/de.js +108 -108
- package/dist/astgraph/vendor/zod/v4/locales/el.js +109 -109
- package/dist/astgraph/vendor/zod/v4/locales/en.js +113 -113
- package/dist/astgraph/vendor/zod/v4/locales/eo.js +109 -109
- package/dist/astgraph/vendor/zod/v4/locales/es.js +132 -132
- package/dist/astgraph/vendor/zod/v4/locales/fa.js +114 -114
- package/dist/astgraph/vendor/zod/v4/locales/fi.js +112 -112
- package/dist/astgraph/vendor/zod/v4/locales/fr-CA.js +107 -107
- package/dist/astgraph/vendor/zod/v4/locales/fr.js +125 -125
- package/dist/astgraph/vendor/zod/v4/locales/he.js +214 -214
- package/dist/astgraph/vendor/zod/v4/locales/hr.js +122 -122
- package/dist/astgraph/vendor/zod/v4/locales/hu.js +108 -108
- package/dist/astgraph/vendor/zod/v4/locales/hy.js +147 -147
- package/dist/astgraph/vendor/zod/v4/locales/id.js +106 -106
- package/dist/astgraph/vendor/zod/v4/locales/index.js +52 -52
- package/dist/astgraph/vendor/zod/v4/locales/is.js +109 -109
- package/dist/astgraph/vendor/zod/v4/locales/it.js +108 -108
- package/dist/astgraph/vendor/zod/v4/locales/ja.js +107 -107
- package/dist/astgraph/vendor/zod/v4/locales/ka.js +112 -112
- package/dist/astgraph/vendor/zod/v4/locales/kh.js +5 -5
- package/dist/astgraph/vendor/zod/v4/locales/km.js +110 -110
- package/dist/astgraph/vendor/zod/v4/locales/ko.js +111 -111
- package/dist/astgraph/vendor/zod/v4/locales/lt.js +203 -203
- package/dist/astgraph/vendor/zod/v4/locales/mk.js +109 -109
- package/dist/astgraph/vendor/zod/v4/locales/ms.js +107 -107
- package/dist/astgraph/vendor/zod/v4/locales/nl.js +110 -110
- package/dist/astgraph/vendor/zod/v4/locales/no.js +108 -108
- package/dist/astgraph/vendor/zod/v4/locales/ota.js +109 -109
- package/dist/astgraph/vendor/zod/v4/locales/package.json +7 -7
- package/dist/astgraph/vendor/zod/v4/locales/pl.js +109 -109
- package/dist/astgraph/vendor/zod/v4/locales/ps.js +114 -114
- package/dist/astgraph/vendor/zod/v4/locales/pt.js +108 -108
- package/dist/astgraph/vendor/zod/v4/locales/ro.js +119 -119
- package/dist/astgraph/vendor/zod/v4/locales/ru.js +156 -156
- package/dist/astgraph/vendor/zod/v4/locales/sl.js +109 -109
- package/dist/astgraph/vendor/zod/v4/locales/sv.js +110 -110
- package/dist/astgraph/vendor/zod/v4/locales/ta.js +110 -110
- package/dist/astgraph/vendor/zod/v4/locales/th.js +110 -110
- package/dist/astgraph/vendor/zod/v4/locales/tr.js +105 -105
- package/dist/astgraph/vendor/zod/v4/locales/ua.js +5 -5
- package/dist/astgraph/vendor/zod/v4/locales/uk.js +108 -108
- package/dist/astgraph/vendor/zod/v4/locales/ur.js +110 -110
- package/dist/astgraph/vendor/zod/v4/locales/uz.js +110 -110
- package/dist/astgraph/vendor/zod/v4/locales/vi.js +108 -108
- package/dist/astgraph/vendor/zod/v4/locales/yo.js +107 -107
- package/dist/astgraph/vendor/zod/v4/locales/zh-CN.js +109 -109
- package/dist/astgraph/vendor/zod/v4/locales/zh-TW.js +107 -107
- package/dist/astgraph/vendor/zod/v4/mini/checks.js +1 -1
- package/dist/astgraph/vendor/zod/v4/mini/coerce.js +22 -22
- package/dist/astgraph/vendor/zod/v4/mini/external.js +14 -14
- package/dist/astgraph/vendor/zod/v4/mini/index.js +3 -3
- package/dist/astgraph/vendor/zod/v4/mini/iso.js +34 -34
- package/dist/astgraph/vendor/zod/v4/mini/package.json +7 -7
- package/dist/astgraph/vendor/zod/v4/mini/parse.js +1 -1
- package/dist/astgraph/vendor/zod/v4/mini/schemas.js +961 -961
- package/dist/astgraph/vendor/zod/v4/package.json +7 -7
- package/dist/{chunk-7OICVL2M.js → chunk-2BF7CVWZ.js} +0 -42
- package/dist/{chunk-RQTYHUMK.js → chunk-3WCDZ6ZL.js} +15 -0
- package/dist/{chunk-Z62P4LL7.js → chunk-6MNOZ2TX.js} +8962 -8422
- package/dist/{chunk-VEUSROUQ.js → chunk-FOTMP4ZS.js} +1 -1
- package/dist/{chunk-SUSLIHXO.js → chunk-ODRWR4KK.js} +1 -1
- package/dist/{chunk-RPFWB45Y.js → chunk-URUVFECH.js} +1 -1
- package/dist/{claude-ink-6CEG2XZZ.js → claude-ink-LP32NSX5.js} +2 -3
- package/dist/cli-main.js +27 -11
- package/dist/config/load.d.ts +2 -0
- package/dist/desktop/main.js +1092 -541
- package/dist/desktop-renderer/assets/index-Bk6FYhyh.css +1 -0
- package/dist/desktop-renderer/assets/{index-D75ozXnZ.js → index-CqRIr-hz.js} +3 -3
- package/dist/desktop-renderer/assets/{interactive-terminal-CTFo4fK9.js → interactive-terminal-C4o7MNPO.js} +1 -1
- package/dist/desktop-renderer/index.html +2 -2
- package/dist/doctor.d.ts +38 -0
- package/dist/execution/docker.d.ts +5 -1
- package/dist/execution/types.d.ts +11 -0
- package/dist/jobs/registry.d.ts +1 -0
- package/dist/{load-4FWNXE6F.js → load-V2UIYYQI.js} +1 -1
- package/dist/sdk/index.js +4 -4
- package/dist/tools/shell.d.ts +17 -12
- package/dist/tools/types.d.ts +1 -0
- package/dist/ui/commands.d.ts +1 -1
- package/dist/ui/session.d.ts +1 -0
- package/dist/update/check.d.ts +20 -0
- package/dist/utils/semver.d.ts +3 -0
- package/dist/utils/spawn-executable.d.ts +2 -0
- package/package.json +1 -1
- package//346/212/200/346/234/257/346/226/271/346/241/210/346/212/245/345/221/212.md +5848 -5848
- package/dist/chunk-OTYFL4AG.js +0 -16
- package/dist/desktop-renderer/assets/index-ZZsUx916.css +0 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from "node:module"; const require = createRequire(import.meta.url);
|
|
3
3
|
import {
|
|
4
|
-
checkForUpdate,
|
|
5
4
|
statusPresentation
|
|
6
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-2BF7CVWZ.js";
|
|
7
6
|
import {
|
|
8
7
|
COMMAND_DESCRIPTIONS,
|
|
9
8
|
MVP_COMMANDS,
|
|
10
9
|
charWidth,
|
|
10
|
+
checkForUpdate,
|
|
11
11
|
createGlobTool,
|
|
12
12
|
createProductionRuntime,
|
|
13
13
|
createTranscriptState,
|
|
@@ -19,9 +19,9 @@ import {
|
|
|
19
19
|
thinkingWindow,
|
|
20
20
|
transcriptReducer,
|
|
21
21
|
withTimeout
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-6MNOZ2TX.js";
|
|
23
23
|
import "./chunk-CIVPKHF4.js";
|
|
24
|
-
import "./chunk-
|
|
24
|
+
import "./chunk-URUVFECH.js";
|
|
25
25
|
import {
|
|
26
26
|
Box_default,
|
|
27
27
|
ClockContext,
|
|
@@ -38,11 +38,10 @@ import {
|
|
|
38
38
|
useStdout,
|
|
39
39
|
use_app_default,
|
|
40
40
|
use_input_default
|
|
41
|
-
} from "./chunk-
|
|
42
|
-
import "./chunk-OTYFL4AG.js";
|
|
41
|
+
} from "./chunk-ODRWR4KK.js";
|
|
43
42
|
import {
|
|
44
43
|
execFileNoThrow
|
|
45
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-3WCDZ6ZL.js";
|
|
46
45
|
import "./chunk-S32JRDZK.js";
|
|
47
46
|
|
|
48
47
|
// src/ui/app.tsx
|
|
@@ -1523,71 +1522,42 @@ function isBridgeMethod(value, method) {
|
|
|
1523
1522
|
&& typeof value[method] === "function";
|
|
1524
1523
|
}
|
|
1525
1524
|
|
|
1526
|
-
function pngDataFromTiff(tiff) {
|
|
1527
|
-
if (!isBridgeMethod(tiff, "base64EncodedStringWithOptions")) {
|
|
1528
|
-
return null;
|
|
1529
|
-
}
|
|
1530
|
-
try {
|
|
1531
|
-
const representation = $.NSBitmapImageRep.imageRepWithData(tiff);
|
|
1532
|
-
if (!isBridgeMethod(representation, "representationUsingTypeProperties")) {
|
|
1533
|
-
return null;
|
|
1534
|
-
}
|
|
1535
|
-
const converted = representation.representationUsingTypeProperties(
|
|
1536
|
-
$.NSBitmapImageFileTypePNG,
|
|
1537
|
-
$({})
|
|
1538
|
-
);
|
|
1539
|
-
return isBridgeMethod(converted, "base64EncodedStringWithOptions")
|
|
1540
|
-
? converted
|
|
1541
|
-
: null;
|
|
1542
|
-
} catch (error) {
|
|
1543
|
-
return null;
|
|
1544
|
-
}
|
|
1545
|
-
}
|
|
1546
|
-
|
|
1547
|
-
function base64FromData(data) {
|
|
1548
|
-
if (!isBridgeMethod(data, "base64EncodedStringWithOptions")) {
|
|
1549
|
-
return null;
|
|
1550
|
-
}
|
|
1551
|
-
try {
|
|
1552
|
-
const encoded = data.base64EncodedStringWithOptions(0);
|
|
1553
|
-
if (!encoded) {
|
|
1554
|
-
return null;
|
|
1555
|
-
}
|
|
1556
|
-
const unwrapped = ObjC.unwrap(encoded);
|
|
1557
|
-
return typeof unwrapped === "string" && unwrapped.length > 0
|
|
1558
|
-
? unwrapped
|
|
1559
|
-
: null;
|
|
1560
|
-
} catch (error) {
|
|
1561
|
-
return null;
|
|
1562
|
-
}
|
|
1563
|
-
}
|
|
1564
|
-
|
|
1565
1525
|
try {
|
|
1566
1526
|
const pasteboard = $.NSPasteboard.generalPasteboard;
|
|
1567
|
-
let
|
|
1527
|
+
let data = null;
|
|
1568
1528
|
if (isBridgeMethod(pasteboard, "dataForType")) {
|
|
1569
|
-
|
|
1570
|
-
if (
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
);
|
|
1529
|
+
const png = pasteboard.dataForType($.NSPasteboardTypePNG);
|
|
1530
|
+
if (isBridgeMethod(png, "base64EncodedStringWithOptions")) {
|
|
1531
|
+
data = png;
|
|
1532
|
+
} else {
|
|
1533
|
+
const tiff = pasteboard.dataForType($.NSPasteboardTypeTIFF);
|
|
1534
|
+
// NSData.length is exposed by JXA as a property value, not a
|
|
1535
|
+
// callable bridge method. Probe a real NSData method so a valid
|
|
1536
|
+
// TIFF-only pasteboard item is not mistaken for ObjC nil.
|
|
1537
|
+
if (isBridgeMethod(tiff, "base64EncodedStringWithOptions")) {
|
|
1538
|
+
const representation = $.NSBitmapImageRep.imageRepWithData(tiff);
|
|
1539
|
+
if (isBridgeMethod(representation, "representationUsingTypeProperties")) {
|
|
1540
|
+
const converted = representation.representationUsingTypeProperties(
|
|
1541
|
+
$.NSBitmapImageFileTypePNG,
|
|
1542
|
+
$.NSDictionary.dictionary
|
|
1543
|
+
);
|
|
1544
|
+
if (isBridgeMethod(converted, "base64EncodedStringWithOptions")) {
|
|
1545
|
+
data = converted;
|
|
1546
|
+
}
|
|
1547
|
+
}
|
|
1548
|
+
}
|
|
1574
1549
|
}
|
|
1575
1550
|
}
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
// public.tiff payload. NSImage can ask AppKit to read any image type the
|
|
1579
|
-
// pasteboard promises (for example PDF, HEIC, or a lazily supplied image),
|
|
1580
|
-
// after which TIFFRepresentation gives us a stable raster conversion path.
|
|
1581
|
-
if (!encoded) {
|
|
1582
|
-
const image = $.NSImage.alloc.initWithPasteboard(pasteboard);
|
|
1583
|
-
if (image !== null && image !== undefined) {
|
|
1584
|
-
encoded = base64FromData(pngDataFromTiff(image.TIFFRepresentation));
|
|
1585
|
-
}
|
|
1551
|
+
if (!data) {
|
|
1552
|
+
$.exit(3);
|
|
1586
1553
|
}
|
|
1554
|
+
const encoded = data.base64EncodedStringWithOptions(0);
|
|
1587
1555
|
if (!encoded) {
|
|
1588
1556
|
$.exit(3);
|
|
1589
1557
|
}
|
|
1590
|
-
|
|
1558
|
+
const output = encoded.stringByAppendingString("\n")
|
|
1559
|
+
.dataUsingEncoding($.NSUTF8StringEncoding);
|
|
1560
|
+
$.NSFileHandle.fileHandleWithStandardOutput.writeData(output);
|
|
1591
1561
|
} catch (error) {
|
|
1592
1562
|
$.exit(3);
|
|
1593
1563
|
}
|
|
@@ -3166,6 +3136,10 @@ function CommandPresentationView({
|
|
|
3166
3136
|
] }),
|
|
3167
3137
|
stdout.total === 0 ? null : /* @__PURE__ */ jsx5(CommandOutputSection, { label: "OUTPUT", value: stdout, tone, error: false }),
|
|
3168
3138
|
stderr.total === 0 ? null : /* @__PURE__ */ jsx5(CommandOutputSection, { label: "ERROR", value: stderr, tone, error: true }),
|
|
3139
|
+
presentation.diagnostic === void 0 ? null : /* @__PURE__ */ jsxs4(Box_default, { children: [
|
|
3140
|
+
/* @__PURE__ */ jsx5(Text, { color: tone, children: "\u2502 " }),
|
|
3141
|
+
/* @__PURE__ */ jsx5(Text, { color: tone, children: presentation.diagnostic })
|
|
3142
|
+
] }),
|
|
3169
3143
|
/* @__PURE__ */ jsxs4(Box_default, { children: [
|
|
3170
3144
|
/* @__PURE__ */ jsx5(Text, { color: tone, children: "\u2514\u2500 " }),
|
|
3171
3145
|
/* @__PURE__ */ jsx5(Text, { dimColor: true, children: commandFooter(presentation, state) })
|
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
// astgraph grammar loading — web-tree-sitter WASM runtime, vendored under ./vendor.
|
|
2
|
-
// Resolves the vendor directory relative to this module so it works both from the
|
|
3
|
-
// source tree (src/init/astgraph) and the copied plugin root (.flavor/plugins/astgraph).
|
|
4
|
-
|
|
5
|
-
import { dirname, join } from "node:path";
|
|
6
|
-
import { fileURLToPath } from "node:url";
|
|
7
|
-
|
|
8
|
-
import { Language, Parser } from "./vendor/tree-sitter.js";
|
|
9
|
-
|
|
10
|
-
const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
|
|
11
|
-
export const VENDOR_DIR = join(MODULE_DIR, "vendor");
|
|
12
|
-
|
|
13
|
-
const GRAMMAR_FILES = {
|
|
14
|
-
typescript: "tree-sitter-typescript.wasm",
|
|
15
|
-
tsx: "tree-sitter-tsx.wasm",
|
|
16
|
-
javascript: "tree-sitter-javascript.wasm",
|
|
17
|
-
jsx: "tree-sitter-javascript.wasm",
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export const SUPPORTED_LANGUAGES = Object.keys(GRAMMAR_FILES);
|
|
21
|
-
|
|
22
|
-
export function languageForFile(path) {
|
|
23
|
-
const lower = path.toLowerCase();
|
|
24
|
-
if (lower.endsWith(".tsx")) return "tsx";
|
|
25
|
-
if (lower.endsWith(".ts") || lower.endsWith(".mts") || lower.endsWith(".cts")) return "typescript";
|
|
26
|
-
if (lower.endsWith(".jsx")) return "jsx";
|
|
27
|
-
if (lower.endsWith(".js") || lower.endsWith(".mjs") || lower.endsWith(".cjs")) return "javascript";
|
|
28
|
-
return undefined;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
let initialized = false;
|
|
32
|
-
let initPromise;
|
|
33
|
-
const languageCache = new Map();
|
|
34
|
-
const parserCache = new Map();
|
|
35
|
-
|
|
36
|
-
/** Initialize the WASM runtime once. Safe to call repeatedly. */
|
|
37
|
-
export async function initGrammars() {
|
|
38
|
-
if (initialized) return;
|
|
39
|
-
initPromise ??= Parser.init({ locateFile: (name) => join(VENDOR_DIR, name) }).then(() => {
|
|
40
|
-
initialized = true;
|
|
41
|
-
});
|
|
42
|
-
await initPromise;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** Load (and cache) a grammar for one of the supported languages. */
|
|
46
|
-
export async function loadLanguage(language) {
|
|
47
|
-
const file = GRAMMAR_FILES[language];
|
|
48
|
-
if (file === undefined) throw new Error(`astgraph: unsupported language "${language}"`);
|
|
49
|
-
await initGrammars();
|
|
50
|
-
let languageInstance = languageCache.get(language);
|
|
51
|
-
if (languageInstance === undefined) {
|
|
52
|
-
languageInstance = await Language.load(join(VENDOR_DIR, file));
|
|
53
|
-
languageCache.set(language, languageInstance);
|
|
54
|
-
}
|
|
55
|
-
return languageInstance;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/** Parse source text and return the syntax tree. */
|
|
59
|
-
export async function parseSource(source, language) {
|
|
60
|
-
const languageInstance = await loadLanguage(language);
|
|
61
|
-
let parser = parserCache.get(language);
|
|
62
|
-
if (parser === undefined) {
|
|
63
|
-
parser = new Parser();
|
|
64
|
-
parser.setLanguage(languageInstance);
|
|
65
|
-
parserCache.set(language, parser);
|
|
66
|
-
}
|
|
67
|
-
return parser.parse(source);
|
|
68
|
-
}
|
|
1
|
+
// astgraph grammar loading — web-tree-sitter WASM runtime, vendored under ./vendor.
|
|
2
|
+
// Resolves the vendor directory relative to this module so it works both from the
|
|
3
|
+
// source tree (src/init/astgraph) and the copied plugin root (.flavor/plugins/astgraph).
|
|
4
|
+
|
|
5
|
+
import { dirname, join } from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
|
|
8
|
+
import { Language, Parser } from "./vendor/tree-sitter.js";
|
|
9
|
+
|
|
10
|
+
const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
export const VENDOR_DIR = join(MODULE_DIR, "vendor");
|
|
12
|
+
|
|
13
|
+
const GRAMMAR_FILES = {
|
|
14
|
+
typescript: "tree-sitter-typescript.wasm",
|
|
15
|
+
tsx: "tree-sitter-tsx.wasm",
|
|
16
|
+
javascript: "tree-sitter-javascript.wasm",
|
|
17
|
+
jsx: "tree-sitter-javascript.wasm",
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const SUPPORTED_LANGUAGES = Object.keys(GRAMMAR_FILES);
|
|
21
|
+
|
|
22
|
+
export function languageForFile(path) {
|
|
23
|
+
const lower = path.toLowerCase();
|
|
24
|
+
if (lower.endsWith(".tsx")) return "tsx";
|
|
25
|
+
if (lower.endsWith(".ts") || lower.endsWith(".mts") || lower.endsWith(".cts")) return "typescript";
|
|
26
|
+
if (lower.endsWith(".jsx")) return "jsx";
|
|
27
|
+
if (lower.endsWith(".js") || lower.endsWith(".mjs") || lower.endsWith(".cjs")) return "javascript";
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
let initialized = false;
|
|
32
|
+
let initPromise;
|
|
33
|
+
const languageCache = new Map();
|
|
34
|
+
const parserCache = new Map();
|
|
35
|
+
|
|
36
|
+
/** Initialize the WASM runtime once. Safe to call repeatedly. */
|
|
37
|
+
export async function initGrammars() {
|
|
38
|
+
if (initialized) return;
|
|
39
|
+
initPromise ??= Parser.init({ locateFile: (name) => join(VENDOR_DIR, name) }).then(() => {
|
|
40
|
+
initialized = true;
|
|
41
|
+
});
|
|
42
|
+
await initPromise;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Load (and cache) a grammar for one of the supported languages. */
|
|
46
|
+
export async function loadLanguage(language) {
|
|
47
|
+
const file = GRAMMAR_FILES[language];
|
|
48
|
+
if (file === undefined) throw new Error(`astgraph: unsupported language "${language}"`);
|
|
49
|
+
await initGrammars();
|
|
50
|
+
let languageInstance = languageCache.get(language);
|
|
51
|
+
if (languageInstance === undefined) {
|
|
52
|
+
languageInstance = await Language.load(join(VENDOR_DIR, file));
|
|
53
|
+
languageCache.set(language, languageInstance);
|
|
54
|
+
}
|
|
55
|
+
return languageInstance;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Parse source text and return the syntax tree. */
|
|
59
|
+
export async function parseSource(source, language) {
|
|
60
|
+
const languageInstance = await loadLanguage(language);
|
|
61
|
+
let parser = parserCache.get(language);
|
|
62
|
+
if (parser === undefined) {
|
|
63
|
+
parser = new Parser();
|
|
64
|
+
parser.setLanguage(languageInstance);
|
|
65
|
+
parserCache.set(language, parser);
|
|
66
|
+
}
|
|
67
|
+
return parser.parse(source);
|
|
68
|
+
}
|