@singapore-editor/tree-sitter 0.1.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 (40) hide show
  1. package/README.md +32 -0
  2. package/dist/assets/__vite-browser-external-CMrW8369.js +9 -0
  3. package/dist/assets/__vite-browser-external-CMrW8369.js.map +1 -0
  4. package/dist/assets/treeSitter.worker-D1ozCaGZ.js +5698 -0
  5. package/dist/assets/treeSitter.worker-D1ozCaGZ.js.map +1 -0
  6. package/dist/index.d.ts +34 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +143 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/session.d.ts +89 -0
  11. package/dist/session.d.ts.map +1 -0
  12. package/dist/session.js +437 -0
  13. package/dist/session.js.map +1 -0
  14. package/dist/structuralSelection.d.ts +37 -0
  15. package/dist/structuralSelection.d.ts.map +1 -0
  16. package/dist/structuralSelection.js +139 -0
  17. package/dist/structuralSelection.js.map +1 -0
  18. package/dist/treeSitter/markdown.d.ts +12 -0
  19. package/dist/treeSitter/markdown.d.ts.map +1 -0
  20. package/dist/treeSitter/registry.d.ts +56 -0
  21. package/dist/treeSitter/registry.d.ts.map +1 -0
  22. package/dist/treeSitter/registry.js +144 -0
  23. package/dist/treeSitter/registry.js.map +1 -0
  24. package/dist/treeSitter/source.d.ts +42 -0
  25. package/dist/treeSitter/source.d.ts.map +1 -0
  26. package/dist/treeSitter/source.js +175 -0
  27. package/dist/treeSitter/source.js.map +1 -0
  28. package/dist/treeSitter/sourceChunkRetention.d.ts +30 -0
  29. package/dist/treeSitter/sourceChunkRetention.d.ts.map +1 -0
  30. package/dist/treeSitter/sourceChunkRetention.js +76 -0
  31. package/dist/treeSitter/sourceChunkRetention.js.map +1 -0
  32. package/dist/treeSitter/treeSitter.worker.d.ts +64 -0
  33. package/dist/treeSitter/treeSitter.worker.d.ts.map +1 -0
  34. package/dist/treeSitter/types.d.ts +198 -0
  35. package/dist/treeSitter/types.d.ts.map +1 -0
  36. package/dist/treeSitter/workerClient.d.ts +133 -0
  37. package/dist/treeSitter/workerClient.d.ts.map +1 -0
  38. package/dist/treeSitter/workerClient.js +420 -0
  39. package/dist/treeSitter/workerClient.js.map +1 -0
  40. package/package.json +50 -0
@@ -0,0 +1,34 @@
1
+ export { TreeSitterLanguageRegistry, createTreeSitterLanguageRegistry, isTreeSitterLanguageId, resolveTreeSitterLanguageAlias, resolveTreeSitterLanguageContribution, type TreeSitterLanguageAssets, type TreeSitterLanguageContribution, type TreeSitterLanguageDescriptor, type TreeSitterLanguageDisposable, type TreeSitterLanguageId, type TreeSitterLanguageRegistrationOptions, type TreeSitterLanguageResolver, } from './treeSitter/registry';
2
+ export type { BracketInfo, FoldRange, TreeSitterCapture, TreeSitterError, TreeSitterInjectionInfo, TreeSitterParseResult, TreeSitterPoint, } from './treeSitter/types';
3
+ export { canUseTreeSitterWorker, createTreeSitterWorkerBackend, TreeSitterWorkerClient, type TreeSitterBackend, type TreeSitterEditPayload, type TreeSitterParsePayload, type TreeSitterSelectionPayload, type TreeSitterWorkerCacheSnapshot, type TreeSitterWorkerLifecycleState, type TreeSitterWorkerOwnerSnapshot, } from './treeSitter/workerClient';
4
+ export { createTreeSitterSourceDescriptor, readTreeSitterInputRange, readTreeSitterPieceTableInput, resolveTreeSitterSourceDescriptor, type TreeSitterSourceCache, type TreeSitterSourceDescriptor, } from './treeSitter/source';
5
+ export type { TreeSitterSourceChunkRetentionSnapshot } from './treeSitter/sourceChunkRetention';
6
+ export { TreeSitterSyntaxSession, createTextDiffEdit, createTreeSitterEditPayload, type TreeSitterSyntaxSessionOptions, } from './session';
7
+ export { expandTreeSitterSelection, selectTreeSitterToken, shrinkTreeSitterSelection, type TreeSitterSelectionCommandOptions, type TreeSitterSelectionCommandResult, type TreeSitterSelectionExpansionState, } from './structuralSelection';
8
+ import type { EditorSyntaxProvider } from '@singapore-editor/core/syntax';
9
+ import type { EditorPlugin } from '@singapore-editor/core/extensions';
10
+ import type { TreeSitterLanguageContribution, TreeSitterLanguageDisposable, TreeSitterLanguageId, TreeSitterLanguageRegistrationOptions, TreeSitterLanguageResolver } from './treeSitter/registry';
11
+ import { type TreeSitterBackend } from './treeSitter/workerClient';
12
+ export type TreeSitterSyntaxProviderOptions = {
13
+ readonly backend?: TreeSitterBackend;
14
+ /**
15
+ * Languages to compile ahead of their first document, read each time a document's first parse
16
+ * answers, so the host's set can change (a workspace switch) and paint is never delayed. Each is
17
+ * compiled once with its injection closure; unknown ids and load failures are skipped.
18
+ */
19
+ readonly warmLanguages?: () => readonly TreeSitterLanguageId[];
20
+ };
21
+ export type TreeSitterSyntaxProvider = EditorSyntaxProvider & TreeSitterLanguageResolver & {
22
+ registerLanguage(contribution: TreeSitterLanguageContribution, options?: TreeSitterLanguageRegistrationOptions): TreeSitterLanguageDisposable;
23
+ };
24
+ export type TreeSitterLanguagePluginOptions = TreeSitterLanguageRegistrationOptions & {
25
+ readonly name?: string;
26
+ };
27
+ export type TreeSitterSyntaxPluginOptions = {
28
+ readonly name?: string;
29
+ };
30
+ export declare const createTreeSitterSyntaxProvider: (options?: TreeSitterSyntaxProviderOptions) => TreeSitterSyntaxProvider;
31
+ export declare const createTreeSitterLanguagePlugin: (contributions: readonly TreeSitterLanguageContribution[], options?: TreeSitterLanguagePluginOptions) => EditorPlugin;
32
+ /** Registers an already-configured provider with an editor without constructing another backend. */
33
+ export declare const createTreeSitterSyntaxPlugin: (provider: TreeSitterSyntaxProvider, options?: TreeSitterSyntaxPluginOptions) => EditorPlugin;
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,gCAAgC,EAChC,sBAAsB,EACtB,8BAA8B,EAC9B,qCAAqC,EACrC,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,EACnC,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,EACjC,KAAK,oBAAoB,EACzB,KAAK,qCAAqC,EAC1C,KAAK,0BAA0B,GAChC,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EACV,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,sBAAsB,EACtB,6BAA6B,EAC7B,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EAClC,KAAK,8BAA8B,EACnC,KAAK,6BAA6B,GACnC,MAAM,2BAA2B,CAAA;AAClC,OAAO,EACL,gCAAgC,EAChC,wBAAwB,EACxB,6BAA6B,EAC7B,iCAAiC,EACjC,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,GAChC,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,sCAAsC,EAAE,MAAM,mCAAmC,CAAA;AAC/F,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,2BAA2B,EAC3B,KAAK,8BAA8B,GACpC,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,yBAAyB,EACzB,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,EACrC,KAAK,iCAAiC,GACvC,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACzE,OAAO,KAAK,EAEV,YAAY,EAEb,MAAM,mCAAmC,CAAA;AAC1C,OAAO,KAAK,EAEV,8BAA8B,EAE9B,4BAA4B,EAC5B,oBAAoB,EACpB,qCAAqC,EACrC,0BAA0B,EAC3B,MAAM,uBAAuB,CAAA;AAI9B,OAAO,EAAiC,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAEjG,MAAM,MAAM,+BAA+B,GAAG;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAA;IACpC;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,SAAS,oBAAoB,EAAE,CAAA;CAC/D,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG,oBAAoB,GACzD,0BAA0B,GAAG;IAC3B,gBAAgB,CACd,YAAY,EAAE,8BAA8B,EAC5C,OAAO,CAAC,EAAE,qCAAqC,GAC9C,4BAA4B,CAAA;CAChC,CAAA;AAEH,MAAM,MAAM,+BAA+B,GAAG,qCAAqC,GAAG;IACpF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAsBD,eAAO,MAAM,8BAA8B,GACzC,UAAS,+BAAoC,KAC5C,wBAmCF,CAAA;AAuBD,eAAO,MAAM,8BAA8B,GACzC,eAAe,SAAS,8BAA8B,EAAE,EACxD,UAAS,+BAAoC,KAC5C,YASD,CAAA;AAEF,oGAAoG;AACpG,eAAO,MAAM,4BAA4B,GACvC,UAAU,wBAAwB,EAClC,UAAS,6BAAkC,KAC1C,YAGD,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,143 @@
1
+ import { TreeSitterLanguageRegistry, createTreeSitterLanguageRegistry, isTreeSitterLanguageId, resolveTreeSitterLanguageAlias, resolveTreeSitterLanguageClosure, resolveTreeSitterLanguageContribution } from "./treeSitter/registry.js";
2
+ import { createTreeSitterSourceDescriptor, readTreeSitterInputRange, readTreeSitterPieceTableInput, resolveTreeSitterSourceDescriptor } from "./treeSitter/source.js";
3
+ import { TreeSitterWorkerClient, canUseTreeSitterWorker, createTreeSitterWorkerBackend } from "./treeSitter/workerClient.js";
4
+ import { TreeSitterSyntaxSession, createTextDiffEdit, createTreeSitterEditPayload } from "./session.js";
5
+ import { expandTreeSitterSelection, selectTreeSitterToken, shrinkTreeSitterSelection, treeSitterSelectionRanges } from "./structuralSelection.js";
6
+ //#region src/index.ts
7
+ var DEFAULT_TREE_SITTER_PROVIDER_KEY = Symbol.for("@singapore-editor/tree-sitter/default-provider");
8
+ var createTreeSitterSyntaxProvider = (options = {}) => {
9
+ const registry = new TreeSitterLanguageRegistry();
10
+ const backend = options.backend ?? createTreeSitterWorkerBackend();
11
+ let warmedKey = null;
12
+ const warm = () => {
13
+ const languageIds = options.warmLanguages?.() ?? [];
14
+ const key = languageIds.join("\n");
15
+ if (languageIds.length === 0 || key === warmedKey) return;
16
+ warmedKey = key;
17
+ warmTreeSitterLanguages(registry, backend, languageIds);
18
+ };
19
+ return {
20
+ createSession: (sessionOptions) => {
21
+ if (!sessionOptions.languageId) return null;
22
+ return new TreeSitterSyntaxSession({
23
+ ...sessionOptions,
24
+ languageId: sessionOptions.languageId,
25
+ languageResolver: registry,
26
+ backend,
27
+ onFirstParse: warm
28
+ });
29
+ },
30
+ registerLanguage: (contribution, registrationOptions) => {
31
+ const registration = registry.registerLanguage(contribution, registrationOptions);
32
+ warmedKey = null;
33
+ return { dispose: () => {
34
+ registration.dispose();
35
+ warmedKey = null;
36
+ } };
37
+ },
38
+ resolveTreeSitterLanguage: (languageId) => registry.resolveTreeSitterLanguage(languageId)
39
+ };
40
+ };
41
+ var warmTreeSitterLanguages = async (resolver, backend, languageIds) => {
42
+ if (!backend.warmLanguages) return;
43
+ const closures = await Promise.allSettled(languageIds.map((languageId) => resolveTreeSitterLanguageClosure(resolver, languageId)));
44
+ const descriptors = /* @__PURE__ */ new Map();
45
+ for (const closure of closures) {
46
+ if (closure.status === "rejected") continue;
47
+ for (const descriptor of closure.value) if (!descriptors.has(descriptor.id)) descriptors.set(descriptor.id, descriptor);
48
+ }
49
+ await backend.warmLanguages([...descriptors.values()]).catch(() => void 0);
50
+ };
51
+ var createTreeSitterLanguagePlugin = (contributions, options = {}) => ({
52
+ name: options.name ?? "tree-sitter-languages",
53
+ activate(context) {
54
+ const registration = defaultProviderRegistration();
55
+ return [retainSyntaxProvider(context, registration), ...contributions.map((contribution) => retainLanguage(registration, contribution))];
56
+ }
57
+ });
58
+ /** Registers an already-configured provider with an editor without constructing another backend. */
59
+ var createTreeSitterSyntaxPlugin = (provider, options = {}) => ({
60
+ name: options.name ?? "tree-sitter-syntax",
61
+ activate: (context) => contributeToEditor(context, provider)
62
+ });
63
+ var defaultProviderRegistration = () => {
64
+ const state = globalThis;
65
+ const existing = state[DEFAULT_TREE_SITTER_PROVIDER_KEY];
66
+ if (existing) return existing;
67
+ const registration = {
68
+ provider: createTreeSitterSyntaxProvider(),
69
+ contextReferences: /* @__PURE__ */ new WeakMap(),
70
+ languageReferences: /* @__PURE__ */ new Map()
71
+ };
72
+ state[DEFAULT_TREE_SITTER_PROVIDER_KEY] = registration;
73
+ return registration;
74
+ };
75
+ var retainSyntaxProvider = (context, registration) => {
76
+ const existing = registration.contextReferences.get(context);
77
+ if (existing) {
78
+ existing.references += 1;
79
+ return { dispose: () => releaseSyntaxProvider(context, registration) };
80
+ }
81
+ registration.contextReferences.set(context, {
82
+ contributions: contributeToEditor(context, registration.provider),
83
+ references: 1
84
+ });
85
+ return { dispose: () => releaseSyntaxProvider(context, registration) };
86
+ };
87
+ var contributeToEditor = (context, provider) => {
88
+ return [context.registerSyntaxProvider(provider), context.registerSelectionRangeProvider((selection) => treeSitterSelectionRanges(selection.folds))];
89
+ };
90
+ var retainLanguage = (registration, contribution) => {
91
+ const key = languageRegistrationKey(contribution);
92
+ const existing = registration.languageReferences.get(key);
93
+ if (existing) {
94
+ existing.references += 1;
95
+ return { dispose: () => releaseLanguage(registration, key) };
96
+ }
97
+ registration.languageReferences.set(key, {
98
+ disposable: registration.provider.registerLanguage(contribution, { replace: true }),
99
+ references: 1
100
+ });
101
+ return { dispose: () => releaseLanguage(registration, key) };
102
+ };
103
+ var releaseSyntaxProvider = (context, registration) => {
104
+ const reference = registration.contextReferences.get(context);
105
+ if (!reference) return;
106
+ reference.references -= 1;
107
+ if (reference.references > 0) return;
108
+ for (const contribution of reference.contributions.toReversed()) contribution.dispose();
109
+ registration.contextReferences.delete(context);
110
+ };
111
+ var releaseLanguage = (registration, key) => {
112
+ const reference = registration.languageReferences.get(key);
113
+ if (!reference) return;
114
+ reference.references -= 1;
115
+ if (reference.references > 0) return;
116
+ reference.disposable.dispose();
117
+ registration.languageReferences.delete(key);
118
+ };
119
+ var languageRegistrationKey = (contribution) => JSON.stringify({
120
+ aliases: sortedItems(contribution.aliases),
121
+ assets: inlineAssetSignature(contribution),
122
+ extensions: sortedItems(contribution.extensions),
123
+ id: contribution.id,
124
+ loader: lazyLoaderSignature(contribution)
125
+ });
126
+ var lazyLoaderSignature = (contribution) => {
127
+ if (!("load" in contribution)) return null;
128
+ return contribution.load?.toString() ?? null;
129
+ };
130
+ var inlineAssetSignature = (contribution) => {
131
+ if ("load" in contribution) return null;
132
+ return {
133
+ foldQuerySource: contribution.foldQuerySource,
134
+ highlightQuerySource: contribution.highlightQuerySource,
135
+ injectionQuerySource: contribution.injectionQuerySource,
136
+ wasmUrl: contribution.wasmUrl
137
+ };
138
+ };
139
+ var sortedItems = (items) => (items ?? []).toSorted();
140
+ //#endregion
141
+ export { TreeSitterLanguageRegistry, TreeSitterSyntaxSession, TreeSitterWorkerClient, canUseTreeSitterWorker, createTextDiffEdit, createTreeSitterEditPayload, createTreeSitterLanguagePlugin, createTreeSitterLanguageRegistry, createTreeSitterSourceDescriptor, createTreeSitterSyntaxPlugin, createTreeSitterSyntaxProvider, createTreeSitterWorkerBackend, expandTreeSitterSelection, isTreeSitterLanguageId, readTreeSitterInputRange, readTreeSitterPieceTableInput, resolveTreeSitterLanguageAlias, resolveTreeSitterLanguageContribution, resolveTreeSitterSourceDescriptor, selectTreeSitterToken, shrinkTreeSitterSelection };
142
+
143
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export {\n TreeSitterLanguageRegistry,\n createTreeSitterLanguageRegistry,\n isTreeSitterLanguageId,\n resolveTreeSitterLanguageAlias,\n resolveTreeSitterLanguageContribution,\n type TreeSitterLanguageAssets,\n type TreeSitterLanguageContribution,\n type TreeSitterLanguageDescriptor,\n type TreeSitterLanguageDisposable,\n type TreeSitterLanguageId,\n type TreeSitterLanguageRegistrationOptions,\n type TreeSitterLanguageResolver,\n} from './treeSitter/registry'\nexport type {\n BracketInfo,\n FoldRange,\n TreeSitterCapture,\n TreeSitterError,\n TreeSitterInjectionInfo,\n TreeSitterParseResult,\n TreeSitterPoint,\n} from './treeSitter/types'\nexport {\n canUseTreeSitterWorker,\n createTreeSitterWorkerBackend,\n TreeSitterWorkerClient,\n type TreeSitterBackend,\n type TreeSitterEditPayload,\n type TreeSitterParsePayload,\n type TreeSitterSelectionPayload,\n type TreeSitterWorkerCacheSnapshot,\n type TreeSitterWorkerLifecycleState,\n type TreeSitterWorkerOwnerSnapshot,\n} from './treeSitter/workerClient'\nexport {\n createTreeSitterSourceDescriptor,\n readTreeSitterInputRange,\n readTreeSitterPieceTableInput,\n resolveTreeSitterSourceDescriptor,\n type TreeSitterSourceCache,\n type TreeSitterSourceDescriptor,\n} from './treeSitter/source'\nexport type { TreeSitterSourceChunkRetentionSnapshot } from './treeSitter/sourceChunkRetention'\nexport {\n TreeSitterSyntaxSession,\n createTextDiffEdit,\n createTreeSitterEditPayload,\n type TreeSitterSyntaxSessionOptions,\n} from './session'\nexport {\n expandTreeSitterSelection,\n selectTreeSitterToken,\n shrinkTreeSitterSelection,\n type TreeSitterSelectionCommandOptions,\n type TreeSitterSelectionCommandResult,\n type TreeSitterSelectionExpansionState,\n} from './structuralSelection'\nimport type { EditorSyntaxProvider } from '@singapore-editor/core/syntax'\nimport type {\n EditorDisposable,\n EditorPlugin,\n EditorPluginContext,\n} from '@singapore-editor/core/extensions'\nimport type {\n TreeSitterLanguageAssets,\n TreeSitterLanguageContribution,\n TreeSitterLanguageDescriptor,\n TreeSitterLanguageDisposable,\n TreeSitterLanguageId,\n TreeSitterLanguageRegistrationOptions,\n TreeSitterLanguageResolver,\n} from './treeSitter/registry'\nimport { TreeSitterLanguageRegistry, resolveTreeSitterLanguageClosure } from './treeSitter/registry'\nimport { TreeSitterSyntaxSession } from './session'\nimport { treeSitterSelectionRanges } from './structuralSelection'\nimport { createTreeSitterWorkerBackend, type TreeSitterBackend } from './treeSitter/workerClient'\n\nexport type TreeSitterSyntaxProviderOptions = {\n readonly backend?: TreeSitterBackend\n /**\n * Languages to compile ahead of their first document, read each time a document's first parse\n * answers, so the host's set can change (a workspace switch) and paint is never delayed. Each is\n * compiled once with its injection closure; unknown ids and load failures are skipped.\n */\n readonly warmLanguages?: () => readonly TreeSitterLanguageId[]\n}\n\nexport type TreeSitterSyntaxProvider = EditorSyntaxProvider &\n TreeSitterLanguageResolver & {\n registerLanguage(\n contribution: TreeSitterLanguageContribution,\n options?: TreeSitterLanguageRegistrationOptions,\n ): TreeSitterLanguageDisposable\n }\n\nexport type TreeSitterLanguagePluginOptions = TreeSitterLanguageRegistrationOptions & {\n readonly name?: string\n}\n\nexport type TreeSitterSyntaxPluginOptions = {\n readonly name?: string\n}\n\ntype TreeSitterProviderRegistration = {\n readonly provider: TreeSitterSyntaxProvider\n readonly contextReferences: WeakMap<EditorPluginContext, TreeSitterContextReference>\n readonly languageReferences: Map<string, TreeSitterLanguageReference>\n}\n\ntype TreeSitterContextReference = {\n contributions: readonly EditorDisposable[]\n references: number\n}\n\ntype TreeSitterLanguageReference = {\n disposable: TreeSitterLanguageDisposable\n references: number\n}\n\nconst DEFAULT_TREE_SITTER_PROVIDER_KEY = Symbol.for(\n '@singapore-editor/tree-sitter/default-provider',\n)\n\nexport const createTreeSitterSyntaxProvider = (\n options: TreeSitterSyntaxProviderOptions = {},\n): TreeSitterSyntaxProvider => {\n const registry = new TreeSitterLanguageRegistry()\n const backend = options.backend ?? createTreeSitterWorkerBackend()\n let warmedKey: string | null = null\n const warm = () => {\n const languageIds = options.warmLanguages?.() ?? []\n const key = languageIds.join('\\n')\n if (languageIds.length === 0 || key === warmedKey) return\n warmedKey = key\n void warmTreeSitterLanguages(registry, backend, languageIds)\n }\n\n return {\n createSession: (sessionOptions) => {\n if (!sessionOptions.languageId) return null\n return new TreeSitterSyntaxSession({\n ...sessionOptions,\n languageId: sessionOptions.languageId,\n languageResolver: registry,\n backend,\n onFirstParse: warm,\n })\n },\n registerLanguage: (contribution, registrationOptions) => {\n const registration = registry.registerLanguage(contribution, registrationOptions)\n warmedKey = null\n return {\n dispose: () => {\n registration.dispose()\n warmedKey = null\n },\n }\n },\n resolveTreeSitterLanguage: (languageId) => registry.resolveTreeSitterLanguage(languageId),\n }\n}\n\nconst warmTreeSitterLanguages = async (\n resolver: TreeSitterLanguageResolver,\n backend: TreeSitterBackend,\n languageIds: readonly TreeSitterLanguageId[],\n): Promise<void> => {\n if (!backend.warmLanguages) return\n\n const closures = await Promise.allSettled(\n languageIds.map((languageId) => resolveTreeSitterLanguageClosure(resolver, languageId)),\n )\n const descriptors = new Map<TreeSitterLanguageId, TreeSitterLanguageDescriptor>()\n for (const closure of closures) {\n if (closure.status === 'rejected') continue\n for (const descriptor of closure.value) {\n if (!descriptors.has(descriptor.id)) descriptors.set(descriptor.id, descriptor)\n }\n }\n // Best effort: a worker that cannot start fails the first document too, which reports it.\n await backend.warmLanguages([...descriptors.values()]).catch(() => undefined)\n}\n\nexport const createTreeSitterLanguagePlugin = (\n contributions: readonly TreeSitterLanguageContribution[],\n options: TreeSitterLanguagePluginOptions = {},\n): EditorPlugin => ({\n name: options.name ?? 'tree-sitter-languages',\n activate(context) {\n const registration = defaultProviderRegistration()\n return [\n retainSyntaxProvider(context, registration),\n ...contributions.map((contribution) => retainLanguage(registration, contribution)),\n ]\n },\n})\n\n/** Registers an already-configured provider with an editor without constructing another backend. */\nexport const createTreeSitterSyntaxPlugin = (\n provider: TreeSitterSyntaxProvider,\n options: TreeSitterSyntaxPluginOptions = {},\n): EditorPlugin => ({\n name: options.name ?? 'tree-sitter-syntax',\n activate: (context) => contributeToEditor(context, provider),\n})\n\nconst defaultProviderRegistration = (): TreeSitterProviderRegistration => {\n const state = globalThis as Record<PropertyKey, unknown>\n const existing = state[DEFAULT_TREE_SITTER_PROVIDER_KEY] as\n | TreeSitterProviderRegistration\n | undefined\n if (existing) return existing\n\n const registration = {\n provider: createTreeSitterSyntaxProvider(),\n contextReferences: new WeakMap<EditorPluginContext, TreeSitterContextReference>(),\n languageReferences: new Map<string, TreeSitterLanguageReference>(),\n }\n state[DEFAULT_TREE_SITTER_PROVIDER_KEY] = registration\n return registration\n}\n\nconst retainSyntaxProvider = (\n context: EditorPluginContext,\n registration: TreeSitterProviderRegistration,\n): EditorDisposable => {\n const existing = registration.contextReferences.get(context)\n if (existing) {\n existing.references += 1\n return { dispose: () => releaseSyntaxProvider(context, registration) }\n }\n\n registration.contextReferences.set(context, {\n contributions: contributeToEditor(context, registration.provider),\n references: 1,\n })\n return {\n dispose: () => releaseSyntaxProvider(context, registration),\n }\n}\n\nconst contributeToEditor = (\n context: EditorPluginContext,\n provider: TreeSitterSyntaxProvider,\n): readonly EditorDisposable[] => {\n return [\n context.registerSyntaxProvider(provider),\n context.registerSelectionRangeProvider((selection) =>\n treeSitterSelectionRanges(selection.folds),\n ),\n ]\n}\n\nconst retainLanguage = (\n registration: TreeSitterProviderRegistration,\n contribution: TreeSitterLanguageContribution,\n): EditorDisposable => {\n const key = languageRegistrationKey(contribution)\n const existing = registration.languageReferences.get(key)\n if (existing) {\n existing.references += 1\n return { dispose: () => releaseLanguage(registration, key) }\n }\n\n registration.languageReferences.set(key, {\n disposable: registration.provider.registerLanguage(contribution, { replace: true }),\n references: 1,\n })\n return { dispose: () => releaseLanguage(registration, key) }\n}\n\nconst releaseSyntaxProvider = (\n context: EditorPluginContext,\n registration: TreeSitterProviderRegistration,\n): void => {\n const reference = registration.contextReferences.get(context)\n if (!reference) return\n\n reference.references -= 1\n if (reference.references > 0) return\n\n for (const contribution of reference.contributions.toReversed()) contribution.dispose()\n registration.contextReferences.delete(context)\n}\n\nconst releaseLanguage = (registration: TreeSitterProviderRegistration, key: string): void => {\n const reference = registration.languageReferences.get(key)\n if (!reference) return\n\n reference.references -= 1\n if (reference.references > 0) return\n\n reference.disposable.dispose()\n registration.languageReferences.delete(key)\n}\n\nconst languageRegistrationKey = (contribution: TreeSitterLanguageContribution): string =>\n JSON.stringify({\n aliases: sortedItems(contribution.aliases),\n assets: inlineAssetSignature(contribution),\n extensions: sortedItems(contribution.extensions),\n id: contribution.id,\n loader: lazyLoaderSignature(contribution),\n })\n\nconst lazyLoaderSignature = (contribution: TreeSitterLanguageContribution): string | null => {\n if (!('load' in contribution)) return null\n\n return contribution.load?.toString() ?? null\n}\n\nconst inlineAssetSignature = (\n contribution: TreeSitterLanguageContribution,\n): TreeSitterLanguageAssets | null => {\n if ('load' in contribution) return null\n\n return {\n foldQuerySource: contribution.foldQuerySource,\n highlightQuerySource: contribution.highlightQuerySource,\n injectionQuerySource: contribution.injectionQuerySource,\n wasmUrl: contribution.wasmUrl,\n }\n}\n\nconst sortedItems = (items: readonly string[] | undefined): readonly string[] =>\n (items ?? []).toSorted()\n"],"mappings":";;;;;;AAwHA,IAAM,mCAAmC,OAAO,IAC9C,gDACF;AAEA,IAAa,kCACX,UAA2C,CAAC,MACf;CAC7B,MAAM,WAAW,IAAI,2BAA2B;CAChD,MAAM,UAAU,QAAQ,WAAW,8BAA8B;CACjE,IAAI,YAA2B;CAC/B,MAAM,aAAa;EACjB,MAAM,cAAc,QAAQ,gBAAgB,KAAK,CAAC;EAClD,MAAM,MAAM,YAAY,KAAK,IAAI;EACjC,IAAI,YAAY,WAAW,KAAK,QAAQ,WAAW;EACnD,YAAY;EACZ,wBAA6B,UAAU,SAAS,WAAW;CAC7D;CAEA,OAAO;EACL,gBAAgB,mBAAmB;GACjC,IAAI,CAAC,eAAe,YAAY,OAAO;GACvC,OAAO,IAAI,wBAAwB;IACjC,GAAG;IACH,YAAY,eAAe;IAC3B,kBAAkB;IAClB;IACA,cAAc;GAChB,CAAC;EACH;EACA,mBAAmB,cAAc,wBAAwB;GACvD,MAAM,eAAe,SAAS,iBAAiB,cAAc,mBAAmB;GAChF,YAAY;GACZ,OAAO,EACL,eAAe;IACb,aAAa,QAAQ;IACrB,YAAY;GACd,EACF;EACF;EACA,4BAA4B,eAAe,SAAS,0BAA0B,UAAU;CAC1F;AACF;AAEA,IAAM,0BAA0B,OAC9B,UACA,SACA,gBACkB;CAClB,IAAI,CAAC,QAAQ,eAAe;CAE5B,MAAM,WAAW,MAAM,QAAQ,WAC7B,YAAY,KAAK,eAAe,iCAAiC,UAAU,UAAU,CAAC,CACxF;CACA,MAAM,8BAAc,IAAI,IAAwD;CAChF,KAAK,MAAM,WAAW,UAAU;EAC9B,IAAI,QAAQ,WAAW,YAAY;EACnC,KAAK,MAAM,cAAc,QAAQ,OAC/B,IAAI,CAAC,YAAY,IAAI,WAAW,EAAE,GAAG,YAAY,IAAI,WAAW,IAAI,UAAU;CAElF;CAEA,MAAM,QAAQ,cAAc,CAAC,GAAG,YAAY,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,KAAA,CAAS;AAC9E;AAEA,IAAa,kCACX,eACA,UAA2C,CAAC,OAC1B;CAClB,MAAM,QAAQ,QAAQ;CACtB,SAAS,SAAS;EAChB,MAAM,eAAe,4BAA4B;EACjD,OAAO,CACL,qBAAqB,SAAS,YAAY,GAC1C,GAAG,cAAc,KAAK,iBAAiB,eAAe,cAAc,YAAY,CAAC,CACnF;CACF;AACF;;AAGA,IAAa,gCACX,UACA,UAAyC,CAAC,OACxB;CAClB,MAAM,QAAQ,QAAQ;CACtB,WAAW,YAAY,mBAAmB,SAAS,QAAQ;AAC7D;AAEA,IAAM,oCAAoE;CACxE,MAAM,QAAQ;CACd,MAAM,WAAW,MAAM;CAGvB,IAAI,UAAU,OAAO;CAErB,MAAM,eAAe;EACnB,UAAU,+BAA+B;EACzC,mCAAmB,IAAI,QAAyD;EAChF,oCAAoB,IAAI,IAAyC;CACnE;CACA,MAAM,oCAAoC;CAC1C,OAAO;AACT;AAEA,IAAM,wBACJ,SACA,iBACqB;CACrB,MAAM,WAAW,aAAa,kBAAkB,IAAI,OAAO;CAC3D,IAAI,UAAU;EACZ,SAAS,cAAc;EACvB,OAAO,EAAE,eAAe,sBAAsB,SAAS,YAAY,EAAE;CACvE;CAEA,aAAa,kBAAkB,IAAI,SAAS;EAC1C,eAAe,mBAAmB,SAAS,aAAa,QAAQ;EAChE,YAAY;CACd,CAAC;CACD,OAAO,EACL,eAAe,sBAAsB,SAAS,YAAY,EAC5D;AACF;AAEA,IAAM,sBACJ,SACA,aACgC;CAChC,OAAO,CACL,QAAQ,uBAAuB,QAAQ,GACvC,QAAQ,gCAAgC,cACtC,0BAA0B,UAAU,KAAK,CAC3C,CACF;AACF;AAEA,IAAM,kBACJ,cACA,iBACqB;CACrB,MAAM,MAAM,wBAAwB,YAAY;CAChD,MAAM,WAAW,aAAa,mBAAmB,IAAI,GAAG;CACxD,IAAI,UAAU;EACZ,SAAS,cAAc;EACvB,OAAO,EAAE,eAAe,gBAAgB,cAAc,GAAG,EAAE;CAC7D;CAEA,aAAa,mBAAmB,IAAI,KAAK;EACvC,YAAY,aAAa,SAAS,iBAAiB,cAAc,EAAE,SAAS,KAAK,CAAC;EAClF,YAAY;CACd,CAAC;CACD,OAAO,EAAE,eAAe,gBAAgB,cAAc,GAAG,EAAE;AAC7D;AAEA,IAAM,yBACJ,SACA,iBACS;CACT,MAAM,YAAY,aAAa,kBAAkB,IAAI,OAAO;CAC5D,IAAI,CAAC,WAAW;CAEhB,UAAU,cAAc;CACxB,IAAI,UAAU,aAAa,GAAG;CAE9B,KAAK,MAAM,gBAAgB,UAAU,cAAc,WAAW,GAAG,aAAa,QAAQ;CACtF,aAAa,kBAAkB,OAAO,OAAO;AAC/C;AAEA,IAAM,mBAAmB,cAA8C,QAAsB;CAC3F,MAAM,YAAY,aAAa,mBAAmB,IAAI,GAAG;CACzD,IAAI,CAAC,WAAW;CAEhB,UAAU,cAAc;CACxB,IAAI,UAAU,aAAa,GAAG;CAE9B,UAAU,WAAW,QAAQ;CAC7B,aAAa,mBAAmB,OAAO,GAAG;AAC5C;AAEA,IAAM,2BAA2B,iBAC/B,KAAK,UAAU;CACb,SAAS,YAAY,aAAa,OAAO;CACzC,QAAQ,qBAAqB,YAAY;CACzC,YAAY,YAAY,aAAa,UAAU;CAC/C,IAAI,aAAa;CACjB,QAAQ,oBAAoB,YAAY;AAC1C,CAAC;AAEH,IAAM,uBAAuB,iBAAgE;CAC3F,IAAI,EAAE,UAAU,eAAe,OAAO;CAEtC,OAAO,aAAa,MAAM,SAAS,KAAK;AAC1C;AAEA,IAAM,wBACJ,iBACoC;CACpC,IAAI,UAAU,cAAc,OAAO;CAEnC,OAAO;EACL,iBAAiB,aAAa;EAC9B,sBAAsB,aAAa;EACnC,sBAAsB,aAAa;EACnC,SAAS,aAAa;CACxB;AACF;AAEA,IAAM,eAAe,WAClB,SAAS,CAAC,EAAA,CAAG,SAAS"}
@@ -0,0 +1,89 @@
1
+ import { type DocumentSessionChange, type DocumentTextSnapshot, type PieceTableSnapshot, type TextEdit } from '@singapore-editor/core/document';
2
+ import { type EditorSyntaxRange, type EditorSyntaxResult, type EditorSyntaxSession, type EditorSyntaxFoldingSupport } from '@singapore-editor/core/syntax';
3
+ import type { TreeSitterLanguageId } from './treeSitter/types';
4
+ import { type TreeSitterLanguageResolver } from './treeSitter/registry';
5
+ import { type TreeSitterBackend, type TreeSitterBackendEditPayload, type TreeSitterEditPayload } from './treeSitter/workerClient';
6
+ export type TreeSitterSyntaxSessionOptions = {
7
+ readonly documentId: string;
8
+ readonly runtimeSessionId?: string;
9
+ readonly languageId: TreeSitterLanguageId;
10
+ readonly languageResolver?: TreeSitterLanguageResolver;
11
+ readonly foldingSupport?: Exclude<EditorSyntaxFoldingSupport, 'pending'>;
12
+ readonly includeHighlights?: boolean;
13
+ readonly includeCaptures?: boolean;
14
+ readonly syntaxMode?: 'full' | 'range';
15
+ readonly textSnapshot: DocumentTextSnapshot;
16
+ readonly snapshot: PieceTableSnapshot;
17
+ readonly backend?: TreeSitterBackend;
18
+ /** Called once, after the session's first parse answers. */
19
+ readonly onFirstParse?: () => void;
20
+ };
21
+ export declare class TreeSitterSyntaxSession implements EditorSyntaxSession {
22
+ private readonly documentId;
23
+ private runtimeSessionId;
24
+ private readonly languageId;
25
+ private readonly languageResolver;
26
+ private readonly includeHighlights;
27
+ private readonly includeCaptures;
28
+ private readonly syntaxMode;
29
+ private readonly backend;
30
+ private snapshotVersion;
31
+ private parsedSnapshotVersion;
32
+ private textSnapshot;
33
+ private snapshot;
34
+ private result;
35
+ private currentFoldingSupport;
36
+ private languageRegistrationPromise;
37
+ private readonly pendingLanguages;
38
+ private disposed;
39
+ private onFirstParse;
40
+ constructor(options: TreeSitterSyntaxSessionOptions);
41
+ get foldingSupport(): EditorSyntaxFoldingSupport;
42
+ refresh(textSnapshot: DocumentTextSnapshot): Promise<EditorSyntaxResult>;
43
+ private notifyFirstParse;
44
+ applyChange(change: DocumentSessionChange): Promise<EditorSyntaxResult>;
45
+ queryRange(range: EditorSyntaxRange): Promise<EditorSyntaxResult>;
46
+ canQueryRange(): boolean;
47
+ getResult(): EditorSyntaxResult;
48
+ getTokens(): EditorSyntaxResult['tokens'];
49
+ getSnapshotVersion(): number;
50
+ dispose(): void;
51
+ private applyIncrementalEdit;
52
+ private reparseAfterIncrementalFailure;
53
+ private isCurrentSnapshotVersion;
54
+ private ensureLanguageRegistered;
55
+ private registerResolvedLanguage;
56
+ private registerMissingLanguages;
57
+ private resolveLanguageDependencies;
58
+ private updateFromUnavailableLanguage;
59
+ private updateFromTreeSitterResult;
60
+ private updateFromTreeSitterRangeResult;
61
+ private createRangeUnavailableResult;
62
+ private createEmptyResult;
63
+ private resultContext;
64
+ private languageConfiguration;
65
+ private snapshotTag;
66
+ }
67
+ type TreeSitterBaseEditPayloadOptions = {
68
+ readonly documentId: string;
69
+ readonly runtimeSessionId: string;
70
+ readonly languageId: TreeSitterLanguageId;
71
+ readonly previousSnapshotVersion: number;
72
+ readonly snapshotVersion: number;
73
+ readonly previousSnapshot: PieceTableSnapshot;
74
+ readonly nextSnapshot: PieceTableSnapshot;
75
+ readonly edits: readonly TextEdit[];
76
+ readonly includeHighlights?: boolean;
77
+ readonly includeCaptures?: boolean;
78
+ };
79
+ type TreeSitterEditPayloadOptions = TreeSitterBaseEditPayloadOptions & {
80
+ readonly resultMode?: 'full';
81
+ };
82
+ type TreeSitterParseOnlyEditPayloadOptions = TreeSitterBaseEditPayloadOptions & {
83
+ readonly resultMode: 'parseOnly';
84
+ };
85
+ export declare function createTreeSitterEditPayload(options: TreeSitterParseOnlyEditPayloadOptions): TreeSitterBackendEditPayload | null;
86
+ export declare function createTreeSitterEditPayload(options: TreeSitterEditPayloadOptions): TreeSitterEditPayload | null;
87
+ export declare const createTextDiffEdit: (previousText: string, nextText: string) => TextEdit | null;
88
+ export {};
89
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}