@coze-editor/extension-lint 0.1.0-alpha.37c297 → 0.1.0-alpha.577152

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/dist/esm/index.js CHANGED
@@ -77,7 +77,7 @@ var mergeDecorations = (decorations) => {
77
77
  if (typeof diagnostic.from !== "number" || typeof diagnostic.to !== "number") {
78
78
  return;
79
79
  }
80
- if (diagnostic.from <= diagnostic.to) {
80
+ if (diagnostic.from < diagnostic.to) {
81
81
  merge.push(
82
82
  createDecoration(
83
83
  diagnostic.from,
@@ -97,7 +97,7 @@ var mergeDecorations = (decorations) => {
97
97
  });
98
98
  return Decoration.set(merge);
99
99
  } catch (e) {
100
- console.error("FlowLangSDK: linter mergeDecorations error", e);
100
+ console.error("linter mergeDecorations error", e);
101
101
  return decorations;
102
102
  }
103
103
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/merge-decorations.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\n// Credits to @codemirror/lint\n// copy from @codemirror/lint, 修改了 lintState 中 provide decorations 的绘制逻辑\nimport elt from 'crelt';\nimport {\n EditorView,\n ViewPlugin,\n Decoration,\n type DecorationSet,\n WidgetType,\n type ViewUpdate,\n type Command,\n logException,\n type KeyBinding,\n hoverTooltip,\n type Tooltip,\n showTooltip,\n gutter,\n GutterMarker,\n type PanelConstructor,\n type Panel,\n showPanel,\n getPanel,\n} from '@codemirror/view';\nimport {\n type Text,\n StateEffect,\n StateField,\n type Extension,\n type TransactionSpec,\n type Transaction,\n type EditorState,\n Facet,\n combineConfig,\n RangeSet,\n type Range,\n} from '@codemirror/state';\n\nimport { mergeDecorations } from './merge-decorations';\n\nexport type Severity = 'hint' | 'info' | 'warning' | 'error';\n\n/// Describes a problem or hint for a piece of code.\nexport interface Diagnostic {\n /// The start position of the relevant text.\n from: number;\n /// The end position. May be equal to `from`, though actually\n /// covering text is preferable.\n to: number;\n /// The severity of the problem. This will influence how it is\n /// displayed.\n severity: Severity;\n /// When given, add an extra CSS class to parts of the code that\n /// this diagnostic applies to.\n markClass?: string;\n /// An optional source string indicating where the diagnostic is\n /// coming from. You can put the name of your linter here, if\n /// applicable.\n source?: string;\n /// The message associated with this diagnostic.\n message: string;\n /// An optional custom rendering function that displays the message\n /// as a DOM node.\n renderMessage?: (view: EditorView) => Node;\n /// An optional array of actions that can be taken on this\n /// diagnostic.\n actions?: readonly Action[];\n}\n\n/// An action associated with a diagnostic.\nexport interface Action {\n /// The label to show to the user. Should be relatively short.\n name: string;\n /// The function to call when the user activates this action. Is\n /// given the diagnostic's _current_ position, which may have\n /// changed since the creation of the diagnostic, due to editing.\n apply: (view: EditorView, from: number, to: number) => void;\n}\n\ntype DiagnosticFilter = (\n diagnostics: readonly Diagnostic[],\n state: EditorState,\n) => Diagnostic[];\n\ninterface LintConfig {\n /// Time to wait (in milliseconds) after a change before running\n /// the linter. Defaults to 750ms.\n delay?: number;\n /// Optional predicate that can be used to indicate when diagnostics\n /// need to be recomputed. Linting is always re-done on document\n /// changes.\n needsRefresh?: null | ((update: ViewUpdate) => boolean);\n /// Optional filter to determine which diagnostics produce markers\n /// in the content.\n markerFilter?: null | DiagnosticFilter;\n /// Filter applied to a set of diagnostics shown in a tooltip. No\n /// tooltip will appear if the empty set is returned.\n tooltipFilter?: null | DiagnosticFilter;\n /// Can be used to control what kind of transactions cause lint\n /// hover tooltips associated with the given document range to be\n /// hidden. By default any transactions that changes the line\n /// around the range will hide it. Returning null falls back to this\n /// behavior.\n hideOn?: (tr: Transaction, from: number, to: number) => boolean | null;\n /// When enabled (defaults to off), this will cause the lint panel\n /// to automatically open when diagnostics are found, and close when\n /// all diagnostics are resolved or removed.\n autoPanel?: boolean;\n}\n\ninterface LintGutterConfig {\n /// The delay before showing a tooltip when hovering over a lint gutter marker.\n hoverTime?: number;\n /// Optional filter determining which diagnostics show a marker in\n /// the gutter.\n markerFilter?: null | DiagnosticFilter;\n /// Optional filter for diagnostics displayed in a tooltip, which\n /// can also be used to prevent a tooltip appearing.\n tooltipFilter?: null | DiagnosticFilter;\n}\n\nclass SelectedDiagnostic {\n constructor(\n readonly from: number,\n readonly to: number,\n readonly diagnostic: Diagnostic,\n ) {}\n}\n\nclass LintState {\n constructor(\n readonly diagnostics: DecorationSet,\n readonly panel: PanelConstructor | null,\n readonly selected: SelectedDiagnostic | null,\n ) {}\n\n static init(\n diagnostics: readonly Diagnostic[],\n panel: PanelConstructor | null,\n state: EditorState,\n ) {\n // Filter the list of diagnostics for which to create markers\n let markedDiagnostics = diagnostics;\n const diagnosticFilter = state.facet(lintConfig).markerFilter;\n if (diagnosticFilter) {\n markedDiagnostics = diagnosticFilter(markedDiagnostics, state);\n }\n\n const ranges = Decoration.set(\n markedDiagnostics.map((d: Diagnostic) => {\n // For zero-length ranges or ranges covering only a line break, create a widget\n if (\n d.from == d.to ||\n (d.from == d.to - 1 && state.doc.lineAt(d.from).to == d.from)\n ) {\n return Decoration.widget({\n widget: new DiagnosticWidget(d),\n diagnostic: d,\n }).range(d.from);\n }\n\n return Decoration.mark({\n attributes: {\n class: `cm-lintRange cm-lintRange-${\n d.severity\n }${d.markClass ? ` ${d.markClass}` : ''}`,\n },\n diagnostic: d,\n }).range(d.from, d.to);\n }),\n true,\n );\n\n return new LintState(ranges, panel, findDiagnostic(ranges));\n }\n}\n\nfunction findDiagnostic(\n diagnostics: DecorationSet,\n diagnostic: Diagnostic | null = null,\n after = 0,\n): SelectedDiagnostic | null {\n let found: SelectedDiagnostic | null = null;\n diagnostics.between(after, 1e9, (from, to, { spec }) => {\n if (diagnostic && spec.diagnostic != diagnostic) {\n return;\n }\n found = new SelectedDiagnostic(from, to, spec.diagnostic);\n return false;\n });\n return found;\n}\n\nfunction hideTooltip(tr: Transaction, tooltip: Tooltip) {\n const from = tooltip.pos,\n to = tooltip.end || from;\n const result = tr.state.facet(lintConfig).hideOn(tr, from, to);\n if (result != null) {\n return result;\n }\n const line = tr.startState.doc.lineAt(tooltip.pos);\n return !!(\n tr.effects.some(e => e.is(setDiagnosticsEffect)) ||\n tr.changes.touchesRange(line.from, Math.max(line.to, to))\n );\n}\n\nfunction maybeEnableLint(\n state: EditorState,\n effects: readonly StateEffect<unknown>[],\n) {\n return state.field(lintState, false)\n ? effects\n : effects.concat(StateEffect.appendConfig.of(lintExtensions));\n}\n\n/// Returns a transaction spec which updates the current set of\n/// diagnostics, and enables the lint extension if if wasn't already\n/// active.\nexport function setDiagnostics(\n state: EditorState,\n diagnostics: readonly Diagnostic[],\n): TransactionSpec {\n return {\n effects: maybeEnableLint(state, [setDiagnosticsEffect.of(diagnostics)]),\n };\n}\n\n/// The state effect that updates the set of active diagnostics. Can\n/// be useful when writing an extension that needs to track these.\nexport const setDiagnosticsEffect = StateEffect.define<readonly Diagnostic[]>();\n\nconst togglePanel = StateEffect.define<boolean>();\n\nconst movePanelSelection = StateEffect.define<SelectedDiagnostic>();\n\nconst lintState = StateField.define<LintState>({\n create() {\n return new LintState(Decoration.none, null, null);\n },\n update(value, tr) {\n if (tr.docChanged && value.diagnostics.size) {\n const mapped = value.diagnostics.map(tr.changes);\n let selected: SelectedDiagnostic | null = null,\n { panel } = value;\n if (value.selected) {\n const selPos = tr.changes.mapPos(value.selected.from, 1);\n selected =\n findDiagnostic(mapped, value.selected.diagnostic, selPos) ||\n findDiagnostic(mapped, null, selPos);\n }\n if (!mapped.size && panel && tr.state.facet(lintConfig).autoPanel) {\n panel = null;\n }\n value = new LintState(mapped, panel, selected);\n }\n\n for (const effect of tr.effects) {\n if (effect.is(setDiagnosticsEffect)) {\n const panel = !tr.state.facet(lintConfig).autoPanel\n ? value.panel\n : effect.value.length\n ? LintPanel.open\n : null;\n value = LintState.init(effect.value, panel, tr.state);\n } else if (effect.is(togglePanel)) {\n value = new LintState(\n value.diagnostics,\n effect.value ? LintPanel.open : null,\n value.selected,\n );\n } else if (effect.is(movePanelSelection)) {\n value = new LintState(value.diagnostics, value.panel, effect.value);\n }\n }\n\n return value;\n },\n provide: f => [\n showPanel.from(f, val => val.panel),\n // mergeDecorations 中合并了相同 severity 的 diagnostic 在编辑器中的下划线样式,以前会重复绘制下划线,现在只会绘制一次。\n EditorView.decorations.from(f, s => mergeDecorations(s.diagnostics)),\n ],\n});\n\n/// Returns the number of active lint diagnostics in the given state.\nexport function diagnosticCount(state: EditorState) {\n const lint = state.field(lintState, false);\n return lint ? lint.diagnostics.size : 0;\n}\n\nconst activeMark = Decoration.mark({\n class: 'cm-lintRange cm-lintRange-active',\n});\n\nfunction lintTooltip(view: EditorView, pos: number, side: -1 | 1) {\n const { diagnostics } = view.state.field(lintState);\n let found: Diagnostic[] = [],\n stackStart = 2e8,\n stackEnd = 0;\n diagnostics.between(\n pos - (side < 0 ? 1 : 0),\n pos + (side > 0 ? 1 : 0),\n (from, to, { spec }) => {\n if (\n pos >= from &&\n pos <= to &&\n (from == to || ((pos > from || side > 0) && (pos < to || side < 0)))\n ) {\n found.push(spec.diagnostic);\n stackStart = Math.min(from, stackStart);\n stackEnd = Math.max(to, stackEnd);\n }\n },\n );\n\n const diagnosticFilter = view.state.facet(lintConfig).tooltipFilter;\n if (diagnosticFilter) {\n found = diagnosticFilter(found, view.state);\n }\n\n if (!found.length) {\n return null;\n }\n\n return {\n pos: stackStart,\n end: stackEnd,\n above: view.state.doc.lineAt(stackStart).to < stackEnd,\n create() {\n return { dom: diagnosticsTooltip(view, found) };\n },\n };\n}\n\nfunction diagnosticsTooltip(\n view: EditorView,\n diagnostics: readonly Diagnostic[],\n) {\n return elt(\n 'ul',\n { class: 'cm-tooltip-lint' },\n diagnostics.map(d => renderDiagnostic(view, d, false)),\n );\n}\n\n/// Command to open and focus the lint panel.\nexport const openLintPanel: Command = (view: EditorView) => {\n const field = view.state.field(lintState, false);\n if (!field || !field.panel) {\n view.dispatch({\n effects: maybeEnableLint(view.state, [togglePanel.of(true)]),\n });\n }\n const panel = getPanel(view, LintPanel.open);\n if (panel) {\n (panel.dom.querySelector('.cm-panel-lint ul') as HTMLElement).focus();\n }\n return true;\n};\n\n/// Command to close the lint panel, when open.\nexport const closeLintPanel: Command = (view: EditorView) => {\n const field = view.state.field(lintState, false);\n if (!field || !field.panel) {\n return false;\n }\n view.dispatch({ effects: togglePanel.of(false) });\n return true;\n};\n\n/// Move the selection to the next diagnostic.\nexport const nextDiagnostic: Command = (view: EditorView) => {\n const field = view.state.field(lintState, false);\n if (!field) {\n return false;\n }\n const sel = view.state.selection.main;\n let next = field.diagnostics.iter(sel.to + 1);\n if (!next.value) {\n next = field.diagnostics.iter(0);\n if (!next.value || (next.from == sel.from && next.to == sel.to)) {\n return false;\n }\n }\n view.dispatch({\n selection: { anchor: next.from, head: next.to },\n scrollIntoView: true,\n });\n return true;\n};\n\n/// Move the selection to the previous diagnostic.\nexport const previousDiagnostic: Command = (view: EditorView) => {\n const { state } = view,\n field = state.field(lintState, false);\n if (!field) {\n return false;\n }\n const sel = state.selection.main;\n let prevFrom: number | undefined,\n prevTo: number | undefined,\n lastFrom: number | undefined,\n lastTo: number | undefined;\n field.diagnostics.between(0, state.doc.length, (from, to) => {\n if (to < sel.to && (prevFrom == null || prevFrom < from)) {\n prevFrom = from;\n prevTo = to;\n }\n if (lastFrom == null || from > lastFrom) {\n lastFrom = from;\n lastTo = to;\n }\n });\n if (lastFrom == null || (prevFrom == null && lastFrom == sel.from)) {\n return false;\n }\n view.dispatch({\n selection: { anchor: prevFrom ?? lastFrom, head: prevTo ?? lastTo },\n scrollIntoView: true,\n });\n return true;\n};\n\n/// A set of default key bindings for the lint functionality.\n///\n/// - Ctrl-Shift-m (Cmd-Shift-m on macOS): [`openLintPanel`](#lint.openLintPanel)\n/// - F8: [`nextDiagnostic`](#lint.nextDiagnostic)\nexport const lintKeymap: readonly KeyBinding[] = [\n { key: 'Mod-Shift-m', run: openLintPanel, preventDefault: true },\n { key: 'F8', run: nextDiagnostic },\n];\n\n/// The type of a function that produces diagnostics.\nexport type LintSource = (\n view: EditorView,\n) => readonly Diagnostic[] | Promise<readonly Diagnostic[]>;\n\nconst lintPlugin = ViewPlugin.fromClass(\n class {\n lintTime: number;\n timeout = -1;\n set = true;\n\n constructor(readonly view: EditorView) {\n const { delay } = view.state.facet(lintConfig);\n this.lintTime = Date.now() + delay;\n this.run = this.run.bind(this);\n this.timeout = window.setTimeout(this.run, delay);\n }\n\n run() {\n clearTimeout(this.timeout);\n const now = Date.now();\n if (now < this.lintTime - 10) {\n this.timeout = window.setTimeout(this.run, this.lintTime - now);\n } else {\n this.set = false;\n const { state } = this.view,\n { sources } = state.facet(lintConfig);\n if (sources.length) {\n Promise.all(\n sources.map(source => Promise.resolve(source(this.view))),\n ).then(\n annotations => {\n const all = annotations.reduce((a, b) => a.concat(b));\n if (this.view.state.doc == state.doc) {\n this.view.dispatch(setDiagnostics(this.view.state, all));\n }\n },\n error => {\n logException(this.view.state, error);\n },\n );\n }\n }\n }\n\n update(update: ViewUpdate) {\n const config = update.state.facet(lintConfig);\n if (\n update.docChanged ||\n config != update.startState.facet(lintConfig) ||\n (config.needsRefresh && config.needsRefresh(update))\n ) {\n this.lintTime = Date.now() + config.delay;\n if (!this.set) {\n this.set = true;\n this.timeout = window.setTimeout(this.run, config.delay);\n }\n }\n }\n\n force() {\n if (this.set) {\n this.lintTime = Date.now();\n this.run();\n }\n }\n\n destroy() {\n clearTimeout(this.timeout);\n }\n },\n);\n\nconst lintConfig = Facet.define<\n { source: LintSource | null; config: LintConfig },\n Required<LintConfig> & { sources: readonly LintSource[] }\n>({\n combine(input) {\n return {\n sources: input\n .map(i => i.source)\n .filter(x => x != null) as readonly LintSource[],\n ...combineConfig(\n input.map(i => i.config),\n {\n delay: 750,\n markerFilter: null,\n tooltipFilter: null,\n needsRefresh: null,\n hideOn: () => null,\n },\n {\n needsRefresh: (a, b) => (!a ? b : !b ? a : u => a(u) || b(u)),\n },\n ),\n };\n },\n});\n\n/// Given a diagnostic source, this function returns an extension that\n/// enables linting with that source. It will be called whenever the\n/// editor is idle (after its content changed). If `null` is given as\n/// source, this only configures the lint extension.\nexport function linter(\n source: LintSource | null,\n config: LintConfig = {},\n): Extension {\n return [lintConfig.of({ source, config }), lintPlugin, lintExtensions];\n}\n\n/// Forces any linters [configured](#lint.linter) to run when the\n/// editor is idle to run right away.\nexport function forceLinting(view: EditorView) {\n const plugin = view.plugin(lintPlugin);\n if (plugin) {\n plugin.force();\n }\n}\n\nfunction assignKeys(actions: readonly Action[] | undefined) {\n const assigned: string[] = [];\n if (actions) {\n actions: for (const { name } of actions) {\n for (let i = 0; i < name.length; i++) {\n const ch = name[i];\n if (\n /[a-zA-Z]/.test(ch) &&\n !assigned.some(c => c.toLowerCase() == ch.toLowerCase())\n ) {\n assigned.push(ch);\n continue actions;\n }\n }\n assigned.push('');\n }\n }\n return assigned;\n}\n\nfunction renderDiagnostic(\n view: EditorView,\n diagnostic: Diagnostic,\n inPanel: boolean,\n) {\n const keys = inPanel ? assignKeys(diagnostic.actions) : [];\n return elt(\n 'li',\n { class: `cm-diagnostic cm-diagnostic-${diagnostic.severity}` },\n elt(\n 'span',\n { class: 'cm-diagnosticText' },\n diagnostic.renderMessage\n ? diagnostic.renderMessage(view)\n : diagnostic.message,\n ),\n diagnostic.actions?.map((action, i) => {\n let fired = false;\n const click = (e: Event) => {\n e.preventDefault();\n if (fired) {\n return;\n }\n fired = true;\n const found = findDiagnostic(\n view.state.field(lintState).diagnostics,\n diagnostic,\n );\n if (found) {\n action.apply(view, found.from, found.to);\n }\n };\n const { name } = action,\n keyIndex = keys[i] ? name.indexOf(keys[i]) : -1;\n const nameElt =\n keyIndex < 0\n ? name\n : [\n name.slice(0, keyIndex),\n elt('u', name.slice(keyIndex, keyIndex + 1)),\n name.slice(keyIndex + 1),\n ];\n return elt(\n 'button',\n {\n type: 'button',\n class: 'cm-diagnosticAction',\n onclick: click,\n onmousedown: click,\n 'aria-label': ` Action: ${name}${keyIndex < 0 ? '' : ` (access key \"${keys[i]})\"`}.`,\n },\n nameElt,\n );\n }),\n diagnostic.source &&\n elt('div', { class: 'cm-diagnosticSource' }, diagnostic.source),\n );\n}\n\nclass DiagnosticWidget extends WidgetType {\n constructor(readonly diagnostic: Diagnostic) {\n super();\n }\n\n eq(other: DiagnosticWidget) {\n return other.diagnostic == this.diagnostic;\n }\n\n toDOM() {\n return elt('span', {\n class: `cm-lintPoint cm-lintPoint-${this.diagnostic.severity}`,\n });\n }\n}\n\nclass PanelItem {\n id = `item_${Math.floor(Math.random() * 0xffffffff).toString(16)}`;\n dom: HTMLElement;\n\n constructor(\n view: EditorView,\n readonly diagnostic: Diagnostic,\n ) {\n this.dom = renderDiagnostic(view, diagnostic, true);\n this.dom.id = this.id;\n this.dom.setAttribute('role', 'option');\n }\n}\n\nclass LintPanel implements Panel {\n items: PanelItem[] = [];\n dom: HTMLElement;\n list: HTMLElement;\n\n constructor(readonly view: EditorView) {\n const onkeydown = (event: KeyboardEvent) => {\n if (event.keyCode == 27) {\n // Escape\n closeLintPanel(this.view);\n this.view.focus();\n } else if (event.keyCode == 38 || event.keyCode == 33) {\n // ArrowUp, PageUp\n this.moveSelection(\n (this.selectedIndex - 1 + this.items.length) % this.items.length,\n );\n } else if (event.keyCode == 40 || event.keyCode == 34) {\n // ArrowDown, PageDown\n this.moveSelection((this.selectedIndex + 1) % this.items.length);\n } else if (event.keyCode == 36) {\n // Home\n this.moveSelection(0);\n } else if (event.keyCode == 35) {\n // End\n this.moveSelection(this.items.length - 1);\n } else if (event.keyCode == 13) {\n // Enter\n this.view.focus();\n } else if (\n event.keyCode >= 65 &&\n event.keyCode <= 90 &&\n this.selectedIndex >= 0\n ) {\n // A-Z\n const { diagnostic } = this.items[this.selectedIndex],\n keys = assignKeys(diagnostic.actions);\n for (let i = 0; i < keys.length; i++) {\n if (keys[i].toUpperCase().charCodeAt(0) == event.keyCode) {\n const found = findDiagnostic(\n this.view.state.field(lintState).diagnostics,\n diagnostic,\n );\n if (found) {\n diagnostic.actions![i].apply(view, found.from, found.to);\n }\n }\n }\n } else {\n return;\n }\n event.preventDefault();\n };\n const onclick = (event: MouseEvent) => {\n for (let i = 0; i < this.items.length; i++) {\n if (this.items[i].dom.contains(event.target as HTMLElement)) {\n this.moveSelection(i);\n }\n }\n };\n\n this.list = elt('ul', {\n tabIndex: 0,\n role: 'listbox',\n 'aria-label': this.view.state.phrase('Diagnostics'),\n onkeydown,\n onclick,\n });\n this.dom = elt(\n 'div',\n { class: 'cm-panel-lint' },\n this.list,\n elt(\n 'button',\n {\n type: 'button',\n name: 'close',\n 'aria-label': this.view.state.phrase('close'),\n onclick: () => closeLintPanel(this.view),\n },\n '×',\n ),\n );\n this.update();\n }\n\n get selectedIndex() {\n const { selected } = this.view.state.field(lintState);\n if (!selected) {\n return -1;\n }\n for (let i = 0; i < this.items.length; i++) {\n if (this.items[i].diagnostic == selected.diagnostic) {\n return i;\n }\n }\n return -1;\n }\n\n update() {\n const { diagnostics, selected } = this.view.state.field(lintState);\n let i = 0,\n needsSync = false,\n newSelectedItem: PanelItem | null = null;\n diagnostics.between(\n 0,\n this.view.state.doc.length,\n (_start, _end, { spec }) => {\n let found = -1,\n item;\n for (let j = i; j < this.items.length; j++) {\n if (this.items[j].diagnostic == spec.diagnostic) {\n found = j;\n break;\n }\n }\n if (found < 0) {\n item = new PanelItem(this.view, spec.diagnostic);\n this.items.splice(i, 0, item);\n needsSync = true;\n } else {\n item = this.items[found];\n if (found > i) {\n this.items.splice(i, found - i);\n needsSync = true;\n }\n }\n if (selected && item.diagnostic == selected.diagnostic) {\n if (!item.dom.hasAttribute('aria-selected')) {\n item.dom.setAttribute('aria-selected', 'true');\n newSelectedItem = item;\n }\n } else if (item.dom.hasAttribute('aria-selected')) {\n item.dom.removeAttribute('aria-selected');\n }\n i++;\n },\n );\n while (\n i < this.items.length &&\n !(this.items.length == 1 && this.items[0].diagnostic.from < 0)\n ) {\n needsSync = true;\n this.items.pop();\n }\n if (this.items.length == 0) {\n this.items.push(\n new PanelItem(this.view, {\n from: -1,\n to: -1,\n severity: 'info',\n message: this.view.state.phrase('No diagnostics'),\n }),\n );\n needsSync = true;\n }\n if (newSelectedItem) {\n this.list.setAttribute('aria-activedescendant', newSelectedItem!.id);\n this.view.requestMeasure({\n key: this,\n read: () => ({\n sel: newSelectedItem!.dom.getBoundingClientRect(),\n panel: this.list.getBoundingClientRect(),\n }),\n write: ({ sel, panel }) => {\n const scaleY = panel.height / this.list.offsetHeight;\n if (sel.top < panel.top) {\n this.list.scrollTop -= (panel.top - sel.top) / scaleY;\n } else if (sel.bottom > panel.bottom) {\n this.list.scrollTop += (sel.bottom - panel.bottom) / scaleY;\n }\n },\n });\n } else if (this.selectedIndex < 0) {\n this.list.removeAttribute('aria-activedescendant');\n }\n if (needsSync) {\n this.sync();\n }\n }\n\n sync() {\n let domPos: ChildNode | null = this.list.firstChild;\n function rm() {\n const prev = domPos!;\n domPos = prev.nextSibling;\n prev.remove();\n }\n\n for (const item of this.items) {\n if (item.dom.parentNode == this.list) {\n while (domPos != item.dom) {\n rm();\n }\n domPos = item.dom.nextSibling;\n } else {\n this.list.insertBefore(item.dom, domPos);\n }\n }\n while (domPos) {\n rm();\n }\n }\n\n moveSelection(selectedIndex: number) {\n if (this.selectedIndex < 0) {\n return;\n }\n const field = this.view.state.field(lintState);\n const selection = findDiagnostic(\n field.diagnostics,\n this.items[selectedIndex].diagnostic,\n );\n if (!selection) {\n return;\n }\n this.view.dispatch({\n selection: { anchor: selection.from, head: selection.to },\n scrollIntoView: true,\n effects: movePanelSelection.of(selection),\n });\n }\n\n static open(view: EditorView) {\n return new LintPanel(view);\n }\n}\n\nfunction svg(content: string, attrs = 'viewBox=\"0 0 40 40\"') {\n return `url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" ${attrs}>${encodeURIComponent(content)}</svg>')`;\n}\n\nfunction underline(color: string) {\n return svg(\n `<path d=\"m0 2.5 l2 -1.5 l1 0 l2 1.5 l1 0\" stroke=\"${color}\" fill=\"none\" stroke-width=\".7\"/>`,\n 'width=\"6\" height=\"3\"',\n );\n}\n\nconst baseTheme = EditorView.baseTheme({\n '.cm-diagnostic': {\n padding: '3px 6px 3px 8px',\n marginLeft: '-1px',\n display: 'block',\n whiteSpace: 'pre-wrap',\n },\n '.cm-diagnostic-error': { borderLeft: '5px solid #d11' },\n '.cm-diagnostic-warning': { borderLeft: '5px solid orange' },\n '.cm-diagnostic-info': { borderLeft: '5px solid #999' },\n '.cm-diagnostic-hint': { borderLeft: '5px solid #66d' },\n\n '.cm-diagnosticAction': {\n font: 'inherit',\n border: 'none',\n padding: '2px 4px',\n backgroundColor: '#444',\n color: 'white',\n borderRadius: '3px',\n marginLeft: '8px',\n cursor: 'pointer',\n },\n\n '.cm-diagnosticSource': {\n fontSize: '70%',\n opacity: 0.7,\n },\n\n '.cm-lintRange': {\n backgroundPosition: 'left bottom',\n backgroundRepeat: 'repeat-x',\n paddingBottom: '0.7px',\n },\n\n '.cm-lintRange-error': { backgroundImage: underline('#d11') },\n '.cm-lintRange-warning': { backgroundImage: underline('orange') },\n '.cm-lintRange-info': { backgroundImage: underline('#999') },\n '.cm-lintRange-hint': { backgroundImage: underline('#66d') },\n '.cm-lintRange-active': { backgroundColor: '#ffdd9980' },\n\n '.cm-tooltip-lint': {\n padding: 0,\n margin: 0,\n },\n\n '.cm-lintPoint': {\n position: 'relative',\n\n '&:after': {\n content: '\"\"',\n position: 'absolute',\n bottom: 0,\n left: '-2px',\n borderLeft: '3px solid transparent',\n borderRight: '3px solid transparent',\n borderBottom: '4px solid #d11',\n },\n },\n\n '.cm-lintPoint-warning': {\n '&:after': { borderBottomColor: 'orange' },\n },\n '.cm-lintPoint-info': {\n '&:after': { borderBottomColor: '#999' },\n },\n '.cm-lintPoint-hint': {\n '&:after': { borderBottomColor: '#66d' },\n },\n\n '.cm-panel.cm-panel-lint': {\n position: 'relative',\n '& ul': {\n maxHeight: '100px',\n overflowY: 'auto',\n '& [aria-selected]': {\n backgroundColor: '#ddd',\n '& u': { textDecoration: 'underline' },\n },\n '&:focus [aria-selected]': {\n background_fallback: '#bdf',\n backgroundColor: 'Highlight',\n color_fallback: 'white',\n color: 'HighlightText',\n },\n '& u': { textDecoration: 'none' },\n padding: 0,\n margin: 0,\n },\n '& [name=close]': {\n position: 'absolute',\n top: '0',\n right: '2px',\n background: 'inherit',\n border: 'none',\n font: 'inherit',\n padding: 0,\n margin: 0,\n },\n },\n});\n\nfunction severityWeight(sev: Severity) {\n return sev == 'error' ? 4 : sev == 'warning' ? 3 : sev == 'info' ? 2 : 1;\n}\n\nclass LintGutterMarker extends GutterMarker {\n severity: Severity;\n constructor(readonly diagnostics: readonly Diagnostic[]) {\n super();\n this.severity = diagnostics.reduce(\n (max, d) =>\n severityWeight(max) < severityWeight(d.severity) ? d.severity : max,\n 'hint' as Severity,\n );\n }\n\n toDOM(view: EditorView) {\n const elt = document.createElement('div');\n elt.className = `cm-lint-marker cm-lint-marker-${this.severity}`;\n\n let { diagnostics } = this;\n const diagnosticsFilter = view.state.facet(lintGutterConfig).tooltipFilter;\n if (diagnosticsFilter) {\n diagnostics = diagnosticsFilter(diagnostics, view.state);\n }\n\n if (diagnostics.length) {\n elt.onmouseover = () => gutterMarkerMouseOver(view, elt, diagnostics);\n }\n\n return elt;\n }\n}\n\nconst enum Hover {\n Time = 300,\n Margin = 10,\n}\n\nfunction trackHoverOn(view: EditorView, marker: HTMLElement) {\n const mousemove = (event: MouseEvent) => {\n const rect = marker.getBoundingClientRect();\n if (\n event.clientX > rect.left - Hover.Margin &&\n event.clientX < rect.right + Hover.Margin &&\n event.clientY > rect.top - Hover.Margin &&\n event.clientY < rect.bottom + Hover.Margin\n ) {\n return;\n }\n for (\n let target = event.target as Node | null;\n target;\n target = target.parentNode\n ) {\n if (\n target.nodeType == 1 &&\n (target as HTMLElement).classList.contains('cm-tooltip-lint')\n ) {\n return;\n }\n }\n window.removeEventListener('mousemove', mousemove);\n if (view.state.field(lintGutterTooltip)) {\n view.dispatch({ effects: setLintGutterTooltip.of(null) });\n }\n };\n window.addEventListener('mousemove', mousemove);\n}\n\nfunction gutterMarkerMouseOver(\n view: EditorView,\n marker: HTMLElement,\n diagnostics: readonly Diagnostic[],\n) {\n function hovered() {\n const line = view.elementAtHeight(\n marker.getBoundingClientRect().top + 5 - view.documentTop,\n );\n const linePos = view.coordsAtPos(line.from);\n if (linePos) {\n view.dispatch({\n effects: setLintGutterTooltip.of({\n pos: line.from,\n above: false,\n create() {\n return {\n dom: diagnosticsTooltip(view, diagnostics),\n getCoords: () => marker.getBoundingClientRect(),\n };\n },\n }),\n });\n }\n marker.onmouseout = marker.onmousemove = null;\n trackHoverOn(view, marker);\n }\n\n const { hoverTime } = view.state.facet(lintGutterConfig);\n\n let hoverTimeout = setTimeout(hovered, hoverTime);\n marker.onmouseout = () => {\n clearTimeout(hoverTimeout);\n marker.onmouseout = marker.onmousemove = null;\n };\n marker.onmousemove = () => {\n clearTimeout(hoverTimeout);\n hoverTimeout = setTimeout(hovered, hoverTime);\n };\n}\n\nfunction markersForDiagnostics(doc: Text, diagnostics: readonly Diagnostic[]) {\n const byLine: { [line: number]: Diagnostic[] } = Object.create(null);\n for (const diagnostic of diagnostics) {\n const line = doc.lineAt(diagnostic.from);\n (byLine[line.from] || (byLine[line.from] = [])).push(diagnostic);\n }\n const markers: Range<GutterMarker>[] = [];\n for (const line in byLine) {\n markers.push(new LintGutterMarker(byLine[line]).range(+line));\n }\n return RangeSet.of(markers, true);\n}\n\nconst lintGutterExtension = gutter({\n class: 'cm-gutter-lint',\n markers: view => view.state.field(lintGutterMarkers),\n});\n\nconst lintGutterMarkers = StateField.define<RangeSet<GutterMarker>>({\n create() {\n return RangeSet.empty;\n },\n update(markers, tr) {\n markers = markers.map(tr.changes);\n const diagnosticFilter = tr.state.facet(lintGutterConfig).markerFilter;\n for (const effect of tr.effects) {\n if (effect.is(setDiagnosticsEffect)) {\n let diagnostics = effect.value;\n if (diagnosticFilter) {\n diagnostics = diagnosticFilter(diagnostics || [], tr.state);\n }\n markers = markersForDiagnostics(tr.state.doc, diagnostics.slice(0));\n }\n }\n return markers;\n },\n});\n\nconst setLintGutterTooltip = StateEffect.define<Tooltip | null>();\n\nconst lintGutterTooltip = StateField.define<Tooltip | null>({\n create() {\n return null;\n },\n update(tooltip, tr) {\n if (tooltip && tr.docChanged) {\n tooltip = hideTooltip(tr, tooltip)\n ? null\n : { ...tooltip, pos: tr.changes.mapPos(tooltip.pos) };\n }\n return tr.effects.reduce(\n (t, e) => (e.is(setLintGutterTooltip) ? e.value : t),\n tooltip,\n );\n },\n provide: field => showTooltip.from(field),\n});\n\nconst lintGutterTheme = EditorView.baseTheme({\n '.cm-gutter-lint': {\n width: '1.4em',\n '& .cm-gutterElement': {\n padding: '.2em',\n },\n },\n '.cm-lint-marker': {\n width: '1em',\n height: '1em',\n },\n '.cm-lint-marker-info': {\n content: svg(\n '<path fill=\"#aaf\" stroke=\"#77e\" stroke-width=\"6\" stroke-linejoin=\"round\" d=\"M5 5L35 5L35 35L5 35Z\"/>',\n ),\n },\n '.cm-lint-marker-warning': {\n content: svg(\n '<path fill=\"#fe8\" stroke=\"#fd7\" stroke-width=\"6\" stroke-linejoin=\"round\" d=\"M20 6L37 35L3 35Z\"/>',\n ),\n },\n '.cm-lint-marker-error': {\n content: svg(\n '<circle cx=\"20\" cy=\"20\" r=\"15\" fill=\"#f87\" stroke=\"#f43\" stroke-width=\"6\"/>',\n ),\n },\n});\n\nconst lintExtensions = [\n lintState,\n EditorView.decorations.compute([lintState], state => {\n const { selected, panel } = state.field(lintState);\n return !selected || !panel || selected.from == selected.to\n ? Decoration.none\n : Decoration.set([activeMark.range(selected.from, selected.to)]);\n }),\n hoverTooltip(lintTooltip, { hideOn: hideTooltip }),\n baseTheme,\n];\n\nconst lintGutterConfig = Facet.define<\n LintGutterConfig,\n Required<LintGutterConfig>\n>({\n combine(configs) {\n return combineConfig(configs, {\n hoverTime: Hover.Time,\n markerFilter: null,\n tooltipFilter: null,\n });\n },\n});\n\n/// Returns an extension that installs a gutter showing markers for\n/// each line that has diagnostics, which can be hovered over to see\n/// the diagnostics.\nexport function lintGutter(config: LintGutterConfig = {}): Extension {\n return [\n lintGutterConfig.of(config),\n lintGutterMarkers,\n lintGutterExtension,\n lintGutterTheme,\n lintGutterTooltip,\n ];\n}\n\n/// Iterate over the marked diagnostics for the given editor state,\n/// calling `f` for each of them. Note that, if the document changed\n/// since the diagnostics were created, the `Diagnostic` object will\n/// hold the original outdated position, whereas the `to` and `from`\n/// arguments hold the diagnostic's current position.\nexport function forEachDiagnostic(\n state: EditorState,\n f: (d: Diagnostic, from: number, to: number) => void,\n) {\n const lState = state.field(lintState, false);\n if (lState && lState.diagnostics.size) {\n for (\n let iter = RangeSet.iter([lState.diagnostics]);\n iter.value;\n iter.next()\n ) {\n f(iter.value.spec.diagnostic, iter.from, iter.to);\n }\n }\n}\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { Decoration, type DecorationSet } from '@codemirror/view';\nimport { type Range } from '@codemirror/state';\n\nimport { type Diagnostic, type Severity } from './index';\n\nconst splitDiagnosticBySeverity = (decorations: DecorationSet) => {\n const diagnosticMap = new Map<Severity, Diagnostic[]>();\n const decoration = decorations.iter();\n\n while (decoration.value) {\n const { severity } = decoration.value.spec.diagnostic;\n\n if (!diagnosticMap.has(severity)) {\n diagnosticMap.set(severity, []);\n }\n\n diagnosticMap.get(severity)!.push(decoration.value.spec.diagnostic);\n\n decoration.next();\n }\n\n return diagnosticMap;\n};\n\nconst createDecoration = (\n from: number,\n to: number,\n severity: Severity,\n diagnostics: Diagnostic[],\n) => {\n const last = diagnostics[diagnostics.length - 1];\n\n return Decoration.mark({\n attributes: {\n class: `cm-lintRange cm-lintRange-${\n severity\n }${last.markClass ? ` ${last.markClass}` : ''}`,\n },\n sourceDiagnostics: diagnostics,\n }).range(from, to);\n};\n\ninterface MergedDiagnostic extends Partial<Diagnostic> {\n sourceDiagnostics: Diagnostic[];\n}\n\nconst mergeDecoration = (diagnostics: Diagnostic[]): MergedDiagnostic[] => {\n const cloned = diagnostics.map(e => ({\n from: e.from,\n to: e.to,\n }));\n\n const merged: MergedDiagnostic[] = [];\n\n cloned.sort((a, b) => a.from - b.from);\n\n let current = cloned[0];\n let currentSourceDiagnostics: Diagnostic[] = [diagnostics[0]];\n\n for (let i = 1; i < cloned.length; i++) {\n const next = cloned[i];\n\n if (next.from <= current.to) {\n currentSourceDiagnostics.push(diagnostics[i]);\n current.to = Math.max(current.to, next.to);\n } else {\n merged.push({ ...current, sourceDiagnostics: currentSourceDiagnostics });\n current = next;\n currentSourceDiagnostics = [diagnostics[i]];\n }\n }\n\n merged.push({ ...current, sourceDiagnostics: currentSourceDiagnostics });\n\n return merged;\n};\n\nexport const mergeDecorations = (decorations: DecorationSet): DecorationSet => {\n try {\n const diagnosticMap = splitDiagnosticBySeverity(decorations);\n const merge: Range<Decoration>[] = [];\n\n diagnosticMap.forEach((value, key) => {\n mergeDecoration(value).forEach(diagnostic => {\n if (\n typeof diagnostic.from !== 'number' ||\n typeof diagnostic.to !== 'number'\n ) {\n return;\n }\n if (diagnostic.from <= diagnostic.to) {\n merge.push(\n createDecoration(\n diagnostic.from,\n diagnostic.to,\n key,\n diagnostic.sourceDiagnostics,\n ),\n );\n }\n });\n });\n\n merge.sort((a, b) => {\n if (a.from !== b.from) {\n return a.from - b.from;\n }\n\n return a.value.startSide - b.value.startSide;\n });\n\n return Decoration.set(merge);\n } catch (e) {\n console.error('FlowLangSDK: linter mergeDecorations error', e);\n return decorations;\n }\n};\n"],"mappings":";AAKA,OAAO,SAAS;AAChB;AAAA,EACE;AAAA,EACA;AAAA,EACA,cAAAA;AAAA,EAEA;AAAA,EAGA;AAAA,EAEA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,EAKA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;;;ACnCP,SAAS,kBAAsC;AAK/C,IAAM,4BAA4B,CAAC,gBAA+B;AAChE,QAAM,gBAAgB,oBAAI,IAA4B;AACtD,QAAM,aAAa,YAAY,KAAK;AAEpC,SAAO,WAAW,OAAO;AACvB,UAAM,EAAE,SAAS,IAAI,WAAW,MAAM,KAAK;AAE3C,QAAI,CAAC,cAAc,IAAI,QAAQ,GAAG;AAChC,oBAAc,IAAI,UAAU,CAAC,CAAC;AAAA,IAChC;AAEA,kBAAc,IAAI,QAAQ,EAAG,KAAK,WAAW,MAAM,KAAK,UAAU;AAElE,eAAW,KAAK;AAAA,EAClB;AAEA,SAAO;AACT;AAEA,IAAM,mBAAmB,CACvB,MACA,IACA,UACA,gBACG;AACH,QAAM,OAAO,YAAY,YAAY,SAAS,CAAC;AAE/C,SAAO,WAAW,KAAK;AAAA,IACrB,YAAY;AAAA,MACV,OAAO,6BACL,QACF,GAAG,KAAK,YAAY,IAAI,KAAK,SAAS,KAAK,EAAE;AAAA,IAC/C;AAAA,IACA,mBAAmB;AAAA,EACrB,CAAC,EAAE,MAAM,MAAM,EAAE;AACnB;AAMA,IAAM,kBAAkB,CAAC,gBAAkD;AACzE,QAAM,SAAS,YAAY,IAAI,QAAM;AAAA,IACnC,MAAM,EAAE;AAAA,IACR,IAAI,EAAE;AAAA,EACR,EAAE;AAEF,QAAM,SAA6B,CAAC;AAEpC,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAErC,MAAI,UAAU,OAAO,CAAC;AACtB,MAAI,2BAAyC,CAAC,YAAY,CAAC,CAAC;AAE5D,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,OAAO,OAAO,CAAC;AAErB,QAAI,KAAK,QAAQ,QAAQ,IAAI;AAC3B,+BAAyB,KAAK,YAAY,CAAC,CAAC;AAC5C,cAAQ,KAAK,KAAK,IAAI,QAAQ,IAAI,KAAK,EAAE;AAAA,IAC3C,OAAO;AACL,aAAO,KAAK,EAAE,GAAG,SAAS,mBAAmB,yBAAyB,CAAC;AACvE,gBAAU;AACV,iCAA2B,CAAC,YAAY,CAAC,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO,KAAK,EAAE,GAAG,SAAS,mBAAmB,yBAAyB,CAAC;AAEvE,SAAO;AACT;AAEO,IAAM,mBAAmB,CAAC,gBAA8C;AAC7E,MAAI;AACF,UAAM,gBAAgB,0BAA0B,WAAW;AAC3D,UAAM,QAA6B,CAAC;AAEpC,kBAAc,QAAQ,CAAC,OAAO,QAAQ;AACpC,sBAAgB,KAAK,EAAE,QAAQ,gBAAc;AAC3C,YACE,OAAO,WAAW,SAAS,YAC3B,OAAO,WAAW,OAAO,UACzB;AACA;AAAA,QACF;AACA,YAAI,WAAW,QAAQ,WAAW,IAAI;AACpC,gBAAM;AAAA,YACJ;AAAA,cACE,WAAW;AAAA,cACX,WAAW;AAAA,cACX;AAAA,cACA,WAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,UAAM,KAAK,CAAC,GAAG,MAAM;AACnB,UAAI,EAAE,SAAS,EAAE,MAAM;AACrB,eAAO,EAAE,OAAO,EAAE;AAAA,MACpB;AAEA,aAAO,EAAE,MAAM,YAAY,EAAE,MAAM;AAAA,IACrC,CAAC;AAED,WAAO,WAAW,IAAI,KAAK;AAAA,EAC7B,SAAS,GAAG;AACV,YAAQ,MAAM,8CAA8C,CAAC;AAC7D,WAAO;AAAA,EACT;AACF;;;ADIA,IAAM,qBAAN,MAAyB;AAAA,EACvB,YACW,MACA,IACA,YACT;AAHS;AACA;AACA;AAAA,EACR;AACL;AAEA,IAAM,YAAN,MAAM,WAAU;AAAA,EACd,YACW,aACA,OACA,UACT;AAHS;AACA;AACA;AAAA,EACR;AAAA,EAEH,OAAO,KACL,aACA,OACA,OACA;AAEA,QAAI,oBAAoB;AACxB,UAAM,mBAAmB,MAAM,MAAM,UAAU,EAAE;AACjD,QAAI,kBAAkB;AACpB,0BAAoB,iBAAiB,mBAAmB,KAAK;AAAA,IAC/D;AAEA,UAAM,SAASC,YAAW;AAAA,MACxB,kBAAkB,IAAI,CAAC,MAAkB;AAEvC,YACE,EAAE,QAAQ,EAAE,MACX,EAAE,QAAQ,EAAE,KAAK,KAAK,MAAM,IAAI,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MACxD;AACA,iBAAOA,YAAW,OAAO;AAAA,YACvB,QAAQ,IAAI,iBAAiB,CAAC;AAAA,YAC9B,YAAY;AAAA,UACd,CAAC,EAAE,MAAM,EAAE,IAAI;AAAA,QACjB;AAEA,eAAOA,YAAW,KAAK;AAAA,UACrB,YAAY;AAAA,YACV,OAAO,6BACL,EAAE,QACJ,GAAG,EAAE,YAAY,IAAI,EAAE,SAAS,KAAK,EAAE;AAAA,UACzC;AAAA,UACA,YAAY;AAAA,QACd,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;AAAA,MACvB,CAAC;AAAA,MACD;AAAA,IACF;AAEA,WAAO,IAAI,WAAU,QAAQ,OAAO,eAAe,MAAM,CAAC;AAAA,EAC5D;AACF;AAEA,SAAS,eACP,aACA,aAAgC,MAChC,QAAQ,GACmB;AAC3B,MAAI,QAAmC;AACvC,cAAY,QAAQ,OAAO,KAAK,CAAC,MAAM,IAAI,EAAE,KAAK,MAAM;AACtD,QAAI,cAAc,KAAK,cAAc,YAAY;AAC/C;AAAA,IACF;AACA,YAAQ,IAAI,mBAAmB,MAAM,IAAI,KAAK,UAAU;AACxD,WAAO;AAAA,EACT,CAAC;AACD,SAAO;AACT;AAEA,SAAS,YAAY,IAAiB,SAAkB;AACtD,QAAM,OAAO,QAAQ,KACnB,KAAK,QAAQ,OAAO;AACtB,QAAM,SAAS,GAAG,MAAM,MAAM,UAAU,EAAE,OAAO,IAAI,MAAM,EAAE;AAC7D,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AACA,QAAM,OAAO,GAAG,WAAW,IAAI,OAAO,QAAQ,GAAG;AACjD,SAAO,CAAC,EACN,GAAG,QAAQ,KAAK,OAAK,EAAE,GAAG,oBAAoB,CAAC,KAC/C,GAAG,QAAQ,aAAa,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,EAAE,CAAC;AAE5D;AAEA,SAAS,gBACP,OACA,SACA;AACA,SAAO,MAAM,MAAM,WAAW,KAAK,IAC/B,UACA,QAAQ,OAAO,YAAY,aAAa,GAAG,cAAc,CAAC;AAChE;AAKO,SAAS,eACd,OACA,aACiB;AACjB,SAAO;AAAA,IACL,SAAS,gBAAgB,OAAO,CAAC,qBAAqB,GAAG,WAAW,CAAC,CAAC;AAAA,EACxE;AACF;AAIO,IAAM,uBAAuB,YAAY,OAA8B;AAE9E,IAAM,cAAc,YAAY,OAAgB;AAEhD,IAAM,qBAAqB,YAAY,OAA2B;AAElE,IAAM,YAAY,WAAW,OAAkB;AAAA,EAC7C,SAAS;AACP,WAAO,IAAI,UAAUA,YAAW,MAAM,MAAM,IAAI;AAAA,EAClD;AAAA,EACA,OAAO,OAAO,IAAI;AAChB,QAAI,GAAG,cAAc,MAAM,YAAY,MAAM;AAC3C,YAAM,SAAS,MAAM,YAAY,IAAI,GAAG,OAAO;AAC/C,UAAI,WAAsC,MACxC,EAAE,MAAM,IAAI;AACd,UAAI,MAAM,UAAU;AAClB,cAAM,SAAS,GAAG,QAAQ,OAAO,MAAM,SAAS,MAAM,CAAC;AACvD,mBACE,eAAe,QAAQ,MAAM,SAAS,YAAY,MAAM,KACxD,eAAe,QAAQ,MAAM,MAAM;AAAA,MACvC;AACA,UAAI,CAAC,OAAO,QAAQ,SAAS,GAAG,MAAM,MAAM,UAAU,EAAE,WAAW;AACjE,gBAAQ;AAAA,MACV;AACA,cAAQ,IAAI,UAAU,QAAQ,OAAO,QAAQ;AAAA,IAC/C;AAEA,eAAW,UAAU,GAAG,SAAS;AAC/B,UAAI,OAAO,GAAG,oBAAoB,GAAG;AACnC,cAAM,QAAQ,CAAC,GAAG,MAAM,MAAM,UAAU,EAAE,YACtC,MAAM,QACN,OAAO,MAAM,SACX,UAAU,OACV;AACN,gBAAQ,UAAU,KAAK,OAAO,OAAO,OAAO,GAAG,KAAK;AAAA,MACtD,WAAW,OAAO,GAAG,WAAW,GAAG;AACjC,gBAAQ,IAAI;AAAA,UACV,MAAM;AAAA,UACN,OAAO,QAAQ,UAAU,OAAO;AAAA,UAChC,MAAM;AAAA,QACR;AAAA,MACF,WAAW,OAAO,GAAG,kBAAkB,GAAG;AACxC,gBAAQ,IAAI,UAAU,MAAM,aAAa,MAAM,OAAO,OAAO,KAAK;AAAA,MACpE;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EACA,SAAS,OAAK;AAAA,IACZ,UAAU,KAAK,GAAG,SAAO,IAAI,KAAK;AAAA;AAAA,IAElC,WAAW,YAAY,KAAK,GAAG,OAAK,iBAAiB,EAAE,WAAW,CAAC;AAAA,EACrE;AACF,CAAC;AAGM,SAAS,gBAAgB,OAAoB;AAClD,QAAM,OAAO,MAAM,MAAM,WAAW,KAAK;AACzC,SAAO,OAAO,KAAK,YAAY,OAAO;AACxC;AAEA,IAAM,aAAaA,YAAW,KAAK;AAAA,EACjC,OAAO;AACT,CAAC;AAED,SAAS,YAAY,MAAkB,KAAa,MAAc;AAChE,QAAM,EAAE,YAAY,IAAI,KAAK,MAAM,MAAM,SAAS;AAClD,MAAI,QAAsB,CAAC,GACzB,aAAa,KACb,WAAW;AACb,cAAY;AAAA,IACV,OAAO,OAAO,IAAI,IAAI;AAAA,IACtB,OAAO,OAAO,IAAI,IAAI;AAAA,IACtB,CAAC,MAAM,IAAI,EAAE,KAAK,MAAM;AACtB,UACE,OAAO,QACP,OAAO,OACN,QAAQ,OAAQ,MAAM,QAAQ,OAAO,OAAO,MAAM,MAAM,OAAO,KAChE;AACA,cAAM,KAAK,KAAK,UAAU;AAC1B,qBAAa,KAAK,IAAI,MAAM,UAAU;AACtC,mBAAW,KAAK,IAAI,IAAI,QAAQ;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAmB,KAAK,MAAM,MAAM,UAAU,EAAE;AACtD,MAAI,kBAAkB;AACpB,YAAQ,iBAAiB,OAAO,KAAK,KAAK;AAAA,EAC5C;AAEA,MAAI,CAAC,MAAM,QAAQ;AACjB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,OAAO,KAAK,MAAM,IAAI,OAAO,UAAU,EAAE,KAAK;AAAA,IAC9C,SAAS;AACP,aAAO,EAAE,KAAK,mBAAmB,MAAM,KAAK,EAAE;AAAA,IAChD;AAAA,EACF;AACF;AAEA,SAAS,mBACP,MACA,aACA;AACA,SAAO;AAAA,IACL;AAAA,IACA,EAAE,OAAO,kBAAkB;AAAA,IAC3B,YAAY,IAAI,OAAK,iBAAiB,MAAM,GAAG,KAAK,CAAC;AAAA,EACvD;AACF;AAGO,IAAM,gBAAyB,CAAC,SAAqB;AAC1D,QAAM,QAAQ,KAAK,MAAM,MAAM,WAAW,KAAK;AAC/C,MAAI,CAAC,SAAS,CAAC,MAAM,OAAO;AAC1B,SAAK,SAAS;AAAA,MACZ,SAAS,gBAAgB,KAAK,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;AAAA,IAC7D,CAAC;AAAA,EACH;AACA,QAAM,QAAQ,SAAS,MAAM,UAAU,IAAI;AAC3C,MAAI,OAAO;AACT,IAAC,MAAM,IAAI,cAAc,mBAAmB,EAAkB,MAAM;AAAA,EACtE;AACA,SAAO;AACT;AAGO,IAAM,iBAA0B,CAAC,SAAqB;AAC3D,QAAM,QAAQ,KAAK,MAAM,MAAM,WAAW,KAAK;AAC/C,MAAI,CAAC,SAAS,CAAC,MAAM,OAAO;AAC1B,WAAO;AAAA,EACT;AACA,OAAK,SAAS,EAAE,SAAS,YAAY,GAAG,KAAK,EAAE,CAAC;AAChD,SAAO;AACT;AAGO,IAAM,iBAA0B,CAAC,SAAqB;AAC3D,QAAM,QAAQ,KAAK,MAAM,MAAM,WAAW,KAAK;AAC/C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,MAAM,KAAK,MAAM,UAAU;AACjC,MAAI,OAAO,MAAM,YAAY,KAAK,IAAI,KAAK,CAAC;AAC5C,MAAI,CAAC,KAAK,OAAO;AACf,WAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,QAAI,CAAC,KAAK,SAAU,KAAK,QAAQ,IAAI,QAAQ,KAAK,MAAM,IAAI,IAAK;AAC/D,aAAO;AAAA,IACT;AAAA,EACF;AACA,OAAK,SAAS;AAAA,IACZ,WAAW,EAAE,QAAQ,KAAK,MAAM,MAAM,KAAK,GAAG;AAAA,IAC9C,gBAAgB;AAAA,EAClB,CAAC;AACD,SAAO;AACT;AAGO,IAAM,qBAA8B,CAAC,SAAqB;AAC/D,QAAM,EAAE,MAAM,IAAI,MAChB,QAAQ,MAAM,MAAM,WAAW,KAAK;AACtC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,MAAM,MAAM,UAAU;AAC5B,MAAI,UACF,QACA,UACA;AACF,QAAM,YAAY,QAAQ,GAAG,MAAM,IAAI,QAAQ,CAAC,MAAM,OAAO;AAC3D,QAAI,KAAK,IAAI,OAAO,YAAY,QAAQ,WAAW,OAAO;AACxD,iBAAW;AACX,eAAS;AAAA,IACX;AACA,QAAI,YAAY,QAAQ,OAAO,UAAU;AACvC,iBAAW;AACX,eAAS;AAAA,IACX;AAAA,EACF,CAAC;AACD,MAAI,YAAY,QAAS,YAAY,QAAQ,YAAY,IAAI,MAAO;AAClE,WAAO;AAAA,EACT;AACA,OAAK,SAAS;AAAA,IACZ,WAAW,EAAE,QAAQ,YAAY,UAAU,MAAM,UAAU,OAAO;AAAA,IAClE,gBAAgB;AAAA,EAClB,CAAC;AACD,SAAO;AACT;AAMO,IAAM,aAAoC;AAAA,EAC/C,EAAE,KAAK,eAAe,KAAK,eAAe,gBAAgB,KAAK;AAAA,EAC/D,EAAE,KAAK,MAAM,KAAK,eAAe;AACnC;AAOA,IAAM,aAAa,WAAW;AAAA,EAC5B,MAAM;AAAA,IAKJ,YAAqB,MAAkB;AAAlB;AACnB,YAAM,EAAE,MAAM,IAAI,KAAK,MAAM,MAAM,UAAU;AAC7C,WAAK,WAAW,KAAK,IAAI,IAAI;AAC7B,WAAK,MAAM,KAAK,IAAI,KAAK,IAAI;AAC7B,WAAK,UAAU,OAAO,WAAW,KAAK,KAAK,KAAK;AAAA,IAClD;AAAA,IATA;AAAA,IACA,UAAU;AAAA,IACV,MAAM;AAAA,IASN,MAAM;AACJ,mBAAa,KAAK,OAAO;AACzB,YAAM,MAAM,KAAK,IAAI;AACrB,UAAI,MAAM,KAAK,WAAW,IAAI;AAC5B,aAAK,UAAU,OAAO,WAAW,KAAK,KAAK,KAAK,WAAW,GAAG;AAAA,MAChE,OAAO;AACL,aAAK,MAAM;AACX,cAAM,EAAE,MAAM,IAAI,KAAK,MACrB,EAAE,QAAQ,IAAI,MAAM,MAAM,UAAU;AACtC,YAAI,QAAQ,QAAQ;AAClB,kBAAQ;AAAA,YACN,QAAQ,IAAI,YAAU,QAAQ,QAAQ,OAAO,KAAK,IAAI,CAAC,CAAC;AAAA,UAC1D,EAAE;AAAA,YACA,iBAAe;AACb,oBAAM,MAAM,YAAY,OAAO,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC;AACpD,kBAAI,KAAK,KAAK,MAAM,OAAO,MAAM,KAAK;AACpC,qBAAK,KAAK,SAAS,eAAe,KAAK,KAAK,OAAO,GAAG,CAAC;AAAA,cACzD;AAAA,YACF;AAAA,YACA,WAAS;AACP,2BAAa,KAAK,KAAK,OAAO,KAAK;AAAA,YACrC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,OAAO,QAAoB;AACzB,YAAM,SAAS,OAAO,MAAM,MAAM,UAAU;AAC5C,UACE,OAAO,cACP,UAAU,OAAO,WAAW,MAAM,UAAU,KAC3C,OAAO,gBAAgB,OAAO,aAAa,MAAM,GAClD;AACA,aAAK,WAAW,KAAK,IAAI,IAAI,OAAO;AACpC,YAAI,CAAC,KAAK,KAAK;AACb,eAAK,MAAM;AACX,eAAK,UAAU,OAAO,WAAW,KAAK,KAAK,OAAO,KAAK;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAAA,IAEA,QAAQ;AACN,UAAI,KAAK,KAAK;AACZ,aAAK,WAAW,KAAK,IAAI;AACzB,aAAK,IAAI;AAAA,MACX;AAAA,IACF;AAAA,IAEA,UAAU;AACR,mBAAa,KAAK,OAAO;AAAA,IAC3B;AAAA,EACF;AACF;AAEA,IAAM,aAAa,MAAM,OAGvB;AAAA,EACA,QAAQ,OAAO;AACb,WAAO;AAAA,MACL,SAAS,MACN,IAAI,OAAK,EAAE,MAAM,EACjB,OAAO,OAAK,KAAK,IAAI;AAAA,MACxB,GAAG;AAAA,QACD,MAAM,IAAI,OAAK,EAAE,MAAM;AAAA,QACvB;AAAA,UACE,OAAO;AAAA,UACP,cAAc;AAAA,UACd,eAAe;AAAA,UACf,cAAc;AAAA,UACd,QAAQ,MAAM;AAAA,QAChB;AAAA,QACA;AAAA,UACE,cAAc,CAAC,GAAG,MAAO,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,OAAK,EAAE,CAAC,KAAK,EAAE,CAAC;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAMM,SAAS,OACd,QACA,SAAqB,CAAC,GACX;AACX,SAAO,CAAC,WAAW,GAAG,EAAE,QAAQ,OAAO,CAAC,GAAG,YAAY,cAAc;AACvE;AAIO,SAAS,aAAa,MAAkB;AAC7C,QAAM,SAAS,KAAK,OAAO,UAAU;AACrC,MAAI,QAAQ;AACV,WAAO,MAAM;AAAA,EACf;AACF;AAEA,SAAS,WAAW,SAAwC;AAC1D,QAAM,WAAqB,CAAC;AAC5B,MAAI,SAAS;AACX,YAAS,YAAW,EAAE,KAAK,KAAK,SAAS;AACvC,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,cAAM,KAAK,KAAK,CAAC;AACjB,YACE,WAAW,KAAK,EAAE,KAClB,CAAC,SAAS,KAAK,OAAK,EAAE,YAAY,KAAK,GAAG,YAAY,CAAC,GACvD;AACA,mBAAS,KAAK,EAAE;AAChB,mBAAS;AAAA,QACX;AAAA,MACF;AACA,eAAS,KAAK,EAAE;AAAA,IAClB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBACP,MACA,YACA,SACA;AAlkBF;AAmkBE,QAAM,OAAO,UAAU,WAAW,WAAW,OAAO,IAAI,CAAC;AACzD,SAAO;AAAA,IACL;AAAA,IACA,EAAE,OAAO,+BAA+B,WAAW,QAAQ,GAAG;AAAA,IAC9D;AAAA,MACE;AAAA,MACA,EAAE,OAAO,oBAAoB;AAAA,MAC7B,WAAW,gBACP,WAAW,cAAc,IAAI,IAC7B,WAAW;AAAA,IACjB;AAAA,KACA,gBAAW,YAAX,mBAAoB,IAAI,CAAC,QAAQ,MAAM;AACrC,UAAI,QAAQ;AACZ,YAAM,QAAQ,CAAC,MAAa;AAC1B,UAAE,eAAe;AACjB,YAAI,OAAO;AACT;AAAA,QACF;AACA,gBAAQ;AACR,cAAM,QAAQ;AAAA,UACZ,KAAK,MAAM,MAAM,SAAS,EAAE;AAAA,UAC5B;AAAA,QACF;AACA,YAAI,OAAO;AACT,iBAAO,MAAM,MAAM,MAAM,MAAM,MAAM,EAAE;AAAA,QACzC;AAAA,MACF;AACA,YAAM,EAAE,KAAK,IAAI,QACf,WAAW,KAAK,CAAC,IAAI,KAAK,QAAQ,KAAK,CAAC,CAAC,IAAI;AAC/C,YAAM,UACJ,WAAW,IACP,OACA;AAAA,QACE,KAAK,MAAM,GAAG,QAAQ;AAAA,QACtB,IAAI,KAAK,KAAK,MAAM,UAAU,WAAW,CAAC,CAAC;AAAA,QAC3C,KAAK,MAAM,WAAW,CAAC;AAAA,MACzB;AACN,aAAO;AAAA,QACL;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,UACP,SAAS;AAAA,UACT,aAAa;AAAA,UACb,cAAc,YAAY,IAAI,GAAG,WAAW,IAAI,KAAK,iBAAiB,KAAK,CAAC,CAAC,IAAI;AAAA,QACnF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,WAAW,UACT,IAAI,OAAO,EAAE,OAAO,sBAAsB,GAAG,WAAW,MAAM;AAAA,EAClE;AACF;AAEA,IAAM,mBAAN,cAA+B,WAAW;AAAA,EACxC,YAAqB,YAAwB;AAC3C,UAAM;AADa;AAAA,EAErB;AAAA,EAEA,GAAG,OAAyB;AAC1B,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC;AAAA,EAEA,QAAQ;AACN,WAAO,IAAI,QAAQ;AAAA,MACjB,OAAO,6BAA6B,KAAK,WAAW,QAAQ;AAAA,IAC9D,CAAC;AAAA,EACH;AACF;AAEA,IAAM,YAAN,MAAgB;AAAA,EAId,YACE,MACS,YACT;AADS;AAET,SAAK,MAAM,iBAAiB,MAAM,YAAY,IAAI;AAClD,SAAK,IAAI,KAAK,KAAK;AACnB,SAAK,IAAI,aAAa,QAAQ,QAAQ;AAAA,EACxC;AAAA,EAVA,KAAK,QAAQ,KAAK,MAAM,KAAK,OAAO,IAAI,UAAU,EAAE,SAAS,EAAE,CAAC;AAAA,EAChE;AAUF;AAEA,IAAM,YAAN,MAAM,WAA2B;AAAA,EAK/B,YAAqB,MAAkB;AAAlB;AACnB,UAAM,YAAY,CAAC,UAAyB;AAC1C,UAAI,MAAM,WAAW,IAAI;AAEvB,uBAAe,KAAK,IAAI;AACxB,aAAK,KAAK,MAAM;AAAA,MAClB,WAAW,MAAM,WAAW,MAAM,MAAM,WAAW,IAAI;AAErD,aAAK;AAAA,WACF,KAAK,gBAAgB,IAAI,KAAK,MAAM,UAAU,KAAK,MAAM;AAAA,QAC5D;AAAA,MACF,WAAW,MAAM,WAAW,MAAM,MAAM,WAAW,IAAI;AAErD,aAAK,eAAe,KAAK,gBAAgB,KAAK,KAAK,MAAM,MAAM;AAAA,MACjE,WAAW,MAAM,WAAW,IAAI;AAE9B,aAAK,cAAc,CAAC;AAAA,MACtB,WAAW,MAAM,WAAW,IAAI;AAE9B,aAAK,cAAc,KAAK,MAAM,SAAS,CAAC;AAAA,MAC1C,WAAW,MAAM,WAAW,IAAI;AAE9B,aAAK,KAAK,MAAM;AAAA,MAClB,WACE,MAAM,WAAW,MACjB,MAAM,WAAW,MACjB,KAAK,iBAAiB,GACtB;AAEA,cAAM,EAAE,WAAW,IAAI,KAAK,MAAM,KAAK,aAAa,GAClD,OAAO,WAAW,WAAW,OAAO;AACtC,iBAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,cAAI,KAAK,CAAC,EAAE,YAAY,EAAE,WAAW,CAAC,KAAK,MAAM,SAAS;AACxD,kBAAM,QAAQ;AAAA,cACZ,KAAK,KAAK,MAAM,MAAM,SAAS,EAAE;AAAA,cACjC;AAAA,YACF;AACA,gBAAI,OAAO;AACT,yBAAW,QAAS,CAAC,EAAE,MAAM,MAAM,MAAM,MAAM,MAAM,EAAE;AAAA,YACzD;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AACL;AAAA,MACF;AACA,YAAM,eAAe;AAAA,IACvB;AACA,UAAM,UAAU,CAAC,UAAsB;AACrC,eAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;AAC1C,YAAI,KAAK,MAAM,CAAC,EAAE,IAAI,SAAS,MAAM,MAAqB,GAAG;AAC3D,eAAK,cAAc,CAAC;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEA,SAAK,OAAO,IAAI,MAAM;AAAA,MACpB,UAAU;AAAA,MACV,MAAM;AAAA,MACN,cAAc,KAAK,KAAK,MAAM,OAAO,aAAa;AAAA,MAClD;AAAA,MACA;AAAA,IACF,CAAC;AACD,SAAK,MAAM;AAAA,MACT;AAAA,MACA,EAAE,OAAO,gBAAgB;AAAA,MACzB,KAAK;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,cAAc,KAAK,KAAK,MAAM,OAAO,OAAO;AAAA,UAC5C,SAAS,MAAM,eAAe,KAAK,IAAI;AAAA,QACzC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,SAAK,OAAO;AAAA,EACd;AAAA,EAlFA,QAAqB,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EAkFA,IAAI,gBAAgB;AAClB,UAAM,EAAE,SAAS,IAAI,KAAK,KAAK,MAAM,MAAM,SAAS;AACpD,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AACA,aAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;AAC1C,UAAI,KAAK,MAAM,CAAC,EAAE,cAAc,SAAS,YAAY;AACnD,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,SAAS;AACP,UAAM,EAAE,aAAa,SAAS,IAAI,KAAK,KAAK,MAAM,MAAM,SAAS;AACjE,QAAI,IAAI,GACN,YAAY,OACZ,kBAAoC;AACtC,gBAAY;AAAA,MACV;AAAA,MACA,KAAK,KAAK,MAAM,IAAI;AAAA,MACpB,CAAC,QAAQ,MAAM,EAAE,KAAK,MAAM;AAC1B,YAAI,QAAQ,IACV;AACF,iBAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;AAC1C,cAAI,KAAK,MAAM,CAAC,EAAE,cAAc,KAAK,YAAY;AAC/C,oBAAQ;AACR;AAAA,UACF;AAAA,QACF;AACA,YAAI,QAAQ,GAAG;AACb,iBAAO,IAAI,UAAU,KAAK,MAAM,KAAK,UAAU;AAC/C,eAAK,MAAM,OAAO,GAAG,GAAG,IAAI;AAC5B,sBAAY;AAAA,QACd,OAAO;AACL,iBAAO,KAAK,MAAM,KAAK;AACvB,cAAI,QAAQ,GAAG;AACb,iBAAK,MAAM,OAAO,GAAG,QAAQ,CAAC;AAC9B,wBAAY;AAAA,UACd;AAAA,QACF;AACA,YAAI,YAAY,KAAK,cAAc,SAAS,YAAY;AACtD,cAAI,CAAC,KAAK,IAAI,aAAa,eAAe,GAAG;AAC3C,iBAAK,IAAI,aAAa,iBAAiB,MAAM;AAC7C,8BAAkB;AAAA,UACpB;AAAA,QACF,WAAW,KAAK,IAAI,aAAa,eAAe,GAAG;AACjD,eAAK,IAAI,gBAAgB,eAAe;AAAA,QAC1C;AACA;AAAA,MACF;AAAA,IACF;AACA,WACE,IAAI,KAAK,MAAM,UACf,EAAE,KAAK,MAAM,UAAU,KAAK,KAAK,MAAM,CAAC,EAAE,WAAW,OAAO,IAC5D;AACA,kBAAY;AACZ,WAAK,MAAM,IAAI;AAAA,IACjB;AACA,QAAI,KAAK,MAAM,UAAU,GAAG;AAC1B,WAAK,MAAM;AAAA,QACT,IAAI,UAAU,KAAK,MAAM;AAAA,UACvB,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,SAAS,KAAK,KAAK,MAAM,OAAO,gBAAgB;AAAA,QAClD,CAAC;AAAA,MACH;AACA,kBAAY;AAAA,IACd;AACA,QAAI,iBAAiB;AACnB,WAAK,KAAK,aAAa,yBAAyB,gBAAiB,EAAE;AACnE,WAAK,KAAK,eAAe;AAAA,QACvB,KAAK;AAAA,QACL,MAAM,OAAO;AAAA,UACX,KAAK,gBAAiB,IAAI,sBAAsB;AAAA,UAChD,OAAO,KAAK,KAAK,sBAAsB;AAAA,QACzC;AAAA,QACA,OAAO,CAAC,EAAE,KAAK,MAAM,MAAM;AACzB,gBAAM,SAAS,MAAM,SAAS,KAAK,KAAK;AACxC,cAAI,IAAI,MAAM,MAAM,KAAK;AACvB,iBAAK,KAAK,cAAc,MAAM,MAAM,IAAI,OAAO;AAAA,UACjD,WAAW,IAAI,SAAS,MAAM,QAAQ;AACpC,iBAAK,KAAK,cAAc,IAAI,SAAS,MAAM,UAAU;AAAA,UACvD;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,WAAW,KAAK,gBAAgB,GAAG;AACjC,WAAK,KAAK,gBAAgB,uBAAuB;AAAA,IACnD;AACA,QAAI,WAAW;AACb,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,OAAO;AACL,QAAI,SAA2B,KAAK,KAAK;AACzC,aAAS,KAAK;AACZ,YAAM,OAAO;AACb,eAAS,KAAK;AACd,WAAK,OAAO;AAAA,IACd;AAEA,eAAW,QAAQ,KAAK,OAAO;AAC7B,UAAI,KAAK,IAAI,cAAc,KAAK,MAAM;AACpC,eAAO,UAAU,KAAK,KAAK;AACzB,aAAG;AAAA,QACL;AACA,iBAAS,KAAK,IAAI;AAAA,MACpB,OAAO;AACL,aAAK,KAAK,aAAa,KAAK,KAAK,MAAM;AAAA,MACzC;AAAA,IACF;AACA,WAAO,QAAQ;AACb,SAAG;AAAA,IACL;AAAA,EACF;AAAA,EAEA,cAAc,eAAuB;AACnC,QAAI,KAAK,gBAAgB,GAAG;AAC1B;AAAA,IACF;AACA,UAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,SAAS;AAC7C,UAAM,YAAY;AAAA,MAChB,MAAM;AAAA,MACN,KAAK,MAAM,aAAa,EAAE;AAAA,IAC5B;AACA,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AACA,SAAK,KAAK,SAAS;AAAA,MACjB,WAAW,EAAE,QAAQ,UAAU,MAAM,MAAM,UAAU,GAAG;AAAA,MACxD,gBAAgB;AAAA,MAChB,SAAS,mBAAmB,GAAG,SAAS;AAAA,IAC1C,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,KAAK,MAAkB;AAC5B,WAAO,IAAI,WAAU,IAAI;AAAA,EAC3B;AACF;AAEA,SAAS,IAAI,SAAiB,QAAQ,uBAAuB;AAC3D,SAAO,mEAAmE,KAAK,IAAI,mBAAmB,OAAO,CAAC;AAChH;AAEA,SAAS,UAAU,OAAe;AAChC,SAAO;AAAA,IACL,qDAAqD,KAAK;AAAA,IAC1D;AAAA,EACF;AACF;AAEA,IAAM,YAAY,WAAW,UAAU;AAAA,EACrC,kBAAkB;AAAA,IAChB,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AAAA,EACA,wBAAwB,EAAE,YAAY,iBAAiB;AAAA,EACvD,0BAA0B,EAAE,YAAY,mBAAmB;AAAA,EAC3D,uBAAuB,EAAE,YAAY,iBAAiB;AAAA,EACtD,uBAAuB,EAAE,YAAY,iBAAiB;AAAA,EAEtD,wBAAwB;AAAA,IACtB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAAA,EAEA,wBAAwB;AAAA,IACtB,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EAEA,iBAAiB;AAAA,IACf,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,eAAe;AAAA,EACjB;AAAA,EAEA,uBAAuB,EAAE,iBAAiB,UAAU,MAAM,EAAE;AAAA,EAC5D,yBAAyB,EAAE,iBAAiB,UAAU,QAAQ,EAAE;AAAA,EAChE,sBAAsB,EAAE,iBAAiB,UAAU,MAAM,EAAE;AAAA,EAC3D,sBAAsB,EAAE,iBAAiB,UAAU,MAAM,EAAE;AAAA,EAC3D,wBAAwB,EAAE,iBAAiB,YAAY;AAAA,EAEvD,oBAAoB;AAAA,IAClB,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EAEA,iBAAiB;AAAA,IACf,UAAU;AAAA,IAEV,WAAW;AAAA,MACT,SAAS;AAAA,MACT,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,cAAc;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,yBAAyB;AAAA,IACvB,WAAW,EAAE,mBAAmB,SAAS;AAAA,EAC3C;AAAA,EACA,sBAAsB;AAAA,IACpB,WAAW,EAAE,mBAAmB,OAAO;AAAA,EACzC;AAAA,EACA,sBAAsB;AAAA,IACpB,WAAW,EAAE,mBAAmB,OAAO;AAAA,EACzC;AAAA,EAEA,2BAA2B;AAAA,IACzB,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,WAAW;AAAA,MACX,WAAW;AAAA,MACX,qBAAqB;AAAA,QACnB,iBAAiB;AAAA,QACjB,OAAO,EAAE,gBAAgB,YAAY;AAAA,MACvC;AAAA,MACA,2BAA2B;AAAA,QACzB,qBAAqB;AAAA,QACrB,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,QAChB,OAAO;AAAA,MACT;AAAA,MACA,OAAO,EAAE,gBAAgB,OAAO;AAAA,MAChC,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,IACA,kBAAkB;AAAA,MAChB,UAAU;AAAA,MACV,KAAK;AAAA,MACL,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AACF,CAAC;AAED,SAAS,eAAe,KAAe;AACrC,SAAO,OAAO,UAAU,IAAI,OAAO,YAAY,IAAI,OAAO,SAAS,IAAI;AACzE;AAEA,IAAM,mBAAN,cAA+B,aAAa;AAAA,EAE1C,YAAqB,aAAoC;AACvD,UAAM;AADa;AAEnB,SAAK,WAAW,YAAY;AAAA,MAC1B,CAAC,KAAK,MACJ,eAAe,GAAG,IAAI,eAAe,EAAE,QAAQ,IAAI,EAAE,WAAW;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA,EARA;AAAA,EAUA,MAAM,MAAkB;AACtB,UAAMC,OAAM,SAAS,cAAc,KAAK;AACxC,IAAAA,KAAI,YAAY,iCAAiC,KAAK,QAAQ;AAE9D,QAAI,EAAE,YAAY,IAAI;AACtB,UAAM,oBAAoB,KAAK,MAAM,MAAM,gBAAgB,EAAE;AAC7D,QAAI,mBAAmB;AACrB,oBAAc,kBAAkB,aAAa,KAAK,KAAK;AAAA,IACzD;AAEA,QAAI,YAAY,QAAQ;AACtB,MAAAA,KAAI,cAAc,MAAM,sBAAsB,MAAMA,MAAK,WAAW;AAAA,IACtE;AAEA,WAAOA;AAAA,EACT;AACF;AAOA,SAAS,aAAa,MAAkB,QAAqB;AAC3D,QAAM,YAAY,CAAC,UAAsB;AACvC,UAAM,OAAO,OAAO,sBAAsB;AAC1C,QACE,MAAM,UAAU,KAAK,OAAO,mBAC5B,MAAM,UAAU,KAAK,QAAQ,mBAC7B,MAAM,UAAU,KAAK,MAAM,mBAC3B,MAAM,UAAU,KAAK,SAAS,iBAC9B;AACA;AAAA,IACF;AACA,aACM,SAAS,MAAM,QACnB,QACA,SAAS,OAAO,YAChB;AACA,UACE,OAAO,YAAY,KAClB,OAAuB,UAAU,SAAS,iBAAiB,GAC5D;AACA;AAAA,MACF;AAAA,IACF;AACA,WAAO,oBAAoB,aAAa,SAAS;AACjD,QAAI,KAAK,MAAM,MAAM,iBAAiB,GAAG;AACvC,WAAK,SAAS,EAAE,SAAS,qBAAqB,GAAG,IAAI,EAAE,CAAC;AAAA,IAC1D;AAAA,EACF;AACA,SAAO,iBAAiB,aAAa,SAAS;AAChD;AAEA,SAAS,sBACP,MACA,QACA,aACA;AACA,WAAS,UAAU;AACjB,UAAM,OAAO,KAAK;AAAA,MAChB,OAAO,sBAAsB,EAAE,MAAM,IAAI,KAAK;AAAA,IAChD;AACA,UAAM,UAAU,KAAK,YAAY,KAAK,IAAI;AAC1C,QAAI,SAAS;AACX,WAAK,SAAS;AAAA,QACZ,SAAS,qBAAqB,GAAG;AAAA,UAC/B,KAAK,KAAK;AAAA,UACV,OAAO;AAAA,UACP,SAAS;AACP,mBAAO;AAAA,cACL,KAAK,mBAAmB,MAAM,WAAW;AAAA,cACzC,WAAW,MAAM,OAAO,sBAAsB;AAAA,YAChD;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AACA,WAAO,aAAa,OAAO,cAAc;AACzC,iBAAa,MAAM,MAAM;AAAA,EAC3B;AAEA,QAAM,EAAE,UAAU,IAAI,KAAK,MAAM,MAAM,gBAAgB;AAEvD,MAAI,eAAe,WAAW,SAAS,SAAS;AAChD,SAAO,aAAa,MAAM;AACxB,iBAAa,YAAY;AACzB,WAAO,aAAa,OAAO,cAAc;AAAA,EAC3C;AACA,SAAO,cAAc,MAAM;AACzB,iBAAa,YAAY;AACzB,mBAAe,WAAW,SAAS,SAAS;AAAA,EAC9C;AACF;AAEA,SAAS,sBAAsB,KAAW,aAAoC;AAC5E,QAAM,SAA2C,uBAAO,OAAO,IAAI;AACnE,aAAW,cAAc,aAAa;AACpC,UAAM,OAAO,IAAI,OAAO,WAAW,IAAI;AACvC,KAAC,OAAO,KAAK,IAAI,MAAM,OAAO,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;AAAA,EACjE;AACA,QAAM,UAAiC,CAAC;AACxC,aAAW,QAAQ,QAAQ;AACzB,YAAQ,KAAK,IAAI,iBAAiB,OAAO,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC;AAAA,EAC9D;AACA,SAAO,SAAS,GAAG,SAAS,IAAI;AAClC;AAEA,IAAM,sBAAsB,OAAO;AAAA,EACjC,OAAO;AAAA,EACP,SAAS,UAAQ,KAAK,MAAM,MAAM,iBAAiB;AACrD,CAAC;AAED,IAAM,oBAAoB,WAAW,OAA+B;AAAA,EAClE,SAAS;AACP,WAAO,SAAS;AAAA,EAClB;AAAA,EACA,OAAO,SAAS,IAAI;AAClB,cAAU,QAAQ,IAAI,GAAG,OAAO;AAChC,UAAM,mBAAmB,GAAG,MAAM,MAAM,gBAAgB,EAAE;AAC1D,eAAW,UAAU,GAAG,SAAS;AAC/B,UAAI,OAAO,GAAG,oBAAoB,GAAG;AACnC,YAAI,cAAc,OAAO;AACzB,YAAI,kBAAkB;AACpB,wBAAc,iBAAiB,eAAe,CAAC,GAAG,GAAG,KAAK;AAAA,QAC5D;AACA,kBAAU,sBAAsB,GAAG,MAAM,KAAK,YAAY,MAAM,CAAC,CAAC;AAAA,MACpE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF,CAAC;AAED,IAAM,uBAAuB,YAAY,OAAuB;AAEhE,IAAM,oBAAoB,WAAW,OAAuB;AAAA,EAC1D,SAAS;AACP,WAAO;AAAA,EACT;AAAA,EACA,OAAO,SAAS,IAAI;AAClB,QAAI,WAAW,GAAG,YAAY;AAC5B,gBAAU,YAAY,IAAI,OAAO,IAC7B,OACA,EAAE,GAAG,SAAS,KAAK,GAAG,QAAQ,OAAO,QAAQ,GAAG,EAAE;AAAA,IACxD;AACA,WAAO,GAAG,QAAQ;AAAA,MAChB,CAAC,GAAG,MAAO,EAAE,GAAG,oBAAoB,IAAI,EAAE,QAAQ;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAS,WAAS,YAAY,KAAK,KAAK;AAC1C,CAAC;AAED,IAAM,kBAAkB,WAAW,UAAU;AAAA,EAC3C,mBAAmB;AAAA,IACjB,OAAO;AAAA,IACP,uBAAuB;AAAA,MACrB,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,mBAAmB;AAAA,IACjB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,wBAAwB;AAAA,IACtB,SAAS;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA,EACA,2BAA2B;AAAA,IACzB,SAAS;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA,EACA,yBAAyB;AAAA,IACvB,SAAS;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA,WAAW,YAAY,QAAQ,CAAC,SAAS,GAAG,WAAS;AACnD,UAAM,EAAE,UAAU,MAAM,IAAI,MAAM,MAAM,SAAS;AACjD,WAAO,CAAC,YAAY,CAAC,SAAS,SAAS,QAAQ,SAAS,KACpDC,YAAW,OACXA,YAAW,IAAI,CAAC,WAAW,MAAM,SAAS,MAAM,SAAS,EAAE,CAAC,CAAC;AAAA,EACnE,CAAC;AAAA,EACD,aAAa,aAAa,EAAE,QAAQ,YAAY,CAAC;AAAA,EACjD;AACF;AAEA,IAAM,mBAAmB,MAAM,OAG7B;AAAA,EACA,QAAQ,SAAS;AACf,WAAO,cAAc,SAAS;AAAA,MAC5B,WAAW;AAAA,MACX,cAAc;AAAA,MACd,eAAe;AAAA,IACjB,CAAC;AAAA,EACH;AACF,CAAC;AAKM,SAAS,WAAW,SAA2B,CAAC,GAAc;AACnE,SAAO;AAAA,IACL,iBAAiB,GAAG,MAAM;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAOO,SAAS,kBACd,OACA,GACA;AACA,QAAM,SAAS,MAAM,MAAM,WAAW,KAAK;AAC3C,MAAI,UAAU,OAAO,YAAY,MAAM;AACrC,aACM,OAAO,SAAS,KAAK,CAAC,OAAO,WAAW,CAAC,GAC7C,KAAK,OACL,KAAK,KAAK,GACV;AACA,QAAE,KAAK,MAAM,KAAK,YAAY,KAAK,MAAM,KAAK,EAAE;AAAA,IAClD;AAAA,EACF;AACF;","names":["Decoration","Decoration","elt","Decoration"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/merge-decorations.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\n// Credits to @codemirror/lint\n// copy from @codemirror/lint, 修改了 lintState 中 provide decorations 的绘制逻辑\nimport elt from 'crelt';\nimport {\n EditorView,\n ViewPlugin,\n Decoration,\n type DecorationSet,\n WidgetType,\n type ViewUpdate,\n type Command,\n logException,\n type KeyBinding,\n hoverTooltip,\n type Tooltip,\n showTooltip,\n gutter,\n GutterMarker,\n type PanelConstructor,\n type Panel,\n showPanel,\n getPanel,\n} from '@codemirror/view';\nimport {\n type Text,\n StateEffect,\n StateField,\n type Extension,\n type TransactionSpec,\n type Transaction,\n type EditorState,\n Facet,\n combineConfig,\n RangeSet,\n type Range,\n} from '@codemirror/state';\n\nimport { mergeDecorations } from './merge-decorations';\n\nexport type Severity = 'hint' | 'info' | 'warning' | 'error';\n\n/// Describes a problem or hint for a piece of code.\nexport interface Diagnostic {\n /// The start position of the relevant text.\n from: number;\n /// The end position. May be equal to `from`, though actually\n /// covering text is preferable.\n to: number;\n /// The severity of the problem. This will influence how it is\n /// displayed.\n severity: Severity;\n /// When given, add an extra CSS class to parts of the code that\n /// this diagnostic applies to.\n markClass?: string;\n /// An optional source string indicating where the diagnostic is\n /// coming from. You can put the name of your linter here, if\n /// applicable.\n source?: string;\n /// The message associated with this diagnostic.\n message: string;\n /// An optional custom rendering function that displays the message\n /// as a DOM node.\n renderMessage?: (view: EditorView) => Node;\n /// An optional array of actions that can be taken on this\n /// diagnostic.\n actions?: readonly Action[];\n}\n\n/// An action associated with a diagnostic.\nexport interface Action {\n /// The label to show to the user. Should be relatively short.\n name: string;\n /// The function to call when the user activates this action. Is\n /// given the diagnostic's _current_ position, which may have\n /// changed since the creation of the diagnostic, due to editing.\n apply: (view: EditorView, from: number, to: number) => void;\n}\n\ntype DiagnosticFilter = (\n diagnostics: readonly Diagnostic[],\n state: EditorState,\n) => Diagnostic[];\n\ninterface LintConfig {\n /// Time to wait (in milliseconds) after a change before running\n /// the linter. Defaults to 750ms.\n delay?: number;\n /// Optional predicate that can be used to indicate when diagnostics\n /// need to be recomputed. Linting is always re-done on document\n /// changes.\n needsRefresh?: null | ((update: ViewUpdate) => boolean);\n /// Optional filter to determine which diagnostics produce markers\n /// in the content.\n markerFilter?: null | DiagnosticFilter;\n /// Filter applied to a set of diagnostics shown in a tooltip. No\n /// tooltip will appear if the empty set is returned.\n tooltipFilter?: null | DiagnosticFilter;\n /// Can be used to control what kind of transactions cause lint\n /// hover tooltips associated with the given document range to be\n /// hidden. By default any transactions that changes the line\n /// around the range will hide it. Returning null falls back to this\n /// behavior.\n hideOn?: (tr: Transaction, from: number, to: number) => boolean | null;\n /// When enabled (defaults to off), this will cause the lint panel\n /// to automatically open when diagnostics are found, and close when\n /// all diagnostics are resolved or removed.\n autoPanel?: boolean;\n}\n\ninterface LintGutterConfig {\n /// The delay before showing a tooltip when hovering over a lint gutter marker.\n hoverTime?: number;\n /// Optional filter determining which diagnostics show a marker in\n /// the gutter.\n markerFilter?: null | DiagnosticFilter;\n /// Optional filter for diagnostics displayed in a tooltip, which\n /// can also be used to prevent a tooltip appearing.\n tooltipFilter?: null | DiagnosticFilter;\n}\n\nclass SelectedDiagnostic {\n constructor(\n readonly from: number,\n readonly to: number,\n readonly diagnostic: Diagnostic,\n ) {}\n}\n\nclass LintState {\n constructor(\n readonly diagnostics: DecorationSet,\n readonly panel: PanelConstructor | null,\n readonly selected: SelectedDiagnostic | null,\n ) {}\n\n static init(\n diagnostics: readonly Diagnostic[],\n panel: PanelConstructor | null,\n state: EditorState,\n ) {\n // Filter the list of diagnostics for which to create markers\n let markedDiagnostics = diagnostics;\n const diagnosticFilter = state.facet(lintConfig).markerFilter;\n if (diagnosticFilter) {\n markedDiagnostics = diagnosticFilter(markedDiagnostics, state);\n }\n\n const ranges = Decoration.set(\n markedDiagnostics.map((d: Diagnostic) => {\n // For zero-length ranges or ranges covering only a line break, create a widget\n if (\n d.from == d.to ||\n (d.from == d.to - 1 && state.doc.lineAt(d.from).to == d.from)\n ) {\n return Decoration.widget({\n widget: new DiagnosticWidget(d),\n diagnostic: d,\n }).range(d.from);\n }\n\n return Decoration.mark({\n attributes: {\n class: `cm-lintRange cm-lintRange-${\n d.severity\n }${d.markClass ? ` ${d.markClass}` : ''}`,\n },\n diagnostic: d,\n }).range(d.from, d.to);\n }),\n true,\n );\n\n return new LintState(ranges, panel, findDiagnostic(ranges));\n }\n}\n\nfunction findDiagnostic(\n diagnostics: DecorationSet,\n diagnostic: Diagnostic | null = null,\n after = 0,\n): SelectedDiagnostic | null {\n let found: SelectedDiagnostic | null = null;\n diagnostics.between(after, 1e9, (from, to, { spec }) => {\n if (diagnostic && spec.diagnostic != diagnostic) {\n return;\n }\n found = new SelectedDiagnostic(from, to, spec.diagnostic);\n return false;\n });\n return found;\n}\n\nfunction hideTooltip(tr: Transaction, tooltip: Tooltip) {\n const from = tooltip.pos,\n to = tooltip.end || from;\n const result = tr.state.facet(lintConfig).hideOn(tr, from, to);\n if (result != null) {\n return result;\n }\n const line = tr.startState.doc.lineAt(tooltip.pos);\n return !!(\n tr.effects.some(e => e.is(setDiagnosticsEffect)) ||\n tr.changes.touchesRange(line.from, Math.max(line.to, to))\n );\n}\n\nfunction maybeEnableLint(\n state: EditorState,\n effects: readonly StateEffect<unknown>[],\n) {\n return state.field(lintState, false)\n ? effects\n : effects.concat(StateEffect.appendConfig.of(lintExtensions));\n}\n\n/// Returns a transaction spec which updates the current set of\n/// diagnostics, and enables the lint extension if if wasn't already\n/// active.\nexport function setDiagnostics(\n state: EditorState,\n diagnostics: readonly Diagnostic[],\n): TransactionSpec {\n return {\n effects: maybeEnableLint(state, [setDiagnosticsEffect.of(diagnostics)]),\n };\n}\n\n/// The state effect that updates the set of active diagnostics. Can\n/// be useful when writing an extension that needs to track these.\nexport const setDiagnosticsEffect = StateEffect.define<readonly Diagnostic[]>();\n\nconst togglePanel = StateEffect.define<boolean>();\n\nconst movePanelSelection = StateEffect.define<SelectedDiagnostic>();\n\nconst lintState = StateField.define<LintState>({\n create() {\n return new LintState(Decoration.none, null, null);\n },\n update(value, tr) {\n if (tr.docChanged && value.diagnostics.size) {\n const mapped = value.diagnostics.map(tr.changes);\n let selected: SelectedDiagnostic | null = null,\n { panel } = value;\n if (value.selected) {\n const selPos = tr.changes.mapPos(value.selected.from, 1);\n selected =\n findDiagnostic(mapped, value.selected.diagnostic, selPos) ||\n findDiagnostic(mapped, null, selPos);\n }\n if (!mapped.size && panel && tr.state.facet(lintConfig).autoPanel) {\n panel = null;\n }\n value = new LintState(mapped, panel, selected);\n }\n\n for (const effect of tr.effects) {\n if (effect.is(setDiagnosticsEffect)) {\n const panel = !tr.state.facet(lintConfig).autoPanel\n ? value.panel\n : effect.value.length\n ? LintPanel.open\n : null;\n value = LintState.init(effect.value, panel, tr.state);\n } else if (effect.is(togglePanel)) {\n value = new LintState(\n value.diagnostics,\n effect.value ? LintPanel.open : null,\n value.selected,\n );\n } else if (effect.is(movePanelSelection)) {\n value = new LintState(value.diagnostics, value.panel, effect.value);\n }\n }\n\n return value;\n },\n provide: f => [\n showPanel.from(f, val => val.panel),\n // mergeDecorations 中合并了相同 severity 的 diagnostic 在编辑器中的下划线样式,以前会重复绘制下划线,现在只会绘制一次。\n EditorView.decorations.from(f, s => mergeDecorations(s.diagnostics)),\n ],\n});\n\n/// Returns the number of active lint diagnostics in the given state.\nexport function diagnosticCount(state: EditorState) {\n const lint = state.field(lintState, false);\n return lint ? lint.diagnostics.size : 0;\n}\n\nconst activeMark = Decoration.mark({\n class: 'cm-lintRange cm-lintRange-active',\n});\n\nfunction lintTooltip(view: EditorView, pos: number, side: -1 | 1) {\n const { diagnostics } = view.state.field(lintState);\n let found: Diagnostic[] = [],\n stackStart = 2e8,\n stackEnd = 0;\n diagnostics.between(\n pos - (side < 0 ? 1 : 0),\n pos + (side > 0 ? 1 : 0),\n (from, to, { spec }) => {\n if (\n pos >= from &&\n pos <= to &&\n (from == to || ((pos > from || side > 0) && (pos < to || side < 0)))\n ) {\n found.push(spec.diagnostic);\n stackStart = Math.min(from, stackStart);\n stackEnd = Math.max(to, stackEnd);\n }\n },\n );\n\n const diagnosticFilter = view.state.facet(lintConfig).tooltipFilter;\n if (diagnosticFilter) {\n found = diagnosticFilter(found, view.state);\n }\n\n if (!found.length) {\n return null;\n }\n\n return {\n pos: stackStart,\n end: stackEnd,\n above: view.state.doc.lineAt(stackStart).to < stackEnd,\n create() {\n return { dom: diagnosticsTooltip(view, found) };\n },\n };\n}\n\nfunction diagnosticsTooltip(\n view: EditorView,\n diagnostics: readonly Diagnostic[],\n) {\n return elt(\n 'ul',\n { class: 'cm-tooltip-lint' },\n diagnostics.map(d => renderDiagnostic(view, d, false)),\n );\n}\n\n/// Command to open and focus the lint panel.\nexport const openLintPanel: Command = (view: EditorView) => {\n const field = view.state.field(lintState, false);\n if (!field || !field.panel) {\n view.dispatch({\n effects: maybeEnableLint(view.state, [togglePanel.of(true)]),\n });\n }\n const panel = getPanel(view, LintPanel.open);\n if (panel) {\n (panel.dom.querySelector('.cm-panel-lint ul') as HTMLElement).focus();\n }\n return true;\n};\n\n/// Command to close the lint panel, when open.\nexport const closeLintPanel: Command = (view: EditorView) => {\n const field = view.state.field(lintState, false);\n if (!field || !field.panel) {\n return false;\n }\n view.dispatch({ effects: togglePanel.of(false) });\n return true;\n};\n\n/// Move the selection to the next diagnostic.\nexport const nextDiagnostic: Command = (view: EditorView) => {\n const field = view.state.field(lintState, false);\n if (!field) {\n return false;\n }\n const sel = view.state.selection.main;\n let next = field.diagnostics.iter(sel.to + 1);\n if (!next.value) {\n next = field.diagnostics.iter(0);\n if (!next.value || (next.from == sel.from && next.to == sel.to)) {\n return false;\n }\n }\n view.dispatch({\n selection: { anchor: next.from, head: next.to },\n scrollIntoView: true,\n });\n return true;\n};\n\n/// Move the selection to the previous diagnostic.\nexport const previousDiagnostic: Command = (view: EditorView) => {\n const { state } = view,\n field = state.field(lintState, false);\n if (!field) {\n return false;\n }\n const sel = state.selection.main;\n let prevFrom: number | undefined,\n prevTo: number | undefined,\n lastFrom: number | undefined,\n lastTo: number | undefined;\n field.diagnostics.between(0, state.doc.length, (from, to) => {\n if (to < sel.to && (prevFrom == null || prevFrom < from)) {\n prevFrom = from;\n prevTo = to;\n }\n if (lastFrom == null || from > lastFrom) {\n lastFrom = from;\n lastTo = to;\n }\n });\n if (lastFrom == null || (prevFrom == null && lastFrom == sel.from)) {\n return false;\n }\n view.dispatch({\n selection: { anchor: prevFrom ?? lastFrom, head: prevTo ?? lastTo },\n scrollIntoView: true,\n });\n return true;\n};\n\n/// A set of default key bindings for the lint functionality.\n///\n/// - Ctrl-Shift-m (Cmd-Shift-m on macOS): [`openLintPanel`](#lint.openLintPanel)\n/// - F8: [`nextDiagnostic`](#lint.nextDiagnostic)\nexport const lintKeymap: readonly KeyBinding[] = [\n { key: 'Mod-Shift-m', run: openLintPanel, preventDefault: true },\n { key: 'F8', run: nextDiagnostic },\n];\n\n/// The type of a function that produces diagnostics.\nexport type LintSource = (\n view: EditorView,\n) => readonly Diagnostic[] | Promise<readonly Diagnostic[]>;\n\nconst lintPlugin = ViewPlugin.fromClass(\n class {\n lintTime: number;\n timeout = -1;\n set = true;\n\n constructor(readonly view: EditorView) {\n const { delay } = view.state.facet(lintConfig);\n this.lintTime = Date.now() + delay;\n this.run = this.run.bind(this);\n this.timeout = window.setTimeout(this.run, delay);\n }\n\n run() {\n clearTimeout(this.timeout);\n const now = Date.now();\n if (now < this.lintTime - 10) {\n this.timeout = window.setTimeout(this.run, this.lintTime - now);\n } else {\n this.set = false;\n const { state } = this.view,\n { sources } = state.facet(lintConfig);\n if (sources.length) {\n Promise.all(\n sources.map(source => Promise.resolve(source(this.view))),\n ).then(\n annotations => {\n const all = annotations.reduce((a, b) => a.concat(b));\n if (this.view.state.doc == state.doc) {\n this.view.dispatch(setDiagnostics(this.view.state, all));\n }\n },\n error => {\n logException(this.view.state, error);\n },\n );\n }\n }\n }\n\n update(update: ViewUpdate) {\n const config = update.state.facet(lintConfig);\n if (\n update.docChanged ||\n config != update.startState.facet(lintConfig) ||\n (config.needsRefresh && config.needsRefresh(update))\n ) {\n this.lintTime = Date.now() + config.delay;\n if (!this.set) {\n this.set = true;\n this.timeout = window.setTimeout(this.run, config.delay);\n }\n }\n }\n\n force() {\n if (this.set) {\n this.lintTime = Date.now();\n this.run();\n }\n }\n\n destroy() {\n clearTimeout(this.timeout);\n }\n },\n);\n\nconst lintConfig = Facet.define<\n { source: LintSource | null; config: LintConfig },\n Required<LintConfig> & { sources: readonly LintSource[] }\n>({\n combine(input) {\n return {\n sources: input\n .map(i => i.source)\n .filter(x => x != null) as readonly LintSource[],\n ...combineConfig(\n input.map(i => i.config),\n {\n delay: 750,\n markerFilter: null,\n tooltipFilter: null,\n needsRefresh: null,\n hideOn: () => null,\n },\n {\n needsRefresh: (a, b) => (!a ? b : !b ? a : u => a(u) || b(u)),\n },\n ),\n };\n },\n});\n\n/// Given a diagnostic source, this function returns an extension that\n/// enables linting with that source. It will be called whenever the\n/// editor is idle (after its content changed). If `null` is given as\n/// source, this only configures the lint extension.\nexport function linter(\n source: LintSource | null,\n config: LintConfig = {},\n): Extension {\n return [lintConfig.of({ source, config }), lintPlugin, lintExtensions];\n}\n\n/// Forces any linters [configured](#lint.linter) to run when the\n/// editor is idle to run right away.\nexport function forceLinting(view: EditorView) {\n const plugin = view.plugin(lintPlugin);\n if (plugin) {\n plugin.force();\n }\n}\n\nfunction assignKeys(actions: readonly Action[] | undefined) {\n const assigned: string[] = [];\n if (actions) {\n actions: for (const { name } of actions) {\n for (let i = 0; i < name.length; i++) {\n const ch = name[i];\n if (\n /[a-zA-Z]/.test(ch) &&\n !assigned.some(c => c.toLowerCase() == ch.toLowerCase())\n ) {\n assigned.push(ch);\n continue actions;\n }\n }\n assigned.push('');\n }\n }\n return assigned;\n}\n\nfunction renderDiagnostic(\n view: EditorView,\n diagnostic: Diagnostic,\n inPanel: boolean,\n) {\n const keys = inPanel ? assignKeys(diagnostic.actions) : [];\n return elt(\n 'li',\n { class: `cm-diagnostic cm-diagnostic-${diagnostic.severity}` },\n elt(\n 'span',\n { class: 'cm-diagnosticText' },\n diagnostic.renderMessage\n ? diagnostic.renderMessage(view)\n : diagnostic.message,\n ),\n diagnostic.actions?.map((action, i) => {\n let fired = false;\n const click = (e: Event) => {\n e.preventDefault();\n if (fired) {\n return;\n }\n fired = true;\n const found = findDiagnostic(\n view.state.field(lintState).diagnostics,\n diagnostic,\n );\n if (found) {\n action.apply(view, found.from, found.to);\n }\n };\n const { name } = action,\n keyIndex = keys[i] ? name.indexOf(keys[i]) : -1;\n const nameElt =\n keyIndex < 0\n ? name\n : [\n name.slice(0, keyIndex),\n elt('u', name.slice(keyIndex, keyIndex + 1)),\n name.slice(keyIndex + 1),\n ];\n return elt(\n 'button',\n {\n type: 'button',\n class: 'cm-diagnosticAction',\n onclick: click,\n onmousedown: click,\n 'aria-label': ` Action: ${name}${keyIndex < 0 ? '' : ` (access key \"${keys[i]})\"`}.`,\n },\n nameElt,\n );\n }),\n diagnostic.source &&\n elt('div', { class: 'cm-diagnosticSource' }, diagnostic.source),\n );\n}\n\nclass DiagnosticWidget extends WidgetType {\n constructor(readonly diagnostic: Diagnostic) {\n super();\n }\n\n eq(other: DiagnosticWidget) {\n return other.diagnostic == this.diagnostic;\n }\n\n toDOM() {\n return elt('span', {\n class: `cm-lintPoint cm-lintPoint-${this.diagnostic.severity}`,\n });\n }\n}\n\nclass PanelItem {\n id = `item_${Math.floor(Math.random() * 0xffffffff).toString(16)}`;\n dom: HTMLElement;\n\n constructor(\n view: EditorView,\n readonly diagnostic: Diagnostic,\n ) {\n this.dom = renderDiagnostic(view, diagnostic, true);\n this.dom.id = this.id;\n this.dom.setAttribute('role', 'option');\n }\n}\n\nclass LintPanel implements Panel {\n items: PanelItem[] = [];\n dom: HTMLElement;\n list: HTMLElement;\n\n constructor(readonly view: EditorView) {\n const onkeydown = (event: KeyboardEvent) => {\n if (event.keyCode == 27) {\n // Escape\n closeLintPanel(this.view);\n this.view.focus();\n } else if (event.keyCode == 38 || event.keyCode == 33) {\n // ArrowUp, PageUp\n this.moveSelection(\n (this.selectedIndex - 1 + this.items.length) % this.items.length,\n );\n } else if (event.keyCode == 40 || event.keyCode == 34) {\n // ArrowDown, PageDown\n this.moveSelection((this.selectedIndex + 1) % this.items.length);\n } else if (event.keyCode == 36) {\n // Home\n this.moveSelection(0);\n } else if (event.keyCode == 35) {\n // End\n this.moveSelection(this.items.length - 1);\n } else if (event.keyCode == 13) {\n // Enter\n this.view.focus();\n } else if (\n event.keyCode >= 65 &&\n event.keyCode <= 90 &&\n this.selectedIndex >= 0\n ) {\n // A-Z\n const { diagnostic } = this.items[this.selectedIndex],\n keys = assignKeys(diagnostic.actions);\n for (let i = 0; i < keys.length; i++) {\n if (keys[i].toUpperCase().charCodeAt(0) == event.keyCode) {\n const found = findDiagnostic(\n this.view.state.field(lintState).diagnostics,\n diagnostic,\n );\n if (found) {\n diagnostic.actions![i].apply(view, found.from, found.to);\n }\n }\n }\n } else {\n return;\n }\n event.preventDefault();\n };\n const onclick = (event: MouseEvent) => {\n for (let i = 0; i < this.items.length; i++) {\n if (this.items[i].dom.contains(event.target as HTMLElement)) {\n this.moveSelection(i);\n }\n }\n };\n\n this.list = elt('ul', {\n tabIndex: 0,\n role: 'listbox',\n 'aria-label': this.view.state.phrase('Diagnostics'),\n onkeydown,\n onclick,\n });\n this.dom = elt(\n 'div',\n { class: 'cm-panel-lint' },\n this.list,\n elt(\n 'button',\n {\n type: 'button',\n name: 'close',\n 'aria-label': this.view.state.phrase('close'),\n onclick: () => closeLintPanel(this.view),\n },\n '×',\n ),\n );\n this.update();\n }\n\n get selectedIndex() {\n const { selected } = this.view.state.field(lintState);\n if (!selected) {\n return -1;\n }\n for (let i = 0; i < this.items.length; i++) {\n if (this.items[i].diagnostic == selected.diagnostic) {\n return i;\n }\n }\n return -1;\n }\n\n update() {\n const { diagnostics, selected } = this.view.state.field(lintState);\n let i = 0,\n needsSync = false,\n newSelectedItem: PanelItem | null = null;\n diagnostics.between(\n 0,\n this.view.state.doc.length,\n (_start, _end, { spec }) => {\n let found = -1,\n item;\n for (let j = i; j < this.items.length; j++) {\n if (this.items[j].diagnostic == spec.diagnostic) {\n found = j;\n break;\n }\n }\n if (found < 0) {\n item = new PanelItem(this.view, spec.diagnostic);\n this.items.splice(i, 0, item);\n needsSync = true;\n } else {\n item = this.items[found];\n if (found > i) {\n this.items.splice(i, found - i);\n needsSync = true;\n }\n }\n if (selected && item.diagnostic == selected.diagnostic) {\n if (!item.dom.hasAttribute('aria-selected')) {\n item.dom.setAttribute('aria-selected', 'true');\n newSelectedItem = item;\n }\n } else if (item.dom.hasAttribute('aria-selected')) {\n item.dom.removeAttribute('aria-selected');\n }\n i++;\n },\n );\n while (\n i < this.items.length &&\n !(this.items.length == 1 && this.items[0].diagnostic.from < 0)\n ) {\n needsSync = true;\n this.items.pop();\n }\n if (this.items.length == 0) {\n this.items.push(\n new PanelItem(this.view, {\n from: -1,\n to: -1,\n severity: 'info',\n message: this.view.state.phrase('No diagnostics'),\n }),\n );\n needsSync = true;\n }\n if (newSelectedItem) {\n this.list.setAttribute('aria-activedescendant', newSelectedItem!.id);\n this.view.requestMeasure({\n key: this,\n read: () => ({\n sel: newSelectedItem!.dom.getBoundingClientRect(),\n panel: this.list.getBoundingClientRect(),\n }),\n write: ({ sel, panel }) => {\n const scaleY = panel.height / this.list.offsetHeight;\n if (sel.top < panel.top) {\n this.list.scrollTop -= (panel.top - sel.top) / scaleY;\n } else if (sel.bottom > panel.bottom) {\n this.list.scrollTop += (sel.bottom - panel.bottom) / scaleY;\n }\n },\n });\n } else if (this.selectedIndex < 0) {\n this.list.removeAttribute('aria-activedescendant');\n }\n if (needsSync) {\n this.sync();\n }\n }\n\n sync() {\n let domPos: ChildNode | null = this.list.firstChild;\n function rm() {\n const prev = domPos!;\n domPos = prev.nextSibling;\n prev.remove();\n }\n\n for (const item of this.items) {\n if (item.dom.parentNode == this.list) {\n while (domPos != item.dom) {\n rm();\n }\n domPos = item.dom.nextSibling;\n } else {\n this.list.insertBefore(item.dom, domPos);\n }\n }\n while (domPos) {\n rm();\n }\n }\n\n moveSelection(selectedIndex: number) {\n if (this.selectedIndex < 0) {\n return;\n }\n const field = this.view.state.field(lintState);\n const selection = findDiagnostic(\n field.diagnostics,\n this.items[selectedIndex].diagnostic,\n );\n if (!selection) {\n return;\n }\n this.view.dispatch({\n selection: { anchor: selection.from, head: selection.to },\n scrollIntoView: true,\n effects: movePanelSelection.of(selection),\n });\n }\n\n static open(view: EditorView) {\n return new LintPanel(view);\n }\n}\n\nfunction svg(content: string, attrs = 'viewBox=\"0 0 40 40\"') {\n return `url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" ${attrs}>${encodeURIComponent(content)}</svg>')`;\n}\n\nfunction underline(color: string) {\n return svg(\n `<path d=\"m0 2.5 l2 -1.5 l1 0 l2 1.5 l1 0\" stroke=\"${color}\" fill=\"none\" stroke-width=\".7\"/>`,\n 'width=\"6\" height=\"3\"',\n );\n}\n\nconst baseTheme = EditorView.baseTheme({\n '.cm-diagnostic': {\n padding: '3px 6px 3px 8px',\n marginLeft: '-1px',\n display: 'block',\n whiteSpace: 'pre-wrap',\n },\n '.cm-diagnostic-error': { borderLeft: '5px solid #d11' },\n '.cm-diagnostic-warning': { borderLeft: '5px solid orange' },\n '.cm-diagnostic-info': { borderLeft: '5px solid #999' },\n '.cm-diagnostic-hint': { borderLeft: '5px solid #66d' },\n\n '.cm-diagnosticAction': {\n font: 'inherit',\n border: 'none',\n padding: '2px 4px',\n backgroundColor: '#444',\n color: 'white',\n borderRadius: '3px',\n marginLeft: '8px',\n cursor: 'pointer',\n },\n\n '.cm-diagnosticSource': {\n fontSize: '70%',\n opacity: 0.7,\n },\n\n '.cm-lintRange': {\n backgroundPosition: 'left bottom',\n backgroundRepeat: 'repeat-x',\n paddingBottom: '0.7px',\n },\n\n '.cm-lintRange-error': { backgroundImage: underline('#d11') },\n '.cm-lintRange-warning': { backgroundImage: underline('orange') },\n '.cm-lintRange-info': { backgroundImage: underline('#999') },\n '.cm-lintRange-hint': { backgroundImage: underline('#66d') },\n '.cm-lintRange-active': { backgroundColor: '#ffdd9980' },\n\n '.cm-tooltip-lint': {\n padding: 0,\n margin: 0,\n },\n\n '.cm-lintPoint': {\n position: 'relative',\n\n '&:after': {\n content: '\"\"',\n position: 'absolute',\n bottom: 0,\n left: '-2px',\n borderLeft: '3px solid transparent',\n borderRight: '3px solid transparent',\n borderBottom: '4px solid #d11',\n },\n },\n\n '.cm-lintPoint-warning': {\n '&:after': { borderBottomColor: 'orange' },\n },\n '.cm-lintPoint-info': {\n '&:after': { borderBottomColor: '#999' },\n },\n '.cm-lintPoint-hint': {\n '&:after': { borderBottomColor: '#66d' },\n },\n\n '.cm-panel.cm-panel-lint': {\n position: 'relative',\n '& ul': {\n maxHeight: '100px',\n overflowY: 'auto',\n '& [aria-selected]': {\n backgroundColor: '#ddd',\n '& u': { textDecoration: 'underline' },\n },\n '&:focus [aria-selected]': {\n background_fallback: '#bdf',\n backgroundColor: 'Highlight',\n color_fallback: 'white',\n color: 'HighlightText',\n },\n '& u': { textDecoration: 'none' },\n padding: 0,\n margin: 0,\n },\n '& [name=close]': {\n position: 'absolute',\n top: '0',\n right: '2px',\n background: 'inherit',\n border: 'none',\n font: 'inherit',\n padding: 0,\n margin: 0,\n },\n },\n});\n\nfunction severityWeight(sev: Severity) {\n return sev == 'error' ? 4 : sev == 'warning' ? 3 : sev == 'info' ? 2 : 1;\n}\n\nclass LintGutterMarker extends GutterMarker {\n severity: Severity;\n constructor(readonly diagnostics: readonly Diagnostic[]) {\n super();\n this.severity = diagnostics.reduce(\n (max, d) =>\n severityWeight(max) < severityWeight(d.severity) ? d.severity : max,\n 'hint' as Severity,\n );\n }\n\n toDOM(view: EditorView) {\n const elt = document.createElement('div');\n elt.className = `cm-lint-marker cm-lint-marker-${this.severity}`;\n\n let { diagnostics } = this;\n const diagnosticsFilter = view.state.facet(lintGutterConfig).tooltipFilter;\n if (diagnosticsFilter) {\n diagnostics = diagnosticsFilter(diagnostics, view.state);\n }\n\n if (diagnostics.length) {\n elt.onmouseover = () => gutterMarkerMouseOver(view, elt, diagnostics);\n }\n\n return elt;\n }\n}\n\nconst enum Hover {\n Time = 300,\n Margin = 10,\n}\n\nfunction trackHoverOn(view: EditorView, marker: HTMLElement) {\n const mousemove = (event: MouseEvent) => {\n const rect = marker.getBoundingClientRect();\n if (\n event.clientX > rect.left - Hover.Margin &&\n event.clientX < rect.right + Hover.Margin &&\n event.clientY > rect.top - Hover.Margin &&\n event.clientY < rect.bottom + Hover.Margin\n ) {\n return;\n }\n for (\n let target = event.target as Node | null;\n target;\n target = target.parentNode\n ) {\n if (\n target.nodeType == 1 &&\n (target as HTMLElement).classList.contains('cm-tooltip-lint')\n ) {\n return;\n }\n }\n window.removeEventListener('mousemove', mousemove);\n if (view.state.field(lintGutterTooltip)) {\n view.dispatch({ effects: setLintGutterTooltip.of(null) });\n }\n };\n window.addEventListener('mousemove', mousemove);\n}\n\nfunction gutterMarkerMouseOver(\n view: EditorView,\n marker: HTMLElement,\n diagnostics: readonly Diagnostic[],\n) {\n function hovered() {\n const line = view.elementAtHeight(\n marker.getBoundingClientRect().top + 5 - view.documentTop,\n );\n const linePos = view.coordsAtPos(line.from);\n if (linePos) {\n view.dispatch({\n effects: setLintGutterTooltip.of({\n pos: line.from,\n above: false,\n create() {\n return {\n dom: diagnosticsTooltip(view, diagnostics),\n getCoords: () => marker.getBoundingClientRect(),\n };\n },\n }),\n });\n }\n marker.onmouseout = marker.onmousemove = null;\n trackHoverOn(view, marker);\n }\n\n const { hoverTime } = view.state.facet(lintGutterConfig);\n\n let hoverTimeout = setTimeout(hovered, hoverTime);\n marker.onmouseout = () => {\n clearTimeout(hoverTimeout);\n marker.onmouseout = marker.onmousemove = null;\n };\n marker.onmousemove = () => {\n clearTimeout(hoverTimeout);\n hoverTimeout = setTimeout(hovered, hoverTime);\n };\n}\n\nfunction markersForDiagnostics(doc: Text, diagnostics: readonly Diagnostic[]) {\n const byLine: { [line: number]: Diagnostic[] } = Object.create(null);\n for (const diagnostic of diagnostics) {\n const line = doc.lineAt(diagnostic.from);\n (byLine[line.from] || (byLine[line.from] = [])).push(diagnostic);\n }\n const markers: Range<GutterMarker>[] = [];\n for (const line in byLine) {\n markers.push(new LintGutterMarker(byLine[line]).range(+line));\n }\n return RangeSet.of(markers, true);\n}\n\nconst lintGutterExtension = gutter({\n class: 'cm-gutter-lint',\n markers: view => view.state.field(lintGutterMarkers),\n});\n\nconst lintGutterMarkers = StateField.define<RangeSet<GutterMarker>>({\n create() {\n return RangeSet.empty;\n },\n update(markers, tr) {\n markers = markers.map(tr.changes);\n const diagnosticFilter = tr.state.facet(lintGutterConfig).markerFilter;\n for (const effect of tr.effects) {\n if (effect.is(setDiagnosticsEffect)) {\n let diagnostics = effect.value;\n if (diagnosticFilter) {\n diagnostics = diagnosticFilter(diagnostics || [], tr.state);\n }\n markers = markersForDiagnostics(tr.state.doc, diagnostics.slice(0));\n }\n }\n return markers;\n },\n});\n\nconst setLintGutterTooltip = StateEffect.define<Tooltip | null>();\n\nconst lintGutterTooltip = StateField.define<Tooltip | null>({\n create() {\n return null;\n },\n update(tooltip, tr) {\n if (tooltip && tr.docChanged) {\n tooltip = hideTooltip(tr, tooltip)\n ? null\n : { ...tooltip, pos: tr.changes.mapPos(tooltip.pos) };\n }\n return tr.effects.reduce(\n (t, e) => (e.is(setLintGutterTooltip) ? e.value : t),\n tooltip,\n );\n },\n provide: field => showTooltip.from(field),\n});\n\nconst lintGutterTheme = EditorView.baseTheme({\n '.cm-gutter-lint': {\n width: '1.4em',\n '& .cm-gutterElement': {\n padding: '.2em',\n },\n },\n '.cm-lint-marker': {\n width: '1em',\n height: '1em',\n },\n '.cm-lint-marker-info': {\n content: svg(\n '<path fill=\"#aaf\" stroke=\"#77e\" stroke-width=\"6\" stroke-linejoin=\"round\" d=\"M5 5L35 5L35 35L5 35Z\"/>',\n ),\n },\n '.cm-lint-marker-warning': {\n content: svg(\n '<path fill=\"#fe8\" stroke=\"#fd7\" stroke-width=\"6\" stroke-linejoin=\"round\" d=\"M20 6L37 35L3 35Z\"/>',\n ),\n },\n '.cm-lint-marker-error': {\n content: svg(\n '<circle cx=\"20\" cy=\"20\" r=\"15\" fill=\"#f87\" stroke=\"#f43\" stroke-width=\"6\"/>',\n ),\n },\n});\n\nconst lintExtensions = [\n lintState,\n EditorView.decorations.compute([lintState], state => {\n const { selected, panel } = state.field(lintState);\n return !selected || !panel || selected.from == selected.to\n ? Decoration.none\n : Decoration.set([activeMark.range(selected.from, selected.to)]);\n }),\n hoverTooltip(lintTooltip, { hideOn: hideTooltip }),\n baseTheme,\n];\n\nconst lintGutterConfig = Facet.define<\n LintGutterConfig,\n Required<LintGutterConfig>\n>({\n combine(configs) {\n return combineConfig(configs, {\n hoverTime: Hover.Time,\n markerFilter: null,\n tooltipFilter: null,\n });\n },\n});\n\n/// Returns an extension that installs a gutter showing markers for\n/// each line that has diagnostics, which can be hovered over to see\n/// the diagnostics.\nexport function lintGutter(config: LintGutterConfig = {}): Extension {\n return [\n lintGutterConfig.of(config),\n lintGutterMarkers,\n lintGutterExtension,\n lintGutterTheme,\n lintGutterTooltip,\n ];\n}\n\n/// Iterate over the marked diagnostics for the given editor state,\n/// calling `f` for each of them. Note that, if the document changed\n/// since the diagnostics were created, the `Diagnostic` object will\n/// hold the original outdated position, whereas the `to` and `from`\n/// arguments hold the diagnostic's current position.\nexport function forEachDiagnostic(\n state: EditorState,\n f: (d: Diagnostic, from: number, to: number) => void,\n) {\n const lState = state.field(lintState, false);\n if (lState && lState.diagnostics.size) {\n for (\n let iter = RangeSet.iter([lState.diagnostics]);\n iter.value;\n iter.next()\n ) {\n f(iter.value.spec.diagnostic, iter.from, iter.to);\n }\n }\n}\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { Decoration, type DecorationSet } from '@codemirror/view';\nimport { type Range } from '@codemirror/state';\n\nimport { type Diagnostic, type Severity } from './index';\n\nconst splitDiagnosticBySeverity = (decorations: DecorationSet) => {\n const diagnosticMap = new Map<Severity, Diagnostic[]>();\n const decoration = decorations.iter();\n\n while (decoration.value) {\n const { severity } = decoration.value.spec.diagnostic;\n\n if (!diagnosticMap.has(severity)) {\n diagnosticMap.set(severity, []);\n }\n\n diagnosticMap.get(severity)!.push(decoration.value.spec.diagnostic);\n\n decoration.next();\n }\n\n return diagnosticMap;\n};\n\nconst createDecoration = (\n from: number,\n to: number,\n severity: Severity,\n diagnostics: Diagnostic[],\n) => {\n const last = diagnostics[diagnostics.length - 1];\n\n return Decoration.mark({\n attributes: {\n class: `cm-lintRange cm-lintRange-${\n severity\n }${last.markClass ? ` ${last.markClass}` : ''}`,\n },\n sourceDiagnostics: diagnostics,\n }).range(from, to);\n};\n\ninterface MergedDiagnostic extends Partial<Diagnostic> {\n sourceDiagnostics: Diagnostic[];\n}\n\nconst mergeDecoration = (diagnostics: Diagnostic[]): MergedDiagnostic[] => {\n const cloned = diagnostics.map(e => ({\n from: e.from,\n to: e.to,\n }));\n\n const merged: MergedDiagnostic[] = [];\n\n cloned.sort((a, b) => a.from - b.from);\n\n let current = cloned[0];\n let currentSourceDiagnostics: Diagnostic[] = [diagnostics[0]];\n\n for (let i = 1; i < cloned.length; i++) {\n const next = cloned[i];\n\n if (next.from <= current.to) {\n currentSourceDiagnostics.push(diagnostics[i]);\n current.to = Math.max(current.to, next.to);\n } else {\n merged.push({ ...current, sourceDiagnostics: currentSourceDiagnostics });\n current = next;\n currentSourceDiagnostics = [diagnostics[i]];\n }\n }\n\n merged.push({ ...current, sourceDiagnostics: currentSourceDiagnostics });\n\n return merged;\n};\n\nexport const mergeDecorations = (decorations: DecorationSet): DecorationSet => {\n try {\n const diagnosticMap = splitDiagnosticBySeverity(decorations);\n const merge: Range<Decoration>[] = [];\n\n diagnosticMap.forEach((value, key) => {\n mergeDecoration(value).forEach(diagnostic => {\n if (\n typeof diagnostic.from !== 'number' ||\n typeof diagnostic.to !== 'number'\n ) {\n return;\n }\n if (diagnostic.from < diagnostic.to) {\n merge.push(\n createDecoration(\n diagnostic.from,\n diagnostic.to,\n key,\n diagnostic.sourceDiagnostics,\n ),\n );\n }\n });\n });\n\n merge.sort((a, b) => {\n if (a.from !== b.from) {\n return a.from - b.from;\n }\n\n return a.value.startSide - b.value.startSide;\n });\n\n return Decoration.set(merge);\n } catch (e) {\n console.error('linter mergeDecorations error', e);\n return decorations;\n }\n};\n"],"mappings":"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","names":["Decoration","Decoration","elt","Decoration"]}
package/dist/index.js CHANGED
@@ -103,7 +103,7 @@ var mergeDecorations = (decorations) => {
103
103
  if (typeof diagnostic.from !== "number" || typeof diagnostic.to !== "number") {
104
104
  return;
105
105
  }
106
- if (diagnostic.from <= diagnostic.to) {
106
+ if (diagnostic.from < diagnostic.to) {
107
107
  merge.push(
108
108
  createDecoration(
109
109
  diagnostic.from,
@@ -123,7 +123,7 @@ var mergeDecorations = (decorations) => {
123
123
  });
124
124
  return import_view.Decoration.set(merge);
125
125
  } catch (e) {
126
- console.error("FlowLangSDK: linter mergeDecorations error", e);
126
+ console.error("linter mergeDecorations error", e);
127
127
  return decorations;
128
128
  }
129
129
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/merge-decorations.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\n// Credits to @codemirror/lint\n// copy from @codemirror/lint, 修改了 lintState 中 provide decorations 的绘制逻辑\nimport elt from 'crelt';\nimport {\n EditorView,\n ViewPlugin,\n Decoration,\n type DecorationSet,\n WidgetType,\n type ViewUpdate,\n type Command,\n logException,\n type KeyBinding,\n hoverTooltip,\n type Tooltip,\n showTooltip,\n gutter,\n GutterMarker,\n type PanelConstructor,\n type Panel,\n showPanel,\n getPanel,\n} from '@codemirror/view';\nimport {\n type Text,\n StateEffect,\n StateField,\n type Extension,\n type TransactionSpec,\n type Transaction,\n type EditorState,\n Facet,\n combineConfig,\n RangeSet,\n type Range,\n} from '@codemirror/state';\n\nimport { mergeDecorations } from './merge-decorations';\n\nexport type Severity = 'hint' | 'info' | 'warning' | 'error';\n\n/// Describes a problem or hint for a piece of code.\nexport interface Diagnostic {\n /// The start position of the relevant text.\n from: number;\n /// The end position. May be equal to `from`, though actually\n /// covering text is preferable.\n to: number;\n /// The severity of the problem. This will influence how it is\n /// displayed.\n severity: Severity;\n /// When given, add an extra CSS class to parts of the code that\n /// this diagnostic applies to.\n markClass?: string;\n /// An optional source string indicating where the diagnostic is\n /// coming from. You can put the name of your linter here, if\n /// applicable.\n source?: string;\n /// The message associated with this diagnostic.\n message: string;\n /// An optional custom rendering function that displays the message\n /// as a DOM node.\n renderMessage?: (view: EditorView) => Node;\n /// An optional array of actions that can be taken on this\n /// diagnostic.\n actions?: readonly Action[];\n}\n\n/// An action associated with a diagnostic.\nexport interface Action {\n /// The label to show to the user. Should be relatively short.\n name: string;\n /// The function to call when the user activates this action. Is\n /// given the diagnostic's _current_ position, which may have\n /// changed since the creation of the diagnostic, due to editing.\n apply: (view: EditorView, from: number, to: number) => void;\n}\n\ntype DiagnosticFilter = (\n diagnostics: readonly Diagnostic[],\n state: EditorState,\n) => Diagnostic[];\n\ninterface LintConfig {\n /// Time to wait (in milliseconds) after a change before running\n /// the linter. Defaults to 750ms.\n delay?: number;\n /// Optional predicate that can be used to indicate when diagnostics\n /// need to be recomputed. Linting is always re-done on document\n /// changes.\n needsRefresh?: null | ((update: ViewUpdate) => boolean);\n /// Optional filter to determine which diagnostics produce markers\n /// in the content.\n markerFilter?: null | DiagnosticFilter;\n /// Filter applied to a set of diagnostics shown in a tooltip. No\n /// tooltip will appear if the empty set is returned.\n tooltipFilter?: null | DiagnosticFilter;\n /// Can be used to control what kind of transactions cause lint\n /// hover tooltips associated with the given document range to be\n /// hidden. By default any transactions that changes the line\n /// around the range will hide it. Returning null falls back to this\n /// behavior.\n hideOn?: (tr: Transaction, from: number, to: number) => boolean | null;\n /// When enabled (defaults to off), this will cause the lint panel\n /// to automatically open when diagnostics are found, and close when\n /// all diagnostics are resolved or removed.\n autoPanel?: boolean;\n}\n\ninterface LintGutterConfig {\n /// The delay before showing a tooltip when hovering over a lint gutter marker.\n hoverTime?: number;\n /// Optional filter determining which diagnostics show a marker in\n /// the gutter.\n markerFilter?: null | DiagnosticFilter;\n /// Optional filter for diagnostics displayed in a tooltip, which\n /// can also be used to prevent a tooltip appearing.\n tooltipFilter?: null | DiagnosticFilter;\n}\n\nclass SelectedDiagnostic {\n constructor(\n readonly from: number,\n readonly to: number,\n readonly diagnostic: Diagnostic,\n ) {}\n}\n\nclass LintState {\n constructor(\n readonly diagnostics: DecorationSet,\n readonly panel: PanelConstructor | null,\n readonly selected: SelectedDiagnostic | null,\n ) {}\n\n static init(\n diagnostics: readonly Diagnostic[],\n panel: PanelConstructor | null,\n state: EditorState,\n ) {\n // Filter the list of diagnostics for which to create markers\n let markedDiagnostics = diagnostics;\n const diagnosticFilter = state.facet(lintConfig).markerFilter;\n if (diagnosticFilter) {\n markedDiagnostics = diagnosticFilter(markedDiagnostics, state);\n }\n\n const ranges = Decoration.set(\n markedDiagnostics.map((d: Diagnostic) => {\n // For zero-length ranges or ranges covering only a line break, create a widget\n if (\n d.from == d.to ||\n (d.from == d.to - 1 && state.doc.lineAt(d.from).to == d.from)\n ) {\n return Decoration.widget({\n widget: new DiagnosticWidget(d),\n diagnostic: d,\n }).range(d.from);\n }\n\n return Decoration.mark({\n attributes: {\n class: `cm-lintRange cm-lintRange-${\n d.severity\n }${d.markClass ? ` ${d.markClass}` : ''}`,\n },\n diagnostic: d,\n }).range(d.from, d.to);\n }),\n true,\n );\n\n return new LintState(ranges, panel, findDiagnostic(ranges));\n }\n}\n\nfunction findDiagnostic(\n diagnostics: DecorationSet,\n diagnostic: Diagnostic | null = null,\n after = 0,\n): SelectedDiagnostic | null {\n let found: SelectedDiagnostic | null = null;\n diagnostics.between(after, 1e9, (from, to, { spec }) => {\n if (diagnostic && spec.diagnostic != diagnostic) {\n return;\n }\n found = new SelectedDiagnostic(from, to, spec.diagnostic);\n return false;\n });\n return found;\n}\n\nfunction hideTooltip(tr: Transaction, tooltip: Tooltip) {\n const from = tooltip.pos,\n to = tooltip.end || from;\n const result = tr.state.facet(lintConfig).hideOn(tr, from, to);\n if (result != null) {\n return result;\n }\n const line = tr.startState.doc.lineAt(tooltip.pos);\n return !!(\n tr.effects.some(e => e.is(setDiagnosticsEffect)) ||\n tr.changes.touchesRange(line.from, Math.max(line.to, to))\n );\n}\n\nfunction maybeEnableLint(\n state: EditorState,\n effects: readonly StateEffect<unknown>[],\n) {\n return state.field(lintState, false)\n ? effects\n : effects.concat(StateEffect.appendConfig.of(lintExtensions));\n}\n\n/// Returns a transaction spec which updates the current set of\n/// diagnostics, and enables the lint extension if if wasn't already\n/// active.\nexport function setDiagnostics(\n state: EditorState,\n diagnostics: readonly Diagnostic[],\n): TransactionSpec {\n return {\n effects: maybeEnableLint(state, [setDiagnosticsEffect.of(diagnostics)]),\n };\n}\n\n/// The state effect that updates the set of active diagnostics. Can\n/// be useful when writing an extension that needs to track these.\nexport const setDiagnosticsEffect = StateEffect.define<readonly Diagnostic[]>();\n\nconst togglePanel = StateEffect.define<boolean>();\n\nconst movePanelSelection = StateEffect.define<SelectedDiagnostic>();\n\nconst lintState = StateField.define<LintState>({\n create() {\n return new LintState(Decoration.none, null, null);\n },\n update(value, tr) {\n if (tr.docChanged && value.diagnostics.size) {\n const mapped = value.diagnostics.map(tr.changes);\n let selected: SelectedDiagnostic | null = null,\n { panel } = value;\n if (value.selected) {\n const selPos = tr.changes.mapPos(value.selected.from, 1);\n selected =\n findDiagnostic(mapped, value.selected.diagnostic, selPos) ||\n findDiagnostic(mapped, null, selPos);\n }\n if (!mapped.size && panel && tr.state.facet(lintConfig).autoPanel) {\n panel = null;\n }\n value = new LintState(mapped, panel, selected);\n }\n\n for (const effect of tr.effects) {\n if (effect.is(setDiagnosticsEffect)) {\n const panel = !tr.state.facet(lintConfig).autoPanel\n ? value.panel\n : effect.value.length\n ? LintPanel.open\n : null;\n value = LintState.init(effect.value, panel, tr.state);\n } else if (effect.is(togglePanel)) {\n value = new LintState(\n value.diagnostics,\n effect.value ? LintPanel.open : null,\n value.selected,\n );\n } else if (effect.is(movePanelSelection)) {\n value = new LintState(value.diagnostics, value.panel, effect.value);\n }\n }\n\n return value;\n },\n provide: f => [\n showPanel.from(f, val => val.panel),\n // mergeDecorations 中合并了相同 severity 的 diagnostic 在编辑器中的下划线样式,以前会重复绘制下划线,现在只会绘制一次。\n EditorView.decorations.from(f, s => mergeDecorations(s.diagnostics)),\n ],\n});\n\n/// Returns the number of active lint diagnostics in the given state.\nexport function diagnosticCount(state: EditorState) {\n const lint = state.field(lintState, false);\n return lint ? lint.diagnostics.size : 0;\n}\n\nconst activeMark = Decoration.mark({\n class: 'cm-lintRange cm-lintRange-active',\n});\n\nfunction lintTooltip(view: EditorView, pos: number, side: -1 | 1) {\n const { diagnostics } = view.state.field(lintState);\n let found: Diagnostic[] = [],\n stackStart = 2e8,\n stackEnd = 0;\n diagnostics.between(\n pos - (side < 0 ? 1 : 0),\n pos + (side > 0 ? 1 : 0),\n (from, to, { spec }) => {\n if (\n pos >= from &&\n pos <= to &&\n (from == to || ((pos > from || side > 0) && (pos < to || side < 0)))\n ) {\n found.push(spec.diagnostic);\n stackStart = Math.min(from, stackStart);\n stackEnd = Math.max(to, stackEnd);\n }\n },\n );\n\n const diagnosticFilter = view.state.facet(lintConfig).tooltipFilter;\n if (diagnosticFilter) {\n found = diagnosticFilter(found, view.state);\n }\n\n if (!found.length) {\n return null;\n }\n\n return {\n pos: stackStart,\n end: stackEnd,\n above: view.state.doc.lineAt(stackStart).to < stackEnd,\n create() {\n return { dom: diagnosticsTooltip(view, found) };\n },\n };\n}\n\nfunction diagnosticsTooltip(\n view: EditorView,\n diagnostics: readonly Diagnostic[],\n) {\n return elt(\n 'ul',\n { class: 'cm-tooltip-lint' },\n diagnostics.map(d => renderDiagnostic(view, d, false)),\n );\n}\n\n/// Command to open and focus the lint panel.\nexport const openLintPanel: Command = (view: EditorView) => {\n const field = view.state.field(lintState, false);\n if (!field || !field.panel) {\n view.dispatch({\n effects: maybeEnableLint(view.state, [togglePanel.of(true)]),\n });\n }\n const panel = getPanel(view, LintPanel.open);\n if (panel) {\n (panel.dom.querySelector('.cm-panel-lint ul') as HTMLElement).focus();\n }\n return true;\n};\n\n/// Command to close the lint panel, when open.\nexport const closeLintPanel: Command = (view: EditorView) => {\n const field = view.state.field(lintState, false);\n if (!field || !field.panel) {\n return false;\n }\n view.dispatch({ effects: togglePanel.of(false) });\n return true;\n};\n\n/// Move the selection to the next diagnostic.\nexport const nextDiagnostic: Command = (view: EditorView) => {\n const field = view.state.field(lintState, false);\n if (!field) {\n return false;\n }\n const sel = view.state.selection.main;\n let next = field.diagnostics.iter(sel.to + 1);\n if (!next.value) {\n next = field.diagnostics.iter(0);\n if (!next.value || (next.from == sel.from && next.to == sel.to)) {\n return false;\n }\n }\n view.dispatch({\n selection: { anchor: next.from, head: next.to },\n scrollIntoView: true,\n });\n return true;\n};\n\n/// Move the selection to the previous diagnostic.\nexport const previousDiagnostic: Command = (view: EditorView) => {\n const { state } = view,\n field = state.field(lintState, false);\n if (!field) {\n return false;\n }\n const sel = state.selection.main;\n let prevFrom: number | undefined,\n prevTo: number | undefined,\n lastFrom: number | undefined,\n lastTo: number | undefined;\n field.diagnostics.between(0, state.doc.length, (from, to) => {\n if (to < sel.to && (prevFrom == null || prevFrom < from)) {\n prevFrom = from;\n prevTo = to;\n }\n if (lastFrom == null || from > lastFrom) {\n lastFrom = from;\n lastTo = to;\n }\n });\n if (lastFrom == null || (prevFrom == null && lastFrom == sel.from)) {\n return false;\n }\n view.dispatch({\n selection: { anchor: prevFrom ?? lastFrom, head: prevTo ?? lastTo },\n scrollIntoView: true,\n });\n return true;\n};\n\n/// A set of default key bindings for the lint functionality.\n///\n/// - Ctrl-Shift-m (Cmd-Shift-m on macOS): [`openLintPanel`](#lint.openLintPanel)\n/// - F8: [`nextDiagnostic`](#lint.nextDiagnostic)\nexport const lintKeymap: readonly KeyBinding[] = [\n { key: 'Mod-Shift-m', run: openLintPanel, preventDefault: true },\n { key: 'F8', run: nextDiagnostic },\n];\n\n/// The type of a function that produces diagnostics.\nexport type LintSource = (\n view: EditorView,\n) => readonly Diagnostic[] | Promise<readonly Diagnostic[]>;\n\nconst lintPlugin = ViewPlugin.fromClass(\n class {\n lintTime: number;\n timeout = -1;\n set = true;\n\n constructor(readonly view: EditorView) {\n const { delay } = view.state.facet(lintConfig);\n this.lintTime = Date.now() + delay;\n this.run = this.run.bind(this);\n this.timeout = window.setTimeout(this.run, delay);\n }\n\n run() {\n clearTimeout(this.timeout);\n const now = Date.now();\n if (now < this.lintTime - 10) {\n this.timeout = window.setTimeout(this.run, this.lintTime - now);\n } else {\n this.set = false;\n const { state } = this.view,\n { sources } = state.facet(lintConfig);\n if (sources.length) {\n Promise.all(\n sources.map(source => Promise.resolve(source(this.view))),\n ).then(\n annotations => {\n const all = annotations.reduce((a, b) => a.concat(b));\n if (this.view.state.doc == state.doc) {\n this.view.dispatch(setDiagnostics(this.view.state, all));\n }\n },\n error => {\n logException(this.view.state, error);\n },\n );\n }\n }\n }\n\n update(update: ViewUpdate) {\n const config = update.state.facet(lintConfig);\n if (\n update.docChanged ||\n config != update.startState.facet(lintConfig) ||\n (config.needsRefresh && config.needsRefresh(update))\n ) {\n this.lintTime = Date.now() + config.delay;\n if (!this.set) {\n this.set = true;\n this.timeout = window.setTimeout(this.run, config.delay);\n }\n }\n }\n\n force() {\n if (this.set) {\n this.lintTime = Date.now();\n this.run();\n }\n }\n\n destroy() {\n clearTimeout(this.timeout);\n }\n },\n);\n\nconst lintConfig = Facet.define<\n { source: LintSource | null; config: LintConfig },\n Required<LintConfig> & { sources: readonly LintSource[] }\n>({\n combine(input) {\n return {\n sources: input\n .map(i => i.source)\n .filter(x => x != null) as readonly LintSource[],\n ...combineConfig(\n input.map(i => i.config),\n {\n delay: 750,\n markerFilter: null,\n tooltipFilter: null,\n needsRefresh: null,\n hideOn: () => null,\n },\n {\n needsRefresh: (a, b) => (!a ? b : !b ? a : u => a(u) || b(u)),\n },\n ),\n };\n },\n});\n\n/// Given a diagnostic source, this function returns an extension that\n/// enables linting with that source. It will be called whenever the\n/// editor is idle (after its content changed). If `null` is given as\n/// source, this only configures the lint extension.\nexport function linter(\n source: LintSource | null,\n config: LintConfig = {},\n): Extension {\n return [lintConfig.of({ source, config }), lintPlugin, lintExtensions];\n}\n\n/// Forces any linters [configured](#lint.linter) to run when the\n/// editor is idle to run right away.\nexport function forceLinting(view: EditorView) {\n const plugin = view.plugin(lintPlugin);\n if (plugin) {\n plugin.force();\n }\n}\n\nfunction assignKeys(actions: readonly Action[] | undefined) {\n const assigned: string[] = [];\n if (actions) {\n actions: for (const { name } of actions) {\n for (let i = 0; i < name.length; i++) {\n const ch = name[i];\n if (\n /[a-zA-Z]/.test(ch) &&\n !assigned.some(c => c.toLowerCase() == ch.toLowerCase())\n ) {\n assigned.push(ch);\n continue actions;\n }\n }\n assigned.push('');\n }\n }\n return assigned;\n}\n\nfunction renderDiagnostic(\n view: EditorView,\n diagnostic: Diagnostic,\n inPanel: boolean,\n) {\n const keys = inPanel ? assignKeys(diagnostic.actions) : [];\n return elt(\n 'li',\n { class: `cm-diagnostic cm-diagnostic-${diagnostic.severity}` },\n elt(\n 'span',\n { class: 'cm-diagnosticText' },\n diagnostic.renderMessage\n ? diagnostic.renderMessage(view)\n : diagnostic.message,\n ),\n diagnostic.actions?.map((action, i) => {\n let fired = false;\n const click = (e: Event) => {\n e.preventDefault();\n if (fired) {\n return;\n }\n fired = true;\n const found = findDiagnostic(\n view.state.field(lintState).diagnostics,\n diagnostic,\n );\n if (found) {\n action.apply(view, found.from, found.to);\n }\n };\n const { name } = action,\n keyIndex = keys[i] ? name.indexOf(keys[i]) : -1;\n const nameElt =\n keyIndex < 0\n ? name\n : [\n name.slice(0, keyIndex),\n elt('u', name.slice(keyIndex, keyIndex + 1)),\n name.slice(keyIndex + 1),\n ];\n return elt(\n 'button',\n {\n type: 'button',\n class: 'cm-diagnosticAction',\n onclick: click,\n onmousedown: click,\n 'aria-label': ` Action: ${name}${keyIndex < 0 ? '' : ` (access key \"${keys[i]})\"`}.`,\n },\n nameElt,\n );\n }),\n diagnostic.source &&\n elt('div', { class: 'cm-diagnosticSource' }, diagnostic.source),\n );\n}\n\nclass DiagnosticWidget extends WidgetType {\n constructor(readonly diagnostic: Diagnostic) {\n super();\n }\n\n eq(other: DiagnosticWidget) {\n return other.diagnostic == this.diagnostic;\n }\n\n toDOM() {\n return elt('span', {\n class: `cm-lintPoint cm-lintPoint-${this.diagnostic.severity}`,\n });\n }\n}\n\nclass PanelItem {\n id = `item_${Math.floor(Math.random() * 0xffffffff).toString(16)}`;\n dom: HTMLElement;\n\n constructor(\n view: EditorView,\n readonly diagnostic: Diagnostic,\n ) {\n this.dom = renderDiagnostic(view, diagnostic, true);\n this.dom.id = this.id;\n this.dom.setAttribute('role', 'option');\n }\n}\n\nclass LintPanel implements Panel {\n items: PanelItem[] = [];\n dom: HTMLElement;\n list: HTMLElement;\n\n constructor(readonly view: EditorView) {\n const onkeydown = (event: KeyboardEvent) => {\n if (event.keyCode == 27) {\n // Escape\n closeLintPanel(this.view);\n this.view.focus();\n } else if (event.keyCode == 38 || event.keyCode == 33) {\n // ArrowUp, PageUp\n this.moveSelection(\n (this.selectedIndex - 1 + this.items.length) % this.items.length,\n );\n } else if (event.keyCode == 40 || event.keyCode == 34) {\n // ArrowDown, PageDown\n this.moveSelection((this.selectedIndex + 1) % this.items.length);\n } else if (event.keyCode == 36) {\n // Home\n this.moveSelection(0);\n } else if (event.keyCode == 35) {\n // End\n this.moveSelection(this.items.length - 1);\n } else if (event.keyCode == 13) {\n // Enter\n this.view.focus();\n } else if (\n event.keyCode >= 65 &&\n event.keyCode <= 90 &&\n this.selectedIndex >= 0\n ) {\n // A-Z\n const { diagnostic } = this.items[this.selectedIndex],\n keys = assignKeys(diagnostic.actions);\n for (let i = 0; i < keys.length; i++) {\n if (keys[i].toUpperCase().charCodeAt(0) == event.keyCode) {\n const found = findDiagnostic(\n this.view.state.field(lintState).diagnostics,\n diagnostic,\n );\n if (found) {\n diagnostic.actions![i].apply(view, found.from, found.to);\n }\n }\n }\n } else {\n return;\n }\n event.preventDefault();\n };\n const onclick = (event: MouseEvent) => {\n for (let i = 0; i < this.items.length; i++) {\n if (this.items[i].dom.contains(event.target as HTMLElement)) {\n this.moveSelection(i);\n }\n }\n };\n\n this.list = elt('ul', {\n tabIndex: 0,\n role: 'listbox',\n 'aria-label': this.view.state.phrase('Diagnostics'),\n onkeydown,\n onclick,\n });\n this.dom = elt(\n 'div',\n { class: 'cm-panel-lint' },\n this.list,\n elt(\n 'button',\n {\n type: 'button',\n name: 'close',\n 'aria-label': this.view.state.phrase('close'),\n onclick: () => closeLintPanel(this.view),\n },\n '×',\n ),\n );\n this.update();\n }\n\n get selectedIndex() {\n const { selected } = this.view.state.field(lintState);\n if (!selected) {\n return -1;\n }\n for (let i = 0; i < this.items.length; i++) {\n if (this.items[i].diagnostic == selected.diagnostic) {\n return i;\n }\n }\n return -1;\n }\n\n update() {\n const { diagnostics, selected } = this.view.state.field(lintState);\n let i = 0,\n needsSync = false,\n newSelectedItem: PanelItem | null = null;\n diagnostics.between(\n 0,\n this.view.state.doc.length,\n (_start, _end, { spec }) => {\n let found = -1,\n item;\n for (let j = i; j < this.items.length; j++) {\n if (this.items[j].diagnostic == spec.diagnostic) {\n found = j;\n break;\n }\n }\n if (found < 0) {\n item = new PanelItem(this.view, spec.diagnostic);\n this.items.splice(i, 0, item);\n needsSync = true;\n } else {\n item = this.items[found];\n if (found > i) {\n this.items.splice(i, found - i);\n needsSync = true;\n }\n }\n if (selected && item.diagnostic == selected.diagnostic) {\n if (!item.dom.hasAttribute('aria-selected')) {\n item.dom.setAttribute('aria-selected', 'true');\n newSelectedItem = item;\n }\n } else if (item.dom.hasAttribute('aria-selected')) {\n item.dom.removeAttribute('aria-selected');\n }\n i++;\n },\n );\n while (\n i < this.items.length &&\n !(this.items.length == 1 && this.items[0].diagnostic.from < 0)\n ) {\n needsSync = true;\n this.items.pop();\n }\n if (this.items.length == 0) {\n this.items.push(\n new PanelItem(this.view, {\n from: -1,\n to: -1,\n severity: 'info',\n message: this.view.state.phrase('No diagnostics'),\n }),\n );\n needsSync = true;\n }\n if (newSelectedItem) {\n this.list.setAttribute('aria-activedescendant', newSelectedItem!.id);\n this.view.requestMeasure({\n key: this,\n read: () => ({\n sel: newSelectedItem!.dom.getBoundingClientRect(),\n panel: this.list.getBoundingClientRect(),\n }),\n write: ({ sel, panel }) => {\n const scaleY = panel.height / this.list.offsetHeight;\n if (sel.top < panel.top) {\n this.list.scrollTop -= (panel.top - sel.top) / scaleY;\n } else if (sel.bottom > panel.bottom) {\n this.list.scrollTop += (sel.bottom - panel.bottom) / scaleY;\n }\n },\n });\n } else if (this.selectedIndex < 0) {\n this.list.removeAttribute('aria-activedescendant');\n }\n if (needsSync) {\n this.sync();\n }\n }\n\n sync() {\n let domPos: ChildNode | null = this.list.firstChild;\n function rm() {\n const prev = domPos!;\n domPos = prev.nextSibling;\n prev.remove();\n }\n\n for (const item of this.items) {\n if (item.dom.parentNode == this.list) {\n while (domPos != item.dom) {\n rm();\n }\n domPos = item.dom.nextSibling;\n } else {\n this.list.insertBefore(item.dom, domPos);\n }\n }\n while (domPos) {\n rm();\n }\n }\n\n moveSelection(selectedIndex: number) {\n if (this.selectedIndex < 0) {\n return;\n }\n const field = this.view.state.field(lintState);\n const selection = findDiagnostic(\n field.diagnostics,\n this.items[selectedIndex].diagnostic,\n );\n if (!selection) {\n return;\n }\n this.view.dispatch({\n selection: { anchor: selection.from, head: selection.to },\n scrollIntoView: true,\n effects: movePanelSelection.of(selection),\n });\n }\n\n static open(view: EditorView) {\n return new LintPanel(view);\n }\n}\n\nfunction svg(content: string, attrs = 'viewBox=\"0 0 40 40\"') {\n return `url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" ${attrs}>${encodeURIComponent(content)}</svg>')`;\n}\n\nfunction underline(color: string) {\n return svg(\n `<path d=\"m0 2.5 l2 -1.5 l1 0 l2 1.5 l1 0\" stroke=\"${color}\" fill=\"none\" stroke-width=\".7\"/>`,\n 'width=\"6\" height=\"3\"',\n );\n}\n\nconst baseTheme = EditorView.baseTheme({\n '.cm-diagnostic': {\n padding: '3px 6px 3px 8px',\n marginLeft: '-1px',\n display: 'block',\n whiteSpace: 'pre-wrap',\n },\n '.cm-diagnostic-error': { borderLeft: '5px solid #d11' },\n '.cm-diagnostic-warning': { borderLeft: '5px solid orange' },\n '.cm-diagnostic-info': { borderLeft: '5px solid #999' },\n '.cm-diagnostic-hint': { borderLeft: '5px solid #66d' },\n\n '.cm-diagnosticAction': {\n font: 'inherit',\n border: 'none',\n padding: '2px 4px',\n backgroundColor: '#444',\n color: 'white',\n borderRadius: '3px',\n marginLeft: '8px',\n cursor: 'pointer',\n },\n\n '.cm-diagnosticSource': {\n fontSize: '70%',\n opacity: 0.7,\n },\n\n '.cm-lintRange': {\n backgroundPosition: 'left bottom',\n backgroundRepeat: 'repeat-x',\n paddingBottom: '0.7px',\n },\n\n '.cm-lintRange-error': { backgroundImage: underline('#d11') },\n '.cm-lintRange-warning': { backgroundImage: underline('orange') },\n '.cm-lintRange-info': { backgroundImage: underline('#999') },\n '.cm-lintRange-hint': { backgroundImage: underline('#66d') },\n '.cm-lintRange-active': { backgroundColor: '#ffdd9980' },\n\n '.cm-tooltip-lint': {\n padding: 0,\n margin: 0,\n },\n\n '.cm-lintPoint': {\n position: 'relative',\n\n '&:after': {\n content: '\"\"',\n position: 'absolute',\n bottom: 0,\n left: '-2px',\n borderLeft: '3px solid transparent',\n borderRight: '3px solid transparent',\n borderBottom: '4px solid #d11',\n },\n },\n\n '.cm-lintPoint-warning': {\n '&:after': { borderBottomColor: 'orange' },\n },\n '.cm-lintPoint-info': {\n '&:after': { borderBottomColor: '#999' },\n },\n '.cm-lintPoint-hint': {\n '&:after': { borderBottomColor: '#66d' },\n },\n\n '.cm-panel.cm-panel-lint': {\n position: 'relative',\n '& ul': {\n maxHeight: '100px',\n overflowY: 'auto',\n '& [aria-selected]': {\n backgroundColor: '#ddd',\n '& u': { textDecoration: 'underline' },\n },\n '&:focus [aria-selected]': {\n background_fallback: '#bdf',\n backgroundColor: 'Highlight',\n color_fallback: 'white',\n color: 'HighlightText',\n },\n '& u': { textDecoration: 'none' },\n padding: 0,\n margin: 0,\n },\n '& [name=close]': {\n position: 'absolute',\n top: '0',\n right: '2px',\n background: 'inherit',\n border: 'none',\n font: 'inherit',\n padding: 0,\n margin: 0,\n },\n },\n});\n\nfunction severityWeight(sev: Severity) {\n return sev == 'error' ? 4 : sev == 'warning' ? 3 : sev == 'info' ? 2 : 1;\n}\n\nclass LintGutterMarker extends GutterMarker {\n severity: Severity;\n constructor(readonly diagnostics: readonly Diagnostic[]) {\n super();\n this.severity = diagnostics.reduce(\n (max, d) =>\n severityWeight(max) < severityWeight(d.severity) ? d.severity : max,\n 'hint' as Severity,\n );\n }\n\n toDOM(view: EditorView) {\n const elt = document.createElement('div');\n elt.className = `cm-lint-marker cm-lint-marker-${this.severity}`;\n\n let { diagnostics } = this;\n const diagnosticsFilter = view.state.facet(lintGutterConfig).tooltipFilter;\n if (diagnosticsFilter) {\n diagnostics = diagnosticsFilter(diagnostics, view.state);\n }\n\n if (diagnostics.length) {\n elt.onmouseover = () => gutterMarkerMouseOver(view, elt, diagnostics);\n }\n\n return elt;\n }\n}\n\nconst enum Hover {\n Time = 300,\n Margin = 10,\n}\n\nfunction trackHoverOn(view: EditorView, marker: HTMLElement) {\n const mousemove = (event: MouseEvent) => {\n const rect = marker.getBoundingClientRect();\n if (\n event.clientX > rect.left - Hover.Margin &&\n event.clientX < rect.right + Hover.Margin &&\n event.clientY > rect.top - Hover.Margin &&\n event.clientY < rect.bottom + Hover.Margin\n ) {\n return;\n }\n for (\n let target = event.target as Node | null;\n target;\n target = target.parentNode\n ) {\n if (\n target.nodeType == 1 &&\n (target as HTMLElement).classList.contains('cm-tooltip-lint')\n ) {\n return;\n }\n }\n window.removeEventListener('mousemove', mousemove);\n if (view.state.field(lintGutterTooltip)) {\n view.dispatch({ effects: setLintGutterTooltip.of(null) });\n }\n };\n window.addEventListener('mousemove', mousemove);\n}\n\nfunction gutterMarkerMouseOver(\n view: EditorView,\n marker: HTMLElement,\n diagnostics: readonly Diagnostic[],\n) {\n function hovered() {\n const line = view.elementAtHeight(\n marker.getBoundingClientRect().top + 5 - view.documentTop,\n );\n const linePos = view.coordsAtPos(line.from);\n if (linePos) {\n view.dispatch({\n effects: setLintGutterTooltip.of({\n pos: line.from,\n above: false,\n create() {\n return {\n dom: diagnosticsTooltip(view, diagnostics),\n getCoords: () => marker.getBoundingClientRect(),\n };\n },\n }),\n });\n }\n marker.onmouseout = marker.onmousemove = null;\n trackHoverOn(view, marker);\n }\n\n const { hoverTime } = view.state.facet(lintGutterConfig);\n\n let hoverTimeout = setTimeout(hovered, hoverTime);\n marker.onmouseout = () => {\n clearTimeout(hoverTimeout);\n marker.onmouseout = marker.onmousemove = null;\n };\n marker.onmousemove = () => {\n clearTimeout(hoverTimeout);\n hoverTimeout = setTimeout(hovered, hoverTime);\n };\n}\n\nfunction markersForDiagnostics(doc: Text, diagnostics: readonly Diagnostic[]) {\n const byLine: { [line: number]: Diagnostic[] } = Object.create(null);\n for (const diagnostic of diagnostics) {\n const line = doc.lineAt(diagnostic.from);\n (byLine[line.from] || (byLine[line.from] = [])).push(diagnostic);\n }\n const markers: Range<GutterMarker>[] = [];\n for (const line in byLine) {\n markers.push(new LintGutterMarker(byLine[line]).range(+line));\n }\n return RangeSet.of(markers, true);\n}\n\nconst lintGutterExtension = gutter({\n class: 'cm-gutter-lint',\n markers: view => view.state.field(lintGutterMarkers),\n});\n\nconst lintGutterMarkers = StateField.define<RangeSet<GutterMarker>>({\n create() {\n return RangeSet.empty;\n },\n update(markers, tr) {\n markers = markers.map(tr.changes);\n const diagnosticFilter = tr.state.facet(lintGutterConfig).markerFilter;\n for (const effect of tr.effects) {\n if (effect.is(setDiagnosticsEffect)) {\n let diagnostics = effect.value;\n if (diagnosticFilter) {\n diagnostics = diagnosticFilter(diagnostics || [], tr.state);\n }\n markers = markersForDiagnostics(tr.state.doc, diagnostics.slice(0));\n }\n }\n return markers;\n },\n});\n\nconst setLintGutterTooltip = StateEffect.define<Tooltip | null>();\n\nconst lintGutterTooltip = StateField.define<Tooltip | null>({\n create() {\n return null;\n },\n update(tooltip, tr) {\n if (tooltip && tr.docChanged) {\n tooltip = hideTooltip(tr, tooltip)\n ? null\n : { ...tooltip, pos: tr.changes.mapPos(tooltip.pos) };\n }\n return tr.effects.reduce(\n (t, e) => (e.is(setLintGutterTooltip) ? e.value : t),\n tooltip,\n );\n },\n provide: field => showTooltip.from(field),\n});\n\nconst lintGutterTheme = EditorView.baseTheme({\n '.cm-gutter-lint': {\n width: '1.4em',\n '& .cm-gutterElement': {\n padding: '.2em',\n },\n },\n '.cm-lint-marker': {\n width: '1em',\n height: '1em',\n },\n '.cm-lint-marker-info': {\n content: svg(\n '<path fill=\"#aaf\" stroke=\"#77e\" stroke-width=\"6\" stroke-linejoin=\"round\" d=\"M5 5L35 5L35 35L5 35Z\"/>',\n ),\n },\n '.cm-lint-marker-warning': {\n content: svg(\n '<path fill=\"#fe8\" stroke=\"#fd7\" stroke-width=\"6\" stroke-linejoin=\"round\" d=\"M20 6L37 35L3 35Z\"/>',\n ),\n },\n '.cm-lint-marker-error': {\n content: svg(\n '<circle cx=\"20\" cy=\"20\" r=\"15\" fill=\"#f87\" stroke=\"#f43\" stroke-width=\"6\"/>',\n ),\n },\n});\n\nconst lintExtensions = [\n lintState,\n EditorView.decorations.compute([lintState], state => {\n const { selected, panel } = state.field(lintState);\n return !selected || !panel || selected.from == selected.to\n ? Decoration.none\n : Decoration.set([activeMark.range(selected.from, selected.to)]);\n }),\n hoverTooltip(lintTooltip, { hideOn: hideTooltip }),\n baseTheme,\n];\n\nconst lintGutterConfig = Facet.define<\n LintGutterConfig,\n Required<LintGutterConfig>\n>({\n combine(configs) {\n return combineConfig(configs, {\n hoverTime: Hover.Time,\n markerFilter: null,\n tooltipFilter: null,\n });\n },\n});\n\n/// Returns an extension that installs a gutter showing markers for\n/// each line that has diagnostics, which can be hovered over to see\n/// the diagnostics.\nexport function lintGutter(config: LintGutterConfig = {}): Extension {\n return [\n lintGutterConfig.of(config),\n lintGutterMarkers,\n lintGutterExtension,\n lintGutterTheme,\n lintGutterTooltip,\n ];\n}\n\n/// Iterate over the marked diagnostics for the given editor state,\n/// calling `f` for each of them. Note that, if the document changed\n/// since the diagnostics were created, the `Diagnostic` object will\n/// hold the original outdated position, whereas the `to` and `from`\n/// arguments hold the diagnostic's current position.\nexport function forEachDiagnostic(\n state: EditorState,\n f: (d: Diagnostic, from: number, to: number) => void,\n) {\n const lState = state.field(lintState, false);\n if (lState && lState.diagnostics.size) {\n for (\n let iter = RangeSet.iter([lState.diagnostics]);\n iter.value;\n iter.next()\n ) {\n f(iter.value.spec.diagnostic, iter.from, iter.to);\n }\n }\n}\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { Decoration, type DecorationSet } from '@codemirror/view';\nimport { type Range } from '@codemirror/state';\n\nimport { type Diagnostic, type Severity } from './index';\n\nconst splitDiagnosticBySeverity = (decorations: DecorationSet) => {\n const diagnosticMap = new Map<Severity, Diagnostic[]>();\n const decoration = decorations.iter();\n\n while (decoration.value) {\n const { severity } = decoration.value.spec.diagnostic;\n\n if (!diagnosticMap.has(severity)) {\n diagnosticMap.set(severity, []);\n }\n\n diagnosticMap.get(severity)!.push(decoration.value.spec.diagnostic);\n\n decoration.next();\n }\n\n return diagnosticMap;\n};\n\nconst createDecoration = (\n from: number,\n to: number,\n severity: Severity,\n diagnostics: Diagnostic[],\n) => {\n const last = diagnostics[diagnostics.length - 1];\n\n return Decoration.mark({\n attributes: {\n class: `cm-lintRange cm-lintRange-${\n severity\n }${last.markClass ? ` ${last.markClass}` : ''}`,\n },\n sourceDiagnostics: diagnostics,\n }).range(from, to);\n};\n\ninterface MergedDiagnostic extends Partial<Diagnostic> {\n sourceDiagnostics: Diagnostic[];\n}\n\nconst mergeDecoration = (diagnostics: Diagnostic[]): MergedDiagnostic[] => {\n const cloned = diagnostics.map(e => ({\n from: e.from,\n to: e.to,\n }));\n\n const merged: MergedDiagnostic[] = [];\n\n cloned.sort((a, b) => a.from - b.from);\n\n let current = cloned[0];\n let currentSourceDiagnostics: Diagnostic[] = [diagnostics[0]];\n\n for (let i = 1; i < cloned.length; i++) {\n const next = cloned[i];\n\n if (next.from <= current.to) {\n currentSourceDiagnostics.push(diagnostics[i]);\n current.to = Math.max(current.to, next.to);\n } else {\n merged.push({ ...current, sourceDiagnostics: currentSourceDiagnostics });\n current = next;\n currentSourceDiagnostics = [diagnostics[i]];\n }\n }\n\n merged.push({ ...current, sourceDiagnostics: currentSourceDiagnostics });\n\n return merged;\n};\n\nexport const mergeDecorations = (decorations: DecorationSet): DecorationSet => {\n try {\n const diagnosticMap = splitDiagnosticBySeverity(decorations);\n const merge: Range<Decoration>[] = [];\n\n diagnosticMap.forEach((value, key) => {\n mergeDecoration(value).forEach(diagnostic => {\n if (\n typeof diagnostic.from !== 'number' ||\n typeof diagnostic.to !== 'number'\n ) {\n return;\n }\n if (diagnostic.from <= diagnostic.to) {\n merge.push(\n createDecoration(\n diagnostic.from,\n diagnostic.to,\n key,\n diagnostic.sourceDiagnostics,\n ),\n );\n }\n });\n });\n\n merge.sort((a, b) => {\n if (a.from !== b.from) {\n return a.from - b.from;\n }\n\n return a.value.startSide - b.value.startSide;\n });\n\n return Decoration.set(merge);\n } catch (e) {\n console.error('FlowLangSDK: linter mergeDecorations error', e);\n return decorations;\n }\n};\n"],"mappings":"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","names":["import_view","elt"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/merge-decorations.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\n// Credits to @codemirror/lint\n// copy from @codemirror/lint, 修改了 lintState 中 provide decorations 的绘制逻辑\nimport elt from 'crelt';\nimport {\n EditorView,\n ViewPlugin,\n Decoration,\n type DecorationSet,\n WidgetType,\n type ViewUpdate,\n type Command,\n logException,\n type KeyBinding,\n hoverTooltip,\n type Tooltip,\n showTooltip,\n gutter,\n GutterMarker,\n type PanelConstructor,\n type Panel,\n showPanel,\n getPanel,\n} from '@codemirror/view';\nimport {\n type Text,\n StateEffect,\n StateField,\n type Extension,\n type TransactionSpec,\n type Transaction,\n type EditorState,\n Facet,\n combineConfig,\n RangeSet,\n type Range,\n} from '@codemirror/state';\n\nimport { mergeDecorations } from './merge-decorations';\n\nexport type Severity = 'hint' | 'info' | 'warning' | 'error';\n\n/// Describes a problem or hint for a piece of code.\nexport interface Diagnostic {\n /// The start position of the relevant text.\n from: number;\n /// The end position. May be equal to `from`, though actually\n /// covering text is preferable.\n to: number;\n /// The severity of the problem. This will influence how it is\n /// displayed.\n severity: Severity;\n /// When given, add an extra CSS class to parts of the code that\n /// this diagnostic applies to.\n markClass?: string;\n /// An optional source string indicating where the diagnostic is\n /// coming from. You can put the name of your linter here, if\n /// applicable.\n source?: string;\n /// The message associated with this diagnostic.\n message: string;\n /// An optional custom rendering function that displays the message\n /// as a DOM node.\n renderMessage?: (view: EditorView) => Node;\n /// An optional array of actions that can be taken on this\n /// diagnostic.\n actions?: readonly Action[];\n}\n\n/// An action associated with a diagnostic.\nexport interface Action {\n /// The label to show to the user. Should be relatively short.\n name: string;\n /// The function to call when the user activates this action. Is\n /// given the diagnostic's _current_ position, which may have\n /// changed since the creation of the diagnostic, due to editing.\n apply: (view: EditorView, from: number, to: number) => void;\n}\n\ntype DiagnosticFilter = (\n diagnostics: readonly Diagnostic[],\n state: EditorState,\n) => Diagnostic[];\n\ninterface LintConfig {\n /// Time to wait (in milliseconds) after a change before running\n /// the linter. Defaults to 750ms.\n delay?: number;\n /// Optional predicate that can be used to indicate when diagnostics\n /// need to be recomputed. Linting is always re-done on document\n /// changes.\n needsRefresh?: null | ((update: ViewUpdate) => boolean);\n /// Optional filter to determine which diagnostics produce markers\n /// in the content.\n markerFilter?: null | DiagnosticFilter;\n /// Filter applied to a set of diagnostics shown in a tooltip. No\n /// tooltip will appear if the empty set is returned.\n tooltipFilter?: null | DiagnosticFilter;\n /// Can be used to control what kind of transactions cause lint\n /// hover tooltips associated with the given document range to be\n /// hidden. By default any transactions that changes the line\n /// around the range will hide it. Returning null falls back to this\n /// behavior.\n hideOn?: (tr: Transaction, from: number, to: number) => boolean | null;\n /// When enabled (defaults to off), this will cause the lint panel\n /// to automatically open when diagnostics are found, and close when\n /// all diagnostics are resolved or removed.\n autoPanel?: boolean;\n}\n\ninterface LintGutterConfig {\n /// The delay before showing a tooltip when hovering over a lint gutter marker.\n hoverTime?: number;\n /// Optional filter determining which diagnostics show a marker in\n /// the gutter.\n markerFilter?: null | DiagnosticFilter;\n /// Optional filter for diagnostics displayed in a tooltip, which\n /// can also be used to prevent a tooltip appearing.\n tooltipFilter?: null | DiagnosticFilter;\n}\n\nclass SelectedDiagnostic {\n constructor(\n readonly from: number,\n readonly to: number,\n readonly diagnostic: Diagnostic,\n ) {}\n}\n\nclass LintState {\n constructor(\n readonly diagnostics: DecorationSet,\n readonly panel: PanelConstructor | null,\n readonly selected: SelectedDiagnostic | null,\n ) {}\n\n static init(\n diagnostics: readonly Diagnostic[],\n panel: PanelConstructor | null,\n state: EditorState,\n ) {\n // Filter the list of diagnostics for which to create markers\n let markedDiagnostics = diagnostics;\n const diagnosticFilter = state.facet(lintConfig).markerFilter;\n if (diagnosticFilter) {\n markedDiagnostics = diagnosticFilter(markedDiagnostics, state);\n }\n\n const ranges = Decoration.set(\n markedDiagnostics.map((d: Diagnostic) => {\n // For zero-length ranges or ranges covering only a line break, create a widget\n if (\n d.from == d.to ||\n (d.from == d.to - 1 && state.doc.lineAt(d.from).to == d.from)\n ) {\n return Decoration.widget({\n widget: new DiagnosticWidget(d),\n diagnostic: d,\n }).range(d.from);\n }\n\n return Decoration.mark({\n attributes: {\n class: `cm-lintRange cm-lintRange-${\n d.severity\n }${d.markClass ? ` ${d.markClass}` : ''}`,\n },\n diagnostic: d,\n }).range(d.from, d.to);\n }),\n true,\n );\n\n return new LintState(ranges, panel, findDiagnostic(ranges));\n }\n}\n\nfunction findDiagnostic(\n diagnostics: DecorationSet,\n diagnostic: Diagnostic | null = null,\n after = 0,\n): SelectedDiagnostic | null {\n let found: SelectedDiagnostic | null = null;\n diagnostics.between(after, 1e9, (from, to, { spec }) => {\n if (diagnostic && spec.diagnostic != diagnostic) {\n return;\n }\n found = new SelectedDiagnostic(from, to, spec.diagnostic);\n return false;\n });\n return found;\n}\n\nfunction hideTooltip(tr: Transaction, tooltip: Tooltip) {\n const from = tooltip.pos,\n to = tooltip.end || from;\n const result = tr.state.facet(lintConfig).hideOn(tr, from, to);\n if (result != null) {\n return result;\n }\n const line = tr.startState.doc.lineAt(tooltip.pos);\n return !!(\n tr.effects.some(e => e.is(setDiagnosticsEffect)) ||\n tr.changes.touchesRange(line.from, Math.max(line.to, to))\n );\n}\n\nfunction maybeEnableLint(\n state: EditorState,\n effects: readonly StateEffect<unknown>[],\n) {\n return state.field(lintState, false)\n ? effects\n : effects.concat(StateEffect.appendConfig.of(lintExtensions));\n}\n\n/// Returns a transaction spec which updates the current set of\n/// diagnostics, and enables the lint extension if if wasn't already\n/// active.\nexport function setDiagnostics(\n state: EditorState,\n diagnostics: readonly Diagnostic[],\n): TransactionSpec {\n return {\n effects: maybeEnableLint(state, [setDiagnosticsEffect.of(diagnostics)]),\n };\n}\n\n/// The state effect that updates the set of active diagnostics. Can\n/// be useful when writing an extension that needs to track these.\nexport const setDiagnosticsEffect = StateEffect.define<readonly Diagnostic[]>();\n\nconst togglePanel = StateEffect.define<boolean>();\n\nconst movePanelSelection = StateEffect.define<SelectedDiagnostic>();\n\nconst lintState = StateField.define<LintState>({\n create() {\n return new LintState(Decoration.none, null, null);\n },\n update(value, tr) {\n if (tr.docChanged && value.diagnostics.size) {\n const mapped = value.diagnostics.map(tr.changes);\n let selected: SelectedDiagnostic | null = null,\n { panel } = value;\n if (value.selected) {\n const selPos = tr.changes.mapPos(value.selected.from, 1);\n selected =\n findDiagnostic(mapped, value.selected.diagnostic, selPos) ||\n findDiagnostic(mapped, null, selPos);\n }\n if (!mapped.size && panel && tr.state.facet(lintConfig).autoPanel) {\n panel = null;\n }\n value = new LintState(mapped, panel, selected);\n }\n\n for (const effect of tr.effects) {\n if (effect.is(setDiagnosticsEffect)) {\n const panel = !tr.state.facet(lintConfig).autoPanel\n ? value.panel\n : effect.value.length\n ? LintPanel.open\n : null;\n value = LintState.init(effect.value, panel, tr.state);\n } else if (effect.is(togglePanel)) {\n value = new LintState(\n value.diagnostics,\n effect.value ? LintPanel.open : null,\n value.selected,\n );\n } else if (effect.is(movePanelSelection)) {\n value = new LintState(value.diagnostics, value.panel, effect.value);\n }\n }\n\n return value;\n },\n provide: f => [\n showPanel.from(f, val => val.panel),\n // mergeDecorations 中合并了相同 severity 的 diagnostic 在编辑器中的下划线样式,以前会重复绘制下划线,现在只会绘制一次。\n EditorView.decorations.from(f, s => mergeDecorations(s.diagnostics)),\n ],\n});\n\n/// Returns the number of active lint diagnostics in the given state.\nexport function diagnosticCount(state: EditorState) {\n const lint = state.field(lintState, false);\n return lint ? lint.diagnostics.size : 0;\n}\n\nconst activeMark = Decoration.mark({\n class: 'cm-lintRange cm-lintRange-active',\n});\n\nfunction lintTooltip(view: EditorView, pos: number, side: -1 | 1) {\n const { diagnostics } = view.state.field(lintState);\n let found: Diagnostic[] = [],\n stackStart = 2e8,\n stackEnd = 0;\n diagnostics.between(\n pos - (side < 0 ? 1 : 0),\n pos + (side > 0 ? 1 : 0),\n (from, to, { spec }) => {\n if (\n pos >= from &&\n pos <= to &&\n (from == to || ((pos > from || side > 0) && (pos < to || side < 0)))\n ) {\n found.push(spec.diagnostic);\n stackStart = Math.min(from, stackStart);\n stackEnd = Math.max(to, stackEnd);\n }\n },\n );\n\n const diagnosticFilter = view.state.facet(lintConfig).tooltipFilter;\n if (diagnosticFilter) {\n found = diagnosticFilter(found, view.state);\n }\n\n if (!found.length) {\n return null;\n }\n\n return {\n pos: stackStart,\n end: stackEnd,\n above: view.state.doc.lineAt(stackStart).to < stackEnd,\n create() {\n return { dom: diagnosticsTooltip(view, found) };\n },\n };\n}\n\nfunction diagnosticsTooltip(\n view: EditorView,\n diagnostics: readonly Diagnostic[],\n) {\n return elt(\n 'ul',\n { class: 'cm-tooltip-lint' },\n diagnostics.map(d => renderDiagnostic(view, d, false)),\n );\n}\n\n/// Command to open and focus the lint panel.\nexport const openLintPanel: Command = (view: EditorView) => {\n const field = view.state.field(lintState, false);\n if (!field || !field.panel) {\n view.dispatch({\n effects: maybeEnableLint(view.state, [togglePanel.of(true)]),\n });\n }\n const panel = getPanel(view, LintPanel.open);\n if (panel) {\n (panel.dom.querySelector('.cm-panel-lint ul') as HTMLElement).focus();\n }\n return true;\n};\n\n/// Command to close the lint panel, when open.\nexport const closeLintPanel: Command = (view: EditorView) => {\n const field = view.state.field(lintState, false);\n if (!field || !field.panel) {\n return false;\n }\n view.dispatch({ effects: togglePanel.of(false) });\n return true;\n};\n\n/// Move the selection to the next diagnostic.\nexport const nextDiagnostic: Command = (view: EditorView) => {\n const field = view.state.field(lintState, false);\n if (!field) {\n return false;\n }\n const sel = view.state.selection.main;\n let next = field.diagnostics.iter(sel.to + 1);\n if (!next.value) {\n next = field.diagnostics.iter(0);\n if (!next.value || (next.from == sel.from && next.to == sel.to)) {\n return false;\n }\n }\n view.dispatch({\n selection: { anchor: next.from, head: next.to },\n scrollIntoView: true,\n });\n return true;\n};\n\n/// Move the selection to the previous diagnostic.\nexport const previousDiagnostic: Command = (view: EditorView) => {\n const { state } = view,\n field = state.field(lintState, false);\n if (!field) {\n return false;\n }\n const sel = state.selection.main;\n let prevFrom: number | undefined,\n prevTo: number | undefined,\n lastFrom: number | undefined,\n lastTo: number | undefined;\n field.diagnostics.between(0, state.doc.length, (from, to) => {\n if (to < sel.to && (prevFrom == null || prevFrom < from)) {\n prevFrom = from;\n prevTo = to;\n }\n if (lastFrom == null || from > lastFrom) {\n lastFrom = from;\n lastTo = to;\n }\n });\n if (lastFrom == null || (prevFrom == null && lastFrom == sel.from)) {\n return false;\n }\n view.dispatch({\n selection: { anchor: prevFrom ?? lastFrom, head: prevTo ?? lastTo },\n scrollIntoView: true,\n });\n return true;\n};\n\n/// A set of default key bindings for the lint functionality.\n///\n/// - Ctrl-Shift-m (Cmd-Shift-m on macOS): [`openLintPanel`](#lint.openLintPanel)\n/// - F8: [`nextDiagnostic`](#lint.nextDiagnostic)\nexport const lintKeymap: readonly KeyBinding[] = [\n { key: 'Mod-Shift-m', run: openLintPanel, preventDefault: true },\n { key: 'F8', run: nextDiagnostic },\n];\n\n/// The type of a function that produces diagnostics.\nexport type LintSource = (\n view: EditorView,\n) => readonly Diagnostic[] | Promise<readonly Diagnostic[]>;\n\nconst lintPlugin = ViewPlugin.fromClass(\n class {\n lintTime: number;\n timeout = -1;\n set = true;\n\n constructor(readonly view: EditorView) {\n const { delay } = view.state.facet(lintConfig);\n this.lintTime = Date.now() + delay;\n this.run = this.run.bind(this);\n this.timeout = window.setTimeout(this.run, delay);\n }\n\n run() {\n clearTimeout(this.timeout);\n const now = Date.now();\n if (now < this.lintTime - 10) {\n this.timeout = window.setTimeout(this.run, this.lintTime - now);\n } else {\n this.set = false;\n const { state } = this.view,\n { sources } = state.facet(lintConfig);\n if (sources.length) {\n Promise.all(\n sources.map(source => Promise.resolve(source(this.view))),\n ).then(\n annotations => {\n const all = annotations.reduce((a, b) => a.concat(b));\n if (this.view.state.doc == state.doc) {\n this.view.dispatch(setDiagnostics(this.view.state, all));\n }\n },\n error => {\n logException(this.view.state, error);\n },\n );\n }\n }\n }\n\n update(update: ViewUpdate) {\n const config = update.state.facet(lintConfig);\n if (\n update.docChanged ||\n config != update.startState.facet(lintConfig) ||\n (config.needsRefresh && config.needsRefresh(update))\n ) {\n this.lintTime = Date.now() + config.delay;\n if (!this.set) {\n this.set = true;\n this.timeout = window.setTimeout(this.run, config.delay);\n }\n }\n }\n\n force() {\n if (this.set) {\n this.lintTime = Date.now();\n this.run();\n }\n }\n\n destroy() {\n clearTimeout(this.timeout);\n }\n },\n);\n\nconst lintConfig = Facet.define<\n { source: LintSource | null; config: LintConfig },\n Required<LintConfig> & { sources: readonly LintSource[] }\n>({\n combine(input) {\n return {\n sources: input\n .map(i => i.source)\n .filter(x => x != null) as readonly LintSource[],\n ...combineConfig(\n input.map(i => i.config),\n {\n delay: 750,\n markerFilter: null,\n tooltipFilter: null,\n needsRefresh: null,\n hideOn: () => null,\n },\n {\n needsRefresh: (a, b) => (!a ? b : !b ? a : u => a(u) || b(u)),\n },\n ),\n };\n },\n});\n\n/// Given a diagnostic source, this function returns an extension that\n/// enables linting with that source. It will be called whenever the\n/// editor is idle (after its content changed). If `null` is given as\n/// source, this only configures the lint extension.\nexport function linter(\n source: LintSource | null,\n config: LintConfig = {},\n): Extension {\n return [lintConfig.of({ source, config }), lintPlugin, lintExtensions];\n}\n\n/// Forces any linters [configured](#lint.linter) to run when the\n/// editor is idle to run right away.\nexport function forceLinting(view: EditorView) {\n const plugin = view.plugin(lintPlugin);\n if (plugin) {\n plugin.force();\n }\n}\n\nfunction assignKeys(actions: readonly Action[] | undefined) {\n const assigned: string[] = [];\n if (actions) {\n actions: for (const { name } of actions) {\n for (let i = 0; i < name.length; i++) {\n const ch = name[i];\n if (\n /[a-zA-Z]/.test(ch) &&\n !assigned.some(c => c.toLowerCase() == ch.toLowerCase())\n ) {\n assigned.push(ch);\n continue actions;\n }\n }\n assigned.push('');\n }\n }\n return assigned;\n}\n\nfunction renderDiagnostic(\n view: EditorView,\n diagnostic: Diagnostic,\n inPanel: boolean,\n) {\n const keys = inPanel ? assignKeys(diagnostic.actions) : [];\n return elt(\n 'li',\n { class: `cm-diagnostic cm-diagnostic-${diagnostic.severity}` },\n elt(\n 'span',\n { class: 'cm-diagnosticText' },\n diagnostic.renderMessage\n ? diagnostic.renderMessage(view)\n : diagnostic.message,\n ),\n diagnostic.actions?.map((action, i) => {\n let fired = false;\n const click = (e: Event) => {\n e.preventDefault();\n if (fired) {\n return;\n }\n fired = true;\n const found = findDiagnostic(\n view.state.field(lintState).diagnostics,\n diagnostic,\n );\n if (found) {\n action.apply(view, found.from, found.to);\n }\n };\n const { name } = action,\n keyIndex = keys[i] ? name.indexOf(keys[i]) : -1;\n const nameElt =\n keyIndex < 0\n ? name\n : [\n name.slice(0, keyIndex),\n elt('u', name.slice(keyIndex, keyIndex + 1)),\n name.slice(keyIndex + 1),\n ];\n return elt(\n 'button',\n {\n type: 'button',\n class: 'cm-diagnosticAction',\n onclick: click,\n onmousedown: click,\n 'aria-label': ` Action: ${name}${keyIndex < 0 ? '' : ` (access key \"${keys[i]})\"`}.`,\n },\n nameElt,\n );\n }),\n diagnostic.source &&\n elt('div', { class: 'cm-diagnosticSource' }, diagnostic.source),\n );\n}\n\nclass DiagnosticWidget extends WidgetType {\n constructor(readonly diagnostic: Diagnostic) {\n super();\n }\n\n eq(other: DiagnosticWidget) {\n return other.diagnostic == this.diagnostic;\n }\n\n toDOM() {\n return elt('span', {\n class: `cm-lintPoint cm-lintPoint-${this.diagnostic.severity}`,\n });\n }\n}\n\nclass PanelItem {\n id = `item_${Math.floor(Math.random() * 0xffffffff).toString(16)}`;\n dom: HTMLElement;\n\n constructor(\n view: EditorView,\n readonly diagnostic: Diagnostic,\n ) {\n this.dom = renderDiagnostic(view, diagnostic, true);\n this.dom.id = this.id;\n this.dom.setAttribute('role', 'option');\n }\n}\n\nclass LintPanel implements Panel {\n items: PanelItem[] = [];\n dom: HTMLElement;\n list: HTMLElement;\n\n constructor(readonly view: EditorView) {\n const onkeydown = (event: KeyboardEvent) => {\n if (event.keyCode == 27) {\n // Escape\n closeLintPanel(this.view);\n this.view.focus();\n } else if (event.keyCode == 38 || event.keyCode == 33) {\n // ArrowUp, PageUp\n this.moveSelection(\n (this.selectedIndex - 1 + this.items.length) % this.items.length,\n );\n } else if (event.keyCode == 40 || event.keyCode == 34) {\n // ArrowDown, PageDown\n this.moveSelection((this.selectedIndex + 1) % this.items.length);\n } else if (event.keyCode == 36) {\n // Home\n this.moveSelection(0);\n } else if (event.keyCode == 35) {\n // End\n this.moveSelection(this.items.length - 1);\n } else if (event.keyCode == 13) {\n // Enter\n this.view.focus();\n } else if (\n event.keyCode >= 65 &&\n event.keyCode <= 90 &&\n this.selectedIndex >= 0\n ) {\n // A-Z\n const { diagnostic } = this.items[this.selectedIndex],\n keys = assignKeys(diagnostic.actions);\n for (let i = 0; i < keys.length; i++) {\n if (keys[i].toUpperCase().charCodeAt(0) == event.keyCode) {\n const found = findDiagnostic(\n this.view.state.field(lintState).diagnostics,\n diagnostic,\n );\n if (found) {\n diagnostic.actions![i].apply(view, found.from, found.to);\n }\n }\n }\n } else {\n return;\n }\n event.preventDefault();\n };\n const onclick = (event: MouseEvent) => {\n for (let i = 0; i < this.items.length; i++) {\n if (this.items[i].dom.contains(event.target as HTMLElement)) {\n this.moveSelection(i);\n }\n }\n };\n\n this.list = elt('ul', {\n tabIndex: 0,\n role: 'listbox',\n 'aria-label': this.view.state.phrase('Diagnostics'),\n onkeydown,\n onclick,\n });\n this.dom = elt(\n 'div',\n { class: 'cm-panel-lint' },\n this.list,\n elt(\n 'button',\n {\n type: 'button',\n name: 'close',\n 'aria-label': this.view.state.phrase('close'),\n onclick: () => closeLintPanel(this.view),\n },\n '×',\n ),\n );\n this.update();\n }\n\n get selectedIndex() {\n const { selected } = this.view.state.field(lintState);\n if (!selected) {\n return -1;\n }\n for (let i = 0; i < this.items.length; i++) {\n if (this.items[i].diagnostic == selected.diagnostic) {\n return i;\n }\n }\n return -1;\n }\n\n update() {\n const { diagnostics, selected } = this.view.state.field(lintState);\n let i = 0,\n needsSync = false,\n newSelectedItem: PanelItem | null = null;\n diagnostics.between(\n 0,\n this.view.state.doc.length,\n (_start, _end, { spec }) => {\n let found = -1,\n item;\n for (let j = i; j < this.items.length; j++) {\n if (this.items[j].diagnostic == spec.diagnostic) {\n found = j;\n break;\n }\n }\n if (found < 0) {\n item = new PanelItem(this.view, spec.diagnostic);\n this.items.splice(i, 0, item);\n needsSync = true;\n } else {\n item = this.items[found];\n if (found > i) {\n this.items.splice(i, found - i);\n needsSync = true;\n }\n }\n if (selected && item.diagnostic == selected.diagnostic) {\n if (!item.dom.hasAttribute('aria-selected')) {\n item.dom.setAttribute('aria-selected', 'true');\n newSelectedItem = item;\n }\n } else if (item.dom.hasAttribute('aria-selected')) {\n item.dom.removeAttribute('aria-selected');\n }\n i++;\n },\n );\n while (\n i < this.items.length &&\n !(this.items.length == 1 && this.items[0].diagnostic.from < 0)\n ) {\n needsSync = true;\n this.items.pop();\n }\n if (this.items.length == 0) {\n this.items.push(\n new PanelItem(this.view, {\n from: -1,\n to: -1,\n severity: 'info',\n message: this.view.state.phrase('No diagnostics'),\n }),\n );\n needsSync = true;\n }\n if (newSelectedItem) {\n this.list.setAttribute('aria-activedescendant', newSelectedItem!.id);\n this.view.requestMeasure({\n key: this,\n read: () => ({\n sel: newSelectedItem!.dom.getBoundingClientRect(),\n panel: this.list.getBoundingClientRect(),\n }),\n write: ({ sel, panel }) => {\n const scaleY = panel.height / this.list.offsetHeight;\n if (sel.top < panel.top) {\n this.list.scrollTop -= (panel.top - sel.top) / scaleY;\n } else if (sel.bottom > panel.bottom) {\n this.list.scrollTop += (sel.bottom - panel.bottom) / scaleY;\n }\n },\n });\n } else if (this.selectedIndex < 0) {\n this.list.removeAttribute('aria-activedescendant');\n }\n if (needsSync) {\n this.sync();\n }\n }\n\n sync() {\n let domPos: ChildNode | null = this.list.firstChild;\n function rm() {\n const prev = domPos!;\n domPos = prev.nextSibling;\n prev.remove();\n }\n\n for (const item of this.items) {\n if (item.dom.parentNode == this.list) {\n while (domPos != item.dom) {\n rm();\n }\n domPos = item.dom.nextSibling;\n } else {\n this.list.insertBefore(item.dom, domPos);\n }\n }\n while (domPos) {\n rm();\n }\n }\n\n moveSelection(selectedIndex: number) {\n if (this.selectedIndex < 0) {\n return;\n }\n const field = this.view.state.field(lintState);\n const selection = findDiagnostic(\n field.diagnostics,\n this.items[selectedIndex].diagnostic,\n );\n if (!selection) {\n return;\n }\n this.view.dispatch({\n selection: { anchor: selection.from, head: selection.to },\n scrollIntoView: true,\n effects: movePanelSelection.of(selection),\n });\n }\n\n static open(view: EditorView) {\n return new LintPanel(view);\n }\n}\n\nfunction svg(content: string, attrs = 'viewBox=\"0 0 40 40\"') {\n return `url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" ${attrs}>${encodeURIComponent(content)}</svg>')`;\n}\n\nfunction underline(color: string) {\n return svg(\n `<path d=\"m0 2.5 l2 -1.5 l1 0 l2 1.5 l1 0\" stroke=\"${color}\" fill=\"none\" stroke-width=\".7\"/>`,\n 'width=\"6\" height=\"3\"',\n );\n}\n\nconst baseTheme = EditorView.baseTheme({\n '.cm-diagnostic': {\n padding: '3px 6px 3px 8px',\n marginLeft: '-1px',\n display: 'block',\n whiteSpace: 'pre-wrap',\n },\n '.cm-diagnostic-error': { borderLeft: '5px solid #d11' },\n '.cm-diagnostic-warning': { borderLeft: '5px solid orange' },\n '.cm-diagnostic-info': { borderLeft: '5px solid #999' },\n '.cm-diagnostic-hint': { borderLeft: '5px solid #66d' },\n\n '.cm-diagnosticAction': {\n font: 'inherit',\n border: 'none',\n padding: '2px 4px',\n backgroundColor: '#444',\n color: 'white',\n borderRadius: '3px',\n marginLeft: '8px',\n cursor: 'pointer',\n },\n\n '.cm-diagnosticSource': {\n fontSize: '70%',\n opacity: 0.7,\n },\n\n '.cm-lintRange': {\n backgroundPosition: 'left bottom',\n backgroundRepeat: 'repeat-x',\n paddingBottom: '0.7px',\n },\n\n '.cm-lintRange-error': { backgroundImage: underline('#d11') },\n '.cm-lintRange-warning': { backgroundImage: underline('orange') },\n '.cm-lintRange-info': { backgroundImage: underline('#999') },\n '.cm-lintRange-hint': { backgroundImage: underline('#66d') },\n '.cm-lintRange-active': { backgroundColor: '#ffdd9980' },\n\n '.cm-tooltip-lint': {\n padding: 0,\n margin: 0,\n },\n\n '.cm-lintPoint': {\n position: 'relative',\n\n '&:after': {\n content: '\"\"',\n position: 'absolute',\n bottom: 0,\n left: '-2px',\n borderLeft: '3px solid transparent',\n borderRight: '3px solid transparent',\n borderBottom: '4px solid #d11',\n },\n },\n\n '.cm-lintPoint-warning': {\n '&:after': { borderBottomColor: 'orange' },\n },\n '.cm-lintPoint-info': {\n '&:after': { borderBottomColor: '#999' },\n },\n '.cm-lintPoint-hint': {\n '&:after': { borderBottomColor: '#66d' },\n },\n\n '.cm-panel.cm-panel-lint': {\n position: 'relative',\n '& ul': {\n maxHeight: '100px',\n overflowY: 'auto',\n '& [aria-selected]': {\n backgroundColor: '#ddd',\n '& u': { textDecoration: 'underline' },\n },\n '&:focus [aria-selected]': {\n background_fallback: '#bdf',\n backgroundColor: 'Highlight',\n color_fallback: 'white',\n color: 'HighlightText',\n },\n '& u': { textDecoration: 'none' },\n padding: 0,\n margin: 0,\n },\n '& [name=close]': {\n position: 'absolute',\n top: '0',\n right: '2px',\n background: 'inherit',\n border: 'none',\n font: 'inherit',\n padding: 0,\n margin: 0,\n },\n },\n});\n\nfunction severityWeight(sev: Severity) {\n return sev == 'error' ? 4 : sev == 'warning' ? 3 : sev == 'info' ? 2 : 1;\n}\n\nclass LintGutterMarker extends GutterMarker {\n severity: Severity;\n constructor(readonly diagnostics: readonly Diagnostic[]) {\n super();\n this.severity = diagnostics.reduce(\n (max, d) =>\n severityWeight(max) < severityWeight(d.severity) ? d.severity : max,\n 'hint' as Severity,\n );\n }\n\n toDOM(view: EditorView) {\n const elt = document.createElement('div');\n elt.className = `cm-lint-marker cm-lint-marker-${this.severity}`;\n\n let { diagnostics } = this;\n const diagnosticsFilter = view.state.facet(lintGutterConfig).tooltipFilter;\n if (diagnosticsFilter) {\n diagnostics = diagnosticsFilter(diagnostics, view.state);\n }\n\n if (diagnostics.length) {\n elt.onmouseover = () => gutterMarkerMouseOver(view, elt, diagnostics);\n }\n\n return elt;\n }\n}\n\nconst enum Hover {\n Time = 300,\n Margin = 10,\n}\n\nfunction trackHoverOn(view: EditorView, marker: HTMLElement) {\n const mousemove = (event: MouseEvent) => {\n const rect = marker.getBoundingClientRect();\n if (\n event.clientX > rect.left - Hover.Margin &&\n event.clientX < rect.right + Hover.Margin &&\n event.clientY > rect.top - Hover.Margin &&\n event.clientY < rect.bottom + Hover.Margin\n ) {\n return;\n }\n for (\n let target = event.target as Node | null;\n target;\n target = target.parentNode\n ) {\n if (\n target.nodeType == 1 &&\n (target as HTMLElement).classList.contains('cm-tooltip-lint')\n ) {\n return;\n }\n }\n window.removeEventListener('mousemove', mousemove);\n if (view.state.field(lintGutterTooltip)) {\n view.dispatch({ effects: setLintGutterTooltip.of(null) });\n }\n };\n window.addEventListener('mousemove', mousemove);\n}\n\nfunction gutterMarkerMouseOver(\n view: EditorView,\n marker: HTMLElement,\n diagnostics: readonly Diagnostic[],\n) {\n function hovered() {\n const line = view.elementAtHeight(\n marker.getBoundingClientRect().top + 5 - view.documentTop,\n );\n const linePos = view.coordsAtPos(line.from);\n if (linePos) {\n view.dispatch({\n effects: setLintGutterTooltip.of({\n pos: line.from,\n above: false,\n create() {\n return {\n dom: diagnosticsTooltip(view, diagnostics),\n getCoords: () => marker.getBoundingClientRect(),\n };\n },\n }),\n });\n }\n marker.onmouseout = marker.onmousemove = null;\n trackHoverOn(view, marker);\n }\n\n const { hoverTime } = view.state.facet(lintGutterConfig);\n\n let hoverTimeout = setTimeout(hovered, hoverTime);\n marker.onmouseout = () => {\n clearTimeout(hoverTimeout);\n marker.onmouseout = marker.onmousemove = null;\n };\n marker.onmousemove = () => {\n clearTimeout(hoverTimeout);\n hoverTimeout = setTimeout(hovered, hoverTime);\n };\n}\n\nfunction markersForDiagnostics(doc: Text, diagnostics: readonly Diagnostic[]) {\n const byLine: { [line: number]: Diagnostic[] } = Object.create(null);\n for (const diagnostic of diagnostics) {\n const line = doc.lineAt(diagnostic.from);\n (byLine[line.from] || (byLine[line.from] = [])).push(diagnostic);\n }\n const markers: Range<GutterMarker>[] = [];\n for (const line in byLine) {\n markers.push(new LintGutterMarker(byLine[line]).range(+line));\n }\n return RangeSet.of(markers, true);\n}\n\nconst lintGutterExtension = gutter({\n class: 'cm-gutter-lint',\n markers: view => view.state.field(lintGutterMarkers),\n});\n\nconst lintGutterMarkers = StateField.define<RangeSet<GutterMarker>>({\n create() {\n return RangeSet.empty;\n },\n update(markers, tr) {\n markers = markers.map(tr.changes);\n const diagnosticFilter = tr.state.facet(lintGutterConfig).markerFilter;\n for (const effect of tr.effects) {\n if (effect.is(setDiagnosticsEffect)) {\n let diagnostics = effect.value;\n if (diagnosticFilter) {\n diagnostics = diagnosticFilter(diagnostics || [], tr.state);\n }\n markers = markersForDiagnostics(tr.state.doc, diagnostics.slice(0));\n }\n }\n return markers;\n },\n});\n\nconst setLintGutterTooltip = StateEffect.define<Tooltip | null>();\n\nconst lintGutterTooltip = StateField.define<Tooltip | null>({\n create() {\n return null;\n },\n update(tooltip, tr) {\n if (tooltip && tr.docChanged) {\n tooltip = hideTooltip(tr, tooltip)\n ? null\n : { ...tooltip, pos: tr.changes.mapPos(tooltip.pos) };\n }\n return tr.effects.reduce(\n (t, e) => (e.is(setLintGutterTooltip) ? e.value : t),\n tooltip,\n );\n },\n provide: field => showTooltip.from(field),\n});\n\nconst lintGutterTheme = EditorView.baseTheme({\n '.cm-gutter-lint': {\n width: '1.4em',\n '& .cm-gutterElement': {\n padding: '.2em',\n },\n },\n '.cm-lint-marker': {\n width: '1em',\n height: '1em',\n },\n '.cm-lint-marker-info': {\n content: svg(\n '<path fill=\"#aaf\" stroke=\"#77e\" stroke-width=\"6\" stroke-linejoin=\"round\" d=\"M5 5L35 5L35 35L5 35Z\"/>',\n ),\n },\n '.cm-lint-marker-warning': {\n content: svg(\n '<path fill=\"#fe8\" stroke=\"#fd7\" stroke-width=\"6\" stroke-linejoin=\"round\" d=\"M20 6L37 35L3 35Z\"/>',\n ),\n },\n '.cm-lint-marker-error': {\n content: svg(\n '<circle cx=\"20\" cy=\"20\" r=\"15\" fill=\"#f87\" stroke=\"#f43\" stroke-width=\"6\"/>',\n ),\n },\n});\n\nconst lintExtensions = [\n lintState,\n EditorView.decorations.compute([lintState], state => {\n const { selected, panel } = state.field(lintState);\n return !selected || !panel || selected.from == selected.to\n ? Decoration.none\n : Decoration.set([activeMark.range(selected.from, selected.to)]);\n }),\n hoverTooltip(lintTooltip, { hideOn: hideTooltip }),\n baseTheme,\n];\n\nconst lintGutterConfig = Facet.define<\n LintGutterConfig,\n Required<LintGutterConfig>\n>({\n combine(configs) {\n return combineConfig(configs, {\n hoverTime: Hover.Time,\n markerFilter: null,\n tooltipFilter: null,\n });\n },\n});\n\n/// Returns an extension that installs a gutter showing markers for\n/// each line that has diagnostics, which can be hovered over to see\n/// the diagnostics.\nexport function lintGutter(config: LintGutterConfig = {}): Extension {\n return [\n lintGutterConfig.of(config),\n lintGutterMarkers,\n lintGutterExtension,\n lintGutterTheme,\n lintGutterTooltip,\n ];\n}\n\n/// Iterate over the marked diagnostics for the given editor state,\n/// calling `f` for each of them. Note that, if the document changed\n/// since the diagnostics were created, the `Diagnostic` object will\n/// hold the original outdated position, whereas the `to` and `from`\n/// arguments hold the diagnostic's current position.\nexport function forEachDiagnostic(\n state: EditorState,\n f: (d: Diagnostic, from: number, to: number) => void,\n) {\n const lState = state.field(lintState, false);\n if (lState && lState.diagnostics.size) {\n for (\n let iter = RangeSet.iter([lState.diagnostics]);\n iter.value;\n iter.next()\n ) {\n f(iter.value.spec.diagnostic, iter.from, iter.to);\n }\n }\n}\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { Decoration, type DecorationSet } from '@codemirror/view';\nimport { type Range } from '@codemirror/state';\n\nimport { type Diagnostic, type Severity } from './index';\n\nconst splitDiagnosticBySeverity = (decorations: DecorationSet) => {\n const diagnosticMap = new Map<Severity, Diagnostic[]>();\n const decoration = decorations.iter();\n\n while (decoration.value) {\n const { severity } = decoration.value.spec.diagnostic;\n\n if (!diagnosticMap.has(severity)) {\n diagnosticMap.set(severity, []);\n }\n\n diagnosticMap.get(severity)!.push(decoration.value.spec.diagnostic);\n\n decoration.next();\n }\n\n return diagnosticMap;\n};\n\nconst createDecoration = (\n from: number,\n to: number,\n severity: Severity,\n diagnostics: Diagnostic[],\n) => {\n const last = diagnostics[diagnostics.length - 1];\n\n return Decoration.mark({\n attributes: {\n class: `cm-lintRange cm-lintRange-${\n severity\n }${last.markClass ? ` ${last.markClass}` : ''}`,\n },\n sourceDiagnostics: diagnostics,\n }).range(from, to);\n};\n\ninterface MergedDiagnostic extends Partial<Diagnostic> {\n sourceDiagnostics: Diagnostic[];\n}\n\nconst mergeDecoration = (diagnostics: Diagnostic[]): MergedDiagnostic[] => {\n const cloned = diagnostics.map(e => ({\n from: e.from,\n to: e.to,\n }));\n\n const merged: MergedDiagnostic[] = [];\n\n cloned.sort((a, b) => a.from - b.from);\n\n let current = cloned[0];\n let currentSourceDiagnostics: Diagnostic[] = [diagnostics[0]];\n\n for (let i = 1; i < cloned.length; i++) {\n const next = cloned[i];\n\n if (next.from <= current.to) {\n currentSourceDiagnostics.push(diagnostics[i]);\n current.to = Math.max(current.to, next.to);\n } else {\n merged.push({ ...current, sourceDiagnostics: currentSourceDiagnostics });\n current = next;\n currentSourceDiagnostics = [diagnostics[i]];\n }\n }\n\n merged.push({ ...current, sourceDiagnostics: currentSourceDiagnostics });\n\n return merged;\n};\n\nexport const mergeDecorations = (decorations: DecorationSet): DecorationSet => {\n try {\n const diagnosticMap = splitDiagnosticBySeverity(decorations);\n const merge: Range<Decoration>[] = [];\n\n diagnosticMap.forEach((value, key) => {\n mergeDecoration(value).forEach(diagnostic => {\n if (\n typeof diagnostic.from !== 'number' ||\n typeof diagnostic.to !== 'number'\n ) {\n return;\n }\n if (diagnostic.from < diagnostic.to) {\n merge.push(\n createDecoration(\n diagnostic.from,\n diagnostic.to,\n key,\n diagnostic.sourceDiagnostics,\n ),\n );\n }\n });\n });\n\n merge.sort((a, b) => {\n if (a.from !== b.from) {\n return a.from - b.from;\n }\n\n return a.value.startSide - b.value.startSide;\n });\n\n return Decoration.set(merge);\n } catch (e) {\n console.error('linter mergeDecorations error', e);\n return decorations;\n }\n};\n"],"mappings":"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","names":["import_view","elt"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coze-editor/extension-lint",
3
- "version": "0.1.0-alpha.37c297",
3
+ "version": "0.1.0-alpha.577152",
4
4
  "description": "extension-lint",
5
5
  "license": "MIT",
6
6
  "author": "fengzilong",