jssm 5.147.9 → 5.148.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,52 @@
1
+ import { FslEditor } from './editor.js';
2
+ export { FslEditor } from './editor.js';
3
+
4
+ /**
5
+ * Shared helpers for the dual-prefix (`fsl-` canonical, `jssm-` synonym)
6
+ * web-component naming convention. Centralizes the "match either prefix"
7
+ * rule so it lives in exactly one place.
8
+ */
9
+ /**
10
+ * Returns true when `tag_name` is exactly `fsl-<suffix>` or `jssm-<suffix>`
11
+ * (case-insensitive).
12
+ *
13
+ * @param tag_name - The element tag name to test (e.g. `"FSL-VIZ"`, `"jssm-viz"`).
14
+ * @param suffix - The suffix to match after the prefix (e.g. `"viz"`).
15
+ * @returns `true` when `tag_name` is `fsl-<suffix>` or `jssm-<suffix>`.
16
+ *
17
+ * @example
18
+ * wc_suffix_matches('FSL-VIZ', 'viz'); // true
19
+ * wc_suffix_matches('jssm-viz', 'viz'); // true
20
+ * wc_suffix_matches('div', 'viz'); // false
21
+ * wc_suffix_matches('fsl-vizard', 'viz'); // false — suffix must match exactly
22
+ */
23
+ /**
24
+ * Registers a single canonical `fsl-*` custom-element tag, with no `jssm-*`
25
+ * synonym.
26
+ *
27
+ * This is the registration path for **new** web components. The `jssm-*`
28
+ * prefix is a deprecated backward-compatibility alias retained only for the
29
+ * components that shipped under that name (`<jssm-viz>`, `<jssm-instance>`,
30
+ * `<jssm-bind>`); new components are `fsl-*`-only for fsl.tools brand
31
+ * alignment, and the legacy synonyms are slated for removal in v6. Use
32
+ * {@link define_with_synonym} only when maintaining one of those pre-existing
33
+ * dual-named components.
34
+ *
35
+ * Idempotent: skips the `define` call when the tag is already registered.
36
+ *
37
+ * @param canonical_tag - The `fsl-*` tag name (e.g. `"fsl-info-panel"`).
38
+ * @param CanonicalClass - Constructor to register under `canonical_tag`.
39
+ *
40
+ * @example
41
+ * class FslInfoPanel extends HTMLElement {}
42
+ * define_canonical('fsl-info-panel', FslInfoPanel);
43
+ *
44
+ * @see define_with_synonym
45
+ */
46
+ function define_canonical(canonical_tag, CanonicalClass) {
47
+ if (!customElements.get(canonical_tag))
48
+ customElements.define(canonical_tag, CanonicalClass);
49
+ }
50
+
51
+ // New component: canonical `fsl-*` only, no deprecated `jssm-*` synonym.
52
+ define_canonical('fsl-editor', FslEditor);
@@ -0,0 +1,397 @@
1
+ import { css, LitElement, html } from 'lit';
2
+ import { property } from 'lit/decorators.js';
3
+ import { ViewPlugin, Decoration, EditorView, lineNumbers, highlightActiveLineGutter, highlightActiveLine, drawSelection, keymap } from '@codemirror/view';
4
+ import { Compartment, EditorState } from '@codemirror/state';
5
+ import { syntaxHighlighting, defaultHighlightStyle, HighlightStyle, indentOnInput, bracketMatching } from '@codemirror/language';
6
+ import { history, defaultKeymap, historyKeymap } from '@codemirror/commands';
7
+ import { autocompletion, completionKeymap } from '@codemirror/autocomplete';
8
+ import { linter, lintKeymap } from '@codemirror/lint';
9
+ import { fsl } from 'jssm/cm6';
10
+ import { fslSemanticSpans, fslCompletions, fslDiagnostics } from 'jssm';
11
+ import { tags } from '@lezer/highlight';
12
+
13
+ /**
14
+ * CodeMirror adapters over the editor-agnostic FSL language service. Each
15
+ * factory turns the neutral service output (`fslDiagnostics`, `fslCompletions`,
16
+ * `fslSemanticSpans`) into a CodeMirror extension. The pure mapping functions
17
+ * are exported alongside the extensions so they can be unit-tested directly.
18
+ */
19
+ // ---- diagnostics -----------------------------------------------------------
20
+ /** Map FSL diagnostics to CodeMirror diagnostics, clamped to the document. */
21
+ function fslToCmDiagnostics(text, docLength) {
22
+ return fslDiagnostics(text).map(d => ({
23
+ from: Math.min(d.range.from, docLength),
24
+ to: Math.min(Math.max(d.range.to, d.range.from + 1), docLength),
25
+ severity: d.severity,
26
+ message: d.message,
27
+ }));
28
+ }
29
+ /** Linter source: diagnostics for the view's current document. */
30
+ function fslLintSource(view) {
31
+ return fslToCmDiagnostics(view.state.doc.toString(), view.state.doc.length);
32
+ }
33
+ /** Lint extension wiring `fslLintSource` into `@codemirror/lint`. */
34
+ function fslLintExtension() { return linter(fslLintSource); }
35
+ // ---- completion ------------------------------------------------------------
36
+ /** Map a service completion kind to a CodeMirror completion `type`. */
37
+ function cmType(kind) { return kind === 'key' ? 'property' : 'enum'; }
38
+ /** Completion source: context-aware FSL completions at the caret. */
39
+ function fslCompletionSource(context) {
40
+ const line = context.state.doc.lineAt(context.pos);
41
+ const before = line.text.slice(0, context.pos - line.from);
42
+ const typed = /([\w-]*)$/.exec(before)[1];
43
+ const items = fslCompletions(context.state.doc.toString(), context.pos);
44
+ if (!items.length) {
45
+ return null;
46
+ }
47
+ return {
48
+ from: context.pos - typed.length,
49
+ options: items.map(i => ({ label: i.label, type: cmType(i.kind), detail: i.detail })),
50
+ validFor: /^[\w-]*$/,
51
+ };
52
+ }
53
+ /** Autocomplete extension overriding sources with `fslCompletionSource`. */
54
+ function fslCompletionExtension() { return autocompletion({ override: [fslCompletionSource] }); }
55
+ // ---- semantic overlay ------------------------------------------------------
56
+ /** Build the decoration set (color / state / enum marks) for `text`. */
57
+ function buildFslDecorations(text) {
58
+ const decos = fslSemanticSpans(text)
59
+ .sort((a, b) => a.from - b.from)
60
+ .map(s => Decoration.mark({
61
+ class: `fsl-${s.kind}`,
62
+ attributes: s.value ? { title: s.value, style: `--fsl-chip:${s.value}` } : {},
63
+ }).range(s.from, s.to));
64
+ return Decoration.set(decos, true);
65
+ }
66
+ /** Overlay extension: a view plugin that rebuilds decorations on doc change. */
67
+ function fslOverlayExtension() {
68
+ return ViewPlugin.fromClass(class {
69
+ constructor(view) { this.decorations = buildFslDecorations(view.state.doc.toString()); }
70
+ update(u) { if (u.docChanged) {
71
+ this.decorations = buildFslDecorations(u.state.doc.toString());
72
+ } }
73
+ }, { decorations: v => v.decorations });
74
+ }
75
+
76
+ /**
77
+ * Light and dark CodeMirror themes for `fsl-editor`, as extension bundles for a
78
+ * `Compartment` swap. Chrome colors read the shared `--_fsl-*` appearance tokens
79
+ * (so the editor white-labels with the rest of the suite); the dark highlight
80
+ * style maps the FSL stream tokenizer's tags to a palette that reads on a dark
81
+ * background. Ported from the verified sketch editor theme.
82
+ */
83
+ const lightChrome = EditorView.theme({
84
+ '&': { backgroundColor: 'var(--_fsl-surface, #ffffff)', color: 'var(--_fsl-text, #222222)' },
85
+ '.cm-gutters': { background: 'var(--_fsl-surface, #fafafa)', color: 'var(--_fsl-muted, #9aa0a6)', borderRight: '1px solid var(--_fsl-border, #eee)' },
86
+ '.cm-activeLine': { backgroundColor: 'rgba(91,157,255,0.06)' },
87
+ '.cm-cursor, .cm-dropCursor': { borderLeftColor: 'var(--_fsl-text, #222)' },
88
+ '&.cm-focused .cm-selectionBackground, .cm-selectionBackground': { backgroundColor: 'color-mix(in srgb, var(--_fsl-accent, #5b9dff) 28%, transparent)' },
89
+ }, { dark: false });
90
+ const darkChrome = EditorView.theme({
91
+ '&': { backgroundColor: 'var(--_fsl-surface, #1e1e22)', color: 'var(--_fsl-text, #d6d6d6)' },
92
+ '.cm-gutters': { background: 'var(--_fsl-surface, #1a1a1e)', color: 'var(--_fsl-muted, #5a5f66)', borderRight: '1px solid var(--_fsl-border, #2a2a2e)' },
93
+ '.cm-activeLine': { backgroundColor: 'rgba(130,170,255,0.08)' },
94
+ '.cm-cursor, .cm-dropCursor': { borderLeftColor: 'var(--_fsl-text, #d6d6d6)' },
95
+ '&.cm-focused .cm-selectionBackground, .cm-selectionBackground': { backgroundColor: 'color-mix(in srgb, var(--_fsl-accent, #82aaff) 32%, transparent)' },
96
+ }, { dark: true });
97
+ const darkHighlight = HighlightStyle.define([
98
+ { tag: tags.keyword, color: '#c792ea' },
99
+ { tag: tags.propertyName, color: '#82aaff' },
100
+ { tag: [tags.string, tags.labelName], color: '#c3e88d' },
101
+ { tag: tags.comment, color: '#5f7e97', fontStyle: 'italic' },
102
+ { tag: [tags.atom, tags.bool], color: '#f78c6c' },
103
+ { tag: tags.number, color: '#f78c6c' },
104
+ { tag: tags.operator, color: '#89ddff' },
105
+ { tag: tags.variableName, color: '#d6d6d6' },
106
+ { tag: tags.special(tags.variableName), color: '#addb67' },
107
+ { tag: [tags.punctuation, tags.separator], color: '#89ddff' },
108
+ { tag: [tags.bracket, tags.squareBracket, tags.brace, tags.paren], color: '#c5c9d0' },
109
+ ]);
110
+ /** Light editor theme bundle (token-fed chrome + default highlight style). */
111
+ const lightEditorTheme = [
112
+ lightChrome,
113
+ syntaxHighlighting(defaultHighlightStyle, { fallback: true }),
114
+ ];
115
+ /** Dark editor theme bundle (token-fed chrome + dark highlight, default fallback). */
116
+ const darkEditorTheme = [
117
+ darkChrome,
118
+ syntaxHighlighting(darkHighlight),
119
+ syntaxHighlighting(defaultHighlightStyle, { fallback: true }),
120
+ ];
121
+
122
+ /**
123
+ * Shared FSL appearance contract — the `--fsl-*` design-token vocabulary.
124
+ *
125
+ * Components include this in `static styles` and consume the **private**
126
+ * `--_fsl-*` vars, which resolve: embedder's public `--fsl-*` token →
127
+ * `[theme="dark"]` default → built-in light fallback. White-label by setting
128
+ * `--fsl-*` on any ancestor (custom properties inherit through shadow DOM);
129
+ * flip the built-in default with the host's `theme="dark"` attribute.
130
+ *
131
+ * Companion conventions (declared per-component): expose structural elements as
132
+ * `::part(...)` (e.g. `part="toolbar"`, `"gutter"`, `"editor"`) and forward
133
+ * child parts with `exportparts`; chrome components carry brand slots
134
+ * (`<slot name="brand">` / `"logo">`).
135
+ */
136
+ const fslTokens = css `
137
+ :host {
138
+ --_fsl-surface: var(--fsl-color-surface, #ffffff);
139
+ --_fsl-text: var(--fsl-color-text, #222222);
140
+ --_fsl-accent: var(--fsl-color-accent, #5b9dff);
141
+ --_fsl-border: var(--fsl-color-border, #e5e5e5);
142
+ --_fsl-muted: var(--fsl-color-muted, #9aa0a6);
143
+ --_fsl-font: var(--fsl-font, system-ui, -apple-system, "Segoe UI", sans-serif);
144
+ --_fsl-font-mono: var(--fsl-font-mono, ui-monospace, Consolas, monospace);
145
+ --_fsl-radius: var(--fsl-radius, 6px);
146
+ --_fsl-space-1: var(--fsl-space-1, 4px);
147
+ --_fsl-space-2: var(--fsl-space-2, 8px);
148
+ --_fsl-space-3: var(--fsl-space-3, 12px);
149
+ --_fsl-space-4: var(--fsl-space-4, 16px);
150
+ }
151
+ :host([theme="dark"]) {
152
+ --_fsl-surface: var(--fsl-color-surface, #1e1e22);
153
+ --_fsl-text: var(--fsl-color-text, #d6d6d6);
154
+ --_fsl-accent: var(--fsl-color-accent, #82aaff);
155
+ --_fsl-border: var(--fsl-color-border, #2a2a2e);
156
+ --_fsl-muted: var(--fsl-color-muted, #5a5f66);
157
+ }
158
+ `;
159
+
160
+ /**
161
+ * Shared helpers for the dual-prefix (`fsl-` canonical, `jssm-` synonym)
162
+ * web-component naming convention. Centralizes the "match either prefix"
163
+ * rule so it lives in exactly one place.
164
+ */
165
+ /**
166
+ * Returns true when `tag_name` is exactly `fsl-<suffix>` or `jssm-<suffix>`
167
+ * (case-insensitive).
168
+ *
169
+ * @param tag_name - The element tag name to test (e.g. `"FSL-VIZ"`, `"jssm-viz"`).
170
+ * @param suffix - The suffix to match after the prefix (e.g. `"viz"`).
171
+ * @returns `true` when `tag_name` is `fsl-<suffix>` or `jssm-<suffix>`.
172
+ *
173
+ * @example
174
+ * wc_suffix_matches('FSL-VIZ', 'viz'); // true
175
+ * wc_suffix_matches('jssm-viz', 'viz'); // true
176
+ * wc_suffix_matches('div', 'viz'); // false
177
+ * wc_suffix_matches('fsl-vizard', 'viz'); // false — suffix must match exactly
178
+ */
179
+ /**
180
+ * Returns the nearest ancestor of `el` (or `el` itself) whose tag is
181
+ * `fsl-<suffix>` or `jssm-<suffix>`, or `null` if none exists.
182
+ *
183
+ * @param el - The element to start the search from.
184
+ * @param suffix - The suffix to match (e.g. `"instance"`).
185
+ * @returns The closest matching ancestor element, or `null`.
186
+ *
187
+ * @example
188
+ * // <fsl-instance><div id="k"></div></fsl-instance>
189
+ * closest_wc(document.getElementById('k'), 'instance'); // <fsl-instance>
190
+ *
191
+ * @see wc_suffix_matches
192
+ */
193
+ function closest_wc(el, suffix) {
194
+ return el.closest(`fsl-${suffix}, jssm-${suffix}`);
195
+ }
196
+
197
+ var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
198
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
199
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
200
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
201
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
202
+ };
203
+ /**
204
+ * `<fsl-editor>` — a CodeMirror-based FSL editor web component.
205
+ *
206
+ * Batteries-included: FSL highlighting (`jssm/cm6`), linting, a semantic
207
+ * overlay (color chips / state & enum marks), and context-aware completion —
208
+ * each toggleable via a `no-*` attribute. Light/dark via the reflected `theme`
209
+ * attribute (which also drives the `--fsl-*` token defaults). White-labeled
210
+ * through the shared appearance contract. Emits `change` on user edits.
211
+ *
212
+ * @element fsl-editor
213
+ * @fires {CustomEvent<FslEditorChangeDetail>} change - On every user edit (not on programmatic `fsl` writes).
214
+ * @csspart editor - The CodeMirror editor container.
215
+ */
216
+ class FslEditor extends LitElement {
217
+ constructor() {
218
+ super(...arguments);
219
+ /** FSL source text (two-way: reflects user edits, applies external writes). */
220
+ this.fsl = '';
221
+ /** When true, the document is read-only (selection still allowed). */
222
+ this.readonly = false;
223
+ /** Color theme; reflected so it also drives the `--fsl-*` token defaults. */
224
+ this.theme = 'light';
225
+ /** Disable the diagnostics/lint underlines. */
226
+ this.noLint = false;
227
+ /** Disable the semantic overlay (color chips, state/enum marks). */
228
+ this.noOverlay = false;
229
+ /** Disable context-aware autocompletion. */
230
+ this.noCompletion = false;
231
+ this._view = null;
232
+ this._themeC = new Compartment();
233
+ this._lintC = new Compartment();
234
+ this._overlayC = new Compartment();
235
+ this._completionC = new Compartment();
236
+ this._readonlyC = new Compartment();
237
+ /** True while a programmatic doc write is in flight, to suppress the echo. */
238
+ this._applyingProp = false;
239
+ /** Write-back listener for a bound parent host, or null when standalone. */
240
+ this._onChange = null;
241
+ }
242
+ /** The theme bundle for the current `theme` value. */
243
+ _themeExt() { return this.theme === 'dark' ? darkEditorTheme : lightEditorTheme; }
244
+ /** The underlying CodeMirror view, or null before first render / after disconnect. */
245
+ get view() { return this._view; }
246
+ /**
247
+ * Dual-mode: when nested inside a `<fsl-instance>`, seed the editor from the
248
+ * host's FSL and write edits back to it (the host rebuilds its machine — see
249
+ * #1387). Standalone (no host ancestor) leaves the editor self-contained.
250
+ */
251
+ connectedCallback() {
252
+ super.connectedCallback();
253
+ const host = closest_wc(this, 'instance');
254
+ if (!host) {
255
+ return;
256
+ }
257
+ if (host.fsl) {
258
+ this.fsl = host.fsl;
259
+ }
260
+ const handler = (e) => { host.fsl = e.detail.fsl; };
261
+ this._onChange = handler;
262
+ this.addEventListener('change', handler);
263
+ }
264
+ /**
265
+ * Mount the CodeMirror view once the shadow DOM exists. Each toggleable
266
+ * feature is seeded into its own {@link Compartment} from the matching
267
+ * property, so later property changes reconfigure just that slice.
268
+ */
269
+ firstUpdated() {
270
+ const parent = this.renderRoot.querySelector('[part="editor"]');
271
+ this._view = new EditorView({
272
+ state: EditorState.create({
273
+ doc: this.fsl,
274
+ extensions: [
275
+ lineNumbers(),
276
+ highlightActiveLineGutter(),
277
+ highlightActiveLine(),
278
+ drawSelection(),
279
+ indentOnInput(),
280
+ bracketMatching(),
281
+ EditorState.allowMultipleSelections.of(true),
282
+ fsl(),
283
+ history(),
284
+ keymap.of([...defaultKeymap, ...historyKeymap, ...completionKeymap, ...lintKeymap]),
285
+ this._themeC.of(this._themeExt()),
286
+ this._lintC.of(this.noLint ? [] : fslLintExtension()),
287
+ this._overlayC.of(this.noOverlay ? [] : fslOverlayExtension()),
288
+ this._completionC.of(this.noCompletion ? [] : fslCompletionExtension()),
289
+ this._readonlyC.of(EditorState.readOnly.of(this.readonly)),
290
+ EditorView.updateListener.of(u => { if (u.docChanged) {
291
+ this._onDocChanged();
292
+ } }),
293
+ ],
294
+ }),
295
+ parent,
296
+ });
297
+ }
298
+ /** Reflect a genuine user edit back to the `fsl` property + `change` event. */
299
+ _onDocChanged() {
300
+ if (this._applyingProp) {
301
+ return;
302
+ }
303
+ const text = this._view.state.doc.toString();
304
+ this.fsl = text;
305
+ this.dispatchEvent(new CustomEvent('change', {
306
+ detail: { fsl: text }, bubbles: true, composed: true,
307
+ }));
308
+ }
309
+ /**
310
+ * Map reactive-property changes onto CodeMirror: sync the document, and
311
+ * reconfigure each feature's compartment when its toggle flips.
312
+ */
313
+ willUpdate(changed) {
314
+ if (!this._view) {
315
+ return;
316
+ }
317
+ if (changed.has('fsl')) {
318
+ this._syncDoc();
319
+ }
320
+ if (changed.has('theme')) {
321
+ this._view.dispatch({ effects: this._themeC.reconfigure(this._themeExt()) });
322
+ }
323
+ if (changed.has('noLint')) {
324
+ this._view.dispatch({ effects: this._lintC.reconfigure(this.noLint ? [] : fslLintExtension()) });
325
+ }
326
+ if (changed.has('noOverlay')) {
327
+ this._view.dispatch({ effects: this._overlayC.reconfigure(this.noOverlay ? [] : fslOverlayExtension()) });
328
+ }
329
+ if (changed.has('noCompletion')) {
330
+ this._view.dispatch({ effects: this._completionC.reconfigure(this.noCompletion ? [] : fslCompletionExtension()) });
331
+ }
332
+ if (changed.has('readonly')) {
333
+ this._view.dispatch({ effects: this._readonlyC.reconfigure(EditorState.readOnly.of(this.readonly)) });
334
+ }
335
+ }
336
+ /** Apply an external `fsl` write to the document, guarding the echo. */
337
+ _syncDoc() {
338
+ const cur = this._view.state.doc.toString();
339
+ if (cur === this.fsl) {
340
+ return;
341
+ }
342
+ this._applyingProp = true;
343
+ this._view.dispatch({ changes: { from: 0, to: cur.length, insert: this.fsl } });
344
+ this._applyingProp = false;
345
+ }
346
+ disconnectedCallback() {
347
+ super.disconnectedCallback();
348
+ if (this._onChange) {
349
+ this.removeEventListener('change', this._onChange);
350
+ this._onChange = null;
351
+ }
352
+ if (this._view) {
353
+ this._view.destroy();
354
+ this._view = null;
355
+ }
356
+ }
357
+ render() { return html `<div part="editor" class="editor"></div>`; }
358
+ }
359
+ FslEditor.styles = css `
360
+ :host { display: block; min-height: var(--fsl-editor-min-height, 8em); }
361
+ .editor, .cm-editor { height: 100%; }
362
+ .cm-editor { font-family: var(--_fsl-font-mono); border-radius: var(--_fsl-radius); }
363
+ /* Semantic overlay marks (added by the overlay view plugin). */
364
+ .fsl-color::before {
365
+ content: ''; display: inline-block; width: 0.78em; height: 0.78em;
366
+ margin-right: 0.28em; vertical-align: middle; border-radius: 2px;
367
+ border: 1px solid var(--_fsl-border); background: var(--fsl-chip, transparent);
368
+ }
369
+ /* State names (transition endpoints + declaration subjects) and shape/enum
370
+ values, marked from the parsed AST. Token-overridable, theme-aware so the
371
+ marks stay legible on both the light and dark editor chrome. */
372
+ .fsl-state { color: var(--fsl-color-state, #5b3da8); font-weight: 600; }
373
+ .fsl-enum { color: var(--fsl-color-enum, #b8860b); font-style: italic; }
374
+ :host([theme="dark"]) .fsl-state { color: var(--fsl-color-state, #c792ea); }
375
+ :host([theme="dark"]) .fsl-enum { color: var(--fsl-color-enum, #e0a96d); }
376
+ ${fslTokens}
377
+ `;
378
+ __decorate([
379
+ property({ type: String })
380
+ ], FslEditor.prototype, "fsl", void 0);
381
+ __decorate([
382
+ property({ type: Boolean, reflect: true })
383
+ ], FslEditor.prototype, "readonly", void 0);
384
+ __decorate([
385
+ property({ type: String, reflect: true })
386
+ ], FslEditor.prototype, "theme", void 0);
387
+ __decorate([
388
+ property({ type: Boolean, attribute: 'no-lint' })
389
+ ], FslEditor.prototype, "noLint", void 0);
390
+ __decorate([
391
+ property({ type: Boolean, attribute: 'no-overlay' })
392
+ ], FslEditor.prototype, "noOverlay", void 0);
393
+ __decorate([
394
+ property({ type: Boolean, attribute: 'no-completion' })
395
+ ], FslEditor.prototype, "noCompletion", void 0);
396
+
397
+ export { FslEditor };