@coze-editor/extensions 0.1.0-alpha.0fd19e

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/index.js ADDED
@@ -0,0 +1,1305 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/index.ts
20
+ var index_exports = {};
21
+ __export(index_exports, {
22
+ FocusableWidget: () => FocusableWidget,
23
+ SelectionSide: () => SelectionSide,
24
+ astDebugger: () => astDebugger,
25
+ astDecorator: () => astDecorator,
26
+ autoSelectRanges: () => rangesFacet,
27
+ autoSelectUserEvent: () => selectUserEvent,
28
+ backgroundDecorations: () => backgroundDecorations,
29
+ colorizationBrackets: () => colorizationBrackets,
30
+ deletionEnlarger: () => deletionEnlarger,
31
+ elementAtPosition: () => elementAtPosition,
32
+ focusableKeymap: () => focusableKeymap,
33
+ indentGuides: () => indentGuides,
34
+ inputRules: () => inputRules,
35
+ matchingBrackets: () => matchingBrackets,
36
+ mergeableMarkers: () => mergeableMarkers,
37
+ mixLanguages: () => mixLanguages,
38
+ positionElementLayer: () => positionElementLayer,
39
+ scrollBeyondLastLine: () => scrollBeyondLastLine,
40
+ selectionEnlarger: () => selectionEnlarger,
41
+ updateWholeDecorations: () => updateWholeDecorations
42
+ });
43
+ module.exports = __toCommonJS(index_exports);
44
+
45
+ // src/ast-decorator/whole.ts
46
+ var import_es_toolkit = require("es-toolkit");
47
+ var import_utils = require("@coze-editor/utils");
48
+ var import_view2 = require("@codemirror/view");
49
+ var import_state2 = require("@codemirror/state");
50
+ var import_language = require("@codemirror/language");
51
+
52
+ // src/background-decorations/index.ts
53
+ var import_view = require("@codemirror/view");
54
+ var import_state = require("@codemirror/state");
55
+
56
+ // src/background-decorations/squash.ts
57
+ function squash(decorations) {
58
+ const result = [];
59
+ const grouped = groupDecorationsByClassName(decorations);
60
+ grouped.forEach((decos, className) => {
61
+ const merged = mergeIntervals(decos);
62
+ result.push(
63
+ ...merged.map((m) => ({
64
+ from: m.start,
65
+ to: m.end,
66
+ className
67
+ }))
68
+ );
69
+ });
70
+ return result;
71
+ }
72
+ function groupDecorationsByClassName(decorations) {
73
+ const map = /* @__PURE__ */ new Map();
74
+ decorations.forEach((deco) => {
75
+ if (!map.has(deco.className)) {
76
+ map.set(deco.className, []);
77
+ }
78
+ map.get(deco.className).push(deco);
79
+ });
80
+ return map;
81
+ }
82
+ function mergeIntervals(decorations) {
83
+ const merged = [];
84
+ const cloned = decorations.map((deco) => ({
85
+ start: deco.from,
86
+ end: deco.to
87
+ }));
88
+ cloned.sort((a, b) => a.start - b.start);
89
+ let current = cloned[0];
90
+ for (let i = 1; i < cloned.length; i++) {
91
+ const next = cloned[i];
92
+ if (next.start <= current.end) {
93
+ current.end = Math.max(current.end, next.end);
94
+ } else {
95
+ merged.push(current);
96
+ current = next;
97
+ }
98
+ }
99
+ merged.push(current);
100
+ return merged;
101
+ }
102
+
103
+ // src/background-decorations/cut.ts
104
+ function cutAtLineBreak(decorations, state) {
105
+ const cuts = [];
106
+ decorations.forEach((deco) => {
107
+ const startLine = state.doc.lineAt(deco.from);
108
+ const endLine = state.doc.lineAt(deco.to);
109
+ if (startLine.number !== endLine.number) {
110
+ const slices = [];
111
+ let pos = deco.from;
112
+ for (let i = startLine.number; i < endLine.number; i++) {
113
+ const line = state.doc.line(i);
114
+ slices.push({
115
+ from: pos,
116
+ to: line.to,
117
+ className: deco.className
118
+ });
119
+ pos = line.to + 1;
120
+ }
121
+ slices.push({
122
+ from: pos,
123
+ to: deco.to,
124
+ className: deco.className
125
+ });
126
+ cuts.push(...slices);
127
+ } else {
128
+ cuts.push(deco);
129
+ }
130
+ });
131
+ return cuts;
132
+ }
133
+
134
+ // src/background-decorations/index.ts
135
+ function configChanged(update) {
136
+ return update.startState.facet(backgroundDecorations) !== update.state.facet(backgroundDecorations);
137
+ }
138
+ var backgroundDecoratorLayer = (0, import_view.layer)({
139
+ above: false,
140
+ markers(view) {
141
+ const decorations = view.state.facet(backgroundDecorations).reduce((memo, current) => [...memo, ...current(view)], []);
142
+ return cutAtLineBreak(squash(decorations), view.state).map(
143
+ (deco) => import_view.RectangleMarker.forRange(
144
+ view,
145
+ deco.className,
146
+ import_state.EditorSelection.range(deco.from, deco.to)
147
+ )
148
+ ).reduce((memo, current) => [...memo, ...current], []);
149
+ },
150
+ update(update) {
151
+ return update.focusChanged || update.docChanged || update.selectionSet || update.viewportChanged || configChanged(update);
152
+ },
153
+ class: "cm-backgroundDecoratorLayer"
154
+ });
155
+ var backgroundDecorations = import_state.Facet.define({
156
+ enables: [backgroundDecoratorLayer]
157
+ });
158
+
159
+ // src/ast-decorator/whole.ts
160
+ var updateWholeDecorationsEffect = import_state2.StateEffect.define();
161
+ function updateWholeDecorations(view) {
162
+ view.dispatch({
163
+ effects: updateWholeDecorationsEffect.of(null)
164
+ });
165
+ }
166
+ var classNameDecorationCache = /* @__PURE__ */ new Map();
167
+ function getClassDecoration(className) {
168
+ if (!classNameDecorationCache.has(className)) {
169
+ classNameDecorationCache.set(
170
+ className,
171
+ import_view2.Decoration.mark({
172
+ class: className
173
+ })
174
+ );
175
+ }
176
+ return classNameDecorationCache.get(className);
177
+ }
178
+ function buildDecorations(state, tree) {
179
+ const decorates = state.facet(wholeASTDecoratorFacet) ?? [];
180
+ const treeCursor = tree.cursor();
181
+ const decorations = {
182
+ highest: import_view2.Decoration.none,
183
+ high: import_view2.Decoration.none,
184
+ default: import_view2.Decoration.none,
185
+ low: import_view2.Decoration.none,
186
+ lowest: import_view2.Decoration.none
187
+ };
188
+ let atomicRanges = import_state2.RangeSet.empty;
189
+ let backgroundDecorations2 = [];
190
+ const from = 0;
191
+ const to = state.doc.length;
192
+ (0, import_utils.traverseAST)(treeCursor, from, to, (cursor) => {
193
+ decorates.forEach((decorate) => {
194
+ const decorationSpec = decorate(cursor, state);
195
+ let specs = [];
196
+ if (Array.isArray(decorationSpec)) {
197
+ specs = decorationSpec;
198
+ } else if (decorationSpec) {
199
+ specs = [decorationSpec];
200
+ }
201
+ specs.forEach((spec) => {
202
+ const result = updateDecorationSpec(cursor, spec, {
203
+ decorations,
204
+ backgroundDecorations: backgroundDecorations2,
205
+ atomicRanges
206
+ });
207
+ if (!result) {
208
+ return;
209
+ }
210
+ backgroundDecorations2 = result.backgroundDecorations;
211
+ atomicRanges = result.atomicRanges;
212
+ });
213
+ });
214
+ });
215
+ return {
216
+ decorations,
217
+ atomicRanges,
218
+ backgroundDecorations: backgroundDecorations2
219
+ };
220
+ }
221
+ function updateDecorationSpec(cursor, decorationSpec, {
222
+ decorations,
223
+ backgroundDecorations: backgroundDecorations2,
224
+ atomicRanges
225
+ }) {
226
+ if (!decorationSpec) {
227
+ return;
228
+ }
229
+ const from = decorationSpec.from ?? cursor.from;
230
+ const to = decorationSpec.to ?? cursor.to;
231
+ const omitKeys = ["type", "from", "to", "atomicRange"];
232
+ let decorationRange = null;
233
+ switch (decorationSpec.type) {
234
+ case "className":
235
+ decorationRange = from === to ? null : getClassDecoration(decorationSpec.className).range(from, to);
236
+ break;
237
+ case "replace":
238
+ decorationRange = import_view2.Decoration.replace(
239
+ (0, import_es_toolkit.omit)(decorationSpec, omitKeys)
240
+ ).range(from, to);
241
+ break;
242
+ case "widget":
243
+ decorationRange = import_view2.Decoration.widget((0, import_es_toolkit.omit)(decorationSpec, omitKeys)).range(
244
+ from
245
+ );
246
+ break;
247
+ case "background":
248
+ backgroundDecorations2.push({
249
+ from: decorationSpec.from ?? cursor.from,
250
+ to: decorationSpec.to ?? cursor.to,
251
+ className: decorationSpec.className
252
+ });
253
+ break;
254
+ }
255
+ if (decorationRange) {
256
+ const prec = decorationSpec.type === "className" ? decorationSpec.prec ?? "default" : "default";
257
+ if (decorations[prec]) {
258
+ decorations[prec] = decorations[prec].update({
259
+ add: [decorationRange],
260
+ sort: true
261
+ });
262
+ }
263
+ }
264
+ if (decorationSpec.type !== "background" && decorationRange && decorationSpec.atomicRange === true) {
265
+ atomicRanges = atomicRanges.update({
266
+ add: [decorationRange],
267
+ sort: true
268
+ });
269
+ }
270
+ return {
271
+ decorations,
272
+ backgroundDecorations: backgroundDecorations2,
273
+ atomicRanges
274
+ };
275
+ }
276
+ var decorateField = import_state2.StateField.define({
277
+ create(state) {
278
+ return buildDecorations(state, (0, import_language.syntaxTree)(state));
279
+ },
280
+ update(value, tr) {
281
+ const tree = (0, import_language.syntaxTree)(tr.state);
282
+ const hasUpdateEffect = tr.effects.some(
283
+ (effect) => effect.is(updateWholeDecorationsEffect)
284
+ );
285
+ const syntaxTreeChanged = (0, import_language.syntaxTree)(tr.startState) !== tree;
286
+ if (syntaxTreeChanged || hasUpdateEffect) {
287
+ value = buildDecorations(tr.state, tree);
288
+ }
289
+ return value;
290
+ },
291
+ provide(field) {
292
+ return [
293
+ import_state2.Prec.highest(
294
+ import_view2.EditorView.decorations.compute(
295
+ [field],
296
+ (state) => state.field(field).decorations.highest
297
+ )
298
+ ),
299
+ import_state2.Prec.high(
300
+ import_view2.EditorView.decorations.compute(
301
+ [field],
302
+ (state) => state.field(field).decorations.high
303
+ )
304
+ ),
305
+ import_state2.Prec.default(
306
+ import_view2.EditorView.decorations.compute(
307
+ [field],
308
+ (state) => state.field(field).decorations.default
309
+ )
310
+ ),
311
+ import_state2.Prec.low(
312
+ import_view2.EditorView.decorations.compute(
313
+ [field],
314
+ (state) => state.field(field).decorations.low
315
+ )
316
+ ),
317
+ import_state2.Prec.lowest(
318
+ import_view2.EditorView.decorations.compute(
319
+ [field],
320
+ (state) => state.field(field).decorations.lowest
321
+ )
322
+ ),
323
+ import_view2.EditorView.atomicRanges.of((view) => view.state.field(field).atomicRanges),
324
+ backgroundDecorations.of(
325
+ (view) => view.state.field(field).backgroundDecorations
326
+ )
327
+ ];
328
+ }
329
+ });
330
+ var wholeASTDecoratorFacet = import_state2.Facet.define({
331
+ enables: [decorateField, backgroundDecoratorLayer]
332
+ });
333
+
334
+ // src/ast-decorator/cursor.ts
335
+ var import_view3 = require("@codemirror/view");
336
+ var import_state3 = require("@codemirror/state");
337
+ var import_language2 = require("@codemirror/language");
338
+ var CursorASTView = class {
339
+ constructor(view) {
340
+ this.view = view;
341
+ }
342
+ classNameDecorationCache = /* @__PURE__ */ new Map();
343
+ decorations = import_view3.Decoration.none;
344
+ backgroundDecorations = [];
345
+ getClassDecoration(className) {
346
+ if (!this.classNameDecorationCache.has(className)) {
347
+ this.classNameDecorationCache.set(
348
+ className,
349
+ import_view3.Decoration.mark({
350
+ class: className
351
+ })
352
+ );
353
+ }
354
+ return this.classNameDecorationCache.get(className);
355
+ }
356
+ update(update) {
357
+ if (update.focusChanged && update.view.hasFocus || !update.startState.selection.eq(update.state.selection)) {
358
+ const tree = (0, import_language2.syntaxTree)(update.state);
359
+ const pos = update.state.selection.main.head;
360
+ const decorators = update.state.facet(cursorASTDecoratorFacet);
361
+ const cursor = tree.cursorAt(pos, 0);
362
+ const builder = new import_state3.RangeSetBuilder();
363
+ const bgDecorations = [];
364
+ do {
365
+ decorators.forEach((decorator) => {
366
+ const decorationSpec = decorator(cursor, update.state);
367
+ if (!decorationSpec) {
368
+ return;
369
+ }
370
+ let decoration;
371
+ switch (decorationSpec.type) {
372
+ case "className":
373
+ decoration = this.getClassDecoration(decorationSpec.className);
374
+ break;
375
+ case "background":
376
+ bgDecorations.push({
377
+ from: decorationSpec.from ?? cursor.from,
378
+ to: decorationSpec.to ?? cursor.to,
379
+ className: decorationSpec.className
380
+ });
381
+ break;
382
+ }
383
+ if (decoration) {
384
+ builder.add(
385
+ decorationSpec.from ?? cursor.from,
386
+ decorationSpec.to ?? cursor.to,
387
+ decoration
388
+ );
389
+ }
390
+ });
391
+ } while (cursor.parent());
392
+ this.decorations = builder.finish();
393
+ this.backgroundDecorations = bgDecorations;
394
+ }
395
+ if (update.focusChanged && !update.view.hasFocus) {
396
+ this.decorations = import_view3.Decoration.none;
397
+ this.backgroundDecorations = [];
398
+ }
399
+ }
400
+ };
401
+ var cursorASTDecoratorFacet = import_state3.Facet.define({
402
+ enables: [
403
+ import_view3.ViewPlugin.fromClass(CursorASTView, {
404
+ decorations: (v) => v.decorations,
405
+ provide(plugin) {
406
+ return [
407
+ backgroundDecorations.of(
408
+ (view) => {
409
+ var _a;
410
+ return ((_a = view.plugin(plugin)) == null ? void 0 : _a.backgroundDecorations) ?? [];
411
+ }
412
+ )
413
+ ];
414
+ }
415
+ })
416
+ ]
417
+ });
418
+
419
+ // src/ast-decorator/index.ts
420
+ var astDecorator = {
421
+ whole: wholeASTDecoratorFacet,
422
+ fromCursor: cursorASTDecoratorFacet
423
+ };
424
+
425
+ // src/ast-debugger/index.ts
426
+ var import_utils2 = require("@coze-editor/utils");
427
+ var import_view4 = require("@codemirror/view");
428
+ var import_language3 = require("@codemirror/language");
429
+ var astDebugger = import_view4.ViewPlugin.fromClass(
430
+ class {
431
+ constructor(view) {
432
+ printTreeFromState(view.state);
433
+ }
434
+ update(update) {
435
+ if (update.docChanged) {
436
+ printTreeFromState(update.state);
437
+ }
438
+ }
439
+ }
440
+ );
441
+ function printTreeFromState(state) {
442
+ const tree = (0, import_language3.syntaxTree)(state);
443
+ console.groupCollapsed("Syntax Tree");
444
+ const cursor = tree.cursor();
445
+ (0, import_utils2.traverseAST)(cursor, 0, tree.length, (cursor2) => {
446
+ console.group(
447
+ `%c${cursor2.name}(${cursor2.from}:${cursor2.to})`,
448
+ "color: purple;"
449
+ );
450
+ console.log(state.sliceDoc(cursor2.from, cursor2.to));
451
+ console.groupEnd();
452
+ });
453
+ console.groupEnd();
454
+ }
455
+
456
+ // src/focusable/focusable.ts
457
+ var import_view5 = require("@codemirror/view");
458
+ var focusableKeymap = import_view5.keymap.of([
459
+ {
460
+ key: "ArrowLeft",
461
+ run(view) {
462
+ const mainSelection = view.state.selection.main;
463
+ if (!mainSelection.empty) {
464
+ return false;
465
+ }
466
+ let handled = false;
467
+ const pos = mainSelection.from;
468
+ for (const line of view.docView.children) {
469
+ for (const child of line.children) {
470
+ if (child.isWidget && child.widget instanceof FocusableWidget && child.posAtEnd === pos) {
471
+ child.widget.focus(1);
472
+ handled = true;
473
+ }
474
+ }
475
+ if (handled) {
476
+ break;
477
+ }
478
+ }
479
+ return handled;
480
+ }
481
+ },
482
+ {
483
+ key: "ArrowRight",
484
+ run(view) {
485
+ const mainSelection = view.state.selection.main;
486
+ if (!mainSelection.empty) {
487
+ return false;
488
+ }
489
+ let handled = false;
490
+ const pos = mainSelection.from;
491
+ for (const line of view.docView.children) {
492
+ for (const child of line.children) {
493
+ if (child.isWidget && child.widget instanceof FocusableWidget && child.posAtStart === pos) {
494
+ child.widget.focus(-1);
495
+ handled = true;
496
+ break;
497
+ }
498
+ }
499
+ if (handled) {
500
+ break;
501
+ }
502
+ }
503
+ return handled;
504
+ }
505
+ }
506
+ ]);
507
+ var FocusableWidget = class extends import_view5.WidgetType {
508
+ };
509
+
510
+ // src/auto-select-ranges/extension.ts
511
+ var import_utils3 = require("@coze-editor/utils");
512
+ var import_view6 = require("@codemirror/view");
513
+ var import_state4 = require("@codemirror/state");
514
+
515
+ // src/auto-select-ranges/utils.ts
516
+ function mergeIntervals2(ranges) {
517
+ if (ranges.length === 0) {
518
+ return [];
519
+ }
520
+ const merged = [];
521
+ const cloned = ranges.map((range2) => ({
522
+ from: range2.from,
523
+ to: range2.to
524
+ }));
525
+ cloned.sort((a, b) => a.from - b.from);
526
+ let current = cloned[0];
527
+ for (let i = 1; i < cloned.length; i++) {
528
+ const next = cloned[i];
529
+ if (next.from <= current.to) {
530
+ current.to = Math.max(current.to, next.to);
531
+ } else {
532
+ merged.push(current);
533
+ current = next;
534
+ }
535
+ }
536
+ if (current) {
537
+ merged.push(current);
538
+ }
539
+ return merged;
540
+ }
541
+ function findContainingRange(ranges, pos) {
542
+ for (const range2 of ranges) {
543
+ if (pos >= range2.from && pos <= range2.to) {
544
+ return range2;
545
+ }
546
+ }
547
+ }
548
+
549
+ // src/auto-select-ranges/extension.ts
550
+ var extension = import_view6.ViewPlugin.fromClass(
551
+ class {
552
+ lastFocus = false;
553
+ constructor(view) {
554
+ this.lastFocus = view.hasFocus;
555
+ }
556
+ update(update) {
557
+ const userEvent = update.state.facet(selectUserEvent) ?? "select";
558
+ const hasSelectUserEvent = update.transactions.some(
559
+ (tr) => tr.isUserEvent(userEvent)
560
+ );
561
+ if (hasSelectUserEvent) {
562
+ const lastHasFocus = this.lastFocus;
563
+ const startSelection = update.startState.selection;
564
+ const { selection } = update.state;
565
+ const rangesProviders = update.state.facet(rangesFacet);
566
+ const ranges = mergeIntervals2(
567
+ (0, import_utils3.flatten)(
568
+ rangesProviders.map((provider) => provider(update.view.state))
569
+ ).filter(Boolean)
570
+ );
571
+ const currentRange = findContainingRange(ranges, selection.main.from);
572
+ if (selection.main.empty && currentRange && (!lastHasFocus || // 上一次的选区 from 或 to 在当前选区外(“首次进入”当前选区)
573
+ findContainingRange(ranges, startSelection.main.from) !== currentRange || findContainingRange(ranges, startSelection.main.to) !== currentRange)) {
574
+ queueMicrotask(() => {
575
+ update.view.dispatch({
576
+ selection: selection.replaceRange(
577
+ import_state4.EditorSelection.range(currentRange.from, currentRange.to)
578
+ )
579
+ });
580
+ });
581
+ }
582
+ }
583
+ if (this.lastFocus !== update.view.hasFocus) {
584
+ this.lastFocus = update.view.hasFocus;
585
+ }
586
+ }
587
+ }
588
+ );
589
+ var rangesFacet = import_state4.Facet.define({
590
+ enables: extension
591
+ });
592
+ var selectUserEvent = import_state4.Facet.define({
593
+ combine: import_utils3.FacetCombineStrategy.Last
594
+ });
595
+
596
+ // src/selection-enlarger/extension.ts
597
+ var import_utils5 = require("@coze-editor/utils");
598
+ var import_state5 = require("@codemirror/state");
599
+ var extension2 = import_state5.EditorState.transactionFilter.of((tr) => {
600
+ if (tr.docChanged || tr.newSelection.eq(tr.startState.selection)) {
601
+ return tr;
602
+ }
603
+ const providers = tr.startState.facet(selectionEnlarger);
604
+ const specs = (0, import_utils5.flatten)(providers.map((provider) => provider(tr.startState)));
605
+ let { newSelection } = tr;
606
+ newSelection.ranges.forEach((range2, index) => {
607
+ for (const spec of specs) {
608
+ if ((0, import_utils5.hasOverlap)(range2, spec.source)) {
609
+ const isReversed = range2.head < range2.anchor;
610
+ const from = Math.min(range2.from, spec.target.from);
611
+ const to = Math.max(range2.to, spec.target.to);
612
+ const newRange = isReversed ? import_state5.EditorSelection.range(
613
+ to,
614
+ from,
615
+ range2.goalColumn,
616
+ range2.bidiLevel ?? void 0
617
+ ) : import_state5.EditorSelection.range(
618
+ from,
619
+ to,
620
+ range2.goalColumn,
621
+ range2.bidiLevel ?? void 0
622
+ );
623
+ newSelection = newSelection.replaceRange(newRange, index);
624
+ }
625
+ }
626
+ });
627
+ return [
628
+ tr,
629
+ {
630
+ selection: newSelection
631
+ }
632
+ ];
633
+ });
634
+ var selectionEnlarger = import_state5.Facet.define({
635
+ enables: extension2
636
+ });
637
+
638
+ // src/deletion-enlarger/extension.ts
639
+ var import_utils6 = require("@coze-editor/utils");
640
+ var import_state6 = require("@codemirror/state");
641
+ var extension3 = import_state6.EditorState.transactionFilter.of((tr) => {
642
+ const providers = tr.startState.facet(deletionEnlarger);
643
+ const specs = (0, import_utils6.flatten)(providers.map((provider) => provider(tr.startState)));
644
+ const { length } = tr.startState.doc;
645
+ let changes = import_state6.ChangeSet.empty(length);
646
+ tr.changes.iterChanges((fromA, toA, fromB, toB) => {
647
+ const isDeletion = fromB === toB;
648
+ if (!isDeletion) {
649
+ return;
650
+ }
651
+ for (const spec of specs) {
652
+ if ((0, import_utils6.hasOverlap)(
653
+ {
654
+ from: fromA,
655
+ to: toA
656
+ },
657
+ spec.source
658
+ )) {
659
+ const change = import_state6.ChangeSet.of([{ ...spec.target, insert: "" }], length);
660
+ changes = changes.compose(change.map(changes));
661
+ }
662
+ }
663
+ });
664
+ const nextChanges = changes.map(tr.changes);
665
+ if (nextChanges.empty) {
666
+ return tr;
667
+ }
668
+ return [
669
+ tr,
670
+ {
671
+ changes: nextChanges,
672
+ sequential: true
673
+ }
674
+ ];
675
+ });
676
+ var deletionEnlarger = import_state6.Facet.define({
677
+ enables: extension3
678
+ });
679
+
680
+ // src/input-rules/index.ts
681
+ var import_view7 = require("@codemirror/view");
682
+ var import_state7 = require("@codemirror/state");
683
+ var android = typeof navigator === "object" && /Android\b/.test(navigator.userAgent);
684
+ var isExtension = (v) => Boolean(v);
685
+ var inputRules = (rules) => {
686
+ const ruleExtensions = (rules ?? []).map(({ type, triggerCharacter, handler }) => {
687
+ if (type === "character") {
688
+ return import_view7.EditorView.inputHandler.of((view, from, to, insert) => {
689
+ if ((android ? view.composing : view.compositionStarted) || view.state.readOnly) {
690
+ return false;
691
+ }
692
+ const sel = view.state.selection.main;
693
+ if (insert !== triggerCharacter || from !== sel.from || to !== sel.to) {
694
+ return false;
695
+ }
696
+ return handler({
697
+ view,
698
+ state: view.state,
699
+ from,
700
+ to
701
+ });
702
+ });
703
+ }
704
+ }).filter((v) => isExtension(v));
705
+ return import_state7.Prec.high(ruleExtensions);
706
+ };
707
+
708
+ // src/mix-languages/mix.ts
709
+ var import_common = require("@lezer/common");
710
+ var import_lezer_parser_template = require("@coze-editor/lezer-parser-template");
711
+ var import_language4 = require("@codemirror/language");
712
+ function mixLanguages({ name, outerLanguage, innerLanguage }) {
713
+ return import_language4.LRLanguage.define({
714
+ name,
715
+ parser: import_lezer_parser_template.parser.configure({
716
+ wrap: (0, import_common.parseMixed)((node) => {
717
+ if (outerLanguage && node.type.isTop) {
718
+ return {
719
+ parser: outerLanguage.parser,
720
+ overlay: (n) => n.type.name === "Text"
721
+ };
722
+ }
723
+ if (innerLanguage && node.name === "InterpolationContent") {
724
+ return {
725
+ parser: innerLanguage.parser
726
+ };
727
+ }
728
+ return null;
729
+ })
730
+ })
731
+ });
732
+ }
733
+
734
+ // src/indent-guides/index.ts
735
+ var import_es_toolkit2 = require("es-toolkit");
736
+ var import_view8 = require("@codemirror/view");
737
+ var import_state8 = require("@codemirror/state");
738
+
739
+ // src/indent-guides/utils.ts
740
+ var SPACES = /^\s*/;
741
+ var getCodeStart = (text) => text.match(SPACES)[0].length;
742
+ var fromPairs = (pairs2) => {
743
+ let index = -1;
744
+ const length = pairs2 == null ? 0 : pairs2.length;
745
+ const result = {};
746
+ while (++index < length) {
747
+ const pair = pairs2[index];
748
+ result[pair[0]] = pair[1];
749
+ }
750
+ return result;
751
+ };
752
+
753
+ // src/indent-guides/index.ts
754
+ var indentationMark = import_view8.Decoration.mark({ class: "cm-indentation-guide" });
755
+ var indentationLevelMarks = (0, import_es_toolkit2.range)(20).map(
756
+ (i) => import_view8.Decoration.line({ class: `cm-indentation-level-${i}` })
757
+ );
758
+ var IndentationWidget = class _IndentationWidget extends import_view8.WidgetType {
759
+ constructor(indents) {
760
+ super();
761
+ this.indents = indents;
762
+ }
763
+ static create(indents) {
764
+ return import_view8.Decoration.widget({
765
+ widget: new _IndentationWidget(indents),
766
+ side: 1
767
+ });
768
+ }
769
+ toDOM() {
770
+ const wrap = document.createElement("span");
771
+ wrap.className = "cm-indentation-widget";
772
+ for (const indent of this.indents) {
773
+ const marker = wrap.appendChild(document.createElement("span"));
774
+ marker.className = "cm-indentation-guide";
775
+ marker.textContent = " ";
776
+ wrap.append(" ".repeat(indent - 1));
777
+ }
778
+ return wrap;
779
+ }
780
+ };
781
+ function makeIndentationMark(from, to, indent, tabSize, builder) {
782
+ builder.add(from, from, indentationLevelMarks[indent / tabSize]);
783
+ for (let i = from; i < Math.min(from + indent, to); i += tabSize) {
784
+ builder.add(i, i + 1, indentationMark);
785
+ }
786
+ }
787
+ function makeIndentationWidget(from, to, tabSize, builder) {
788
+ const length = to - from;
789
+ if (length !== 0) {
790
+ return;
791
+ }
792
+ if (tabSize > 2) {
793
+ builder.add(to, to, IndentationWidget.create([tabSize]));
794
+ } else {
795
+ builder.add(to, to, IndentationWidget.create([2, tabSize * 2]));
796
+ }
797
+ }
798
+ function makeIndentationDecorators(view) {
799
+ const builder = new import_state8.RangeSetBuilder();
800
+ const tabSize = Number(view.state.tabSize);
801
+ const { doc } = view.state;
802
+ const spaceOnlyLines = [];
803
+ let currentIndent = 0;
804
+ for (const { from: visibleFrom, to: visibleTo } of view.visibleRanges) {
805
+ let to = visibleFrom - 1;
806
+ let pos, from, length, text;
807
+ while ((pos = to + 1) <= visibleTo) {
808
+ ({ from, to, length, text } = doc.lineAt(pos));
809
+ const codeStartsAt = getCodeStart(text);
810
+ const isAllSpaces = codeStartsAt === length;
811
+ const skipIndent = codeStartsAt === 0;
812
+ const isComment = text[codeStartsAt] === "/";
813
+ if (isAllSpaces) {
814
+ spaceOnlyLines.push({ from, to });
815
+ continue;
816
+ } else if (skipIndent) {
817
+ spaceOnlyLines.length = 0;
818
+ continue;
819
+ }
820
+ const indent = Math.ceil(codeStartsAt / tabSize) * tabSize;
821
+ if (!isComment) {
822
+ currentIndent = indent;
823
+ }
824
+ for (const { from: spaceFrom, to: spaceTo } of spaceOnlyLines) {
825
+ makeIndentationMark(
826
+ spaceFrom,
827
+ spaceTo,
828
+ currentIndent,
829
+ tabSize,
830
+ builder
831
+ );
832
+ makeIndentationWidget(spaceFrom, spaceTo, tabSize, builder);
833
+ }
834
+ spaceOnlyLines.length = 0;
835
+ makeIndentationMark(from, to, indent, tabSize, builder);
836
+ }
837
+ }
838
+ return builder.finish();
839
+ }
840
+ var showIndentations = import_view8.ViewPlugin.fromClass(
841
+ class {
842
+ decorations;
843
+ constructor(view) {
844
+ this.decorations = makeIndentationDecorators(view);
845
+ }
846
+ update(update) {
847
+ if (update.docChanged || update.viewportChanged) {
848
+ this.decorations = makeIndentationDecorators(update.view);
849
+ }
850
+ }
851
+ },
852
+ {
853
+ decorations: (v) => v.decorations
854
+ }
855
+ );
856
+ var indentationTheme = import_view8.EditorView.baseTheme({
857
+ ".cm-line": {
858
+ paddingLeft: 0,
859
+ marginLeft: "2px"
860
+ },
861
+ ".cm-indentation-guide": {
862
+ position: "relative"
863
+ },
864
+ ".cm-indentation-guide:after": {
865
+ position: "absolute",
866
+ content: "''",
867
+ right: "0.9ch",
868
+ height: "1.4em",
869
+ borderLeft: "1px solid rgba(28, 31, 35, .08)"
870
+ },
871
+ ...fromPairs(
872
+ indentationLevelMarks.map((_decoration, i) => [
873
+ `.cm-indentation-level-${i}`,
874
+ { textIndent: `-${i * 2}ch`, paddingLeft: `${i * 2}ch` }
875
+ ])
876
+ )
877
+ });
878
+ var indentGuides = () => [showIndentations, indentationTheme];
879
+
880
+ // src/scroll-beyond-last-line/index.ts
881
+ var import_view9 = require("@codemirror/view");
882
+
883
+ // src/scroll-beyond-last-line/empty-block.ts
884
+ var EmptyBlock = class {
885
+ constructor(lineNumber, contentHeight, scrollHeight) {
886
+ this.lineNumber = lineNumber;
887
+ this.contentHeight = contentHeight;
888
+ this.scrollHeight = scrollHeight;
889
+ }
890
+ draw() {
891
+ const elt = document.createElement("div");
892
+ elt.className = "cm-empty-scroll-block-maker";
893
+ this.adjust(elt);
894
+ return elt;
895
+ }
896
+ update(_, prev) {
897
+ return prev.lineNumber === this.lineNumber && prev.contentHeight === this.contentHeight && prev.scrollHeight === this.scrollHeight;
898
+ }
899
+ adjust(elt) {
900
+ elt.style.display = "block";
901
+ elt.style.width = "1px";
902
+ if (this.lineNumber > 1) {
903
+ elt.style.height = `calc(${typeof this.scrollHeight === "number" ? `${this.scrollHeight}px` : "100%"} + ${this.contentHeight}px)`;
904
+ } else {
905
+ elt.style.height = "0";
906
+ }
907
+ }
908
+ eq(p) {
909
+ return this.lineNumber === p.lineNumber && this.contentHeight === p.contentHeight && this.scrollHeight === p.scrollHeight;
910
+ }
911
+ };
912
+
913
+ // src/scroll-beyond-last-line/index.ts
914
+ var scrollBeyondLastLine = (scrollHeight) => [
915
+ (0, import_view9.layer)({
916
+ above: false,
917
+ updateOnDocViewUpdate: true,
918
+ class: "cm-empty-marker-layer",
919
+ update(update) {
920
+ return update.state.doc.lines !== update.startState.doc.lines;
921
+ },
922
+ markers(view) {
923
+ const maker = new EmptyBlock(
924
+ view.state.doc.lines,
925
+ view.contentHeight,
926
+ scrollHeight
927
+ );
928
+ return [maker];
929
+ }
930
+ }),
931
+ import_view9.EditorView.theme({
932
+ "& .cm-empty-marker-layer": {
933
+ height: "100%"
934
+ }
935
+ })
936
+ ];
937
+
938
+ // src/brackets/matching-brackets.ts
939
+ var import_view10 = require("@codemirror/view");
940
+ var import_state9 = require("@codemirror/state");
941
+ var pairs = {
942
+ "(": ")",
943
+ "{": "}",
944
+ "[": "]",
945
+ ")": "(",
946
+ "}": "{",
947
+ "]": "["
948
+ };
949
+ var findMatchingBracket = (state, cursorPos) => {
950
+ try {
951
+ const doc = state.doc.toString();
952
+ let stack = [];
953
+ let leftIndex = -1;
954
+ let rightIndex = -1;
955
+ for (let i = cursorPos - 1; i >= 0; i--) {
956
+ const char = doc[i];
957
+ if (pairs[char]) {
958
+ if ([")", "}", "]"].includes(char)) {
959
+ stack.push(char);
960
+ } else {
961
+ if (stack.length === 0) {
962
+ leftIndex = i;
963
+ break;
964
+ }
965
+ const lastBracket = stack.pop();
966
+ if (pairs[char] !== lastBracket) {
967
+ return null;
968
+ }
969
+ }
970
+ }
971
+ }
972
+ stack = [];
973
+ for (let i = cursorPos; i < doc.length; i++) {
974
+ const char = doc[i];
975
+ if (pairs[char]) {
976
+ if (["(", "{", "["].includes(char)) {
977
+ stack.push(char);
978
+ } else {
979
+ if (stack.length === 0) {
980
+ rightIndex = i;
981
+ break;
982
+ }
983
+ const lastBracket = stack.pop();
984
+ if (pairs[char] !== lastBracket) {
985
+ return null;
986
+ }
987
+ }
988
+ }
989
+ }
990
+ if (leftIndex !== -1 && rightIndex !== -1) {
991
+ return [leftIndex, rightIndex];
992
+ }
993
+ return null;
994
+ } catch (e) {
995
+ console.error("findMatchingBracket failed", e);
996
+ return null;
997
+ }
998
+ };
999
+ var renderMatch = (match) => {
1000
+ const decorations = [];
1001
+ const mark = import_view10.Decoration.mark({ class: "cm-matchingBracket" });
1002
+ decorations.push(mark.range(match, match + 1));
1003
+ return decorations;
1004
+ };
1005
+ var bracketMatchingState = import_state9.StateField.define({
1006
+ create() {
1007
+ return import_view10.Decoration.none;
1008
+ },
1009
+ update(deco, tr) {
1010
+ if (!tr.docChanged && !tr.selection) {
1011
+ return deco;
1012
+ }
1013
+ let decorations = [];
1014
+ for (const range2 of tr.state.selection.ranges) {
1015
+ if (!range2.empty) {
1016
+ continue;
1017
+ }
1018
+ const match = findMatchingBracket(tr.state, range2.head);
1019
+ if (match) {
1020
+ decorations = decorations.concat(
1021
+ renderMatch(match[0]),
1022
+ renderMatch(match[1])
1023
+ );
1024
+ }
1025
+ }
1026
+ return import_view10.Decoration.set(decorations, true);
1027
+ },
1028
+ provide: (f) => import_view10.EditorView.decorations.from(f)
1029
+ });
1030
+ var matchingBrackets = [bracketMatchingState];
1031
+
1032
+ // src/brackets/colorization.ts
1033
+ var import_view11 = require("@codemirror/view");
1034
+ var import_language5 = require("@codemirror/language");
1035
+ var DEFAULT_COLORS = ["#ffd700", "#da70d6", "#179fff"];
1036
+ var ColorizationBracketsPlugin = import_view11.ViewPlugin.fromClass(
1037
+ class {
1038
+ decorations;
1039
+ constructor(view) {
1040
+ this.decorations = this.getBracketDecorations(view);
1041
+ }
1042
+ update(update) {
1043
+ if (update.docChanged || update.selectionSet || update.viewportChanged) {
1044
+ this.decorations = this.getBracketDecorations(update.view);
1045
+ }
1046
+ }
1047
+ getBracketDecorations(view) {
1048
+ const { doc } = view.state;
1049
+ const decorations = [];
1050
+ const stack = [];
1051
+ const limitNodeType = ["Comment", "String"];
1052
+ const tree = (0, import_language5.syntaxTree)(view.state);
1053
+ for (let pos = 0; pos < doc.length; pos += 1) {
1054
+ const char = doc.sliceString(pos, pos + 1);
1055
+ const node = tree.resolveInner(pos);
1056
+ if (limitNodeType.includes(node.type.name)) {
1057
+ continue;
1058
+ }
1059
+ if (char === "(" || char === "[" || char === "{") {
1060
+ stack.push({ type: char, from: pos });
1061
+ } else if (char === ")" || char === "]" || char === "}") {
1062
+ const open = stack.pop();
1063
+ if (open && open.type === this.getMatchingBracket(char)) {
1064
+ const index = stack.length % 3;
1065
+ decorations.push(
1066
+ import_view11.Decoration.mark({ class: `colorization-bracket-${index}` }).range(
1067
+ open.from,
1068
+ open.from + 1
1069
+ ),
1070
+ import_view11.Decoration.mark({ class: `colorization-bracket-${index}` }).range(
1071
+ pos,
1072
+ pos + 1
1073
+ )
1074
+ );
1075
+ }
1076
+ }
1077
+ }
1078
+ decorations.sort((a, b) => a.from - b.from || a.startSide - b.startSide);
1079
+ return import_view11.Decoration.set(decorations);
1080
+ }
1081
+ getMatchingBracket(closingBracket) {
1082
+ switch (closingBracket) {
1083
+ case ")":
1084
+ return "(";
1085
+ case "]":
1086
+ return "[";
1087
+ case "}":
1088
+ return "{";
1089
+ default:
1090
+ return null;
1091
+ }
1092
+ }
1093
+ },
1094
+ {
1095
+ decorations: (v) => v.decorations
1096
+ }
1097
+ );
1098
+ var colorizationBrackets = [
1099
+ ColorizationBracketsPlugin,
1100
+ import_view11.EditorView.baseTheme({
1101
+ ".colorization-bracket-0": { color: DEFAULT_COLORS[0] },
1102
+ ".colorization-bracket-0 > span": { color: DEFAULT_COLORS[0] },
1103
+ ".colorization-bracket-1": { color: DEFAULT_COLORS[1] },
1104
+ ".colorization-bracket-1 > span": { color: DEFAULT_COLORS[1] },
1105
+ ".colorization-bracket-2": { color: DEFAULT_COLORS[2] },
1106
+ ".colorization-bracket-2 > span": { color: DEFAULT_COLORS[2] }
1107
+ })
1108
+ ];
1109
+
1110
+ // src/position/index.ts
1111
+ var import_view12 = require("@codemirror/view");
1112
+ var import_state10 = require("@codemirror/state");
1113
+ var SelectionSide = /* @__PURE__ */ ((SelectionSide2) => {
1114
+ SelectionSide2["Head"] = "head";
1115
+ SelectionSide2["Anchor"] = "anchor";
1116
+ return SelectionSide2;
1117
+ })(SelectionSide || {});
1118
+ var elementAtPosition = import_state10.Facet.define();
1119
+ function configChanged2(update) {
1120
+ return update.startState.facet(elementAtPosition) !== update.state.facet(elementAtPosition);
1121
+ }
1122
+ var PositionMarker = class {
1123
+ constructor(dom, rect) {
1124
+ this.dom = dom;
1125
+ this.rect = rect;
1126
+ }
1127
+ eq(marker) {
1128
+ return Boolean(
1129
+ (!this.rect && !marker.rect || this.rect && marker.rect && this.rect.left === marker.rect.left && this.rect.top === marker.rect.top && this.rect.width === marker.rect.width && this.rect.height === marker.rect.height) && this.dom === marker.dom
1130
+ );
1131
+ }
1132
+ draw() {
1133
+ this.adjust(this.dom);
1134
+ return this.dom;
1135
+ }
1136
+ update() {
1137
+ this.adjust(this.dom);
1138
+ return true;
1139
+ }
1140
+ adjust(elt) {
1141
+ elt.style.pointerEvents = "none";
1142
+ if (!this.rect) {
1143
+ return;
1144
+ }
1145
+ elt.style.left = `${this.rect.left}px`;
1146
+ elt.style.top = `${this.rect.top}px`;
1147
+ elt.style.width = `${this.rect.width}px`;
1148
+ elt.style.height = `${this.rect.height}px`;
1149
+ }
1150
+ };
1151
+ function getBase(view) {
1152
+ const rect = view.scrollDOM.getBoundingClientRect();
1153
+ const left = view.textDirection === import_view12.Direction.LTR ? rect.left : rect.right - view.scrollDOM.clientWidth * view.scaleX;
1154
+ return {
1155
+ left: left - view.scrollDOM.scrollLeft * view.scaleX,
1156
+ top: rect.top - view.scrollDOM.scrollTop * view.scaleY
1157
+ };
1158
+ }
1159
+ var positionElementLayer = (0, import_view12.layer)({
1160
+ above: true,
1161
+ markers(view) {
1162
+ const elements = view.state.facet(elementAtPosition);
1163
+ if (!elements || elements.length === 0) {
1164
+ return [];
1165
+ }
1166
+ const base = getBase(view);
1167
+ const temp = [];
1168
+ const markers = [];
1169
+ for (const { dom, pos } of elements) {
1170
+ if (!dom) {
1171
+ continue;
1172
+ }
1173
+ let finalPos = -1;
1174
+ if (typeof pos === "function") {
1175
+ finalPos = pos(view);
1176
+ } else if (typeof pos === "number") {
1177
+ finalPos = pos;
1178
+ } else if (pos === "head" /* Head */) {
1179
+ finalPos = view.state.selection.main.head;
1180
+ } else if (pos === "anchor" /* Anchor */) {
1181
+ finalPos = view.state.selection.main.anchor;
1182
+ }
1183
+ const coords = view.coordsAtPos(finalPos);
1184
+ if (coords) {
1185
+ temp.push(coords);
1186
+ const width = 1;
1187
+ const left = coords.left - base.left - width / 2;
1188
+ const top = coords.top - base.top;
1189
+ const height = coords.bottom - coords.top;
1190
+ markers.push(new PositionMarker(dom, { left, top, width, height }));
1191
+ } else {
1192
+ markers.push(new PositionMarker(dom));
1193
+ }
1194
+ }
1195
+ return markers;
1196
+ },
1197
+ update(update) {
1198
+ return update.docChanged || update.selectionSet || update.viewportChanged || configChanged2(update);
1199
+ },
1200
+ class: "cm-positionReferenceLayer"
1201
+ });
1202
+
1203
+ // src/mergeable-markers/index.ts
1204
+ var import_view13 = require("@codemirror/view");
1205
+ var import_state11 = require("@codemirror/state");
1206
+
1207
+ // src/mergeable-markers/squash.ts
1208
+ function squash2(decorations) {
1209
+ const result = [];
1210
+ const grouped = groupDecorationsByClassName2(decorations);
1211
+ grouped.forEach((decos, className) => {
1212
+ const merged = mergeIntervals3(decos);
1213
+ result.push(
1214
+ ...merged.map((m) => ({
1215
+ from: m.start,
1216
+ to: m.end,
1217
+ className
1218
+ }))
1219
+ );
1220
+ });
1221
+ result.sort((a, b) => a.from - b.from);
1222
+ return result;
1223
+ }
1224
+ function groupDecorationsByClassName2(decorations) {
1225
+ const map = /* @__PURE__ */ new Map();
1226
+ decorations.forEach((deco) => {
1227
+ if (!map.has(deco.className)) {
1228
+ map.set(deco.className, []);
1229
+ }
1230
+ map.get(deco.className).push(deco);
1231
+ });
1232
+ return map;
1233
+ }
1234
+ function mergeIntervals3(decorations) {
1235
+ const merged = [];
1236
+ const cloned = decorations.map((deco) => ({
1237
+ start: deco.from,
1238
+ end: deco.to
1239
+ }));
1240
+ cloned.sort((a, b) => a.start - b.start);
1241
+ let current = cloned[0];
1242
+ for (let i = 1; i < cloned.length; i++) {
1243
+ const next = cloned[i];
1244
+ if (next.start <= current.end) {
1245
+ current.end = Math.max(current.end, next.end);
1246
+ } else {
1247
+ merged.push(current);
1248
+ current = next;
1249
+ }
1250
+ }
1251
+ merged.push(current);
1252
+ return merged;
1253
+ }
1254
+
1255
+ // src/mergeable-markers/index.ts
1256
+ var cache = /* @__PURE__ */ new Map();
1257
+ function getClassNameDecoration(className) {
1258
+ const cacheKey = className;
1259
+ if (!cache.has(cacheKey)) {
1260
+ const mark = import_view13.Decoration.mark({ class: className });
1261
+ cache.set(cacheKey, mark);
1262
+ }
1263
+ return cache.get(cacheKey);
1264
+ }
1265
+ var mergeableMarkers = import_state11.Facet.define({
1266
+ combine(specs) {
1267
+ const builder = new import_state11.RangeSetBuilder();
1268
+ const flattened = specs.reduce(
1269
+ (memo, current) => [...memo, ...current],
1270
+ []
1271
+ );
1272
+ for (const spec of squash2(flattened)) {
1273
+ const decoration = getClassNameDecoration(spec.className);
1274
+ builder.add(spec.from, spec.to, decoration);
1275
+ }
1276
+ return builder.finish();
1277
+ },
1278
+ enables(self) {
1279
+ return import_view13.EditorView.decorations.compute([self], (state) => state.facet(self));
1280
+ }
1281
+ });
1282
+ // Annotate the CommonJS export names for ESM import in node:
1283
+ 0 && (module.exports = {
1284
+ FocusableWidget,
1285
+ SelectionSide,
1286
+ astDebugger,
1287
+ astDecorator,
1288
+ autoSelectRanges,
1289
+ autoSelectUserEvent,
1290
+ backgroundDecorations,
1291
+ colorizationBrackets,
1292
+ deletionEnlarger,
1293
+ elementAtPosition,
1294
+ focusableKeymap,
1295
+ indentGuides,
1296
+ inputRules,
1297
+ matchingBrackets,
1298
+ mergeableMarkers,
1299
+ mixLanguages,
1300
+ positionElementLayer,
1301
+ scrollBeyondLastLine,
1302
+ selectionEnlarger,
1303
+ updateWholeDecorations
1304
+ });
1305
+ //# sourceMappingURL=index.js.map