@kalada/codemirror 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/editor-presentation.ts","../src/editor-requests.ts","../src/editor-validation.ts","../src/line-separator.ts","../src/tooltip-state.ts","../src/editor-tooling.ts","../src/editor-session.ts"],"names":["Transaction","ViewPlugin","keymap"],"mappings":"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","file":"chunk-GCHU6EL7.js","sourcesContent":["import type { Tooltip } from \"@codemirror/view\";\nimport type { EditorHover } from \"./editor-contracts.js\";\n\nexport function editorTooltip(hover: EditorHover, from: number, to: number): Tooltip {\n return {\n pos: from,\n end: to,\n above: true,\n create(view) {\n const document = view.dom.ownerDocument;\n const dom = document.createElement(\"section\");\n dom.className = \"cm-editor-hover\";\n dom.setAttribute(\"role\", \"tooltip\");\n if (typeof hover.content === \"string\") dom.textContent = hover.content;\n else for (const section of hover.content) appendSection(document, dom, section);\n return { dom };\n },\n };\n}\n\nfunction appendSection(\n document: Document,\n dom: HTMLElement,\n section: { readonly heading: string; readonly text: readonly string[] },\n): void {\n const heading = document.createElement(\"strong\");\n heading.textContent = section.heading;\n dom.append(heading);\n const list = document.createElement(\"ul\");\n for (const text of section.text.length ? section.text : [\"None\"]) {\n const item = document.createElement(\"li\");\n item.textContent = text;\n list.append(item);\n }\n dom.append(list);\n}\n","import type {\n EditorIdentity,\n EditorRequest,\n EditorResponse,\n EditorResult,\n EditorSnapshot,\n} from \"./editor-contracts.js\";\n\nexport type RequestKind = \"diagnostics\" | \"completion\" | \"hover\" | \"format\";\nexport interface RequestTicket extends EditorRequest {\n readonly current: () => boolean;\n readonly settle: () => void;\n}\n\n/** One latest request per feature; invalidation also covers environment/view lifetime. */\nexport class EditorRequests {\n private readonly pending = new Map<RequestKind, AbortController>();\n // Published completion edits remain guarded until supersession, not just settlement.\n private readonly latest = new Map<RequestKind, AbortController>();\n private generation = 0;\n\n start(\n kind: RequestKind,\n snapshot: EditorSnapshot,\n current: () => EditorSnapshot,\n alive: () => boolean,\n ): RequestTicket {\n const previous = this.pending.get(kind);\n const controller = new AbortController();\n this.pending.set(kind, controller);\n this.latest.set(kind, controller);\n const generation = this.generation;\n // Publish ownership before abort listeners can synchronously reenter the registry.\n previous?.abort();\n return {\n snapshot,\n signal: controller.signal,\n settle: () => {\n if (this.pending.get(kind) === controller) this.pending.delete(kind);\n },\n current: () =>\n !controller.signal.aborted &&\n this.latest.get(kind) === controller &&\n generation === this.generation &&\n alive() &&\n sameIdentity(snapshot, current()),\n };\n }\n\n invalidate(): void {\n this.generation += 1;\n const controllers = [...this.pending.values()];\n this.pending.clear();\n this.latest.clear();\n for (const controller of controllers) controller.abort();\n }\n}\n\nexport function sameIdentity(a: EditorIdentity, b: EditorIdentity): boolean {\n return (\n !!a &&\n a.uri === b.uri &&\n a.version === b.version &&\n a.environmentGeneration === b.environmentGeneration\n );\n}\n\nexport function resolveResponse<T, R>(\n response: EditorResponse<T>,\n ticket: RequestTicket,\n publish: (result: EditorResult<T>) => R,\n fallback: R,\n): R | Promise<R> {\n const accept = (result: EditorResult<T> | null): R => {\n // Settled work must not be aborted by publication (which may dispatch or reenter).\n ticket.settle();\n return result && ticket.current() && sameIdentity(result, ticket.snapshot)\n ? publish(result)\n : fallback;\n };\n if (response instanceof Promise)\n return response.then(accept, () => {\n ticket.settle();\n return fallback;\n });\n return accept(response);\n}\n","import type { Text } from \"@codemirror/state\";\nimport type { EditorEdit, EditorRange } from \"./editor-contracts.js\";\n\nexport function validRange(range: EditorRange, text: string): boolean {\n return (\n !!range &&\n Number.isSafeInteger(range.from) &&\n Number.isSafeInteger(range.to) &&\n range.from >= 0 &&\n range.to >= range.from &&\n range.to <= text.length &&\n !insidePair(text, range.from) &&\n !insidePair(text, range.to)\n );\n}\n\nfunction insidePair(text: string, offset: number): boolean {\n const previous = text.charCodeAt(offset - 1);\n const next = text.charCodeAt(offset);\n return (\n (previous === 13 && next === 10) ||\n (previous >= 0xd800 && previous <= 0xdbff && next >= 0xdc00 && next <= 0xdfff)\n );\n}\n\nexport function validEdit(edit: EditorEdit, text: string): boolean {\n return validRange(edit, text) && typeof edit.text === \"string\";\n}\n\nexport function sourceOffset(doc: Text, separator: string, offset: number): number {\n return offset + (doc.lineAt(offset).number - 1) * (separator.length - 1);\n}\n\nexport function editorOffset(doc: Text, separator: string, offset: number): number {\n for (let number = 1; number <= doc.lines; number += 1) {\n const line = doc.line(number);\n const start = line.from + (number - 1) * (separator.length - 1);\n if (offset <= start + line.length) return line.from + offset - start;\n }\n return doc.length;\n}\n","import { Text } from \"@codemirror/state\";\n\nexport function detectLineSeparator(text: string): string {\n if (text.includes(\"\\r\\n\")) return \"\\r\\n\";\n if (text.includes(\"\\r\")) return \"\\r\";\n return \"\\n\";\n}\n\nexport function textForEditor(text: string): Text {\n return Text.of(text.split(/\\r\\n|\\r|\\n/u));\n}\n\nexport function textFromEditor(document: Text, lineSeparator: string): string {\n return document.sliceString(0, document.length, lineSeparator);\n}\n","import { StateEffect, StateField } from \"@codemirror/state\";\nimport { showTooltip, type Tooltip } from \"@codemirror/view\";\n\nexport const setKeyboardTooltip = StateEffect.define<Tooltip | null>();\n\nexport const keyboardTooltipField = StateField.define<readonly Tooltip[]>({\n create: () => [],\n update(value, transaction) {\n let next = transaction.docChanged ? [] : value;\n for (const effect of transaction.effects) {\n if (effect.is(setKeyboardTooltip)) next = effect.value ? [effect.value] : [];\n }\n return next;\n },\n provide: (field) => showTooltip.computeN([field], (state) => state.field(field)),\n});\n","import {\n autocompletion,\n type CompletionContext,\n type CompletionResult,\n closeCompletion,\n completionKeymap,\n} from \"@codemirror/autocomplete\";\nimport { setDiagnostics } from \"@codemirror/lint\";\nimport { Transaction } from \"@codemirror/state\";\nimport {\n closeHoverTooltips,\n type EditorView,\n hoverTooltip,\n keymap,\n type Tooltip,\n ViewPlugin,\n} from \"@codemirror/view\";\nimport type {\n EditorCompletion,\n EditorEdit,\n EditorHover,\n EditorIdentity,\n EditorProvider,\n EditorResponse,\n EditorResult,\n EditorSnapshot,\n} from \"./editor-contracts.js\";\nimport { editorTooltip } from \"./editor-presentation.js\";\nimport { EditorRequests, type RequestTicket, resolveResponse } from \"./editor-requests.js\";\nimport { editorOffset, sourceOffset, validEdit, validRange } from \"./editor-validation.js\";\nimport { textForEditor } from \"./line-separator.js\";\nimport { keyboardTooltipField, setKeyboardTooltip } from \"./tooltip-state.js\";\n\nexport interface ToolingHost {\n snapshot(): EditorSnapshot;\n view(): EditorView | null;\n renderHover?: (hover: EditorHover, from: number, to: number) => Tooltip;\n isCurrent?: (identity: EditorIdentity) => boolean;\n filterCompletions?: boolean;\n}\n\nexport class EditorTooling {\n private readonly requests = new EditorRequests();\n private frame: number | null = null;\n private hoverIntent = 0;\n private readonly host: ToolingHost;\n private readonly provider: EditorProvider;\n constructor(host: ToolingHost, provider: EditorProvider = {}) {\n this.host = host;\n this.provider = provider;\n }\n\n extension() {\n return [\n autocompletion({ override: [(context) => this.complete(context)] }),\n hoverTooltip((view, offset) => this.hover(view, offset)),\n this.hoverIntentExtension(),\n keyboardTooltipField,\n keymap.of([\n ...completionKeymap,\n { key: \"Mod-Shift-h\", run: (view) => this.keyboardHover(view) },\n {\n key: \"Escape\",\n run: (view) => {\n this.clear(view);\n view.focus();\n return true;\n },\n },\n ]),\n ];\n }\n\n private hoverIntentExtension() {\n return ViewPlugin.define((view) => {\n const changed = () => {\n this.hoverIntent += 1;\n };\n const events = [\"mousemove\", \"mouseleave\", \"pointerdown\"];\n for (const event of events) view.dom.addEventListener(event, changed);\n return {\n update: (update) => {\n if (!update.startState.selection.eq(update.state.selection)) changed();\n },\n destroy: () => {\n for (const event of events) view.dom.removeEventListener(event, changed);\n },\n };\n });\n }\n\n invalidate(view = this.host.view()): void {\n if (this.frame !== null && view)\n view.dom.ownerDocument.defaultView?.cancelAnimationFrame(this.frame);\n this.frame = null;\n this.requests.invalidate();\n }\n\n clear(view: EditorView, diagnostics = false): void {\n this.invalidate();\n closeCompletion(view);\n const interactions = { effects: [setKeyboardTooltip.of(null), closeHoverTooltips] };\n if (diagnostics) view.dispatch(interactions, setDiagnostics(view.state, []));\n else view.dispatch(interactions);\n }\n\n schedule(view: EditorView): void {\n const diagnosticsProvider = this.provider.diagnostics?.bind(this.provider);\n const window = view.dom.ownerDocument.defaultView;\n if (!diagnosticsProvider || !window) return;\n const ticket = this.ticket(\"diagnostics\", view);\n this.frame = window.requestAnimationFrame(() => {\n this.frame = null;\n if (!ticket.current()) return;\n const response = diagnosticsProvider(ticket);\n void this.resolve(\n response,\n ticket,\n (result) => {\n const diagnostics = result.value.filter((entry) =>\n validRange(entry, ticket.snapshot.text),\n );\n view.dispatch(\n setDiagnostics(\n view.state,\n diagnostics.map((entry) => ({\n ...this.range(view, entry),\n message: entry.message,\n severity: entry.severity,\n })),\n ),\n );\n return true;\n },\n false,\n );\n });\n }\n\n format(): boolean | Promise<boolean> {\n const view = this.host.view();\n if (!view || !this.provider.format) return false;\n const ticket = this.ticket(\"format\", view);\n return this.resolve(\n this.provider.format(ticket),\n ticket,\n (result, guarded) => this.apply(view, result.value, guarded),\n false,\n );\n }\n\n private complete(\n context: CompletionContext,\n ): CompletionResult | null | Promise<CompletionResult | null> {\n const view = this.host.view();\n if (!view || view.state !== context.state || !this.provider.completion) return null;\n const ticket = this.ticket(\"completion\", view);\n const offset = sourceOffset(view.state.doc, view.state.lineBreak, context.pos);\n return this.resolve(\n this.provider.completion(ticket, offset),\n ticket,\n (result, guarded) => {\n const entries = result.value.filter((item) => validEdit(item.edit, ticket.snapshot.text));\n const first = entries[0];\n if (!first) return null;\n return {\n ...this.range(view, first.edit),\n filter: this.host.filterCompletions ?? false,\n options: entries.map((item) => this.option(view, item, guarded)),\n };\n },\n null as CompletionResult | null,\n );\n }\n\n private option(view: EditorView, item: EditorCompletion, ticket: RequestTicket) {\n return {\n label: item.label,\n type: item.type,\n detail: item.detail,\n boost: item.boost,\n apply: (target: EditorView) => {\n if (target === view) this.apply(target, item.edit, ticket);\n },\n };\n }\n\n private apply(view: EditorView, edit: EditorEdit, ticket: RequestTicket): boolean {\n if (!ticket.current() || !validEdit(edit, ticket.snapshot.text)) return false;\n view.dispatch({\n changes: { ...this.range(view, edit), insert: textForEditor(edit.text) },\n annotations: Transaction.addToHistory.of(true),\n });\n return true;\n }\n\n private hover(\n view: EditorView,\n offset: number,\n publish?: (tooltip: Tooltip) => void,\n ): Tooltip | null | Promise<Tooltip | null> {\n if (this.host.view() !== view || !this.provider.hover) return null;\n const intent = this.hoverIntent;\n const selection = view.state.selection;\n const request = this.ticket(\"hover\", view);\n const ticket = {\n ...request,\n current: () =>\n request.current() && intent === this.hoverIntent && selection.eq(view.state.selection),\n };\n const source = sourceOffset(view.state.doc, view.state.lineBreak, offset);\n return this.resolve(\n this.provider.hover(ticket, source),\n ticket,\n (result, guarded) => {\n if (!validRange(result.value, ticket.snapshot.text)) return null;\n const range = this.range(view, result.value);\n const tooltip = (this.host.renderHover ?? editorTooltip)(\n result.value,\n range.from,\n range.to,\n );\n if (!guarded.current()) return null;\n publish?.(tooltip);\n return tooltip;\n },\n null as Tooltip | null,\n );\n }\n\n private keyboardHover(view: EditorView): boolean {\n const tooltip = this.hover(view, view.state.selection.main.head, (value) =>\n view.dispatch({ effects: setKeyboardTooltip.of(value) }),\n );\n return tooltip instanceof Promise || tooltip !== null;\n }\n\n private ticket(kind: \"diagnostics\" | \"completion\" | \"hover\" | \"format\", view: EditorView) {\n return this.requests.start(\n kind,\n this.host.snapshot(),\n () => this.host.snapshot(),\n () => this.host.view() === view,\n );\n }\n\n private resolve<T, R>(\n response: EditorResponse<T>,\n ticket: RequestTicket,\n publish: (result: EditorResult<T>, guarded: RequestTicket) => R,\n fallback: R,\n ): R | Promise<R> {\n return resolveResponse(\n response,\n ticket,\n (result) => {\n const guarded = {\n ...ticket,\n current: () => ticket.current() && (this.host.isCurrent?.(result) ?? true),\n };\n return guarded.current() ? publish(result, guarded) : fallback;\n },\n fallback,\n );\n }\n\n private range(view: EditorView, range: { readonly from: number; readonly to: number }) {\n return {\n from: editorOffset(view.state.doc, view.state.lineBreak, range.from),\n to: editorOffset(view.state.doc, view.state.lineBreak, range.to),\n };\n }\n}\n","import { history, historyKeymap } from \"@codemirror/commands\";\nimport { Compartment, EditorSelection, EditorState, Transaction } from \"@codemirror/state\";\nimport { EditorView, keymap, type Tooltip, ViewPlugin, type ViewUpdate } from \"@codemirror/view\";\nimport type {\n EditorHover,\n EditorIdentity,\n EditorSession,\n EditorSessionOptions,\n EditorSnapshot,\n} from \"./editor-contracts.js\";\nimport { EditorTooling } from \"./editor-tooling.js\";\nimport { detectLineSeparator, textForEditor, textFromEditor } from \"./line-separator.js\";\n\n/** Internal bridge hooks are deliberately not part of the neutral public entry point. */\nexport interface EditorBridge {\n changed?: (snapshot: EditorSnapshot, previous: EditorSnapshot, transaction?: Transaction) => void;\n matches?: (snapshot: EditorSnapshot) => boolean;\n renderHover?: (hover: EditorHover, from: number, to: number) => Tooltip;\n isCurrent?: (identity: EditorIdentity) => boolean;\n filterCompletions?: boolean;\n}\n\nexport function createEditorSession(options: EditorSessionOptions): EditorSession {\n return new NeutralEditorSession(options);\n}\n\nexport class NeutralEditorSession implements EditorSession {\n readonly extension;\n private snapshot: EditorSnapshot;\n private attached: EditorView | null = null;\n private disposed = false;\n private failed = false;\n private failureView: EditorView | null = null;\n private notifications: EditorSnapshot[] = [];\n private publishingChanges = false;\n private changing = 0;\n private readonly separator = new Compartment();\n private readonly tooling: EditorTooling;\n private readonly options: EditorSessionOptions;\n private readonly bridge: EditorBridge;\n\n constructor(options: EditorSessionOptions, bridge: EditorBridge = {}) {\n this.options = options;\n this.bridge = bridge;\n const document = options.document;\n if (\n typeof document.text !== \"string\" ||\n typeof document.uri !== \"string\" ||\n document.uri.length === 0 ||\n !Number.isSafeInteger(document.version) ||\n document.version < 0\n )\n throw new TypeError(\"Invalid editor document\");\n this.snapshot = Object.freeze({ ...document, environmentGeneration: 0 });\n this.tooling = new EditorTooling(\n {\n snapshot: () => this.snapshot,\n view: () => (this.disposed || this.failed ? null : this.attached),\n renderHover: bridge.renderHover,\n isCurrent: bridge.isCurrent,\n filterCompletions: bridge.filterCompletions,\n },\n options.provider,\n );\n this.extension = this.createExtension();\n }\n\n getSnapshot(): EditorSnapshot {\n return this.snapshot;\n }\n\n refreshEnvironment(): void {\n this.assertOpen();\n if (this.snapshot.environmentGeneration >= Number.MAX_SAFE_INTEGER)\n throw new RangeError(\"Editor environment generation exhausted\");\n this.snapshot = Object.freeze({\n ...this.snapshot,\n environmentGeneration: this.snapshot.environmentGeneration + 1,\n });\n if (!this.attached) {\n this.tooling.invalidate();\n return;\n }\n this.tooling.clear(this.attached, true);\n this.tooling.schedule(this.attached);\n }\n\n replaceDocument(text: string): void {\n this.assertOpen();\n if (typeof text !== \"string\") throw new TypeError(\"Replacement text must be a string\");\n const view = this.attached;\n if (!view) {\n this.changed(text);\n return;\n }\n const separator = detectLineSeparator(text);\n view.dispatch({\n changes: { from: 0, to: view.state.doc.length, insert: textForEditor(text) },\n selection: EditorSelection.cursor(0),\n annotations: Transaction.addToHistory.of(true),\n effects:\n separator === view.state.lineBreak\n ? undefined\n : this.separator.reconfigure(EditorState.lineSeparator.of(separator)),\n });\n }\n\n format(): boolean | Promise<boolean> {\n this.assertOpen();\n return this.tooling.format();\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.tooling.invalidate(this.attached);\n if (this.attached && !this.failed) this.tooling.clear(this.attached, true);\n this.attached = null;\n }\n\n private createExtension() {\n const session = this;\n return [\n ViewPlugin.define((view) => {\n this.attach(view);\n return {\n update: (update: ViewUpdate) => this.update(update),\n destroy: () => this.detach(view),\n };\n }),\n // Provider callbacks may dispatch; run them only after CodeMirror leaves its update phase.\n EditorView.updateListener.of(() => {\n this.publishChanges();\n this.cleanupFailure();\n }),\n this.separator.of({\n // Resolve when CodeMirror builds a state, including reuse of a cached extension.\n get extension() {\n return EditorState.lineSeparator.of(detectLineSeparator(session.snapshot.text));\n },\n }),\n history(),\n this.tooling.extension(),\n keymap.of(historyKeymap),\n EditorView.contentAttributes.of({ \"aria-label\": this.options.ariaLabel ?? \"Source editor\" }),\n this.options.extensions ?? [],\n ];\n }\n\n private attach(view: EditorView): void {\n this.assertOpen();\n if (this.attached && this.attached !== view)\n throw new Error(\"Editor session already has a view\");\n if (textFromEditor(view.state.doc, view.state.lineBreak) !== this.snapshot.text)\n throw new Error(\"CodeMirror document does not match the opened document\");\n this.attached = view;\n this.tooling.schedule(view);\n }\n\n private detach(view: EditorView): void {\n if (this.attached !== view) return;\n this.attached = null;\n this.tooling.invalidate(view);\n }\n\n private update(update: ViewUpdate): void {\n if (this.disposed || this.failed || !update.docChanged) return;\n try {\n this.updateTransactions(update);\n } catch (error) {\n this.fail(update.view);\n throw error;\n }\n }\n\n private updateTransactions(update: ViewUpdate): void {\n for (const transaction of update.transactions) {\n if (!transaction.docChanged) continue;\n if (\n textFromEditor(transaction.startState.doc, transaction.startState.lineBreak) !==\n this.snapshot.text\n )\n throw new Error(\"CodeMirror and editor snapshots diverged\");\n this.changed(textFromEditor(transaction.newDoc, transaction.state.lineBreak), transaction);\n }\n }\n\n private changed(text: string, transaction?: Transaction): void {\n if (this.snapshot.version >= Number.MAX_SAFE_INTEGER)\n throw new RangeError(\"Editor document revision exhausted\");\n const previous = this.snapshot;\n const snapshot = Object.freeze({ ...previous, version: previous.version + 1, text });\n this.snapshot = snapshot;\n // Reserve FIFO order before service hooks can reenter, but publish only after they commit.\n this.notifications.push(snapshot);\n this.changing += 1;\n let failed = false;\n let failure: unknown;\n try {\n this.bridge.changed?.(snapshot, previous, transaction);\n } catch (error) {\n this.notifications = this.notifications.filter((pending) => pending !== snapshot);\n this.reconcileFailure(snapshot, previous, !!transaction);\n failed = true;\n failure = error;\n } finally {\n this.changing -= 1;\n }\n // Successful nested hooks must drain even on failure; transactions wait for the update listener.\n try {\n if (!transaction) this.publishChanges();\n } catch (error) {\n if (!failed) throw error;\n }\n if (failed) throw failure;\n }\n\n private publishChanges(): void {\n if (this.changing || this.publishingChanges || !this.notifications.length) return;\n this.publishingChanges = true;\n try {\n while (this.notifications.length) {\n const notifications = this.notifications;\n this.notifications = [];\n this.tooling.invalidate();\n for (const snapshot of notifications) this.notifyChange(snapshot);\n }\n } finally {\n this.publishingChanges = false;\n }\n if (!this.disposed && !this.failed && this.attached) this.tooling.schedule(this.attached);\n }\n\n private reconcileFailure(attempt: EditorSnapshot, previous: EditorSnapshot, attached: boolean) {\n if (attached) {\n this.fail(this.attached);\n return;\n }\n try {\n if (this.bridge.matches?.(this.snapshot)) return;\n if (this.snapshot === attempt && this.bridge.matches?.(previous)) {\n this.snapshot = previous;\n this.tooling.invalidate();\n return;\n }\n } catch {}\n this.fail(null);\n this.notifications = [];\n }\n\n private fail(view: EditorView | null): void {\n this.failed = true;\n this.failureView = view;\n // Invalidation is dispatch-free: CodeMirror is still inside its plugin update boundary.\n this.tooling.invalidate(view);\n }\n\n private cleanupFailure(): void {\n const view = this.failureView;\n this.failureView = null;\n if (view) this.tooling.clear(view, true);\n }\n\n private notifyChange(snapshot: EditorSnapshot): void {\n try {\n this.options.onDocumentChange?.(snapshot);\n } catch {}\n }\n\n private assertOpen(): void {\n if (this.disposed) throw new Error(\"Editor session is disposed\");\n if (this.failed) throw new Error(\"Editor session has failed\");\n }\n}\n"]}
@@ -0,0 +1,568 @@
1
+ 'use strict';
2
+
3
+ var commands = require('@codemirror/commands');
4
+ var state = require('@codemirror/state');
5
+ var view = require('@codemirror/view');
6
+ var autocomplete = require('@codemirror/autocomplete');
7
+ var lint = require('@codemirror/lint');
8
+
9
+ // src/editor-session.ts
10
+
11
+ // src/editor-presentation.ts
12
+ function editorTooltip(hover, from, to) {
13
+ return {
14
+ pos: from,
15
+ end: to,
16
+ above: true,
17
+ create(view) {
18
+ const document = view.dom.ownerDocument;
19
+ const dom = document.createElement("section");
20
+ dom.className = "cm-editor-hover";
21
+ dom.setAttribute("role", "tooltip");
22
+ if (typeof hover.content === "string") dom.textContent = hover.content;
23
+ else for (const section of hover.content) appendSection(document, dom, section);
24
+ return { dom };
25
+ }
26
+ };
27
+ }
28
+ function appendSection(document, dom, section) {
29
+ const heading = document.createElement("strong");
30
+ heading.textContent = section.heading;
31
+ dom.append(heading);
32
+ const list = document.createElement("ul");
33
+ for (const text of section.text.length ? section.text : ["None"]) {
34
+ const item = document.createElement("li");
35
+ item.textContent = text;
36
+ list.append(item);
37
+ }
38
+ dom.append(list);
39
+ }
40
+
41
+ // src/editor-requests.ts
42
+ var EditorRequests = class {
43
+ pending = /* @__PURE__ */ new Map();
44
+ // Published completion edits remain guarded until supersession, not just settlement.
45
+ latest = /* @__PURE__ */ new Map();
46
+ generation = 0;
47
+ start(kind, snapshot, current, alive) {
48
+ const previous = this.pending.get(kind);
49
+ const controller = new AbortController();
50
+ this.pending.set(kind, controller);
51
+ this.latest.set(kind, controller);
52
+ const generation = this.generation;
53
+ previous?.abort();
54
+ return {
55
+ snapshot,
56
+ signal: controller.signal,
57
+ settle: () => {
58
+ if (this.pending.get(kind) === controller) this.pending.delete(kind);
59
+ },
60
+ current: () => !controller.signal.aborted && this.latest.get(kind) === controller && generation === this.generation && alive() && sameIdentity(snapshot, current())
61
+ };
62
+ }
63
+ invalidate() {
64
+ this.generation += 1;
65
+ const controllers = [...this.pending.values()];
66
+ this.pending.clear();
67
+ this.latest.clear();
68
+ for (const controller of controllers) controller.abort();
69
+ }
70
+ };
71
+ function sameIdentity(a, b) {
72
+ return !!a && a.uri === b.uri && a.version === b.version && a.environmentGeneration === b.environmentGeneration;
73
+ }
74
+ function resolveResponse(response, ticket, publish, fallback) {
75
+ const accept = (result) => {
76
+ ticket.settle();
77
+ return result && ticket.current() && sameIdentity(result, ticket.snapshot) ? publish(result) : fallback;
78
+ };
79
+ if (response instanceof Promise)
80
+ return response.then(accept, () => {
81
+ ticket.settle();
82
+ return fallback;
83
+ });
84
+ return accept(response);
85
+ }
86
+
87
+ // src/editor-validation.ts
88
+ function validRange(range, text) {
89
+ return !!range && Number.isSafeInteger(range.from) && Number.isSafeInteger(range.to) && range.from >= 0 && range.to >= range.from && range.to <= text.length && !insidePair(text, range.from) && !insidePair(text, range.to);
90
+ }
91
+ function insidePair(text, offset) {
92
+ const previous = text.charCodeAt(offset - 1);
93
+ const next = text.charCodeAt(offset);
94
+ return previous === 13 && next === 10 || previous >= 55296 && previous <= 56319 && next >= 56320 && next <= 57343;
95
+ }
96
+ function validEdit(edit, text) {
97
+ return validRange(edit, text) && typeof edit.text === "string";
98
+ }
99
+ function sourceOffset(doc, separator, offset) {
100
+ return offset + (doc.lineAt(offset).number - 1) * (separator.length - 1);
101
+ }
102
+ function editorOffset(doc, separator, offset) {
103
+ for (let number = 1; number <= doc.lines; number += 1) {
104
+ const line = doc.line(number);
105
+ const start = line.from + (number - 1) * (separator.length - 1);
106
+ if (offset <= start + line.length) return line.from + offset - start;
107
+ }
108
+ return doc.length;
109
+ }
110
+ function detectLineSeparator(text) {
111
+ if (text.includes("\r\n")) return "\r\n";
112
+ if (text.includes("\r")) return "\r";
113
+ return "\n";
114
+ }
115
+ function textForEditor(text) {
116
+ return state.Text.of(text.split(/\r\n|\r|\n/u));
117
+ }
118
+ function textFromEditor(document, lineSeparator) {
119
+ return document.sliceString(0, document.length, lineSeparator);
120
+ }
121
+ var setKeyboardTooltip = state.StateEffect.define();
122
+ var keyboardTooltipField = state.StateField.define({
123
+ create: () => [],
124
+ update(value, transaction) {
125
+ let next = transaction.docChanged ? [] : value;
126
+ for (const effect of transaction.effects) {
127
+ if (effect.is(setKeyboardTooltip)) next = effect.value ? [effect.value] : [];
128
+ }
129
+ return next;
130
+ },
131
+ provide: (field) => view.showTooltip.computeN([field], (state) => state.field(field))
132
+ });
133
+
134
+ // src/editor-tooling.ts
135
+ var EditorTooling = class {
136
+ requests = new EditorRequests();
137
+ frame = null;
138
+ hoverIntent = 0;
139
+ host;
140
+ provider;
141
+ constructor(host, provider = {}) {
142
+ this.host = host;
143
+ this.provider = provider;
144
+ }
145
+ extension() {
146
+ return [
147
+ autocomplete.autocompletion({ override: [(context) => this.complete(context)] }),
148
+ view.hoverTooltip((view, offset) => this.hover(view, offset)),
149
+ this.hoverIntentExtension(),
150
+ keyboardTooltipField,
151
+ view.keymap.of([
152
+ ...autocomplete.completionKeymap,
153
+ { key: "Mod-Shift-h", run: (view) => this.keyboardHover(view) },
154
+ {
155
+ key: "Escape",
156
+ run: (view) => {
157
+ this.clear(view);
158
+ view.focus();
159
+ return true;
160
+ }
161
+ }
162
+ ])
163
+ ];
164
+ }
165
+ hoverIntentExtension() {
166
+ return view.ViewPlugin.define((view) => {
167
+ const changed = () => {
168
+ this.hoverIntent += 1;
169
+ };
170
+ const events = ["mousemove", "mouseleave", "pointerdown"];
171
+ for (const event of events) view.dom.addEventListener(event, changed);
172
+ return {
173
+ update: (update) => {
174
+ if (!update.startState.selection.eq(update.state.selection)) changed();
175
+ },
176
+ destroy: () => {
177
+ for (const event of events) view.dom.removeEventListener(event, changed);
178
+ }
179
+ };
180
+ });
181
+ }
182
+ invalidate(view = this.host.view()) {
183
+ if (this.frame !== null && view)
184
+ view.dom.ownerDocument.defaultView?.cancelAnimationFrame(this.frame);
185
+ this.frame = null;
186
+ this.requests.invalidate();
187
+ }
188
+ clear(view$1, diagnostics = false) {
189
+ this.invalidate();
190
+ autocomplete.closeCompletion(view$1);
191
+ const interactions = { effects: [setKeyboardTooltip.of(null), view.closeHoverTooltips] };
192
+ if (diagnostics) view$1.dispatch(interactions, lint.setDiagnostics(view$1.state, []));
193
+ else view$1.dispatch(interactions);
194
+ }
195
+ schedule(view) {
196
+ const diagnosticsProvider = this.provider.diagnostics?.bind(this.provider);
197
+ const window = view.dom.ownerDocument.defaultView;
198
+ if (!diagnosticsProvider || !window) return;
199
+ const ticket = this.ticket("diagnostics", view);
200
+ this.frame = window.requestAnimationFrame(() => {
201
+ this.frame = null;
202
+ if (!ticket.current()) return;
203
+ const response = diagnosticsProvider(ticket);
204
+ void this.resolve(
205
+ response,
206
+ ticket,
207
+ (result) => {
208
+ const diagnostics = result.value.filter(
209
+ (entry) => validRange(entry, ticket.snapshot.text)
210
+ );
211
+ view.dispatch(
212
+ lint.setDiagnostics(
213
+ view.state,
214
+ diagnostics.map((entry) => ({
215
+ ...this.range(view, entry),
216
+ message: entry.message,
217
+ severity: entry.severity
218
+ }))
219
+ )
220
+ );
221
+ return true;
222
+ },
223
+ false
224
+ );
225
+ });
226
+ }
227
+ format() {
228
+ const view = this.host.view();
229
+ if (!view || !this.provider.format) return false;
230
+ const ticket = this.ticket("format", view);
231
+ return this.resolve(
232
+ this.provider.format(ticket),
233
+ ticket,
234
+ (result, guarded) => this.apply(view, result.value, guarded),
235
+ false
236
+ );
237
+ }
238
+ complete(context) {
239
+ const view = this.host.view();
240
+ if (!view || view.state !== context.state || !this.provider.completion) return null;
241
+ const ticket = this.ticket("completion", view);
242
+ const offset = sourceOffset(view.state.doc, view.state.lineBreak, context.pos);
243
+ return this.resolve(
244
+ this.provider.completion(ticket, offset),
245
+ ticket,
246
+ (result, guarded) => {
247
+ const entries = result.value.filter((item) => validEdit(item.edit, ticket.snapshot.text));
248
+ const first = entries[0];
249
+ if (!first) return null;
250
+ return {
251
+ ...this.range(view, first.edit),
252
+ filter: this.host.filterCompletions ?? false,
253
+ options: entries.map((item) => this.option(view, item, guarded))
254
+ };
255
+ },
256
+ null
257
+ );
258
+ }
259
+ option(view, item, ticket) {
260
+ return {
261
+ label: item.label,
262
+ type: item.type,
263
+ detail: item.detail,
264
+ boost: item.boost,
265
+ apply: (target) => {
266
+ if (target === view) this.apply(target, item.edit, ticket);
267
+ }
268
+ };
269
+ }
270
+ apply(view, edit, ticket) {
271
+ if (!ticket.current() || !validEdit(edit, ticket.snapshot.text)) return false;
272
+ view.dispatch({
273
+ changes: { ...this.range(view, edit), insert: textForEditor(edit.text) },
274
+ annotations: state.Transaction.addToHistory.of(true)
275
+ });
276
+ return true;
277
+ }
278
+ hover(view, offset, publish) {
279
+ if (this.host.view() !== view || !this.provider.hover) return null;
280
+ const intent = this.hoverIntent;
281
+ const selection = view.state.selection;
282
+ const request = this.ticket("hover", view);
283
+ const ticket = {
284
+ ...request,
285
+ current: () => request.current() && intent === this.hoverIntent && selection.eq(view.state.selection)
286
+ };
287
+ const source = sourceOffset(view.state.doc, view.state.lineBreak, offset);
288
+ return this.resolve(
289
+ this.provider.hover(ticket, source),
290
+ ticket,
291
+ (result, guarded) => {
292
+ if (!validRange(result.value, ticket.snapshot.text)) return null;
293
+ const range = this.range(view, result.value);
294
+ const tooltip = (this.host.renderHover ?? editorTooltip)(
295
+ result.value,
296
+ range.from,
297
+ range.to
298
+ );
299
+ if (!guarded.current()) return null;
300
+ publish?.(tooltip);
301
+ return tooltip;
302
+ },
303
+ null
304
+ );
305
+ }
306
+ keyboardHover(view) {
307
+ const tooltip = this.hover(
308
+ view,
309
+ view.state.selection.main.head,
310
+ (value) => view.dispatch({ effects: setKeyboardTooltip.of(value) })
311
+ );
312
+ return tooltip instanceof Promise || tooltip !== null;
313
+ }
314
+ ticket(kind, view) {
315
+ return this.requests.start(
316
+ kind,
317
+ this.host.snapshot(),
318
+ () => this.host.snapshot(),
319
+ () => this.host.view() === view
320
+ );
321
+ }
322
+ resolve(response, ticket, publish, fallback) {
323
+ return resolveResponse(
324
+ response,
325
+ ticket,
326
+ (result) => {
327
+ const guarded = {
328
+ ...ticket,
329
+ current: () => ticket.current() && (this.host.isCurrent?.(result) ?? true)
330
+ };
331
+ return guarded.current() ? publish(result, guarded) : fallback;
332
+ },
333
+ fallback
334
+ );
335
+ }
336
+ range(view, range) {
337
+ return {
338
+ from: editorOffset(view.state.doc, view.state.lineBreak, range.from),
339
+ to: editorOffset(view.state.doc, view.state.lineBreak, range.to)
340
+ };
341
+ }
342
+ };
343
+
344
+ // src/editor-session.ts
345
+ function createEditorSession(options) {
346
+ return new NeutralEditorSession(options);
347
+ }
348
+ var NeutralEditorSession = class {
349
+ extension;
350
+ snapshot;
351
+ attached = null;
352
+ disposed = false;
353
+ failed = false;
354
+ failureView = null;
355
+ notifications = [];
356
+ publishingChanges = false;
357
+ changing = 0;
358
+ separator = new state.Compartment();
359
+ tooling;
360
+ options;
361
+ bridge;
362
+ constructor(options, bridge = {}) {
363
+ this.options = options;
364
+ this.bridge = bridge;
365
+ const document = options.document;
366
+ if (typeof document.text !== "string" || typeof document.uri !== "string" || document.uri.length === 0 || !Number.isSafeInteger(document.version) || document.version < 0)
367
+ throw new TypeError("Invalid editor document");
368
+ this.snapshot = Object.freeze({ ...document, environmentGeneration: 0 });
369
+ this.tooling = new EditorTooling(
370
+ {
371
+ snapshot: () => this.snapshot,
372
+ view: () => this.disposed || this.failed ? null : this.attached,
373
+ renderHover: bridge.renderHover,
374
+ isCurrent: bridge.isCurrent,
375
+ filterCompletions: bridge.filterCompletions
376
+ },
377
+ options.provider
378
+ );
379
+ this.extension = this.createExtension();
380
+ }
381
+ getSnapshot() {
382
+ return this.snapshot;
383
+ }
384
+ refreshEnvironment() {
385
+ this.assertOpen();
386
+ if (this.snapshot.environmentGeneration >= Number.MAX_SAFE_INTEGER)
387
+ throw new RangeError("Editor environment generation exhausted");
388
+ this.snapshot = Object.freeze({
389
+ ...this.snapshot,
390
+ environmentGeneration: this.snapshot.environmentGeneration + 1
391
+ });
392
+ if (!this.attached) {
393
+ this.tooling.invalidate();
394
+ return;
395
+ }
396
+ this.tooling.clear(this.attached, true);
397
+ this.tooling.schedule(this.attached);
398
+ }
399
+ replaceDocument(text) {
400
+ this.assertOpen();
401
+ if (typeof text !== "string") throw new TypeError("Replacement text must be a string");
402
+ const view = this.attached;
403
+ if (!view) {
404
+ this.changed(text);
405
+ return;
406
+ }
407
+ const separator = detectLineSeparator(text);
408
+ view.dispatch({
409
+ changes: { from: 0, to: view.state.doc.length, insert: textForEditor(text) },
410
+ selection: state.EditorSelection.cursor(0),
411
+ annotations: state.Transaction.addToHistory.of(true),
412
+ effects: separator === view.state.lineBreak ? void 0 : this.separator.reconfigure(state.EditorState.lineSeparator.of(separator))
413
+ });
414
+ }
415
+ format() {
416
+ this.assertOpen();
417
+ return this.tooling.format();
418
+ }
419
+ dispose() {
420
+ if (this.disposed) return;
421
+ this.disposed = true;
422
+ this.tooling.invalidate(this.attached);
423
+ if (this.attached && !this.failed) this.tooling.clear(this.attached, true);
424
+ this.attached = null;
425
+ }
426
+ createExtension() {
427
+ const session = this;
428
+ return [
429
+ view.ViewPlugin.define((view) => {
430
+ this.attach(view);
431
+ return {
432
+ update: (update) => this.update(update),
433
+ destroy: () => this.detach(view)
434
+ };
435
+ }),
436
+ // Provider callbacks may dispatch; run them only after CodeMirror leaves its update phase.
437
+ view.EditorView.updateListener.of(() => {
438
+ this.publishChanges();
439
+ this.cleanupFailure();
440
+ }),
441
+ this.separator.of({
442
+ // Resolve when CodeMirror builds a state, including reuse of a cached extension.
443
+ get extension() {
444
+ return state.EditorState.lineSeparator.of(detectLineSeparator(session.snapshot.text));
445
+ }
446
+ }),
447
+ commands.history(),
448
+ this.tooling.extension(),
449
+ view.keymap.of(commands.historyKeymap),
450
+ view.EditorView.contentAttributes.of({ "aria-label": this.options.ariaLabel ?? "Source editor" }),
451
+ this.options.extensions ?? []
452
+ ];
453
+ }
454
+ attach(view) {
455
+ this.assertOpen();
456
+ if (this.attached && this.attached !== view)
457
+ throw new Error("Editor session already has a view");
458
+ if (textFromEditor(view.state.doc, view.state.lineBreak) !== this.snapshot.text)
459
+ throw new Error("CodeMirror document does not match the opened document");
460
+ this.attached = view;
461
+ this.tooling.schedule(view);
462
+ }
463
+ detach(view) {
464
+ if (this.attached !== view) return;
465
+ this.attached = null;
466
+ this.tooling.invalidate(view);
467
+ }
468
+ update(update) {
469
+ if (this.disposed || this.failed || !update.docChanged) return;
470
+ try {
471
+ this.updateTransactions(update);
472
+ } catch (error) {
473
+ this.fail(update.view);
474
+ throw error;
475
+ }
476
+ }
477
+ updateTransactions(update) {
478
+ for (const transaction of update.transactions) {
479
+ if (!transaction.docChanged) continue;
480
+ if (textFromEditor(transaction.startState.doc, transaction.startState.lineBreak) !== this.snapshot.text)
481
+ throw new Error("CodeMirror and editor snapshots diverged");
482
+ this.changed(textFromEditor(transaction.newDoc, transaction.state.lineBreak), transaction);
483
+ }
484
+ }
485
+ changed(text, transaction) {
486
+ if (this.snapshot.version >= Number.MAX_SAFE_INTEGER)
487
+ throw new RangeError("Editor document revision exhausted");
488
+ const previous = this.snapshot;
489
+ const snapshot = Object.freeze({ ...previous, version: previous.version + 1, text });
490
+ this.snapshot = snapshot;
491
+ this.notifications.push(snapshot);
492
+ this.changing += 1;
493
+ let failed = false;
494
+ let failure;
495
+ try {
496
+ this.bridge.changed?.(snapshot, previous, transaction);
497
+ } catch (error) {
498
+ this.notifications = this.notifications.filter((pending) => pending !== snapshot);
499
+ this.reconcileFailure(snapshot, previous, !!transaction);
500
+ failed = true;
501
+ failure = error;
502
+ } finally {
503
+ this.changing -= 1;
504
+ }
505
+ try {
506
+ if (!transaction) this.publishChanges();
507
+ } catch (error) {
508
+ if (!failed) throw error;
509
+ }
510
+ if (failed) throw failure;
511
+ }
512
+ publishChanges() {
513
+ if (this.changing || this.publishingChanges || !this.notifications.length) return;
514
+ this.publishingChanges = true;
515
+ try {
516
+ while (this.notifications.length) {
517
+ const notifications = this.notifications;
518
+ this.notifications = [];
519
+ this.tooling.invalidate();
520
+ for (const snapshot of notifications) this.notifyChange(snapshot);
521
+ }
522
+ } finally {
523
+ this.publishingChanges = false;
524
+ }
525
+ if (!this.disposed && !this.failed && this.attached) this.tooling.schedule(this.attached);
526
+ }
527
+ reconcileFailure(attempt, previous, attached) {
528
+ if (attached) {
529
+ this.fail(this.attached);
530
+ return;
531
+ }
532
+ try {
533
+ if (this.bridge.matches?.(this.snapshot)) return;
534
+ if (this.snapshot === attempt && this.bridge.matches?.(previous)) {
535
+ this.snapshot = previous;
536
+ this.tooling.invalidate();
537
+ return;
538
+ }
539
+ } catch {
540
+ }
541
+ this.fail(null);
542
+ this.notifications = [];
543
+ }
544
+ fail(view) {
545
+ this.failed = true;
546
+ this.failureView = view;
547
+ this.tooling.invalidate(view);
548
+ }
549
+ cleanupFailure() {
550
+ const view = this.failureView;
551
+ this.failureView = null;
552
+ if (view) this.tooling.clear(view, true);
553
+ }
554
+ notifyChange(snapshot) {
555
+ try {
556
+ this.options.onDocumentChange?.(snapshot);
557
+ } catch {
558
+ }
559
+ }
560
+ assertOpen() {
561
+ if (this.disposed) throw new Error("Editor session is disposed");
562
+ if (this.failed) throw new Error("Editor session has failed");
563
+ }
564
+ };
565
+
566
+ exports.createEditorSession = createEditorSession;
567
+ //# sourceMappingURL=editor.cjs.map
568
+ //# sourceMappingURL=editor.cjs.map