@gitwand/core 2.2.0 → 2.4.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.
Files changed (186) hide show
  1. package/dist/__tests__/corpus.d.ts.map +1 -1
  2. package/dist/__tests__/corpus.js +115 -0
  3. package/dist/__tests__/corpus.js.map +1 -1
  4. package/dist/__tests__/patterns/complex.test.d.ts +9 -0
  5. package/dist/__tests__/patterns/complex.test.d.ts.map +1 -0
  6. package/dist/__tests__/patterns/complex.test.js +198 -0
  7. package/dist/__tests__/patterns/complex.test.js.map +1 -0
  8. package/dist/__tests__/patterns/delete-no-change.test.d.ts +11 -0
  9. package/dist/__tests__/patterns/delete-no-change.test.d.ts.map +1 -0
  10. package/dist/__tests__/patterns/delete-no-change.test.js +178 -0
  11. package/dist/__tests__/patterns/delete-no-change.test.js.map +1 -0
  12. package/dist/__tests__/patterns/non-overlapping.test.d.ts +11 -0
  13. package/dist/__tests__/patterns/non-overlapping.test.d.ts.map +1 -0
  14. package/dist/__tests__/patterns/non-overlapping.test.js +240 -0
  15. package/dist/__tests__/patterns/non-overlapping.test.js.map +1 -0
  16. package/dist/__tests__/patterns/one-side-change.test.d.ts +10 -0
  17. package/dist/__tests__/patterns/one-side-change.test.d.ts.map +1 -0
  18. package/dist/__tests__/patterns/one-side-change.test.js +191 -0
  19. package/dist/__tests__/patterns/one-side-change.test.js.map +1 -0
  20. package/dist/__tests__/patterns/same-change.test.d.ts +9 -0
  21. package/dist/__tests__/patterns/same-change.test.d.ts.map +1 -0
  22. package/dist/__tests__/patterns/same-change.test.js +173 -0
  23. package/dist/__tests__/patterns/same-change.test.js.map +1 -0
  24. package/dist/__tests__/patterns/value-only-change.test.d.ts +11 -0
  25. package/dist/__tests__/patterns/value-only-change.test.d.ts.map +1 -0
  26. package/dist/__tests__/patterns/value-only-change.test.js +159 -0
  27. package/dist/__tests__/patterns/value-only-change.test.js.map +1 -0
  28. package/dist/__tests__/patterns/whitespace-only.test.d.ts +10 -0
  29. package/dist/__tests__/patterns/whitespace-only.test.d.ts.map +1 -0
  30. package/dist/__tests__/patterns/whitespace-only.test.js +177 -0
  31. package/dist/__tests__/patterns/whitespace-only.test.js.map +1 -0
  32. package/dist/__tests__/resolvers/css.test.d.ts +12 -0
  33. package/dist/__tests__/resolvers/css.test.d.ts.map +1 -0
  34. package/dist/__tests__/resolvers/css.test.js +171 -0
  35. package/dist/__tests__/resolvers/css.test.js.map +1 -0
  36. package/dist/__tests__/resolvers/imports.test.d.ts +12 -0
  37. package/dist/__tests__/resolvers/imports.test.d.ts.map +1 -0
  38. package/dist/__tests__/resolvers/imports.test.js +135 -0
  39. package/dist/__tests__/resolvers/imports.test.js.map +1 -0
  40. package/dist/__tests__/resolvers/json.test.d.ts +12 -0
  41. package/dist/__tests__/resolvers/json.test.d.ts.map +1 -0
  42. package/dist/__tests__/resolvers/json.test.js +184 -0
  43. package/dist/__tests__/resolvers/json.test.js.map +1 -0
  44. package/dist/__tests__/resolvers/lockfile-npm.test.d.ts +12 -0
  45. package/dist/__tests__/resolvers/lockfile-npm.test.d.ts.map +1 -0
  46. package/dist/__tests__/resolvers/lockfile-npm.test.js +187 -0
  47. package/dist/__tests__/resolvers/lockfile-npm.test.js.map +1 -0
  48. package/dist/__tests__/resolvers/lockfile-pnpm.test.d.ts +12 -0
  49. package/dist/__tests__/resolvers/lockfile-pnpm.test.d.ts.map +1 -0
  50. package/dist/__tests__/resolvers/lockfile-pnpm.test.js +175 -0
  51. package/dist/__tests__/resolvers/lockfile-pnpm.test.js.map +1 -0
  52. package/dist/__tests__/resolvers/lockfile-yarn.test.d.ts +12 -0
  53. package/dist/__tests__/resolvers/lockfile-yarn.test.d.ts.map +1 -0
  54. package/dist/__tests__/resolvers/lockfile-yarn.test.js +165 -0
  55. package/dist/__tests__/resolvers/lockfile-yarn.test.js.map +1 -0
  56. package/dist/__tests__/resolvers/markdown.test.d.ts +12 -0
  57. package/dist/__tests__/resolvers/markdown.test.d.ts.map +1 -0
  58. package/dist/__tests__/resolvers/markdown.test.js +188 -0
  59. package/dist/__tests__/resolvers/markdown.test.js.map +1 -0
  60. package/dist/__tests__/resolvers/vue.test.d.ts +12 -0
  61. package/dist/__tests__/resolvers/vue.test.d.ts.map +1 -0
  62. package/dist/__tests__/resolvers/vue.test.js +225 -0
  63. package/dist/__tests__/resolvers/vue.test.js.map +1 -0
  64. package/dist/__tests__/resolvers/yaml.test.d.ts +12 -0
  65. package/dist/__tests__/resolvers/yaml.test.d.ts.map +1 -0
  66. package/dist/__tests__/resolvers/yaml.test.js +203 -0
  67. package/dist/__tests__/resolvers/yaml.test.js.map +1 -0
  68. package/dist/__tests__/structural/grandeur-nature.test.d.ts +31 -0
  69. package/dist/__tests__/structural/grandeur-nature.test.d.ts.map +1 -0
  70. package/dist/__tests__/structural/grandeur-nature.test.js +264 -0
  71. package/dist/__tests__/structural/grandeur-nature.test.js.map +1 -0
  72. package/dist/__tests__/structural/languages.test.d.ts +5 -0
  73. package/dist/__tests__/structural/languages.test.d.ts.map +1 -0
  74. package/dist/__tests__/structural/languages.test.js +74 -0
  75. package/dist/__tests__/structural/languages.test.js.map +1 -0
  76. package/dist/__tests__/structural/matching.test.d.ts +6 -0
  77. package/dist/__tests__/structural/matching.test.d.ts.map +1 -0
  78. package/dist/__tests__/structural/matching.test.js +113 -0
  79. package/dist/__tests__/structural/matching.test.js.map +1 -0
  80. package/dist/__tests__/structural/merge.test.d.ts +6 -0
  81. package/dist/__tests__/structural/merge.test.d.ts.map +1 -0
  82. package/dist/__tests__/structural/merge.test.js +117 -0
  83. package/dist/__tests__/structural/merge.test.js.map +1 -0
  84. package/dist/__tests__/structural/reconstruct.test.d.ts +6 -0
  85. package/dist/__tests__/structural/reconstruct.test.d.ts.map +1 -0
  86. package/dist/__tests__/structural/reconstruct.test.js +104 -0
  87. package/dist/__tests__/structural/reconstruct.test.js.map +1 -0
  88. package/dist/__tests__/structural/structural-index.test.d.ts +14 -0
  89. package/dist/__tests__/structural/structural-index.test.d.ts.map +1 -0
  90. package/dist/__tests__/structural/structural-index.test.js +108 -0
  91. package/dist/__tests__/structural/structural-index.test.js.map +1 -0
  92. package/dist/__tests__/v2-core-scenarios.test.d.ts +35 -0
  93. package/dist/__tests__/v2-core-scenarios.test.d.ts.map +1 -0
  94. package/dist/__tests__/v2-core-scenarios.test.js +692 -0
  95. package/dist/__tests__/v2-core-scenarios.test.js.map +1 -0
  96. package/dist/__tests__/validation-parse-tree.test.d.ts +15 -0
  97. package/dist/__tests__/validation-parse-tree.test.d.ts.map +1 -0
  98. package/dist/__tests__/validation-parse-tree.test.js +243 -0
  99. package/dist/__tests__/validation-parse-tree.test.js.map +1 -0
  100. package/dist/config.d.ts +25 -0
  101. package/dist/config.d.ts.map +1 -1
  102. package/dist/config.js +17 -0
  103. package/dist/config.js.map +1 -1
  104. package/dist/diff/index.d.ts.map +1 -1
  105. package/dist/diff/index.js +1 -3
  106. package/dist/diff/index.js.map +1 -1
  107. package/dist/index.d.ts +5 -1
  108. package/dist/index.d.ts.map +1 -1
  109. package/dist/index.js +5 -1
  110. package/dist/index.js.map +1 -1
  111. package/dist/patterns/utils.d.ts +8 -7
  112. package/dist/patterns/utils.d.ts.map +1 -1
  113. package/dist/patterns/utils.js +13 -12
  114. package/dist/patterns/utils.js.map +1 -1
  115. package/dist/resolver/adapters/strict-node.d.ts +32 -0
  116. package/dist/resolver/adapters/strict-node.d.ts.map +1 -0
  117. package/dist/resolver/adapters/strict-node.js +117 -0
  118. package/dist/resolver/adapters/strict-node.js.map +1 -0
  119. package/dist/resolver/index.d.ts +33 -0
  120. package/dist/resolver/index.d.ts.map +1 -1
  121. package/dist/resolver/index.js +113 -0
  122. package/dist/resolver/index.js.map +1 -1
  123. package/dist/resolver/policy.d.ts.map +1 -1
  124. package/dist/resolver/policy.js +3 -0
  125. package/dist/resolver/policy.js.map +1 -1
  126. package/dist/resolver/validate-parse-tree.d.ts +52 -0
  127. package/dist/resolver/validate-parse-tree.d.ts.map +1 -0
  128. package/dist/resolver/validate-parse-tree.js +87 -0
  129. package/dist/resolver/validate-parse-tree.js.map +1 -0
  130. package/dist/resolver/validate-strict.d.ts +27 -0
  131. package/dist/resolver/validate-strict.d.ts.map +1 -0
  132. package/dist/resolver/validate-strict.js +41 -0
  133. package/dist/resolver/validate-strict.js.map +1 -0
  134. package/dist/resolver/validation.d.ts.map +1 -1
  135. package/dist/resolver/validation.js +15 -1
  136. package/dist/resolver/validation.js.map +1 -1
  137. package/dist/resolvers/dispatcher.d.ts +17 -1
  138. package/dist/resolvers/dispatcher.d.ts.map +1 -1
  139. package/dist/resolvers/dispatcher.js.map +1 -1
  140. package/dist/structural/entities.d.ts +44 -0
  141. package/dist/structural/entities.d.ts.map +1 -0
  142. package/dist/structural/entities.js +315 -0
  143. package/dist/structural/entities.js.map +1 -0
  144. package/dist/structural/index.d.ts +48 -0
  145. package/dist/structural/index.d.ts.map +1 -0
  146. package/dist/structural/index.js +177 -0
  147. package/dist/structural/index.js.map +1 -0
  148. package/dist/structural/matching.d.ts +46 -0
  149. package/dist/structural/matching.d.ts.map +1 -0
  150. package/dist/structural/matching.js +83 -0
  151. package/dist/structural/matching.js.map +1 -0
  152. package/dist/structural/merge.d.ts +45 -0
  153. package/dist/structural/merge.d.ts.map +1 -0
  154. package/dist/structural/merge.js +127 -0
  155. package/dist/structural/merge.js.map +1 -0
  156. package/dist/structural/parsers/adapters/browser.d.ts +22 -0
  157. package/dist/structural/parsers/adapters/browser.d.ts.map +1 -0
  158. package/dist/structural/parsers/adapters/browser.js +27 -0
  159. package/dist/structural/parsers/adapters/browser.js.map +1 -0
  160. package/dist/structural/parsers/adapters/node.d.ts +18 -0
  161. package/dist/structural/parsers/adapters/node.d.ts.map +1 -0
  162. package/dist/structural/parsers/adapters/node.js +42 -0
  163. package/dist/structural/parsers/adapters/node.js.map +1 -0
  164. package/dist/structural/parsers/adapters/tauri.d.ts +26 -0
  165. package/dist/structural/parsers/adapters/tauri.d.ts.map +1 -0
  166. package/dist/structural/parsers/adapters/tauri.js +34 -0
  167. package/dist/structural/parsers/adapters/tauri.js.map +1 -0
  168. package/dist/structural/parsers/grammars/languages.d.ts +32 -0
  169. package/dist/structural/parsers/grammars/languages.d.ts.map +1 -0
  170. package/dist/structural/parsers/grammars/languages.js +73 -0
  171. package/dist/structural/parsers/grammars/languages.js.map +1 -0
  172. package/dist/structural/parsers/grammars/ts.d.ts +26 -0
  173. package/dist/structural/parsers/grammars/ts.d.ts.map +1 -0
  174. package/dist/structural/parsers/grammars/ts.js +46 -0
  175. package/dist/structural/parsers/grammars/ts.js.map +1 -0
  176. package/dist/structural/parsers/loader.d.ts +74 -0
  177. package/dist/structural/parsers/loader.d.ts.map +1 -0
  178. package/dist/structural/parsers/loader.js +181 -0
  179. package/dist/structural/parsers/loader.js.map +1 -0
  180. package/dist/structural/reconstruct.d.ts +28 -0
  181. package/dist/structural/reconstruct.d.ts.map +1 -0
  182. package/dist/structural/reconstruct.js +63 -0
  183. package/dist/structural/reconstruct.js.map +1 -0
  184. package/dist/types.d.ts +60 -3
  185. package/dist/types.d.ts.map +1 -1
  186. package/package.json +16 -2
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Tauri adapter for loading tree-sitter grammar WASM files.
3
+ *
4
+ * Uses `window.__TAURI_INTERNALS__.convertFileSrc` (Tauri v2) to convert a
5
+ * local asset path into a fetch-able asset:// URL, then loads via fetch.
6
+ *
7
+ * Grammar WASM files must be included in the Tauri bundle under the path
8
+ * specified by `grammarDir` (default: "/assets/grammars" relative to the
9
+ * Tauri resource directory).
10
+ */
11
+ export interface TauriLoaderOptions {
12
+ /**
13
+ * Absolute path to the directory containing grammar WASM files inside
14
+ * the Tauri resource bundle.
15
+ * Defaults to "/assets/grammars".
16
+ */
17
+ grammarDir?: string;
18
+ }
19
+ /**
20
+ * Load grammar WASM bytes in a Tauri webview context.
21
+ *
22
+ * @param grammarName - e.g. "tree-sitter-typescript"
23
+ * @param opts - Tauri-specific options
24
+ */
25
+ export declare function loadGrammarBytes(grammarName: string, opts?: TauriLoaderOptions): Promise<Uint8Array>;
26
+ //# sourceMappingURL=tauri.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tauri.d.ts","sourceRoot":"","sources":["../../../../src/structural/parsers/adapters/tauri.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,UAAU,CAAC,CAuBrB"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Tauri adapter for loading tree-sitter grammar WASM files.
3
+ *
4
+ * Uses `window.__TAURI_INTERNALS__.convertFileSrc` (Tauri v2) to convert a
5
+ * local asset path into a fetch-able asset:// URL, then loads via fetch.
6
+ *
7
+ * Grammar WASM files must be included in the Tauri bundle under the path
8
+ * specified by `grammarDir` (default: "/assets/grammars" relative to the
9
+ * Tauri resource directory).
10
+ */
11
+ /**
12
+ * Load grammar WASM bytes in a Tauri webview context.
13
+ *
14
+ * @param grammarName - e.g. "tree-sitter-typescript"
15
+ * @param opts - Tauri-specific options
16
+ */
17
+ export async function loadGrammarBytes(grammarName, opts = {}) {
18
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
+ const tauri = window.__TAURI_INTERNALS__;
20
+ if (typeof tauri?.convertFileSrc !== "function") {
21
+ throw new Error("[structural] Tauri adapter: __TAURI_INTERNALS__.convertFileSrc is not available. " +
22
+ "Ensure you are running inside a Tauri webview and using Tauri v2.");
23
+ }
24
+ const grammarDir = opts.grammarDir ?? "/assets/grammars";
25
+ const localPath = `${grammarDir}/${grammarName}.wasm`;
26
+ const url = tauri.convertFileSrc(localPath, "asset");
27
+ const response = await fetch(url);
28
+ if (!response.ok) {
29
+ throw new Error(`[structural] Failed to fetch grammar WASM via Tauri: ${localPath} (HTTP ${response.status})`);
30
+ }
31
+ const buffer = await response.arrayBuffer();
32
+ return new Uint8Array(buffer);
33
+ }
34
+ //# sourceMappingURL=tauri.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tauri.js","sourceRoot":"","sources":["../../../../src/structural/parsers/adapters/tauri.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAmB,EACnB,OAA2B,EAAE;IAE7B,8DAA8D;IAC9D,MAAM,KAAK,GAAI,MAAc,CAAC,mBAAmB,CAAC;IAClD,IAAI,OAAO,KAAK,EAAE,cAAc,KAAK,UAAU,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CACb,mFAAmF;YACjF,mEAAmE,CACtE,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,kBAAkB,CAAC;IACzD,MAAM,SAAS,GAAG,GAAG,UAAU,IAAI,WAAW,OAAO,CAAC;IACtD,MAAM,GAAG,GAAW,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAE7D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,wDAAwD,SAAS,UAAU,QAAQ,CAAC,MAAM,GAAG,CAC9F,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC5C,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Language registry for the structural merge engine.
3
+ *
4
+ * Maps file extensions → language identifiers → tree-sitter grammar WASM names.
5
+ * Grammar WASM names correspond to the filenames published by `tree-sitter-wasms`.
6
+ */
7
+ export type SupportedLanguage = "typescript" | "tsx" | "javascript" | "jsx" | "python" | "go" | "rust";
8
+ export interface LanguageSpec {
9
+ /** Grammar WASM name as published in `tree-sitter-wasms/out/` */
10
+ grammarName: string;
11
+ /** File extensions handled by this language (lowercase, with dot) */
12
+ extensions: string[];
13
+ }
14
+ export declare const LANGUAGE_SPECS: Record<SupportedLanguage, LanguageSpec>;
15
+ /**
16
+ * Detect the language for a given file path.
17
+ * Returns `null` if the file extension is not supported.
18
+ */
19
+ export declare function languageForFile(filePath: string): SupportedLanguage | null;
20
+ /**
21
+ * Returns `true` if the file can be handled by the structural merge engine.
22
+ *
23
+ * Excludes TypeScript declaration files (`.d.ts`) — they have no implementation
24
+ * to merge. Excludes `.min.js` and other generated bundles via the generated-file
25
+ * detector in the main resolver pipeline.
26
+ */
27
+ export declare function isStructuralLanguage(filePath: string): boolean;
28
+ /**
29
+ * Return the grammar WASM name for a file, or `null` if not supported.
30
+ */
31
+ export declare function grammarNameForFile(filePath: string): string | null;
32
+ //# sourceMappingURL=languages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"languages.d.ts","sourceRoot":"","sources":["../../../../src/structural/parsers/grammars/languages.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,MAAM,iBAAiB,GACzB,YAAY,GACZ,KAAK,GACL,YAAY,GACZ,KAAK,GACL,QAAQ,GACR,IAAI,GACJ,MAAM,CAAC;AAEX,MAAM,WAAW,YAAY;IAC3B,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAID,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,iBAAiB,EAAE,YAAY,CA8BlE,CAAC;AAYF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAM1E;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAG9D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGlE"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Language registry for the structural merge engine.
3
+ *
4
+ * Maps file extensions → language identifiers → tree-sitter grammar WASM names.
5
+ * Grammar WASM names correspond to the filenames published by `tree-sitter-wasms`.
6
+ */
7
+ // ─── Language specs ───────────────────────────────────────────────────────────
8
+ export const LANGUAGE_SPECS = {
9
+ typescript: {
10
+ grammarName: "tree-sitter-typescript",
11
+ extensions: [".ts"],
12
+ },
13
+ tsx: {
14
+ grammarName: "tree-sitter-tsx",
15
+ extensions: [".tsx"],
16
+ },
17
+ javascript: {
18
+ grammarName: "tree-sitter-javascript",
19
+ extensions: [".js", ".mjs", ".cjs"],
20
+ },
21
+ jsx: {
22
+ // JSX is parsed by the JavaScript grammar (tree-sitter-javascript supports JSX natively)
23
+ grammarName: "tree-sitter-javascript",
24
+ extensions: [".jsx"],
25
+ },
26
+ python: {
27
+ grammarName: "tree-sitter-python",
28
+ extensions: [".py"],
29
+ },
30
+ go: {
31
+ grammarName: "tree-sitter-go",
32
+ extensions: [".go"],
33
+ },
34
+ rust: {
35
+ grammarName: "tree-sitter-rust",
36
+ extensions: [".rs"],
37
+ },
38
+ };
39
+ // ─── Extension → language lookup table ───────────────────────────────────────
40
+ const EXT_TO_LANGUAGE = new Map(Object.entries(LANGUAGE_SPECS).flatMap(([lang, spec]) => spec.extensions.map((ext) => [ext, lang])));
41
+ // ─── Public API ───────────────────────────────────────────────────────────────
42
+ /**
43
+ * Detect the language for a given file path.
44
+ * Returns `null` if the file extension is not supported.
45
+ */
46
+ export function languageForFile(filePath) {
47
+ const lower = filePath.toLowerCase();
48
+ for (const [ext, lang] of EXT_TO_LANGUAGE) {
49
+ if (lower.endsWith(ext))
50
+ return lang;
51
+ }
52
+ return null;
53
+ }
54
+ /**
55
+ * Returns `true` if the file can be handled by the structural merge engine.
56
+ *
57
+ * Excludes TypeScript declaration files (`.d.ts`) — they have no implementation
58
+ * to merge. Excludes `.min.js` and other generated bundles via the generated-file
59
+ * detector in the main resolver pipeline.
60
+ */
61
+ export function isStructuralLanguage(filePath) {
62
+ if (/\.d\.ts$/i.test(filePath))
63
+ return false;
64
+ return languageForFile(filePath) !== null;
65
+ }
66
+ /**
67
+ * Return the grammar WASM name for a file, or `null` if not supported.
68
+ */
69
+ export function grammarNameForFile(filePath) {
70
+ const lang = languageForFile(filePath);
71
+ return lang ? LANGUAGE_SPECS[lang].grammarName : null;
72
+ }
73
+ //# sourceMappingURL=languages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"languages.js","sourceRoot":"","sources":["../../../../src/structural/parsers/grammars/languages.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH,iFAAiF;AAEjF,MAAM,CAAC,MAAM,cAAc,GAA4C;IACrE,UAAU,EAAE;QACV,WAAW,EAAE,wBAAwB;QACrC,UAAU,EAAE,CAAC,KAAK,CAAC;KACpB;IACD,GAAG,EAAE;QACH,WAAW,EAAE,iBAAiB;QAC9B,UAAU,EAAE,CAAC,MAAM,CAAC;KACrB;IACD,UAAU,EAAE;QACV,WAAW,EAAE,wBAAwB;QACrC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;KACpC;IACD,GAAG,EAAE;QACH,yFAAyF;QACzF,WAAW,EAAE,wBAAwB;QACrC,UAAU,EAAE,CAAC,MAAM,CAAC;KACrB;IACD,MAAM,EAAE;QACN,WAAW,EAAE,oBAAoB;QACjC,UAAU,EAAE,CAAC,KAAK,CAAC;KACpB;IACD,EAAE,EAAE;QACF,WAAW,EAAE,gBAAgB;QAC7B,UAAU,EAAE,CAAC,KAAK,CAAC;KACpB;IACD,IAAI,EAAE;QACJ,WAAW,EAAE,kBAAkB;QAC/B,UAAU,EAAE,CAAC,KAAK,CAAC;KACpB;CACF,CAAC;AAEF,gFAAgF;AAEhF,MAAM,eAAe,GAAmC,IAAI,GAAG,CAC5D,MAAM,CAAC,OAAO,CAAC,cAAc,CAAyC,CAAC,OAAO,CAC7E,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAA+B,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CACzF,CACF,CAAC;AAEF,iFAAiF;AAEjF;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,eAAe,EAAE,CAAC;QAC1C,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,OAAO,eAAe,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;AACxD,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Grammar loaders for all structural-merge–supported languages.
3
+ *
4
+ * Uses the unified language registry from `languages.ts` to map file paths
5
+ * to the correct `tree-sitter-wasms` grammar WASM.
6
+ */
7
+ import { type Language, type LoaderOptions } from "../loader.js";
8
+ /** Load the TypeScript grammar. */
9
+ export declare function loadTypeScriptGrammar(opts?: LoaderOptions): Promise<Language | null>;
10
+ /** Load the TSX grammar. */
11
+ export declare function loadTsxGrammar(opts?: LoaderOptions): Promise<Language | null>;
12
+ /** Load the JavaScript grammar (also used for JSX). */
13
+ export declare function loadJavaScriptGrammar(opts?: LoaderOptions): Promise<Language | null>;
14
+ /** Load the Python grammar. */
15
+ export declare function loadPythonGrammar(opts?: LoaderOptions): Promise<Language | null>;
16
+ /** Load the Go grammar. */
17
+ export declare function loadGoGrammar(opts?: LoaderOptions): Promise<Language | null>;
18
+ /** Load the Rust grammar. */
19
+ export declare function loadRustGrammar(opts?: LoaderOptions): Promise<Language | null>;
20
+ /**
21
+ * Load the appropriate grammar for a given file path.
22
+ * Returns `null` if the file extension is not supported or the grammar WASM
23
+ * is unavailable.
24
+ */
25
+ export declare function loadGrammarForFile(filePath: string, opts?: LoaderOptions): Promise<Language | null>;
26
+ //# sourceMappingURL=ts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ts.d.ts","sourceRoot":"","sources":["../../../../src/structural/parsers/grammars/ts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAe,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAK9E,mCAAmC;AACnC,wBAAsB,qBAAqB,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAE9F;AAED,4BAA4B;AAC5B,wBAAsB,cAAc,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAEvF;AAED,uDAAuD;AACvD,wBAAsB,qBAAqB,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAE9F;AAED,+BAA+B;AAC/B,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAE1F;AAED,2BAA2B;AAC3B,wBAAsB,aAAa,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAEtF;AAED,6BAA6B;AAC7B,wBAAsB,eAAe,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAExF;AAID;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,aAAkB,GACvB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAI1B"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Grammar loaders for all structural-merge–supported languages.
3
+ *
4
+ * Uses the unified language registry from `languages.ts` to map file paths
5
+ * to the correct `tree-sitter-wasms` grammar WASM.
6
+ */
7
+ import { loadGrammar } from "../loader.js";
8
+ import { grammarNameForFile, LANGUAGE_SPECS } from "./languages.js";
9
+ // ─── Named loaders (kept for backward compat + direct use) ───────────────────
10
+ /** Load the TypeScript grammar. */
11
+ export async function loadTypeScriptGrammar(opts = {}) {
12
+ return loadGrammar(LANGUAGE_SPECS.typescript.grammarName, opts);
13
+ }
14
+ /** Load the TSX grammar. */
15
+ export async function loadTsxGrammar(opts = {}) {
16
+ return loadGrammar(LANGUAGE_SPECS.tsx.grammarName, opts);
17
+ }
18
+ /** Load the JavaScript grammar (also used for JSX). */
19
+ export async function loadJavaScriptGrammar(opts = {}) {
20
+ return loadGrammar(LANGUAGE_SPECS.javascript.grammarName, opts);
21
+ }
22
+ /** Load the Python grammar. */
23
+ export async function loadPythonGrammar(opts = {}) {
24
+ return loadGrammar(LANGUAGE_SPECS.python.grammarName, opts);
25
+ }
26
+ /** Load the Go grammar. */
27
+ export async function loadGoGrammar(opts = {}) {
28
+ return loadGrammar(LANGUAGE_SPECS.go.grammarName, opts);
29
+ }
30
+ /** Load the Rust grammar. */
31
+ export async function loadRustGrammar(opts = {}) {
32
+ return loadGrammar(LANGUAGE_SPECS.rust.grammarName, opts);
33
+ }
34
+ // ─── Generic loader ───────────────────────────────────────────────────────────
35
+ /**
36
+ * Load the appropriate grammar for a given file path.
37
+ * Returns `null` if the file extension is not supported or the grammar WASM
38
+ * is unavailable.
39
+ */
40
+ export async function loadGrammarForFile(filePath, opts = {}) {
41
+ const grammarName = grammarNameForFile(filePath);
42
+ if (!grammarName)
43
+ return null;
44
+ return loadGrammar(grammarName, opts);
45
+ }
46
+ //# sourceMappingURL=ts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ts.js","sourceRoot":"","sources":["../../../../src/structural/parsers/grammars/ts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAqC,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEpE,gFAAgF;AAEhF,mCAAmC;AACnC,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAsB,EAAE;IAClE,OAAO,WAAW,CAAC,cAAc,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AAClE,CAAC;AAED,4BAA4B;AAC5B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAsB,EAAE;IAC3D,OAAO,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAsB,EAAE;IAClE,OAAO,WAAW,CAAC,cAAc,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AAClE,CAAC;AAED,+BAA+B;AAC/B,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAsB,EAAE;IAC9D,OAAO,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED,2BAA2B;AAC3B,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB,EAAE;IAC1D,OAAO,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED,6BAA6B;AAC7B,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAsB,EAAE;IAC5D,OAAO,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED,iFAAiF;AAEjF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAgB,EAChB,OAAsB,EAAE;IAExB,MAAM,WAAW,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Grammar loader for web-tree-sitter.
3
+ *
4
+ * Handles environment detection, WASM loading, and in-process caching.
5
+ *
6
+ * `web-tree-sitter` is an **optional** peer dependency — if it is not
7
+ * installed, every function here returns `null` gracefully and the
8
+ * structural merge is silently skipped.
9
+ */
10
+ /** A loaded tree-sitter Language (opaque to callers). */
11
+ export type Language = unknown;
12
+ /** A ready-to-use tree-sitter Parser (opaque to callers). */
13
+ export type TSParser = unknown;
14
+ export type Environment = "node" | "tauri" | "browser";
15
+ export interface LoaderOptions {
16
+ /** Base URL used by the browser adapter to locate grammar WASM files. */
17
+ grammarBaseUrl?: string;
18
+ /** Directory used by the Tauri adapter to locate grammar WASM files. */
19
+ grammarDir?: string;
20
+ /**
21
+ * URL for `web-tree-sitter.wasm` — the web-tree-sitter runtime WASM.
22
+ * Pass this when the runtime cannot auto-discover the file (e.g. inside a
23
+ * Vite bundle where the hashed asset URL is not predictable).
24
+ * Example: `"/grammars/web-tree-sitter.wasm"`.
25
+ *
26
+ * Internally mapped to `locateFile` for web-tree-sitter v0.26+ (Emscripten).
27
+ */
28
+ wasmPath?: string;
29
+ /**
30
+ * Custom WASM bytes loader — overrides environment detection entirely.
31
+ * Receives the grammar name (e.g. "tree-sitter-typescript") and must
32
+ * return the raw WASM bytes.
33
+ */
34
+ customLoader?: (grammarName: string) => Promise<Uint8Array>;
35
+ }
36
+ /**
37
+ * Detect the current runtime environment.
38
+ * Priority: Tauri (window.__TAURI_INTERNALS__) > Node.js (process.versions.node) > browser.
39
+ */
40
+ export declare function detectEnvironment(): Environment;
41
+ /**
42
+ * Ensure web-tree-sitter's WASM runtime is initialized.
43
+ *
44
+ * Idempotent — safe to call multiple times; initialization runs only once.
45
+ *
46
+ * @returns The Parser class, or `null` if web-tree-sitter is unavailable.
47
+ */
48
+ export declare function ensureParserInitialized(_opts?: LoaderOptions): Promise<any | null>;
49
+ /**
50
+ * Load and cache a tree-sitter grammar by name.
51
+ *
52
+ * Returns `null` (never throws) if:
53
+ * - `web-tree-sitter` is not installed
54
+ * - The grammar WASM file cannot be found or loaded
55
+ *
56
+ * @param grammarName - e.g. "tree-sitter-typescript"
57
+ * @param opts - Optional WASM path / loader overrides
58
+ */
59
+ export declare function loadGrammar(grammarName: string, opts?: LoaderOptions): Promise<Language | null>;
60
+ /**
61
+ * Create a configured tree-sitter Parser instance.
62
+ *
63
+ * Returns `null` if web-tree-sitter is unavailable.
64
+ *
65
+ * @param language - A language object returned by `loadGrammar()`
66
+ * @param opts - Loader options (passed to `ensureParserInitialized`)
67
+ */
68
+ export declare function createParser(language: Language, opts?: LoaderOptions): Promise<TSParser | null>;
69
+ /**
70
+ * Reset the in-process grammar cache and initialization state.
71
+ * Intended for use in tests only.
72
+ */
73
+ export declare function _resetCache(): void;
74
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/structural/parsers/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,yDAAyD;AACzD,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC;AAE/B,6DAA6D;AAC7D,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC;AAE/B,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CAC7D;AAaD;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,WAAW,CAY/C;AAuCD;;;;;;GAMG;AAEH,wBAAsB,uBAAuB,CAAC,KAAK,GAAE,aAAkB,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAsB5F;AA0BD;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,aAAkB,GACvB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAyB1B;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,QAAQ,EAClB,IAAI,GAAE,aAAkB,GACvB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAQ1B;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAKlC"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Grammar loader for web-tree-sitter.
3
+ *
4
+ * Handles environment detection, WASM loading, and in-process caching.
5
+ *
6
+ * `web-tree-sitter` is an **optional** peer dependency — if it is not
7
+ * installed, every function here returns `null` gracefully and the
8
+ * structural merge is silently skipped.
9
+ */
10
+ // ─── Module-level cache ───────────────────────────────────────────────────────
11
+ const grammarCache = new Map();
12
+ let parserInitialized = false;
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
+ let _ParserClass = null;
15
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
+ let _LanguageClass = null;
17
+ // ─── Environment detection ────────────────────────────────────────────────────
18
+ /**
19
+ * Detect the current runtime environment.
20
+ * Priority: Tauri (window.__TAURI_INTERNALS__) > Node.js (process.versions.node) > browser.
21
+ */
22
+ export function detectEnvironment() {
23
+ if (typeof window !== "undefined" &&
24
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
+ window.__TAURI_INTERNALS__ != null) {
26
+ return "tauri";
27
+ }
28
+ if (typeof process !== "undefined" && process.versions?.node) {
29
+ return "node";
30
+ }
31
+ return "browser";
32
+ }
33
+ // ─── web-tree-sitter dynamic import ──────────────────────────────────────────
34
+ /**
35
+ * Try to dynamically import `web-tree-sitter`.
36
+ * Returns `null` (never throws) if the package is not installed.
37
+ */
38
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
39
+ async function tryImportTreeSitter() {
40
+ if (_ParserClass !== null)
41
+ return _ParserClass;
42
+ try {
43
+ // web-tree-sitter is an optional peerDependency — TypeScript cannot
44
+ // resolve it at compile time when it is not installed.
45
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
46
+ // @ts-ignore: optional peer — may not be installed
47
+ const mod = await import("web-tree-sitter");
48
+ // v0.26+ exports named exports (Parser, Language, …) with no default.
49
+ // Earlier versions (≤0.22) had a single default export (the Parser class)
50
+ // with Language available as Parser.Language.
51
+ // Support both shapes.
52
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
53
+ const anyMod = mod;
54
+ if (anyMod.Parser) {
55
+ // v0.26+ shape: { Parser, Language, … }
56
+ _ParserClass = anyMod.Parser;
57
+ _LanguageClass = anyMod.Language;
58
+ }
59
+ else {
60
+ // pre-v0.22 shape: default export is the Parser class; Language is Parser.Language
61
+ const ParserDefault = anyMod.default ?? anyMod;
62
+ _ParserClass = ParserDefault;
63
+ _LanguageClass = ParserDefault.Language;
64
+ }
65
+ return _ParserClass;
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ /**
72
+ * Ensure web-tree-sitter's WASM runtime is initialized.
73
+ *
74
+ * Idempotent — safe to call multiple times; initialization runs only once.
75
+ *
76
+ * @returns The Parser class, or `null` if web-tree-sitter is unavailable.
77
+ */
78
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
+ export async function ensureParserInitialized(_opts = {}) {
80
+ const Parser = await tryImportTreeSitter();
81
+ if (!Parser)
82
+ return null;
83
+ if (!parserInitialized) {
84
+ // `wasmPath` lets the caller override where web-tree-sitter finds its own
85
+ // runtime WASM (web-tree-sitter.wasm). This is needed in bundled
86
+ // environments (Vite, Tauri) where the file is served as a static asset.
87
+ //
88
+ // web-tree-sitter v0.26+ uses the Emscripten `locateFile` callback to
89
+ // resolve the WASM URL — there is no `wasmPath` option in that API.
90
+ const initOpts = _opts.wasmPath
91
+ ? {
92
+ locateFile: (path) => path.endsWith(".wasm") ? _opts.wasmPath : path,
93
+ }
94
+ : {};
95
+ await Parser.init(initOpts);
96
+ parserInitialized = true;
97
+ }
98
+ return Parser;
99
+ }
100
+ // ─── WASM bytes loading ───────────────────────────────────────────────────────
101
+ async function loadWasmForEnv(env, grammarName, opts) {
102
+ if (env === "node") {
103
+ // vite-ignore: Node-only adapter uses `createRequire` — never bundled for browser/Tauri
104
+ const { loadGrammarBytes } = await import(/* @vite-ignore */ "./adapters/node.js");
105
+ return loadGrammarBytes(grammarName);
106
+ }
107
+ if (env === "tauri") {
108
+ // vite-ignore: Tauri adapter uses @tauri-apps/plugin-fs — not available in web builds
109
+ const { loadGrammarBytes } = await import(/* @vite-ignore */ "./adapters/tauri.js");
110
+ return loadGrammarBytes(grammarName, { grammarDir: opts.grammarDir });
111
+ }
112
+ // browser
113
+ const { loadGrammarBytes } = await import("./adapters/browser.js");
114
+ return loadGrammarBytes(grammarName, { grammarBaseUrl: opts.grammarBaseUrl });
115
+ }
116
+ // ─── Public API ───────────────────────────────────────────────────────────────
117
+ /**
118
+ * Load and cache a tree-sitter grammar by name.
119
+ *
120
+ * Returns `null` (never throws) if:
121
+ * - `web-tree-sitter` is not installed
122
+ * - The grammar WASM file cannot be found or loaded
123
+ *
124
+ * @param grammarName - e.g. "tree-sitter-typescript"
125
+ * @param opts - Optional WASM path / loader overrides
126
+ */
127
+ export async function loadGrammar(grammarName, opts = {}) {
128
+ const cached = grammarCache.get(grammarName);
129
+ if (cached !== undefined)
130
+ return cached;
131
+ const Parser = await ensureParserInitialized(opts);
132
+ if (!Parser)
133
+ return null;
134
+ try {
135
+ let wasmBytes;
136
+ if (opts.customLoader) {
137
+ wasmBytes = await opts.customLoader(grammarName);
138
+ }
139
+ else {
140
+ const env = detectEnvironment();
141
+ wasmBytes = await loadWasmForEnv(env, grammarName, opts);
142
+ }
143
+ // Use the module-level Language class (v0.26+ separate export;
144
+ // fall back to Parser.Language for older versions).
145
+ const LanguageClass = _LanguageClass ?? Parser.Language;
146
+ const language = await LanguageClass.load(wasmBytes);
147
+ grammarCache.set(grammarName, language);
148
+ return language;
149
+ }
150
+ catch {
151
+ return null;
152
+ }
153
+ }
154
+ /**
155
+ * Create a configured tree-sitter Parser instance.
156
+ *
157
+ * Returns `null` if web-tree-sitter is unavailable.
158
+ *
159
+ * @param language - A language object returned by `loadGrammar()`
160
+ * @param opts - Loader options (passed to `ensureParserInitialized`)
161
+ */
162
+ export async function createParser(language, opts = {}) {
163
+ const Parser = await ensureParserInitialized(opts);
164
+ if (!Parser)
165
+ return null;
166
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
167
+ const parser = new Parser();
168
+ parser.setLanguage(language);
169
+ return parser;
170
+ }
171
+ /**
172
+ * Reset the in-process grammar cache and initialization state.
173
+ * Intended for use in tests only.
174
+ */
175
+ export function _resetCache() {
176
+ grammarCache.clear();
177
+ parserInitialized = false;
178
+ _ParserClass = null;
179
+ _LanguageClass = null;
180
+ }
181
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/structural/parsers/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Merged file reconstruction from entity merge results.
3
+ *
4
+ * Follows theirs entity order (to preserve incoming structure), interpolating
5
+ * the inter-entity whitespace/comments from the theirs source verbatim.
6
+ * Entities that only exist in ours (ours-added) are appended at the end.
7
+ */
8
+ import type { TopLevelEntity } from "./entities.js";
9
+ import type { EntityMergeResult } from "./merge.js";
10
+ /**
11
+ * Reconstruct the merged source file from entity merge results.
12
+ *
13
+ * Strategy:
14
+ * 1. Walk theirs entities in order.
15
+ * - Emit the source gap (whitespace, comments) between consecutive
16
+ * entities, taken verbatim from `theirsSource`.
17
+ * - Emit the merged text for each entity (or skip if deleted).
18
+ * 2. Emit the trailing content from `theirsSource` after the last entity.
19
+ * 3. Append any entities that only exist in ours (ours-added), separated
20
+ * by a newline.
21
+ *
22
+ * @param merges - Merge decision per entity signature
23
+ * @param theirsEntities - Top-level entities from the theirs version (ordered)
24
+ * @param oursEntities - Top-level entities from the ours version (ordered)
25
+ * @param theirsSource - Full source text of the theirs version (for gaps)
26
+ */
27
+ export declare function reconstructFile(merges: EntityMergeResult[], theirsEntities: TopLevelEntity[], oursEntities: TopLevelEntity[], theirsSource: string): string;
28
+ //# sourceMappingURL=reconstruct.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconstruct.d.ts","sourceRoot":"","sources":["../../src/structural/reconstruct.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,iBAAiB,EAAE,EAC3B,cAAc,EAAE,cAAc,EAAE,EAChC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,MAAM,GACnB,MAAM,CA2CR"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Merged file reconstruction from entity merge results.
3
+ *
4
+ * Follows theirs entity order (to preserve incoming structure), interpolating
5
+ * the inter-entity whitespace/comments from the theirs source verbatim.
6
+ * Entities that only exist in ours (ours-added) are appended at the end.
7
+ */
8
+ /**
9
+ * Reconstruct the merged source file from entity merge results.
10
+ *
11
+ * Strategy:
12
+ * 1. Walk theirs entities in order.
13
+ * - Emit the source gap (whitespace, comments) between consecutive
14
+ * entities, taken verbatim from `theirsSource`.
15
+ * - Emit the merged text for each entity (or skip if deleted).
16
+ * 2. Emit the trailing content from `theirsSource` after the last entity.
17
+ * 3. Append any entities that only exist in ours (ours-added), separated
18
+ * by a newline.
19
+ *
20
+ * @param merges - Merge decision per entity signature
21
+ * @param theirsEntities - Top-level entities from the theirs version (ordered)
22
+ * @param oursEntities - Top-level entities from the ours version (ordered)
23
+ * @param theirsSource - Full source text of the theirs version (for gaps)
24
+ */
25
+ export function reconstructFile(merges, theirsEntities, oursEntities, theirsSource) {
26
+ const mergeMap = new Map(merges.map((m) => [m.signature, m]));
27
+ const theirsSigSet = new Set(theirsEntities.map((e) => e.signature));
28
+ const parts = [];
29
+ let lastEnd = 0;
30
+ // ── 1. Follow theirs entity order ────────────────────────
31
+ for (const entity of theirsEntities) {
32
+ const merge = mergeMap.get(entity.signature);
33
+ // Emit the gap between the previous entity and this one (whitespace / comments)
34
+ const gap = theirsSource.slice(lastEnd, entity.startByte);
35
+ if (gap)
36
+ parts.push(gap);
37
+ if (merge?.include && merge.mergedText !== null) {
38
+ parts.push(merge.mergedText);
39
+ }
40
+ // If the entity is excluded (deleted / conflicted), we still advance
41
+ // lastEnd to skip over the theirs text for that entity.
42
+ lastEnd = entity.endByte;
43
+ }
44
+ // ── 2. Trailing content after the last theirs entity ─────
45
+ const trailing = theirsSource.slice(lastEnd);
46
+ if (trailing)
47
+ parts.push(trailing);
48
+ // ── 3. Append ours-added entities ────────────────────────
49
+ for (const entity of oursEntities) {
50
+ if (theirsSigSet.has(entity.signature))
51
+ continue; // already handled above
52
+ const merge = mergeMap.get(entity.signature);
53
+ if (!merge?.include || merge.mergedText === null)
54
+ continue;
55
+ // Ensure there's at least one newline separator before the appended entity
56
+ const last = parts[parts.length - 1] ?? "";
57
+ if (last !== "" && !last.endsWith("\n"))
58
+ parts.push("\n");
59
+ parts.push(merge.mergedText);
60
+ }
61
+ return parts.join("");
62
+ }
63
+ //# sourceMappingURL=reconstruct.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconstruct.js","sourceRoot":"","sources":["../../src/structural/reconstruct.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe,CAC7B,MAA2B,EAC3B,cAAgC,EAChC,YAA8B,EAC9B,YAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAErE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,4DAA4D;IAC5D,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE7C,gFAAgF;QAChF,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,GAAG;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEzB,IAAI,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC;QACD,qEAAqE;QACrE,wDAAwD;QAExD,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC3B,CAAC;IAED,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEnC,4DAA4D;IAC5D,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;QAClC,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;YAAE,SAAS,CAAC,wBAAwB;QAE1E,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI;YAAE,SAAS;QAE3D,2EAA2E;QAC3E,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE1D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC"}