@coze-editor/extensions 0.1.0-alpha.09ffeb
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/esm/index.js +1399 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/index.d.mts +170 -0
- package/dist/index.d.ts +170 -0
- package/dist/index.js +1418 -0
- package/dist/index.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/ast-decorator/whole.ts","../../src/background-decorations/index.ts","../../src/background-decorations/squash.ts","../../src/background-decorations/cut.ts","../../src/ast-decorator/cursor.ts","../../src/ast-decorator/index.ts","../../src/ast-debugger/index.ts","../../src/focusable/focusable.ts","../../src/auto-select-ranges/extension.ts","../../src/auto-select-ranges/utils.ts","../../src/selection-enlarger/extension.ts","../../src/deletion-enlarger/extension.ts","../../src/input-rules/index.ts","../../src/mix-languages/mix.ts","../../src/indent-guides/index.ts","../../src/indent-guides/utils.ts","../../src/scroll-beyond-last-line/index.ts","../../src/scroll-beyond-last-line/empty-block.ts","../../src/brackets/matching-brackets.ts","../../src/brackets/colorization.ts","../../src/position/index.ts","../../src/mergeable-markers/index.ts","../../src/mergeable-markers/squash.ts","../../src/frozen-ranges/extension.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { omit } from 'es-toolkit';\nimport type { Tree, TreeCursor } from '@lezer/common';\nimport { traverseAST } from '@coze-editor/utils';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n type WidgetType,\n} from '@codemirror/view';\nimport {\n type EditorState,\n type Range,\n Facet,\n RangeSet,\n StateEffect,\n StateField,\n Prec,\n} from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\n\nimport {\n backgroundDecorations,\n backgroundDecoratorLayer,\n type BackgroundDecoration,\n} from '../background-decorations';\n\ntype Precedence = 'highest' | 'high' | 'default' | 'low' | 'lowest';\n\ninterface BaseDecorationSpec {\n from?: number;\n to?: number;\n atomicRange?: boolean;\n}\n\ninterface ClassNameDecorationSpec extends BaseDecorationSpec {\n type: 'className';\n className: string;\n prec?: Precedence;\n}\n\ninterface ReplaceDecorationSpec extends BaseDecorationSpec {\n type: 'replace';\n widget?: WidgetType;\n inclusive?: boolean;\n inclusiveStart?: boolean;\n inclusiveEnd?: boolean;\n block?: boolean;\n}\n\ninterface WidgetDecorationSpec extends BaseDecorationSpec {\n type: 'widget';\n widget: WidgetType;\n side?: number;\n inlineOrder?: boolean;\n block?: boolean;\n}\n\ninterface BackgroundDecorationSpec {\n from?: number;\n to?: number;\n type: 'background';\n className: string;\n}\n\ntype DecorationSpec =\n | ClassNameDecorationSpec\n | ReplaceDecorationSpec\n | WidgetDecorationSpec\n | BackgroundDecorationSpec;\n\ntype WholeASTDecorator = (\n cursor: TreeCursor,\n state: EditorState,\n) => DecorationSpec[] | DecorationSpec | undefined;\n\nconst updateWholeDecorationsEffect = StateEffect.define();\n\nfunction updateWholeDecorations(view: EditorView) {\n view.dispatch({\n effects: updateWholeDecorationsEffect.of(null),\n });\n}\n\nconst classNameDecorationCache: Map<string, Decoration> = new Map();\nfunction getClassDecoration(className: string): Decoration {\n if (!classNameDecorationCache.has(className)) {\n classNameDecorationCache.set(\n className,\n Decoration.mark({\n class: className,\n }),\n );\n }\n\n return classNameDecorationCache.get(className)!;\n}\n\ntype CategoriedDecorationSet = Record<Precedence, DecorationSet>;\n\nfunction buildDecorations(state: EditorState, tree: Tree) {\n const decorates = state.facet(wholeASTDecoratorFacet) ?? [];\n\n const treeCursor = tree.cursor();\n const decorations: CategoriedDecorationSet = {\n highest: Decoration.none,\n high: Decoration.none,\n default: Decoration.none,\n low: Decoration.none,\n lowest: Decoration.none,\n };\n let atomicRanges = RangeSet.empty;\n let backgroundDecorations: BackgroundDecoration[] = [];\n\n const from = 0;\n const to = state.doc.length;\n traverseAST(treeCursor, from, to, cursor => {\n decorates.forEach(decorate => {\n const decorationSpec = decorate(cursor, state);\n\n let specs: DecorationSpec[] = [];\n if (Array.isArray(decorationSpec)) {\n specs = decorationSpec;\n } else if (decorationSpec) {\n specs = [decorationSpec];\n }\n\n specs.forEach(spec => {\n const result = updateDecorationSpec(cursor, spec, {\n decorations,\n backgroundDecorations,\n atomicRanges,\n });\n\n if (!result) {\n return;\n }\n\n backgroundDecorations = result.backgroundDecorations;\n atomicRanges = result.atomicRanges;\n });\n });\n });\n\n return {\n decorations,\n atomicRanges,\n backgroundDecorations,\n };\n}\n\nfunction updateDecorationSpec(\n cursor: TreeCursor,\n decorationSpec: DecorationSpec | undefined,\n {\n decorations,\n backgroundDecorations,\n atomicRanges,\n }: {\n decorations: CategoriedDecorationSet;\n backgroundDecorations: BackgroundDecoration[];\n atomicRanges: RangeSet<any>;\n },\n) {\n if (!decorationSpec) {\n return;\n }\n\n const from = decorationSpec.from ?? cursor.from;\n const to = decorationSpec.to ?? cursor.to;\n\n const omitKeys = ['type', 'from', 'to', 'atomicRange'] as const;\n\n let decorationRange: Range<Decoration> | null = null;\n switch (decorationSpec.type) {\n case 'className':\n // from === to marker will cause delete issue\n // e.g. {{content}} renders as `replace-widget mark replace-widget`\n // delete from end of content to start of content\n // when delete to first letter of content, the delete behavior is strange\n decorationRange =\n from === to\n ? null\n : getClassDecoration(decorationSpec.className).range(from, to);\n break;\n case 'replace':\n decorationRange = Decoration.replace(\n omit(decorationSpec, omitKeys),\n ).range(from, to);\n break;\n case 'widget':\n decorationRange = Decoration.widget(omit(decorationSpec, omitKeys)).range(\n from,\n );\n break;\n case 'background':\n backgroundDecorations.push({\n from: decorationSpec.from ?? cursor.from,\n to: decorationSpec.to ?? cursor.to,\n className: decorationSpec.className,\n });\n break;\n }\n\n if (decorationRange) {\n const prec =\n decorationSpec.type === 'className'\n ? (decorationSpec.prec ?? 'default')\n : 'default';\n\n if (decorations[prec]) {\n decorations[prec] = decorations[prec].update({\n add: [decorationRange],\n sort: true,\n });\n }\n }\n\n if (\n decorationSpec.type !== 'background' &&\n decorationRange &&\n decorationSpec.atomicRange === true\n ) {\n atomicRanges = atomicRanges.update({\n add: [decorationRange],\n sort: true,\n });\n }\n\n return {\n decorations,\n backgroundDecorations,\n atomicRanges,\n };\n}\n\nconst decorateField = StateField.define<{\n decorations: CategoriedDecorationSet;\n atomicRanges: RangeSet<any>;\n backgroundDecorations: BackgroundDecoration[];\n}>({\n create(state) {\n return buildDecorations(state, syntaxTree(state));\n },\n update(value, tr) {\n const tree = syntaxTree(tr.state);\n\n const hasUpdateEffect = tr.effects.some(effect =>\n effect.is(updateWholeDecorationsEffect),\n );\n const syntaxTreeChanged = syntaxTree(tr.startState) !== tree;\n if (syntaxTreeChanged || hasUpdateEffect) {\n value = buildDecorations(tr.state, tree);\n }\n return value;\n },\n provide(field) {\n return [\n Prec.highest(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.highest,\n ),\n ),\n Prec.high(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.high,\n ),\n ),\n Prec.default(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.default,\n ),\n ),\n Prec.low(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.low,\n ),\n ),\n Prec.lowest(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.lowest,\n ),\n ),\n\n EditorView.atomicRanges.of(view => view.state.field(field).atomicRanges),\n backgroundDecorations.of(\n view => view.state.field(field).backgroundDecorations,\n ),\n ];\n },\n});\n\nconst wholeASTDecoratorFacet = Facet.define<\n WholeASTDecorator,\n WholeASTDecorator[]\n>({\n enables: [decorateField, backgroundDecoratorLayer],\n});\n\nexport { wholeASTDecoratorFacet, updateWholeDecorations };\n\nexport type { WholeASTDecorator };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n type EditorView,\n RectangleMarker,\n type ViewUpdate,\n layer,\n} from '@codemirror/view';\nimport { EditorSelection, Facet } from '@codemirror/state';\n\nimport type { BackgroundDecoration } from './types';\nimport { squash } from './squash';\nimport { cutAtLineBreak } from './cut';\n\ntype BackgroundDecorationFn = (view: EditorView) => BackgroundDecoration[];\n\nfunction configChanged(update: ViewUpdate) {\n return (\n update.startState.facet(backgroundDecorations) !==\n update.state.facet(backgroundDecorations)\n );\n}\n\n// 使用时需置于 drawSelection 下方(影响 zIndex)\nconst backgroundDecoratorLayer = layer({\n above: false,\n markers(view) {\n const decorations = view.state\n .facet(backgroundDecorations)\n .reduce<\n BackgroundDecoration[]\n >((memo, current) => [...memo, ...current(view)], []);\n\n return cutAtLineBreak(squash(decorations), view.state)\n .map(deco =>\n RectangleMarker.forRange(\n view,\n deco.className,\n EditorSelection.range(deco.from, deco.to),\n ),\n )\n .reduce((memo, current) => [...memo, ...current], []);\n },\n update(update) {\n return (\n update.focusChanged ||\n update.docChanged ||\n update.selectionSet ||\n update.viewportChanged ||\n configChanged(update)\n );\n },\n class: 'cm-backgroundDecoratorLayer',\n});\n\nconst backgroundDecorations = Facet.define<\n BackgroundDecorationFn,\n BackgroundDecorationFn[]\n>({\n enables: [backgroundDecoratorLayer],\n});\n\nexport { backgroundDecoratorLayer, backgroundDecorations };\n\nexport type { BackgroundDecoration };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport type { BackgroundDecoration } from './types';\n\nfunction squash(decorations: BackgroundDecoration[]) {\n const result: BackgroundDecoration[] = [];\n const grouped = groupDecorationsByClassName(decorations);\n\n grouped.forEach((decos, className) => {\n const merged = mergeIntervals(decos);\n result.push(\n ...merged.map(m => ({\n from: m.start,\n to: m.end,\n className,\n })),\n );\n });\n\n return result;\n}\n\nfunction groupDecorationsByClassName(decorations: BackgroundDecoration[]) {\n const map = new Map<string, BackgroundDecoration[]>();\n\n decorations.forEach(deco => {\n if (!map.has(deco.className)) {\n map.set(deco.className, []);\n }\n\n map.get(deco.className)!.push(deco);\n });\n\n return map;\n}\n\nfunction mergeIntervals(decorations: BackgroundDecoration[]) {\n const merged: { start: number; end: number }[] = [];\n const cloned = decorations.map(deco => ({\n start: deco.from,\n end: deco.to,\n }));\n\n cloned.sort((a, b) => a.start - b.start);\n\n let current = cloned[0];\n for (let i = 1; i < cloned.length; i++) {\n const next = cloned[i];\n\n if (next.start <= current.end) {\n current.end = Math.max(current.end, next.end);\n } else {\n merged.push(current);\n current = next;\n }\n }\n\n merged.push(current);\n\n return merged;\n}\n\nexport { squash };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { type EditorState } from '@codemirror/state';\n\nimport type { BackgroundDecoration } from './types';\n\n// 将跨行的 decoration 在换行符的位置再次切割\nfunction cutAtLineBreak(\n decorations: BackgroundDecoration[],\n state: EditorState,\n) {\n const cuts: BackgroundDecoration[] = [];\n\n decorations.forEach(deco => {\n const startLine = state.doc.lineAt(deco.from);\n const endLine = state.doc.lineAt(deco.to);\n if (startLine.number !== endLine.number) {\n const slices: BackgroundDecoration[] = [];\n let pos = deco.from;\n\n for (let i = startLine.number; i < endLine.number; i++) {\n const line = state.doc.line(i);\n\n slices.push({\n from: pos,\n to: line.to,\n className: deco.className,\n });\n\n pos = line.to + 1;\n }\n\n slices.push({\n from: pos,\n to: deco.to,\n className: deco.className,\n });\n\n cuts.push(...slices);\n } else {\n cuts.push(deco);\n }\n });\n\n return cuts;\n}\n\nexport { cutAtLineBreak };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport type { TreeCursor } from '@lezer/common';\nimport {\n Decoration,\n type DecorationSet,\n type EditorView,\n type PluginValue,\n ViewPlugin,\n type ViewUpdate,\n} from '@codemirror/view';\nimport { type EditorState, Facet, RangeSetBuilder } from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\n\nimport {\n type BackgroundDecoration,\n backgroundDecorations,\n} from '../background-decorations';\n\ntype CursorASTDecorator = (\n cursor: TreeCursor,\n state: EditorState,\n) => ClassNameDecorationSpec | BackgroundDecorationSpec | undefined;\n\ninterface BaseDecorationSpec {\n from?: number;\n to?: number;\n}\n\ninterface ClassNameDecorationSpec extends BaseDecorationSpec {\n type: 'className';\n className: string;\n}\n\ninterface BackgroundDecorationSpec {\n from?: number;\n to?: number;\n type: 'background';\n className: string;\n}\n\nclass CursorASTView implements PluginValue {\n private classNameDecorationCache: Map<string, Decoration> = new Map();\n\n decorations: DecorationSet = Decoration.none;\n backgroundDecorations: BackgroundDecoration[] = [];\n\n constructor(private view: EditorView) {}\n\n getClassDecoration(className: string) {\n if (!this.classNameDecorationCache.has(className)) {\n this.classNameDecorationCache.set(\n className,\n Decoration.mark({\n class: className,\n }),\n );\n }\n\n return this.classNameDecorationCache.get(className);\n }\n\n update(update: ViewUpdate) {\n // focus or selection changed\n if (\n (update.focusChanged && update.view.hasFocus) ||\n !update.startState.selection.eq(update.state.selection)\n ) {\n const tree = syntaxTree(update.state);\n const pos = update.state.selection.main.head;\n const decorators = update.state.facet(cursorASTDecoratorFacet);\n\n const cursor = tree.cursorAt(pos, 0);\n const builder = new RangeSetBuilder<Decoration>();\n const bgDecorations: BackgroundDecoration[] = [];\n\n do {\n decorators.forEach(decorator => {\n const decorationSpec = decorator(cursor, update.state);\n if (!decorationSpec) {\n return;\n }\n\n let decoration;\n switch (decorationSpec.type) {\n case 'className':\n decoration = this.getClassDecoration(decorationSpec.className);\n break;\n case 'background':\n bgDecorations.push({\n from: decorationSpec.from ?? cursor.from,\n to: decorationSpec.to ?? cursor.to,\n className: decorationSpec.className,\n });\n break;\n }\n\n if (decoration) {\n builder.add(\n decorationSpec.from ?? cursor.from,\n decorationSpec.to ?? cursor.to,\n decoration,\n );\n }\n });\n } while (cursor.parent());\n\n this.decorations = builder.finish();\n this.backgroundDecorations = bgDecorations;\n }\n\n if (update.focusChanged && !update.view.hasFocus) {\n this.decorations = Decoration.none;\n this.backgroundDecorations = [];\n }\n }\n}\n\nconst cursorASTDecoratorFacet = Facet.define<\n CursorASTDecorator,\n CursorASTDecorator[]\n>({\n enables: [\n ViewPlugin.fromClass(CursorASTView, {\n decorations: v => v.decorations,\n provide(plugin) {\n return [\n backgroundDecorations.of(\n view => view.plugin(plugin)?.backgroundDecorations ?? [],\n ),\n ];\n },\n }),\n ],\n});\n\nexport { cursorASTDecoratorFacet };\n\nexport type { CursorASTDecorator };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n wholeASTDecoratorFacet,\n updateWholeDecorations,\n type WholeASTDecorator,\n} from './whole';\nimport { cursorASTDecoratorFacet, type CursorASTDecorator } from './cursor';\n\nconst astDecorator = {\n whole: wholeASTDecoratorFacet,\n fromCursor: cursorASTDecoratorFacet,\n};\n\nexport {\n astDecorator,\n updateWholeDecorations,\n type WholeASTDecorator,\n type CursorASTDecorator,\n};\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { traverseAST } from '@coze-editor/utils';\nimport { type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { type EditorState } from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\n\nconst astDebugger = ViewPlugin.fromClass(\n class {\n constructor(view: EditorView) {\n printTreeFromState(view.state);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged) {\n printTreeFromState(update.state);\n }\n }\n },\n);\n\nfunction printTreeFromState(state: EditorState) {\n const tree = syntaxTree(state);\n\n console.groupCollapsed('Syntax Tree');\n\n const cursor = tree.cursor();\n traverseAST(cursor, 0, tree.length, cursor => {\n console.group(\n `%c${cursor.name}(${cursor.from}:${cursor.to})`,\n 'color: purple;',\n );\n\n console.log(state.sliceDoc(cursor.from, cursor.to));\n console.groupEnd();\n });\n\n console.groupEnd();\n}\n\nexport { astDebugger };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { type EditorView, WidgetType, keymap } from '@codemirror/view';\n\n// function blockAt(view: EditorView, pos: number): BlockInfo {\n// const line = view.lineBlockAt(pos)\n// if (Array.isArray(line.type)) for (const l of line.type) {\n// if (l.to > pos || l.to == pos && (l.to == line.to || l.type == BlockType.Text)) return l\n// }\n// return line\n// }\n\nconst focusableKeymap = keymap.of([\n {\n key: 'ArrowLeft',\n run(view: EditorView) {\n const mainSelection = view.state.selection.main;\n if (!mainSelection.empty) {\n return false;\n }\n\n let handled = false;\n const pos = mainSelection.from;\n\n // WHY get widget view directly from view.docView\n // widget has eq method, if eq returns true, new widget will not be applied\n // widget.toDOM will not be called in this case, so widget.focus won't take effect\n\n // @ts-expect-error docView is not public\n for (const line of view.docView.children) {\n for (const child of line.children) {\n if (\n child.isWidget &&\n child.widget instanceof FocusableWidget &&\n child.posAtEnd === pos\n ) {\n child.widget.focus(1);\n handled = true;\n }\n }\n\n if (handled) {\n break;\n }\n }\n return handled;\n },\n },\n {\n key: 'ArrowRight',\n run(view: EditorView) {\n const mainSelection = view.state.selection.main;\n if (!mainSelection.empty) {\n return false;\n }\n\n let handled = false;\n\n const pos = mainSelection.from;\n\n // @ts-expect-error docView is not public\n for (const line of view.docView.children) {\n for (const child of line.children) {\n if (\n child.isWidget &&\n child.widget instanceof FocusableWidget &&\n child.posAtStart === pos\n ) {\n child.widget.focus(-1);\n handled = true;\n break;\n }\n }\n\n if (handled) {\n break;\n }\n }\n\n return handled;\n },\n },\n]);\n\nabstract class FocusableWidget extends WidgetType {\n abstract focus(fromSide: -1 | 1): void;\n}\n\nexport { focusableKeymap, FocusableWidget };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { FacetCombineStrategy, flatten } from '@coze-editor/utils';\nimport { ViewPlugin, type EditorView, type ViewUpdate } from '@codemirror/view';\nimport { EditorSelection, type EditorState, Facet } from '@codemirror/state';\n\nimport { mergeIntervals, findContainingRange } from './utils';\n\ninterface Range {\n from: number;\n to: number;\n}\ntype RangesProvider = (state: EditorState) => Range[];\ntype SelectUserEvent = 'select' | 'select.pointer';\n\nconst extension = ViewPlugin.fromClass(\n class {\n lastFocus = false;\n\n constructor(view: EditorView) {\n this.lastFocus = view.hasFocus;\n }\n\n update(update: ViewUpdate) {\n const userEvent = update.state.facet(selectUserEvent) ?? 'select';\n\n const hasSelectUserEvent = update.transactions.some(tr =>\n tr.isUserEvent(userEvent),\n );\n\n if (hasSelectUserEvent) {\n const lastHasFocus = this.lastFocus;\n\n const startSelection = update.startState.selection;\n const { selection } = update.state;\n\n const rangesProviders = update.state.facet(rangesFacet);\n const ranges = mergeIntervals(\n flatten(\n rangesProviders.map(provider => provider(update.view.state)),\n ).filter(Boolean),\n );\n\n const currentRange = findContainingRange(ranges, selection.main.from);\n\n // 1. 从当前选区外进入当前选区\n // 2. 失焦状态进入当前选区(失焦前原本就在 a range 内,聚焦时再次进入 a range 内,需要再次触发选中)\n if (\n selection.main.empty &&\n currentRange &&\n (!lastHasFocus ||\n // 上一次的选区 from 或 to 在当前选区外(“首次进入”当前选区)\n findContainingRange(ranges, startSelection.main.from) !==\n currentRange ||\n findContainingRange(ranges, startSelection.main.to) !==\n currentRange)\n ) {\n queueMicrotask(() => {\n update.view.dispatch({\n selection: selection.replaceRange(\n EditorSelection.range(currentRange.from, currentRange.to),\n ),\n });\n });\n }\n }\n\n if (this.lastFocus !== update.view.hasFocus) {\n this.lastFocus = update.view.hasFocus;\n }\n }\n },\n);\n\nconst rangesFacet = Facet.define<RangesProvider>({\n enables: extension,\n});\n\nconst selectUserEvent = Facet.define<SelectUserEvent, SelectUserEvent>({\n combine: FacetCombineStrategy.Last,\n});\n\nexport { rangesFacet, selectUserEvent };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\ninterface Range {\n from: number;\n to: number;\n}\n\nfunction mergeIntervals(ranges: Range[]) {\n if (ranges.length === 0) {\n return [];\n }\n\n const merged: { from: number; to: number }[] = [];\n const cloned = ranges.map(range => ({\n from: range.from,\n to: range.to,\n }));\n\n cloned.sort((a, b) => a.from - b.from);\n\n let current = cloned[0];\n for (let i = 1; i < cloned.length; i++) {\n const next = cloned[i];\n\n if (next.from <= current.to) {\n current.to = Math.max(current.to, next.to);\n } else {\n merged.push(current);\n current = next;\n }\n }\n\n if (current) {\n merged.push(current);\n }\n\n return merged;\n}\n\nfunction findContainingRange(ranges: Range[], pos: number): Range | undefined {\n for (const range of ranges) {\n if (pos >= range.from && pos <= range.to) {\n return range;\n }\n }\n}\n\nexport { mergeIntervals, findContainingRange };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { flatten, hasOverlap } from '@coze-editor/utils';\nimport { EditorSelection, EditorState, Facet } from '@codemirror/state';\n\ninterface SelectionEnlargerSpec {\n source: {\n from: number;\n to: number;\n };\n target: {\n from: number;\n to: number;\n };\n}\n\ntype SelectionEnlargerProvider = (\n state: EditorState,\n) => SelectionEnlargerSpec[];\n\nconst extension = EditorState.transactionFilter.of(tr => {\n // 内容变化或者选区不变,跳过\n if (tr.docChanged || tr.newSelection.eq(tr.startState.selection)) {\n return tr;\n }\n\n const providers = tr.startState.facet(selectionEnlarger);\n const specs = flatten(providers.map(provider => provider(tr.startState)));\n\n let { newSelection } = tr;\n\n newSelection.ranges.forEach((range, index) => {\n for (const spec of specs) {\n if (hasOverlap(range, spec.source)) {\n const isReversed = range.head < range.anchor;\n const from = Math.min(range.from, spec.target.from);\n const to = Math.max(range.to, spec.target.to);\n const newRange = isReversed\n ? EditorSelection.range(\n to,\n from,\n range.goalColumn,\n range.bidiLevel ?? undefined,\n )\n : EditorSelection.range(\n from,\n to,\n range.goalColumn,\n range.bidiLevel ?? undefined,\n );\n\n newSelection = newSelection.replaceRange(newRange, index);\n }\n }\n });\n\n return [\n tr,\n {\n selection: newSelection,\n },\n ];\n});\n\nconst selectionEnlarger = Facet.define<SelectionEnlargerProvider>({\n enables: extension,\n});\n\nexport { selectionEnlarger };\n\nexport type { SelectionEnlargerSpec };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { flatten, hasOverlap } from '@coze-editor/utils';\nimport { ChangeSet, EditorState, Facet } from '@codemirror/state';\n\ninterface DeletionEnlargerSpec {\n source: {\n from: number;\n to: number;\n };\n target: {\n from: number;\n to: number;\n };\n}\n\ntype DeletionEnlargerProvider = (state: EditorState) => DeletionEnlargerSpec[];\n\nconst extension = EditorState.transactionFilter.of(tr => {\n const providers = tr.startState.facet(deletionEnlarger);\n\n const specs = flatten(providers.map(provider => provider(tr.startState)));\n\n const { length } = tr.startState.doc;\n let changes = ChangeSet.empty(length);\n\n tr.changes.iterChanges((fromA, toA, fromB, toB) => {\n const isDeletion = fromB === toB;\n\n if (!isDeletion) {\n return;\n }\n\n for (const spec of specs) {\n if (\n hasOverlap(\n {\n from: fromA,\n to: toA,\n },\n spec.source,\n )\n ) {\n const change = ChangeSet.of([{ ...spec.target, insert: '' }], length);\n\n changes = changes.compose(change.map(changes));\n }\n }\n });\n\n const nextChanges = changes.map(tr.changes);\n\n if (nextChanges.empty) {\n return tr;\n }\n\n return [\n tr,\n {\n changes: nextChanges,\n sequential: true,\n },\n ];\n});\n\nconst deletionEnlarger = Facet.define<DeletionEnlargerProvider>({\n enables: extension,\n});\n\nexport { deletionEnlarger };\n\nexport type { DeletionEnlargerSpec };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\n// modified from closeBrackets extension (from @codemirror/autocomplete)\nimport { EditorView } from '@codemirror/view';\nimport { type EditorState, Prec, type Extension } from '@codemirror/state';\n\ninterface InputRule {\n type: 'character';\n triggerCharacter: string;\n handler: ({\n view,\n state,\n from,\n to,\n }: {\n view: EditorView;\n state: EditorState;\n from: number;\n to: number;\n }) => boolean;\n}\n\nconst android =\n typeof navigator === 'object' && /Android\\b/.test(navigator.userAgent);\n\nconst isExtension = (v: unknown): v is Extension => Boolean(v);\nconst inputRules = (rules?: InputRule[]) => {\n const ruleExtensions: Extension[] = (rules ?? [])\n .map(({ type, triggerCharacter, handler }) => {\n if (type === 'character') {\n return EditorView.inputHandler.of((view, from, to, insert) => {\n if (\n (android ? view.composing : view.compositionStarted) ||\n view.state.readOnly\n ) {\n return false;\n }\n const sel = view.state.selection.main;\n if (\n insert !== triggerCharacter ||\n from !== sel.from ||\n to !== sel.to\n ) {\n return false;\n }\n return handler({\n view,\n state: view.state,\n from,\n to,\n });\n });\n }\n })\n .filter(v => isExtension(v));\n\n // give it a higher precedence than default closebrackets extension\n return Prec.high(ruleExtensions);\n};\n\nexport { inputRules };\n\nexport type { InputRule };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { parseMixed } from '@lezer/common';\nimport { parser as templateParser } from '@coze-editor/lezer-parser-template';\nimport { type Language, LRLanguage } from '@codemirror/language';\n\ninterface MixOptions {\n name?: string;\n outerLanguage?: Language;\n innerLanguage?: Language;\n}\n\nfunction mixLanguages({ name, outerLanguage, innerLanguage }: MixOptions) {\n return LRLanguage.define({\n name,\n parser: templateParser.configure({\n wrap: parseMixed(node => {\n if (outerLanguage && node.type.isTop) {\n return {\n parser: outerLanguage.parser,\n overlay: n => n.type.name === 'Text',\n };\n }\n\n if (innerLanguage && node.name === 'InterpolationContent') {\n return {\n parser: innerLanguage.parser,\n };\n }\n\n return null;\n }),\n }),\n });\n}\n\nexport { mixLanguages };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\n/// Adapted from https://github.com/nota-lang/nota/blob/master/packages/nota-editor/lib/indentation-guides.ts 做了一些调整\nimport { range } from 'es-toolkit';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n ViewPlugin,\n type ViewUpdate,\n WidgetType,\n} from '@codemirror/view';\nimport { RangeSetBuilder } from '@codemirror/state';\n\nimport { getCodeStart, fromPairs } from './utils';\n\nconst indentationMark = Decoration.mark({ class: 'cm-indentation-guide' });\nconst indentationLevelMarks = range(20).map(i =>\n Decoration.line({ class: `cm-indentation-level-${i}` }),\n);\n\nclass IndentationWidget extends WidgetType {\n constructor(readonly indents: number[]) {\n super();\n }\n\n static create(indents: number[]) {\n return Decoration.widget({\n widget: new IndentationWidget(indents),\n side: 1,\n });\n }\n\n toDOM() {\n const wrap = document.createElement('span');\n wrap.className = 'cm-indentation-widget';\n for (const indent of this.indents) {\n const marker = wrap.appendChild(document.createElement('span'));\n marker.className = 'cm-indentation-guide';\n marker.textContent = ' ';\n wrap.append(' '.repeat(indent - 1));\n }\n return wrap;\n }\n}\n\nfunction makeIndentationMark(\n from: number,\n to: number,\n indent: number,\n tabSize: number,\n builder: RangeSetBuilder<Decoration>,\n) {\n builder.add(from, from, indentationLevelMarks[indent / tabSize]);\n for (let i = from; i < Math.min(from + indent, to); i += tabSize) {\n builder.add(i, i + 1, indentationMark);\n }\n}\n\nfunction makeIndentationWidget(\n from: number,\n to: number,\n tabSize: number,\n builder: RangeSetBuilder<Decoration>,\n) {\n const length = to - from;\n if (length !== 0) {\n return;\n }\n\n if (tabSize > 2) {\n builder.add(to, to, IndentationWidget.create([tabSize]));\n } else {\n builder.add(to, to, IndentationWidget.create([2, tabSize * 2]));\n }\n}\n\nfunction makeIndentationDecorators(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n const tabSize = Number(view.state.tabSize);\n const { doc } = view.state;\n const spaceOnlyLines: { from: number; to: number }[] = [];\n let currentIndent = 0;\n for (const { from: visibleFrom, to: visibleTo } of view.visibleRanges) {\n let to = visibleFrom - 1;\n let pos, from, length, text;\n\n while ((pos = to + 1) <= visibleTo) {\n ({ from, to, length, text } = doc.lineAt(pos));\n const codeStartsAt = getCodeStart(text);\n const isAllSpaces = codeStartsAt === length;\n // we don't have indentation guides for the zero indentation level\n const skipIndent = codeStartsAt === 0;\n const isComment = text[codeStartsAt] === '/';\n if (isAllSpaces) {\n spaceOnlyLines.push({ from, to });\n continue;\n } else if (skipIndent) {\n spaceOnlyLines.length = 0;\n continue;\n }\n\n const indent = Math.ceil(codeStartsAt / tabSize) * tabSize;\n\n if (!isComment) {\n currentIndent = indent;\n }\n\n for (const { from: spaceFrom, to: spaceTo } of spaceOnlyLines) {\n makeIndentationMark(\n spaceFrom,\n spaceTo,\n currentIndent,\n tabSize,\n builder,\n );\n makeIndentationWidget(spaceFrom, spaceTo, tabSize, builder);\n }\n spaceOnlyLines.length = 0;\n\n makeIndentationMark(from, to, indent, tabSize, builder);\n }\n }\n return builder.finish();\n}\n\nconst showIndentations = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = makeIndentationDecorators(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = makeIndentationDecorators(update.view);\n }\n }\n },\n {\n decorations: v => v.decorations,\n },\n);\n\nconst indentationTheme = EditorView.baseTheme({\n '.cm-line': {\n paddingLeft: 0,\n marginLeft: '2px',\n },\n '.cm-indentation-guide': {\n position: 'relative',\n },\n '.cm-indentation-guide:after': {\n position: 'absolute',\n content: \"''\",\n right: '0.9ch',\n height: '1.4em',\n borderLeft: '1px solid rgba(28, 31, 35, .08)',\n },\n ...fromPairs(\n indentationLevelMarks.map((_decoration, i) => [\n `.cm-indentation-level-${i}`,\n { textIndent: `-${i * 2}ch`, paddingLeft: `${i * 2}ch` },\n ]),\n ),\n});\n\nexport const indentGuides = () => [showIndentations, indentationTheme];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nconst SPACES = /^\\s*/;\n\nexport const getCodeStart = (text: string) => text.match(SPACES)![0].length;\n\nexport const fromPairs = (pairs: [string, unknown][]) => {\n let index = -1;\n const length = pairs == null ? 0 : pairs.length;\n const result: Record<string, unknown> = {};\n\n while (++index < length) {\n const pair = pairs[index];\n result[pair[0]] = pair[1];\n }\n return result;\n};\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EditorView, layer, type ViewUpdate } from '@codemirror/view';\n\nimport { EmptyBlock } from './empty-block';\n\nexport const scrollBeyondLastLine = (scrollHeight?: number) => [\n layer({\n above: false,\n updateOnDocViewUpdate: true,\n class: 'cm-empty-marker-layer',\n update(update: ViewUpdate): boolean {\n return update.state.doc.lines !== update.startState.doc.lines;\n },\n markers(view) {\n const maker = new EmptyBlock(\n view.state.doc.lines,\n view.contentHeight,\n scrollHeight,\n );\n return [maker];\n },\n }),\n EditorView.theme({\n '& .cm-empty-marker-layer': {\n height: '100%',\n },\n }),\n];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport type { LayerMarker } from '@codemirror/view';\n\nexport class EmptyBlock implements LayerMarker {\n constructor(\n private lineNumber: number,\n readonly contentHeight: number,\n readonly scrollHeight?: number,\n ) {}\n\n draw() {\n const elt = document.createElement('div');\n elt.className = 'cm-empty-scroll-block-maker';\n this.adjust(elt);\n return elt;\n }\n\n update(_: HTMLElement, prev: EmptyBlock) {\n return (\n prev.lineNumber === this.lineNumber &&\n prev.contentHeight === this.contentHeight &&\n prev.scrollHeight === this.scrollHeight\n );\n }\n\n private adjust(elt: HTMLElement) {\n elt.style.display = 'block';\n elt.style.width = '1px';\n\n if (this.lineNumber > 1) {\n elt.style.height = `calc(${typeof this.scrollHeight === 'number' ? `${this.scrollHeight}px` : '100%'} + ${this.contentHeight}px)`;\n } else {\n elt.style.height = '0';\n }\n }\n\n eq(p: EmptyBlock) {\n return (\n this.lineNumber === p.lineNumber &&\n this.contentHeight === p.contentHeight &&\n this.scrollHeight === p.scrollHeight\n );\n }\n}\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { Decoration, type DecorationSet, EditorView } from '@codemirror/view';\nimport { type EditorState, StateField, type Range } from '@codemirror/state';\n\nconst pairs: Record<string, string> = {\n '(': ')',\n '{': '}',\n '[': ']',\n ')': '(',\n '}': '{',\n ']': '[',\n};\n\nconst findMatchingBracket = (state: EditorState, cursorPos: number) => {\n try {\n const doc = state.doc.toString();\n let stack: string[] = [];\n let leftIndex = -1;\n let rightIndex = -1;\n\n // 向前查找\n for (let i = cursorPos - 1; i >= 0; i--) {\n const char = doc[i];\n if (pairs[char]) {\n if ([')', '}', ']'].includes(char)) {\n stack.push(char);\n } else {\n if (stack.length === 0) {\n leftIndex = i;\n break;\n }\n const lastBracket = stack.pop();\n if (pairs[char] !== lastBracket) {\n return null;\n }\n }\n }\n }\n\n stack = [];\n\n // 向后查找\n for (let i = cursorPos; i < doc.length; i++) {\n const char = doc[i];\n if (pairs[char]) {\n if (['(', '{', '['].includes(char)) {\n stack.push(char);\n } else {\n if (stack.length === 0) {\n rightIndex = i;\n break;\n }\n const lastBracket = stack.pop();\n if (pairs[char] !== lastBracket) {\n return null;\n }\n }\n }\n }\n\n if (leftIndex !== -1 && rightIndex !== -1) {\n return [leftIndex, rightIndex];\n }\n\n return null;\n } catch (e) {\n console.error('findMatchingBracket failed', e);\n return null;\n }\n};\n\nconst renderMatch = (match: number) => {\n const decorations: Range<Decoration>[] = [];\n const mark = Decoration.mark({ class: 'cm-matchingBracket' });\n decorations.push(mark.range(match, match + 1));\n return decorations;\n};\n\nconst bracketMatchingState = StateField.define<DecorationSet>({\n create() {\n return Decoration.none;\n },\n update(deco, tr) {\n if (!tr.docChanged && !tr.selection) {\n return deco;\n }\n\n let decorations: Range<Decoration>[] = [];\n\n for (const range of tr.state.selection.ranges) {\n if (!range.empty) {\n continue;\n }\n const match = findMatchingBracket(tr.state, range.head);\n\n if (match) {\n decorations = decorations.concat(\n renderMatch(match[0]),\n renderMatch(match[1]),\n );\n }\n }\n\n return Decoration.set(decorations, true);\n },\n provide: f => EditorView.decorations.from(f),\n});\n\nexport const matchingBrackets = [bracketMatchingState];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n EditorView,\n Decoration,\n ViewPlugin,\n type ViewUpdate,\n type DecorationSet,\n} from '@codemirror/view';\nimport { syntaxTree } from '@codemirror/language';\n\nconst DEFAULT_COLORS = ['#ffd700', '#da70d6', '#179fff'];\n\nconst ColorizationBracketsPlugin = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = this.getBracketDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.selectionSet || update.viewportChanged) {\n this.decorations = this.getBracketDecorations(update.view);\n }\n }\n\n getBracketDecorations(view: EditorView) {\n const { doc } = view.state;\n const decorations: any[] = [];\n const stack: { type: string; from: number }[] = [];\n const limitNodeType = ['Comment', 'String'];\n\n const tree = syntaxTree(view.state);\n\n for (let pos = 0; pos < doc.length; pos += 1) {\n const char = doc.sliceString(pos, pos + 1);\n const node = tree.resolveInner(pos);\n\n if (limitNodeType.includes(node.type.name)) {\n continue;\n }\n\n if (char === '(' || char === '[' || char === '{') {\n stack.push({ type: char, from: pos });\n } else if (char === ')' || char === ']' || char === '}') {\n const open = stack.pop();\n if (open && open.type === this.getMatchingBracket(char)) {\n const index = stack.length % 3;\n decorations.push(\n Decoration.mark({ class: `colorization-bracket-${index}` }).range(\n open.from,\n open.from + 1,\n ),\n Decoration.mark({ class: `colorization-bracket-${index}` }).range(\n pos,\n pos + 1,\n ),\n );\n }\n }\n }\n\n decorations.sort((a, b) => a.from - b.from || a.startSide - b.startSide);\n\n return Decoration.set(decorations);\n }\n\n getMatchingBracket(closingBracket: string) {\n switch (closingBracket) {\n case ')':\n return '(';\n case ']':\n return '[';\n case '}':\n return '{';\n default:\n return null;\n }\n }\n },\n {\n decorations: v => v.decorations,\n },\n);\n\nexport const colorizationBrackets = [\n ColorizationBracketsPlugin,\n EditorView.baseTheme({\n '.colorization-bracket-0': { color: DEFAULT_COLORS[0] },\n '.colorization-bracket-0 > span': { color: DEFAULT_COLORS[0] },\n '.colorization-bracket-1': { color: DEFAULT_COLORS[1] },\n '.colorization-bracket-1 > span': { color: DEFAULT_COLORS[1] },\n '.colorization-bracket-2': { color: DEFAULT_COLORS[2] },\n '.colorization-bracket-2 > span': { color: DEFAULT_COLORS[2] },\n }),\n];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n Direction,\n type EditorView,\n type LayerMarker,\n type ViewUpdate,\n layer,\n} from '@codemirror/view';\nimport { Facet } from '@codemirror/state';\n\nenum SelectionSide {\n Head = 'head',\n Anchor = 'anchor',\n}\n\ninterface PositionElement {\n dom: HTMLElement | null;\n pos: SelectionSide | number | ((view: EditorView) => number);\n}\nconst elementAtPosition = Facet.define<PositionElement, PositionElement[]>();\n\nfunction configChanged(update: ViewUpdate) {\n return (\n update.startState.facet(elementAtPosition) !==\n update.state.facet(elementAtPosition)\n );\n}\n\ninterface Rect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nclass PositionMarker implements LayerMarker {\n constructor(\n public readonly dom: HTMLElement,\n public readonly rect?: Rect,\n ) {}\n\n eq(marker: PositionMarker) {\n return Boolean(\n ((!this.rect && !marker.rect) ||\n (this.rect &&\n marker.rect &&\n this.rect.left === marker.rect.left &&\n this.rect.top === marker.rect.top &&\n this.rect.width === marker.rect.width &&\n this.rect.height === marker.rect.height)) &&\n this.dom === marker.dom,\n );\n }\n\n draw() {\n this.adjust(this.dom);\n return this.dom;\n }\n\n update() {\n this.adjust(this.dom);\n return true;\n }\n\n private adjust(elt: HTMLElement) {\n elt.style.pointerEvents = 'none';\n\n if (!this.rect) {\n return;\n }\n elt.style.left = `${this.rect.left}px`;\n elt.style.top = `${this.rect.top}px`;\n elt.style.width = `${this.rect.width}px`;\n elt.style.height = `${this.rect.height}px`;\n }\n}\n\nfunction getBase(view: EditorView) {\n const rect = view.scrollDOM.getBoundingClientRect();\n const left =\n view.textDirection === Direction.LTR\n ? rect.left\n : rect.right - view.scrollDOM.clientWidth * view.scaleX;\n return {\n left: left - view.scrollDOM.scrollLeft * view.scaleX,\n top: rect.top - view.scrollDOM.scrollTop * view.scaleY,\n };\n}\n\nconst positionElementLayer = layer({\n above: true,\n\n markers(view: EditorView) {\n const elements = view.state.facet(elementAtPosition);\n\n if (!elements || elements.length === 0) {\n return [];\n }\n\n const base = getBase(view);\n\n const temp: any[] = [];\n\n const markers: PositionMarker[] = [];\n for (const { dom, pos } of elements) {\n if (!dom) {\n continue;\n }\n\n let finalPos = -1;\n\n if (typeof pos === 'function') {\n finalPos = pos(view);\n } else if (typeof pos === 'number') {\n finalPos = pos;\n } else if (pos === SelectionSide.Head) {\n finalPos = view.state.selection.main.head;\n } else if (pos === SelectionSide.Anchor) {\n finalPos = view.state.selection.main.anchor;\n }\n\n const coords = view.coordsAtPos(finalPos);\n\n // 由于 codemirror 实现了局部渲染,可能取不到 coords\n if (coords) {\n temp.push(coords);\n\n const width = 1;\n const left = coords.left - base.left - width / 2;\n const top = coords.top - base.top;\n const height = coords.bottom - coords.top;\n\n markers.push(new PositionMarker(dom, { left, top, width, height }));\n } else {\n markers.push(new PositionMarker(dom));\n }\n }\n\n return markers;\n },\n\n update(update) {\n return (\n update.docChanged ||\n update.selectionSet ||\n update.viewportChanged ||\n configChanged(update)\n );\n },\n\n class: 'cm-positionReferenceLayer',\n});\n\nexport { elementAtPosition, positionElementLayer, SelectionSide };\n\nexport type { PositionElement };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { Decoration, EditorView } from '@codemirror/view';\nimport { Facet, type RangeSet, RangeSetBuilder } from '@codemirror/state';\n\nimport { type MarkDecorationSpec, squash } from './squash';\n\nconst cache = new Map<string, Decoration>();\nfunction getClassNameDecoration(className: string) {\n const cacheKey = className;\n\n if (!cache.has(cacheKey)) {\n const mark = Decoration.mark({ class: className });\n cache.set(cacheKey, mark);\n }\n\n return cache.get(cacheKey)!;\n}\n\nconst mergeableMarkers = Facet.define<\n MarkDecorationSpec[],\n RangeSet<Decoration>\n>({\n combine(specs) {\n const builder = new RangeSetBuilder<Decoration>();\n\n const flattened = specs.reduce(\n (memo, current) => [...memo, ...current],\n [],\n );\n\n for (const spec of squash(flattened)) {\n const decoration = getClassNameDecoration(spec.className);\n builder.add(spec.from, spec.to, decoration);\n }\n\n return builder.finish();\n },\n enables(self) {\n return EditorView.decorations.compute([self], state => state.facet(self));\n },\n});\n\nexport { mergeableMarkers };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nexport interface MarkDecorationSpec {\n from: number;\n to: number;\n className: string;\n}\n\nfunction squash(decorations: MarkDecorationSpec[]) {\n const result: MarkDecorationSpec[] = [];\n const grouped = groupDecorationsByClassName(decorations);\n\n grouped.forEach((decos, className) => {\n const merged = mergeIntervals(decos);\n result.push(\n ...merged.map(m => ({\n from: m.start,\n to: m.end,\n className,\n })),\n );\n });\n\n result.sort((a, b) => a.from - b.from);\n\n return result;\n}\n\nfunction groupDecorationsByClassName(decorations: MarkDecorationSpec[]) {\n const map = new Map<string, MarkDecorationSpec[]>();\n\n decorations.forEach(deco => {\n if (!map.has(deco.className)) {\n map.set(deco.className, []);\n }\n\n map.get(deco.className)!.push(deco);\n });\n\n return map;\n}\n\nfunction mergeIntervals(decorations: MarkDecorationSpec[]) {\n const merged: { start: number; end: number }[] = [];\n const cloned = decorations.map(deco => ({\n start: deco.from,\n end: deco.to,\n }));\n\n cloned.sort((a, b) => a.start - b.start);\n\n let current = cloned[0];\n for (let i = 1; i < cloned.length; i++) {\n const next = cloned[i];\n\n if (next.start <= current.end) {\n current.end = Math.max(current.end, next.end);\n } else {\n merged.push(current);\n current = next;\n }\n }\n\n merged.push(current);\n\n return merged;\n}\n\nexport { squash };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { hasOverlap } from '@coze-editor/utils';\nimport { EditorSelection, EditorState, Facet } from '@codemirror/state';\n\ninterface Range {\n from: number;\n to: number;\n}\n\nconst extension = [\n // 禁止编辑\n EditorState.changeFilter.of(tr => {\n const providers = tr.startState.facet(frozenRanges);\n const specs: Range[] = providers.reduce<Range[]>(\n (memo, provider) => [...memo, ...provider(tr.startState)],\n [],\n );\n if (Array.isArray(specs)) {\n const flattened = specs.reduce<number[]>(\n (memo, current) => [...memo, current.from, current.to],\n [],\n );\n\n return flattened;\n }\n\n return true;\n }),\n // forbid cursor move into frozen ranges\n EditorState.transactionFilter.of(tr => {\n const len = tr.startState.doc.length;\n\n const providers = tr.startState.facet(frozenRanges);\n const specs: Range[] = providers\n .reduce<Range[]>((memo, provider) => [...memo, ...provider(tr.state)], [])\n .filter(\n spec =>\n spec.from >= 0 && spec.from < len && spec.to >= 0 && spec.to < len,\n );\n\n let { newSelection } = tr;\n newSelection.ranges.forEach((range, index) => {\n for (const spec of specs) {\n if (range.empty && range.from > spec.from && range.to < spec.to) {\n newSelection = newSelection.replaceRange(\n EditorSelection.cursor(\n range.assoc > 0 ? spec.from : spec.to,\n range.assoc,\n ),\n index,\n );\n }\n\n if (!range.empty && hasOverlap(range, spec)) {\n const isReversed = range.head < range.anchor;\n\n if (\n // anchor at left\n range.anchor < spec.from\n ) {\n newSelection = newSelection.replaceRange(\n EditorSelection.range(\n range.anchor,\n spec.from,\n range.goalColumn,\n range.bidiLevel ?? undefined,\n ),\n index,\n );\n } else if (\n // anchor at right\n range.anchor > spec.to\n ) {\n newSelection = newSelection.replaceRange(\n EditorSelection.range(\n range.anchor,\n spec.to,\n range.goalColumn,\n range.bidiLevel ?? undefined,\n ),\n index,\n );\n } else if (\n // anchor inside\n range.anchor >= spec.from &&\n range.anchor <= spec.to\n ) {\n // if both anchor and head are inside spec, we should remove this selection\n if (isReversed) {\n newSelection = newSelection.replaceRange(\n EditorSelection.range(\n spec.from,\n Math.min(range.head, spec.from),\n range.goalColumn,\n range.bidiLevel ?? undefined,\n ),\n index,\n );\n } else {\n newSelection = newSelection.replaceRange(\n EditorSelection.range(\n spec.to,\n Math.max(range.head, spec.to),\n range.goalColumn,\n range.bidiLevel ?? undefined,\n ),\n index,\n );\n }\n }\n }\n }\n });\n\n if (newSelection.eq(tr.newSelection)) {\n return tr;\n }\n\n return [\n tr,\n {\n selection: newSelection,\n },\n ];\n }),\n];\n\ntype FrozenRangesProvider = (state: EditorState) => Range[];\n\nconst frozenRanges = Facet.define<FrozenRangesProvider>({\n enables: () => extension,\n});\n\nexport { extension, frozenRanges };\n"],"mappings":"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","names":["Facet","backgroundDecorations","Facet","Decoration","Facet","syntaxTree","Decoration","syntaxTree","Facet","traverseAST","ViewPlugin","syntaxTree","cursor","ViewPlugin","EditorSelection","Facet","mergeIntervals","range","ViewPlugin","mergeIntervals","EditorSelection","Facet","flatten","EditorSelection","Facet","extension","range","flatten","hasOverlap","EditorState","Facet","extension","EditorView","Prec","Decoration","EditorView","ViewPlugin","WidgetType","RangeSetBuilder","pairs","Decoration","WidgetType","RangeSetBuilder","ViewPlugin","EditorView","EditorView","layer","layer","EditorView","Decoration","EditorView","StateField","range","EditorView","Decoration","ViewPlugin","syntaxTree","layer","Facet","SelectionSide","configChanged","Decoration","EditorView","Facet","RangeSetBuilder","squash","groupDecorationsByClassName","mergeIntervals","Decoration","Facet","RangeSetBuilder","squash","EditorView","hasOverlap","EditorSelection","EditorState","Facet","extension","range"]}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import * as _codemirror_state from '@codemirror/state';
|
|
2
|
+
import { EditorState, Facet, Extension, StateField, RangeSet } from '@codemirror/state';
|
|
3
|
+
import { TreeCursor } from '@lezer/common';
|
|
4
|
+
import { WidgetType, EditorView, ViewPlugin, ViewUpdate, DecorationSet, Decoration } from '@codemirror/view';
|
|
5
|
+
import { Language, LRLanguage } from '@codemirror/language';
|
|
6
|
+
|
|
7
|
+
type Precedence = 'highest' | 'high' | 'default' | 'low' | 'lowest';
|
|
8
|
+
interface BaseDecorationSpec$1 {
|
|
9
|
+
from?: number;
|
|
10
|
+
to?: number;
|
|
11
|
+
atomicRange?: boolean;
|
|
12
|
+
}
|
|
13
|
+
interface ClassNameDecorationSpec$1 extends BaseDecorationSpec$1 {
|
|
14
|
+
type: 'className';
|
|
15
|
+
className: string;
|
|
16
|
+
prec?: Precedence;
|
|
17
|
+
}
|
|
18
|
+
interface ReplaceDecorationSpec extends BaseDecorationSpec$1 {
|
|
19
|
+
type: 'replace';
|
|
20
|
+
widget?: WidgetType;
|
|
21
|
+
inclusive?: boolean;
|
|
22
|
+
inclusiveStart?: boolean;
|
|
23
|
+
inclusiveEnd?: boolean;
|
|
24
|
+
block?: boolean;
|
|
25
|
+
}
|
|
26
|
+
interface WidgetDecorationSpec extends BaseDecorationSpec$1 {
|
|
27
|
+
type: 'widget';
|
|
28
|
+
widget: WidgetType;
|
|
29
|
+
side?: number;
|
|
30
|
+
inlineOrder?: boolean;
|
|
31
|
+
block?: boolean;
|
|
32
|
+
}
|
|
33
|
+
interface BackgroundDecorationSpec$1 {
|
|
34
|
+
from?: number;
|
|
35
|
+
to?: number;
|
|
36
|
+
type: 'background';
|
|
37
|
+
className: string;
|
|
38
|
+
}
|
|
39
|
+
type DecorationSpec = ClassNameDecorationSpec$1 | ReplaceDecorationSpec | WidgetDecorationSpec | BackgroundDecorationSpec$1;
|
|
40
|
+
type WholeASTDecorator = (cursor: TreeCursor, state: EditorState) => DecorationSpec[] | DecorationSpec | undefined;
|
|
41
|
+
declare function updateWholeDecorations(view: EditorView): void;
|
|
42
|
+
|
|
43
|
+
type CursorASTDecorator = (cursor: TreeCursor, state: EditorState) => ClassNameDecorationSpec | BackgroundDecorationSpec | undefined;
|
|
44
|
+
interface BaseDecorationSpec {
|
|
45
|
+
from?: number;
|
|
46
|
+
to?: number;
|
|
47
|
+
}
|
|
48
|
+
interface ClassNameDecorationSpec extends BaseDecorationSpec {
|
|
49
|
+
type: 'className';
|
|
50
|
+
className: string;
|
|
51
|
+
}
|
|
52
|
+
interface BackgroundDecorationSpec {
|
|
53
|
+
from?: number;
|
|
54
|
+
to?: number;
|
|
55
|
+
type: 'background';
|
|
56
|
+
className: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
declare const astDecorator: {
|
|
60
|
+
whole: _codemirror_state.Facet<WholeASTDecorator, WholeASTDecorator[]>;
|
|
61
|
+
fromCursor: _codemirror_state.Facet<CursorASTDecorator, CursorASTDecorator[]>;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
declare const astDebugger: ViewPlugin<{
|
|
65
|
+
update(update: ViewUpdate): void;
|
|
66
|
+
}, undefined>;
|
|
67
|
+
|
|
68
|
+
declare const focusableKeymap: _codemirror_state.Extension;
|
|
69
|
+
declare abstract class FocusableWidget extends WidgetType {
|
|
70
|
+
abstract focus(fromSide: -1 | 1): void;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
interface Range$1 {
|
|
74
|
+
from: number;
|
|
75
|
+
to: number;
|
|
76
|
+
}
|
|
77
|
+
type RangesProvider = (state: EditorState) => Range$1[];
|
|
78
|
+
type SelectUserEvent = 'select' | 'select.pointer';
|
|
79
|
+
declare const rangesFacet: Facet<RangesProvider, readonly RangesProvider[]>;
|
|
80
|
+
declare const selectUserEvent: Facet<SelectUserEvent, SelectUserEvent>;
|
|
81
|
+
|
|
82
|
+
interface SelectionEnlargerSpec {
|
|
83
|
+
source: {
|
|
84
|
+
from: number;
|
|
85
|
+
to: number;
|
|
86
|
+
};
|
|
87
|
+
target: {
|
|
88
|
+
from: number;
|
|
89
|
+
to: number;
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
type SelectionEnlargerProvider = (state: EditorState) => SelectionEnlargerSpec[];
|
|
93
|
+
declare const selectionEnlarger: Facet<SelectionEnlargerProvider, readonly SelectionEnlargerProvider[]>;
|
|
94
|
+
|
|
95
|
+
interface DeletionEnlargerSpec {
|
|
96
|
+
source: {
|
|
97
|
+
from: number;
|
|
98
|
+
to: number;
|
|
99
|
+
};
|
|
100
|
+
target: {
|
|
101
|
+
from: number;
|
|
102
|
+
to: number;
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
type DeletionEnlargerProvider = (state: EditorState) => DeletionEnlargerSpec[];
|
|
106
|
+
declare const deletionEnlarger: Facet<DeletionEnlargerProvider, readonly DeletionEnlargerProvider[]>;
|
|
107
|
+
|
|
108
|
+
interface InputRule {
|
|
109
|
+
type: 'character';
|
|
110
|
+
triggerCharacter: string;
|
|
111
|
+
handler: ({ view, state, from, to, }: {
|
|
112
|
+
view: EditorView;
|
|
113
|
+
state: EditorState;
|
|
114
|
+
from: number;
|
|
115
|
+
to: number;
|
|
116
|
+
}) => boolean;
|
|
117
|
+
}
|
|
118
|
+
declare const inputRules: (rules?: InputRule[]) => Extension;
|
|
119
|
+
|
|
120
|
+
interface MixOptions {
|
|
121
|
+
name?: string;
|
|
122
|
+
outerLanguage?: Language;
|
|
123
|
+
innerLanguage?: Language;
|
|
124
|
+
}
|
|
125
|
+
declare function mixLanguages({ name, outerLanguage, innerLanguage }: MixOptions): LRLanguage;
|
|
126
|
+
|
|
127
|
+
declare const indentGuides: () => _codemirror_state.Extension[];
|
|
128
|
+
|
|
129
|
+
declare const scrollBeyondLastLine: (scrollHeight?: number) => _codemirror_state.Extension[];
|
|
130
|
+
|
|
131
|
+
declare const matchingBrackets: StateField<DecorationSet>[];
|
|
132
|
+
|
|
133
|
+
declare const colorizationBrackets: _codemirror_state.Extension[];
|
|
134
|
+
|
|
135
|
+
declare enum SelectionSide {
|
|
136
|
+
Head = "head",
|
|
137
|
+
Anchor = "anchor"
|
|
138
|
+
}
|
|
139
|
+
interface PositionElement {
|
|
140
|
+
dom: HTMLElement | null;
|
|
141
|
+
pos: SelectionSide | number | ((view: EditorView) => number);
|
|
142
|
+
}
|
|
143
|
+
declare const elementAtPosition: Facet<PositionElement, PositionElement[]>;
|
|
144
|
+
declare const positionElementLayer: _codemirror_state.Extension;
|
|
145
|
+
|
|
146
|
+
interface BackgroundDecoration {
|
|
147
|
+
className: string;
|
|
148
|
+
from: number;
|
|
149
|
+
to: number;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
type BackgroundDecorationFn = (view: EditorView) => BackgroundDecoration[];
|
|
153
|
+
declare const backgroundDecorations: Facet<BackgroundDecorationFn, BackgroundDecorationFn[]>;
|
|
154
|
+
|
|
155
|
+
interface MarkDecorationSpec {
|
|
156
|
+
from: number;
|
|
157
|
+
to: number;
|
|
158
|
+
className: string;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
declare const mergeableMarkers: Facet<MarkDecorationSpec[], RangeSet<Decoration>>;
|
|
162
|
+
|
|
163
|
+
interface Range {
|
|
164
|
+
from: number;
|
|
165
|
+
to: number;
|
|
166
|
+
}
|
|
167
|
+
type FrozenRangesProvider = (state: EditorState) => Range[];
|
|
168
|
+
declare const frozenRanges: Facet<FrozenRangesProvider, readonly FrozenRangesProvider[]>;
|
|
169
|
+
|
|
170
|
+
export { type CursorASTDecorator, type DeletionEnlargerSpec, FocusableWidget, type InputRule, type SelectionEnlargerSpec, SelectionSide, type WholeASTDecorator, astDebugger, astDecorator, rangesFacet as autoSelectRanges, selectUserEvent as autoSelectUserEvent, backgroundDecorations, colorizationBrackets, deletionEnlarger, elementAtPosition, focusableKeymap, frozenRanges, indentGuides, inputRules, matchingBrackets, mergeableMarkers, mixLanguages, positionElementLayer, scrollBeyondLastLine, selectionEnlarger, updateWholeDecorations };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import * as _codemirror_state from '@codemirror/state';
|
|
2
|
+
import { EditorState, Facet, Extension, StateField, RangeSet } from '@codemirror/state';
|
|
3
|
+
import { TreeCursor } from '@lezer/common';
|
|
4
|
+
import { WidgetType, EditorView, ViewPlugin, ViewUpdate, DecorationSet, Decoration } from '@codemirror/view';
|
|
5
|
+
import { Language, LRLanguage } from '@codemirror/language';
|
|
6
|
+
|
|
7
|
+
type Precedence = 'highest' | 'high' | 'default' | 'low' | 'lowest';
|
|
8
|
+
interface BaseDecorationSpec$1 {
|
|
9
|
+
from?: number;
|
|
10
|
+
to?: number;
|
|
11
|
+
atomicRange?: boolean;
|
|
12
|
+
}
|
|
13
|
+
interface ClassNameDecorationSpec$1 extends BaseDecorationSpec$1 {
|
|
14
|
+
type: 'className';
|
|
15
|
+
className: string;
|
|
16
|
+
prec?: Precedence;
|
|
17
|
+
}
|
|
18
|
+
interface ReplaceDecorationSpec extends BaseDecorationSpec$1 {
|
|
19
|
+
type: 'replace';
|
|
20
|
+
widget?: WidgetType;
|
|
21
|
+
inclusive?: boolean;
|
|
22
|
+
inclusiveStart?: boolean;
|
|
23
|
+
inclusiveEnd?: boolean;
|
|
24
|
+
block?: boolean;
|
|
25
|
+
}
|
|
26
|
+
interface WidgetDecorationSpec extends BaseDecorationSpec$1 {
|
|
27
|
+
type: 'widget';
|
|
28
|
+
widget: WidgetType;
|
|
29
|
+
side?: number;
|
|
30
|
+
inlineOrder?: boolean;
|
|
31
|
+
block?: boolean;
|
|
32
|
+
}
|
|
33
|
+
interface BackgroundDecorationSpec$1 {
|
|
34
|
+
from?: number;
|
|
35
|
+
to?: number;
|
|
36
|
+
type: 'background';
|
|
37
|
+
className: string;
|
|
38
|
+
}
|
|
39
|
+
type DecorationSpec = ClassNameDecorationSpec$1 | ReplaceDecorationSpec | WidgetDecorationSpec | BackgroundDecorationSpec$1;
|
|
40
|
+
type WholeASTDecorator = (cursor: TreeCursor, state: EditorState) => DecorationSpec[] | DecorationSpec | undefined;
|
|
41
|
+
declare function updateWholeDecorations(view: EditorView): void;
|
|
42
|
+
|
|
43
|
+
type CursorASTDecorator = (cursor: TreeCursor, state: EditorState) => ClassNameDecorationSpec | BackgroundDecorationSpec | undefined;
|
|
44
|
+
interface BaseDecorationSpec {
|
|
45
|
+
from?: number;
|
|
46
|
+
to?: number;
|
|
47
|
+
}
|
|
48
|
+
interface ClassNameDecorationSpec extends BaseDecorationSpec {
|
|
49
|
+
type: 'className';
|
|
50
|
+
className: string;
|
|
51
|
+
}
|
|
52
|
+
interface BackgroundDecorationSpec {
|
|
53
|
+
from?: number;
|
|
54
|
+
to?: number;
|
|
55
|
+
type: 'background';
|
|
56
|
+
className: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
declare const astDecorator: {
|
|
60
|
+
whole: _codemirror_state.Facet<WholeASTDecorator, WholeASTDecorator[]>;
|
|
61
|
+
fromCursor: _codemirror_state.Facet<CursorASTDecorator, CursorASTDecorator[]>;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
declare const astDebugger: ViewPlugin<{
|
|
65
|
+
update(update: ViewUpdate): void;
|
|
66
|
+
}, undefined>;
|
|
67
|
+
|
|
68
|
+
declare const focusableKeymap: _codemirror_state.Extension;
|
|
69
|
+
declare abstract class FocusableWidget extends WidgetType {
|
|
70
|
+
abstract focus(fromSide: -1 | 1): void;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
interface Range$1 {
|
|
74
|
+
from: number;
|
|
75
|
+
to: number;
|
|
76
|
+
}
|
|
77
|
+
type RangesProvider = (state: EditorState) => Range$1[];
|
|
78
|
+
type SelectUserEvent = 'select' | 'select.pointer';
|
|
79
|
+
declare const rangesFacet: Facet<RangesProvider, readonly RangesProvider[]>;
|
|
80
|
+
declare const selectUserEvent: Facet<SelectUserEvent, SelectUserEvent>;
|
|
81
|
+
|
|
82
|
+
interface SelectionEnlargerSpec {
|
|
83
|
+
source: {
|
|
84
|
+
from: number;
|
|
85
|
+
to: number;
|
|
86
|
+
};
|
|
87
|
+
target: {
|
|
88
|
+
from: number;
|
|
89
|
+
to: number;
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
type SelectionEnlargerProvider = (state: EditorState) => SelectionEnlargerSpec[];
|
|
93
|
+
declare const selectionEnlarger: Facet<SelectionEnlargerProvider, readonly SelectionEnlargerProvider[]>;
|
|
94
|
+
|
|
95
|
+
interface DeletionEnlargerSpec {
|
|
96
|
+
source: {
|
|
97
|
+
from: number;
|
|
98
|
+
to: number;
|
|
99
|
+
};
|
|
100
|
+
target: {
|
|
101
|
+
from: number;
|
|
102
|
+
to: number;
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
type DeletionEnlargerProvider = (state: EditorState) => DeletionEnlargerSpec[];
|
|
106
|
+
declare const deletionEnlarger: Facet<DeletionEnlargerProvider, readonly DeletionEnlargerProvider[]>;
|
|
107
|
+
|
|
108
|
+
interface InputRule {
|
|
109
|
+
type: 'character';
|
|
110
|
+
triggerCharacter: string;
|
|
111
|
+
handler: ({ view, state, from, to, }: {
|
|
112
|
+
view: EditorView;
|
|
113
|
+
state: EditorState;
|
|
114
|
+
from: number;
|
|
115
|
+
to: number;
|
|
116
|
+
}) => boolean;
|
|
117
|
+
}
|
|
118
|
+
declare const inputRules: (rules?: InputRule[]) => Extension;
|
|
119
|
+
|
|
120
|
+
interface MixOptions {
|
|
121
|
+
name?: string;
|
|
122
|
+
outerLanguage?: Language;
|
|
123
|
+
innerLanguage?: Language;
|
|
124
|
+
}
|
|
125
|
+
declare function mixLanguages({ name, outerLanguage, innerLanguage }: MixOptions): LRLanguage;
|
|
126
|
+
|
|
127
|
+
declare const indentGuides: () => _codemirror_state.Extension[];
|
|
128
|
+
|
|
129
|
+
declare const scrollBeyondLastLine: (scrollHeight?: number) => _codemirror_state.Extension[];
|
|
130
|
+
|
|
131
|
+
declare const matchingBrackets: StateField<DecorationSet>[];
|
|
132
|
+
|
|
133
|
+
declare const colorizationBrackets: _codemirror_state.Extension[];
|
|
134
|
+
|
|
135
|
+
declare enum SelectionSide {
|
|
136
|
+
Head = "head",
|
|
137
|
+
Anchor = "anchor"
|
|
138
|
+
}
|
|
139
|
+
interface PositionElement {
|
|
140
|
+
dom: HTMLElement | null;
|
|
141
|
+
pos: SelectionSide | number | ((view: EditorView) => number);
|
|
142
|
+
}
|
|
143
|
+
declare const elementAtPosition: Facet<PositionElement, PositionElement[]>;
|
|
144
|
+
declare const positionElementLayer: _codemirror_state.Extension;
|
|
145
|
+
|
|
146
|
+
interface BackgroundDecoration {
|
|
147
|
+
className: string;
|
|
148
|
+
from: number;
|
|
149
|
+
to: number;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
type BackgroundDecorationFn = (view: EditorView) => BackgroundDecoration[];
|
|
153
|
+
declare const backgroundDecorations: Facet<BackgroundDecorationFn, BackgroundDecorationFn[]>;
|
|
154
|
+
|
|
155
|
+
interface MarkDecorationSpec {
|
|
156
|
+
from: number;
|
|
157
|
+
to: number;
|
|
158
|
+
className: string;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
declare const mergeableMarkers: Facet<MarkDecorationSpec[], RangeSet<Decoration>>;
|
|
162
|
+
|
|
163
|
+
interface Range {
|
|
164
|
+
from: number;
|
|
165
|
+
to: number;
|
|
166
|
+
}
|
|
167
|
+
type FrozenRangesProvider = (state: EditorState) => Range[];
|
|
168
|
+
declare const frozenRanges: Facet<FrozenRangesProvider, readonly FrozenRangesProvider[]>;
|
|
169
|
+
|
|
170
|
+
export { type CursorASTDecorator, type DeletionEnlargerSpec, FocusableWidget, type InputRule, type SelectionEnlargerSpec, SelectionSide, type WholeASTDecorator, astDebugger, astDecorator, rangesFacet as autoSelectRanges, selectUserEvent as autoSelectUserEvent, backgroundDecorations, colorizationBrackets, deletionEnlarger, elementAtPosition, focusableKeymap, frozenRanges, indentGuides, inputRules, matchingBrackets, mergeableMarkers, mixLanguages, positionElementLayer, scrollBeyondLastLine, selectionEnlarger, updateWholeDecorations };
|