pdl-editor 0.30.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.
package/dist/index.cjs ADDED
@@ -0,0 +1,863 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.tsx
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ PDL_DEFAULT_MODEL_URI: () => PDL_DEFAULT_MODEL_URI,
34
+ PDL_LANGUAGE_ID: () => PDL_LANGUAGE_ID,
35
+ PDL_MARKER_OWNER: () => PDL_MARKER_OWNER,
36
+ PDL_SCOPE_NAME: () => PDL_SCOPE_NAME,
37
+ PDL_THEME_NAME: () => PDL_THEME_NAME,
38
+ PdlEditor: () => PdlEditor,
39
+ defaultPdlTheme: () => defaultPdlTheme,
40
+ definePdlTheme: () => definePdlTheme,
41
+ diagnosticToPdlMarker: () => diagnosticToPdlMarker,
42
+ programPathForModel: () => programPathForModel,
43
+ registerPdlEditorProviders: () => registerPdlEditorProviders,
44
+ registerPdlLanguage: () => registerPdlLanguage,
45
+ setPdlMarkers: () => setPdlMarkers,
46
+ setupPdlMonaco: () => setupPdlMonaco
47
+ });
48
+ module.exports = __toCommonJS(index_exports);
49
+ var import_react = __toESM(require("react"), 1);
50
+ var monaco = __toESM(require("monaco-editor/esm/vs/editor/editor.api"), 1);
51
+ var import_editor_main = require("monaco-editor/min/vs/editor/editor.main.css");
52
+ var import_hoverContribution = require("monaco-editor/esm/vs/editor/contrib/hover/browser/hoverContribution");
53
+ var import_editor = __toESM(require("monaco-editor/esm/vs/editor/editor.worker?worker"), 1);
54
+ var import_monaco_editor_textmate = require("monaco-editor-textmate");
55
+ var import_monaco_textmate = require("monaco-textmate");
56
+ var import_onigasm = require("onigasm");
57
+ var import_onigasm2 = __toESM(require("onigasm/lib/onigasm.wasm?url"), 1);
58
+
59
+ // assets/language-configuration.json
60
+ var language_configuration_default = {
61
+ comments: {
62
+ lineComment: "//",
63
+ blockComment: [
64
+ "/*",
65
+ "*/"
66
+ ]
67
+ },
68
+ brackets: [
69
+ [
70
+ "(",
71
+ ")"
72
+ ]
73
+ ],
74
+ autoClosingPairs: [
75
+ {
76
+ open: '"',
77
+ close: '"'
78
+ },
79
+ {
80
+ open: "`",
81
+ close: "`"
82
+ },
83
+ {
84
+ open: "(",
85
+ close: ")"
86
+ }
87
+ ],
88
+ surroundingPairs: [
89
+ {
90
+ open: '"',
91
+ close: '"'
92
+ },
93
+ {
94
+ open: "`",
95
+ close: "`"
96
+ },
97
+ {
98
+ open: "(",
99
+ close: ")"
100
+ }
101
+ ],
102
+ wordPattern: "(-?\\d*\\.\\d\\w*)|([^`~!@#$%^&*()+={}\\[\\]\\\\|;:'\",.<>/?\\s]+)",
103
+ indentationRules: {
104
+ increaseIndentPattern: "^\\s*let\\s+[A-Za-z_][A-Za-z0-9_]*\\s*=\\s*$",
105
+ decreaseIndentPattern: "^\\s*$"
106
+ }
107
+ };
108
+
109
+ // assets/pdl.tmLanguage.json
110
+ var pdl_tmLanguage_default = {
111
+ $schema: "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
112
+ name: "PDL",
113
+ scopeName: "source.pdl",
114
+ patterns: [
115
+ {
116
+ include: "#comments"
117
+ },
118
+ {
119
+ include: "#strings"
120
+ },
121
+ {
122
+ include: "#backtickColumns"
123
+ },
124
+ {
125
+ include: "#numbers"
126
+ },
127
+ {
128
+ include: "#contextReferences"
129
+ },
130
+ {
131
+ include: "#operators"
132
+ },
133
+ {
134
+ include: "#declarations"
135
+ },
136
+ {
137
+ include: "#keywords"
138
+ },
139
+ {
140
+ include: "#functions"
141
+ }
142
+ ],
143
+ repository: {
144
+ comments: {
145
+ patterns: [
146
+ {
147
+ name: "comment.line.double-slash.pdl",
148
+ match: "//.*$"
149
+ },
150
+ {
151
+ name: "comment.block.pdl",
152
+ begin: "/\\*",
153
+ end: "\\*/"
154
+ }
155
+ ]
156
+ },
157
+ strings: {
158
+ patterns: [
159
+ {
160
+ name: "string.quoted.double.pdl",
161
+ begin: '"',
162
+ end: '"',
163
+ patterns: [
164
+ {
165
+ name: "constant.character.escape.pdl",
166
+ match: '\\\\(?:["\\\\nrt]|u\\{[0-9A-Fa-f]+\\})'
167
+ }
168
+ ]
169
+ }
170
+ ]
171
+ },
172
+ backtickColumns: {
173
+ patterns: [
174
+ {
175
+ name: "variable.other.column.pdl",
176
+ begin: "`",
177
+ end: "`",
178
+ patterns: [
179
+ {
180
+ name: "constant.character.escape.pdl",
181
+ match: "\\\\(?:[`\\\\])"
182
+ }
183
+ ]
184
+ }
185
+ ]
186
+ },
187
+ numbers: {
188
+ patterns: [
189
+ {
190
+ name: "constant.numeric.pdl",
191
+ match: "\\b[0-9]+(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b"
192
+ }
193
+ ]
194
+ },
195
+ operators: {
196
+ patterns: [
197
+ {
198
+ name: "keyword.operator.pdl",
199
+ match: "\\|"
200
+ },
201
+ {
202
+ name: "keyword.operator.comparison.pdl",
203
+ match: "==|!=|<=|>=|<|>"
204
+ },
205
+ {
206
+ name: "keyword.operator.arithmetic.pdl",
207
+ match: "[+\\-*/%]"
208
+ },
209
+ {
210
+ name: "keyword.operator.context.pdl",
211
+ match: "[$@]"
212
+ }
213
+ ]
214
+ },
215
+ contextReferences: {
216
+ patterns: [
217
+ {
218
+ name: "variable.parameter.context.pdl",
219
+ match: "[$@][A-Za-z_][A-Za-z0-9_]*\\b"
220
+ }
221
+ ]
222
+ },
223
+ declarations: {
224
+ patterns: [
225
+ {
226
+ name: "meta.context.declaration.pdl",
227
+ match: "\\b(param|state)\\s+([A-Za-z_][A-Za-z0-9_]*)\\b",
228
+ captures: {
229
+ "1": {
230
+ name: "keyword.declaration.pdl"
231
+ },
232
+ "2": {
233
+ name: "variable.parameter.declaration.pdl"
234
+ }
235
+ }
236
+ },
237
+ {
238
+ name: "meta.binding.declaration.pdl",
239
+ match: "\\b(let)\\s+([A-Za-z_][A-Za-z0-9_]*)\\b",
240
+ captures: {
241
+ "1": {
242
+ name: "keyword.declaration.pdl"
243
+ },
244
+ "2": {
245
+ name: "variable.other.declaration.pdl"
246
+ }
247
+ }
248
+ },
249
+ {
250
+ name: "meta.output.declaration.pdl",
251
+ match: "\\b(output)\\s+([A-Za-z_][A-Za-z0-9_]*)\\b",
252
+ captures: {
253
+ "1": {
254
+ name: "keyword.declaration.pdl"
255
+ },
256
+ "2": {
257
+ name: "entity.name.function.output.pdl"
258
+ }
259
+ }
260
+ },
261
+ {
262
+ name: "variable.parameter.pdl",
263
+ match: "\\b[A-Za-z_][A-Za-z0-9_]*\\b(?=\\s*=(?!=))"
264
+ }
265
+ ]
266
+ },
267
+ keywords: {
268
+ patterns: [
269
+ {
270
+ name: "keyword.control.pdl",
271
+ match: "\\b(?:let|output|param|state|load|filter|select|drop|rename|mutate|group_by|agg|sort|limit|join|union|distinct|pivot_longer|complete|save|on|kind|by_name|names_to|values_to|fill|format|over|partition_by|order_by|rows|between|unbounded_preceding|current_row|unbounded_following|preceding|following|stdin|stdout|and|or|not|asc|desc|inner|left|right|full|semi|anti|nulls_first|nulls_last)\\b"
272
+ },
273
+ {
274
+ name: "constant.language.pdl",
275
+ match: "\\b(?:true|false|null)\\b"
276
+ }
277
+ ]
278
+ },
279
+ functions: {
280
+ patterns: [
281
+ {
282
+ name: "support.function.window.pdl",
283
+ match: "\\b(?:count|count_distinct|sum|mean|min|max)\\b(?=\\s*\\([^)]*\\)\\s*over\\b)"
284
+ },
285
+ {
286
+ name: "support.function.aggregate.pdl",
287
+ match: "\\b(?:count|count_distinct|sum|mean|min|max)\\b(?=\\s*\\()"
288
+ },
289
+ {
290
+ name: "support.function.scalar.pdl",
291
+ match: "\\b(?:is_null|not_null|coalesce|concat|lower|upper|trim|to_number|abs|round|if_else|col)\\b(?=\\s*\\()"
292
+ },
293
+ {
294
+ name: "support.function.window.pdl",
295
+ match: "\\b(?:row_number|rank|dense_rank|percent_rank|cume_dist|lag|lead|first_value|last_value)\\b(?=\\s*\\()"
296
+ }
297
+ ]
298
+ }
299
+ }
300
+ };
301
+
302
+ // src/index.tsx
303
+ var import_jsx_runtime = require("react/jsx-runtime");
304
+ var PDL_LANGUAGE_ID = "pdl";
305
+ var PDL_SCOPE_NAME = "source.pdl";
306
+ var PDL_THEME_NAME = "pdl-playground";
307
+ var PDL_MARKER_OWNER = "pdl-wasm";
308
+ var PDL_DEFAULT_MODEL_URI = "inmemory://pdl/main.pdl";
309
+ var SEMANTIC_TOKEN_TYPES = [
310
+ "keyword",
311
+ "function",
312
+ "variable",
313
+ "string",
314
+ "number",
315
+ "operator",
316
+ "pdlBindingDeclaration",
317
+ "pdlBindingReference",
318
+ "pdlColumnDefinition",
319
+ "pdlColumnReference",
320
+ "pdlContextDeclaration",
321
+ "pdlContextReference"
322
+ ];
323
+ var setupPromise = null;
324
+ var onigasmPromise = null;
325
+ var providerDisposable = null;
326
+ var editorContexts = /* @__PURE__ */ new Map();
327
+ function PdlEditor({
328
+ value,
329
+ files,
330
+ diagnostics,
331
+ runtime,
332
+ onChange,
333
+ modelUri,
334
+ languageId = PDL_LANGUAGE_ID,
335
+ themeName = PDL_THEME_NAME,
336
+ theme,
337
+ className = "pdl-editor-shell",
338
+ editorClassName = "pdl-editor",
339
+ options,
340
+ setupOptions
341
+ }) {
342
+ const hostRef = import_react.default.useRef(null);
343
+ const editorRef = import_react.default.useRef(null);
344
+ const modelRef = import_react.default.useRef(null);
345
+ const onChangeRef = import_react.default.useRef(onChange);
346
+ const diagnosticsRef = import_react.default.useRef(diagnostics);
347
+ const filesRef = import_react.default.useRef(files);
348
+ const runtimeRef = import_react.default.useRef(runtime);
349
+ const [setupError, setSetupError] = import_react.default.useState(null);
350
+ const resolvedModelUri = import_react.default.useMemo(() => monaco.Uri.parse(modelUri ?? PDL_DEFAULT_MODEL_URI), [modelUri]);
351
+ import_react.default.useEffect(() => {
352
+ onChangeRef.current = onChange;
353
+ }, [onChange]);
354
+ import_react.default.useEffect(() => {
355
+ filesRef.current = files;
356
+ }, [files]);
357
+ import_react.default.useEffect(() => {
358
+ runtimeRef.current = runtime;
359
+ }, [runtime]);
360
+ import_react.default.useEffect(() => {
361
+ diagnosticsRef.current = diagnostics;
362
+ const model = modelRef.current;
363
+ if (model) {
364
+ setPdlMarkers(model, diagnostics);
365
+ }
366
+ }, [diagnostics]);
367
+ import_react.default.useEffect(() => {
368
+ const model = modelRef.current;
369
+ if (model && model.getValue() !== value) {
370
+ const selection = editorRef.current?.getSelection() ?? null;
371
+ model.setValue(value);
372
+ if (selection) {
373
+ editorRef.current?.setSelection(selection);
374
+ }
375
+ setPdlMarkers(model, diagnosticsRef.current);
376
+ }
377
+ }, [value]);
378
+ import_react.default.useEffect(() => {
379
+ let cancelled = false;
380
+ let editor2 = null;
381
+ let model = null;
382
+ let contentDisposable = null;
383
+ let contextKey = null;
384
+ setupPdlMonaco({ ...setupOptions, languageId, themeName, theme }).then(() => {
385
+ if (cancelled || !hostRef.current) {
386
+ return;
387
+ }
388
+ ensurePdlProviders(languageId);
389
+ model = monaco.editor.createModel(value, languageId, resolvedModelUri);
390
+ contextKey = model.uri.toString();
391
+ editorContexts.set(contextKey, {
392
+ runtime: () => runtimeRef.current,
393
+ files: () => filesRef.current
394
+ });
395
+ editor2 = monaco.editor.create(hostRef.current, {
396
+ model,
397
+ theme: themeName,
398
+ automaticLayout: true,
399
+ bracketPairColorization: { enabled: true },
400
+ cursorBlinking: "smooth",
401
+ fixedOverflowWidgets: true,
402
+ fontFamily: '"SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace',
403
+ fontSize: 13,
404
+ lineHeight: 20,
405
+ minimap: { enabled: false },
406
+ overviewRulerBorder: false,
407
+ padding: { top: 12, bottom: 12 },
408
+ renderLineHighlight: "line",
409
+ scrollBeyondLastLine: false,
410
+ smoothScrolling: true,
411
+ tabSize: 2,
412
+ wordWrap: "off",
413
+ ...options
414
+ });
415
+ modelRef.current = model;
416
+ editorRef.current = editor2;
417
+ setPdlMarkers(model, diagnosticsRef.current);
418
+ contentDisposable = model.onDidChangeContent(() => {
419
+ onChangeRef.current(model?.getValue() ?? "");
420
+ });
421
+ }).catch((err) => {
422
+ if (!cancelled) {
423
+ setSetupError(err instanceof Error ? err.message : String(err));
424
+ }
425
+ });
426
+ return () => {
427
+ cancelled = true;
428
+ contentDisposable?.dispose();
429
+ if (contextKey) {
430
+ editorContexts.delete(contextKey);
431
+ }
432
+ if (model) {
433
+ monaco.editor.setModelMarkers(model, PDL_MARKER_OWNER, []);
434
+ }
435
+ editor2?.dispose();
436
+ model?.dispose();
437
+ if (editorRef.current === editor2) {
438
+ editorRef.current = null;
439
+ }
440
+ if (modelRef.current === model) {
441
+ modelRef.current = null;
442
+ }
443
+ };
444
+ }, [languageId, options, resolvedModelUri, setupOptions, theme, themeName]);
445
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className, children: [
446
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { "aria-label": "PDL source", className: editorClassName, ref: hostRef }),
447
+ setupError ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "editor-error", children: [
448
+ "Editor failed to load: ",
449
+ setupError
450
+ ] }) : null
451
+ ] });
452
+ }
453
+ function setupPdlMonaco(options = {}) {
454
+ setupPromise ?? (setupPromise = setupPdlMonacoOnce(options).catch((error) => {
455
+ setupPromise = null;
456
+ throw error;
457
+ }));
458
+ return setupPromise;
459
+ }
460
+ function registerPdlLanguage(options = {}) {
461
+ const languageId = options.languageId ?? PDL_LANGUAGE_ID;
462
+ if (monaco.languages.getLanguages().some((language) => language.id === languageId)) {
463
+ return;
464
+ }
465
+ monaco.languages.register({
466
+ id: languageId,
467
+ aliases: options.aliases ?? ["PDL", "pdl"],
468
+ extensions: options.extensions ?? [".pdl"]
469
+ });
470
+ monaco.languages.setLanguageConfiguration(
471
+ languageId,
472
+ options.languageConfiguration ?? language_configuration_default
473
+ );
474
+ }
475
+ function definePdlTheme(themeName = PDL_THEME_NAME, theme = defaultPdlTheme()) {
476
+ monaco.editor.defineTheme(themeName, theme);
477
+ }
478
+ function defaultPdlTheme() {
479
+ return {
480
+ base: "vs",
481
+ inherit: true,
482
+ rules: [
483
+ { token: "comment", foreground: "6b7280", fontStyle: "italic" },
484
+ { token: "string", foreground: "7a4a10" },
485
+ { token: "number", foreground: "b42318" },
486
+ { token: "keyword", foreground: "166f5c", fontStyle: "bold" },
487
+ { token: "function", foreground: "0f5f8f", fontStyle: "bold" },
488
+ { token: "property", foreground: "0e7490" },
489
+ { token: "variable", foreground: "355f8c" },
490
+ { token: "pdlBindingDeclaration", foreground: "7c3aed", fontStyle: "bold" },
491
+ { token: "pdlBindingReference", foreground: "6d28d9" },
492
+ { token: "pdlColumnDefinition", foreground: "475569" },
493
+ { token: "pdlColumnReference", foreground: "0e7490" },
494
+ { token: "pdlContextDeclaration", foreground: "9a5512", fontStyle: "bold" },
495
+ { token: "pdlContextReference", foreground: "9a5512" },
496
+ { token: "operator", foreground: "4f5b63" },
497
+ { token: "constant.character.escape", foreground: "9f5b00", fontStyle: "bold" },
498
+ { token: "constant.numeric", foreground: "b42318" },
499
+ { token: "constant.language", foreground: "6f42c1" },
500
+ { token: "invalid.illegal", foreground: "b42318", fontStyle: "underline" },
501
+ { token: "keyword.control", foreground: "166f5c", fontStyle: "bold" },
502
+ { token: "keyword.declaration", foreground: "166f5c", fontStyle: "bold" },
503
+ { token: "keyword.operator.frame", foreground: "7a3f98", fontStyle: "bold" },
504
+ { token: "keyword.operator", foreground: "4f5b63" },
505
+ { token: "support.function", foreground: "0f5f8f", fontStyle: "bold" },
506
+ { token: "support.function.aggregate", foreground: "0f5f8f", fontStyle: "bold" },
507
+ { token: "support.function.aggregate.pdl", foreground: "0f5f8f", fontStyle: "bold" },
508
+ { token: "support.function.scalar", foreground: "0f5f8f", fontStyle: "bold" },
509
+ { token: "support.function.scalar.pdl", foreground: "0f5f8f", fontStyle: "bold" },
510
+ { token: "support.function.window", foreground: "0f5f8f", fontStyle: "bold" },
511
+ { token: "support.function.window.pdl", foreground: "0f5f8f", fontStyle: "bold" },
512
+ { token: "entity.name.function.geometry", foreground: "0f5f8f", fontStyle: "bold" },
513
+ { token: "entity.name.function.stat", foreground: "7a3f98", fontStyle: "bold" },
514
+ { token: "entity.name.function.source", foreground: "3c6b22", fontStyle: "bold" },
515
+ { token: "entity.name.function.literal", foreground: "6f42c1" },
516
+ { token: "entity.name.function", foreground: "315f7d" },
517
+ { token: "entity.name.namespace", foreground: "7c3aed", fontStyle: "bold" },
518
+ { token: "support.type.namespace", foreground: "2563eb", fontStyle: "bold" },
519
+ { token: "variable.parameter.property.unknown", foreground: "a33d2d" },
520
+ { token: "variable.parameter.property", foreground: "9a5512" },
521
+ { token: "variable.other.declaration", foreground: "7c3aed", fontStyle: "bold" },
522
+ { token: "variable.other.binding", foreground: "2563eb", fontStyle: "bold" },
523
+ { token: "variable.other.quoted", foreground: "385f70" },
524
+ { token: "variable.parameter", foreground: "475569" },
525
+ { token: "variable.other.member", foreground: "475569" },
526
+ { token: "variable.other.readwrite", foreground: "475569" },
527
+ { token: "variable.other.column.definition", foreground: "475569" },
528
+ { token: "variable.other.column", foreground: "0e7490" },
529
+ { token: "punctuation", foreground: "68757d" }
530
+ ],
531
+ colors: {
532
+ "editor.background": "#ffffff",
533
+ "editor.foreground": "#171f24",
534
+ "editor.lineHighlightBackground": "#f4f7f6",
535
+ "editorLineNumber.foreground": "#9aa6ac",
536
+ "editorLineNumber.activeForeground": "#21695d",
537
+ "editorCursor.foreground": "#1f6f62",
538
+ "editor.selectionBackground": "#cfe8df",
539
+ "editor.inactiveSelectionBackground": "#e8f2ee",
540
+ "editorIndentGuide.background1": "#edf1f3",
541
+ "editorIndentGuide.activeBackground1": "#c9d8d3"
542
+ }
543
+ };
544
+ }
545
+ function registerPdlEditorProviders(options) {
546
+ const languageId = options.languageId ?? PDL_LANGUAGE_ID;
547
+ const programPathForRequest = options.programPathForModel ?? programPathForModel;
548
+ const disposables = [
549
+ monaco.languages.registerHoverProvider(languageId, {
550
+ provideHover(model, position) {
551
+ const hover = requestFeature(model, options, programPathForRequest, {
552
+ kind: "hover",
553
+ position: toTextPosition(position)
554
+ });
555
+ if (!hover) {
556
+ return null;
557
+ }
558
+ return {
559
+ contents: [{ value: hover.markdown, isTrusted: false, supportHtml: false }],
560
+ range: fromTextRange(hover.range)
561
+ };
562
+ }
563
+ }),
564
+ monaco.languages.registerCompletionItemProvider(languageId, {
565
+ triggerCharacters: ["|", '"', " ", "$", "@"],
566
+ provideCompletionItems(model, position) {
567
+ const completions = requestFeature(model, options, programPathForRequest, {
568
+ kind: "completion",
569
+ position: toTextPosition(position)
570
+ });
571
+ return {
572
+ suggestions: (completions ?? []).map((item) => completionItem(item, position))
573
+ };
574
+ }
575
+ }),
576
+ monaco.languages.registerDocumentFormattingEditProvider(languageId, {
577
+ provideDocumentFormattingEdits(model) {
578
+ const edit = requestFeature(model, options, programPathForRequest, {
579
+ kind: "formatting"
580
+ });
581
+ return edit ? [textEdit(edit)] : [];
582
+ }
583
+ }),
584
+ monaco.languages.registerDocumentSemanticTokensProvider(languageId, {
585
+ getLegend() {
586
+ return {
587
+ tokenTypes: SEMANTIC_TOKEN_TYPES,
588
+ tokenModifiers: []
589
+ };
590
+ },
591
+ provideDocumentSemanticTokens(model) {
592
+ const tokens = requestFeature(model, options, programPathForRequest, {
593
+ kind: "semanticTokens"
594
+ });
595
+ return {
596
+ data: new Uint32Array(encodeSemanticTokens(tokens ?? [])),
597
+ resultId: void 0
598
+ };
599
+ },
600
+ releaseDocumentSemanticTokens() {
601
+ return void 0;
602
+ }
603
+ }),
604
+ monaco.languages.registerDefinitionProvider(languageId, {
605
+ provideDefinition(model, position) {
606
+ const location = requestFeature(model, options, programPathForRequest, {
607
+ kind: "definition",
608
+ position: toTextPosition(position)
609
+ });
610
+ return location ? [{ uri: model.uri, range: fromTextRange(location.range) }] : [];
611
+ }
612
+ }),
613
+ monaco.languages.registerReferenceProvider(languageId, {
614
+ provideReferences(model, position) {
615
+ const locations = requestFeature(model, options, programPathForRequest, {
616
+ kind: "references",
617
+ position: toTextPosition(position)
618
+ });
619
+ return (locations ?? []).map((location) => ({
620
+ uri: model.uri,
621
+ range: fromTextRange(location.range)
622
+ }));
623
+ }
624
+ }),
625
+ monaco.languages.registerRenameProvider(languageId, {
626
+ provideRenameEdits(model, position, newName) {
627
+ const edits = requestFeature(model, options, programPathForRequest, {
628
+ kind: "rename",
629
+ position: toTextPosition(position),
630
+ newName
631
+ });
632
+ return {
633
+ edits: (edits ?? []).map((edit) => ({
634
+ resource: model.uri,
635
+ textEdit: textEdit(edit),
636
+ versionId: void 0
637
+ }))
638
+ };
639
+ }
640
+ }),
641
+ monaco.languages.registerDocumentSymbolProvider(languageId, {
642
+ provideDocumentSymbols(model) {
643
+ const symbols = requestFeature(model, options, programPathForRequest, {
644
+ kind: "documentSymbols"
645
+ });
646
+ return (symbols ?? []).map(documentSymbol);
647
+ }
648
+ })
649
+ ];
650
+ return {
651
+ dispose() {
652
+ for (const disposable of disposables) {
653
+ disposable.dispose();
654
+ }
655
+ }
656
+ };
657
+ }
658
+ function programPathForModel(model) {
659
+ const path = model.uri.path.replace(/^\/+/, "");
660
+ return path ? `memory/${path}` : "memory/main.pdl";
661
+ }
662
+ function setPdlMarkers(model, diagnostics) {
663
+ monaco.editor.setModelMarkers(
664
+ model,
665
+ PDL_MARKER_OWNER,
666
+ diagnostics.map((diagnostic) => diagnosticToPdlMarker(diagnostic))
667
+ );
668
+ }
669
+ function diagnosticToPdlMarker(diagnostic) {
670
+ const start = fromTextPosition(diagnostic.range.start);
671
+ const end = fromTextPosition(diagnostic.range.end);
672
+ return {
673
+ code: diagnostic.code,
674
+ severity: severityToMarkerSeverity(diagnostic.severity),
675
+ source: "PDL",
676
+ message: diagnostic.message,
677
+ startLineNumber: start.lineNumber,
678
+ startColumn: start.column,
679
+ endLineNumber: end.lineNumber,
680
+ endColumn: end.column === start.column && end.lineNumber === start.lineNumber ? end.column + 1 : end.column
681
+ };
682
+ }
683
+ function ensurePdlProviders(languageId) {
684
+ providerDisposable ?? (providerDisposable = registerPdlEditorProviders({
685
+ languageId,
686
+ getRuntime: (model) => editorContexts.get(model.uri.toString())?.runtime() ?? null,
687
+ getFiles: (model) => editorContexts.get(model.uri.toString())?.files() ?? {}
688
+ }));
689
+ }
690
+ async function setupPdlMonacoOnce(options) {
691
+ if (options.configureWorker !== false) {
692
+ configureMonacoWorker();
693
+ }
694
+ registerPdlLanguage(options);
695
+ definePdlTheme(options.themeName ?? PDL_THEME_NAME, options.theme ?? defaultPdlTheme());
696
+ await loadOnigasmOnce(options.onigasmWasmUrl ?? import_onigasm2.default);
697
+ const registry = new import_monaco_textmate.Registry({
698
+ getGrammarDefinition: async () => ({
699
+ format: "json",
700
+ content: options.grammar ?? pdl_tmLanguage_default
701
+ })
702
+ });
703
+ await (0, import_monaco_editor_textmate.wireTmGrammars)(
704
+ monaco,
705
+ registry,
706
+ /* @__PURE__ */ new Map([[options.languageId ?? PDL_LANGUAGE_ID, options.scopeName ?? PDL_SCOPE_NAME]])
707
+ );
708
+ }
709
+ function configureMonacoWorker() {
710
+ const target = globalThis;
711
+ target.MonacoEnvironment ?? (target.MonacoEnvironment = {
712
+ getWorker: () => new import_editor.default()
713
+ });
714
+ }
715
+ function loadOnigasmOnce(url) {
716
+ onigasmPromise ?? (onigasmPromise = (0, import_onigasm.loadWASM)(url).catch((error) => {
717
+ onigasmPromise = null;
718
+ throw error;
719
+ }));
720
+ return onigasmPromise;
721
+ }
722
+ function requestFeature(model, options, resolveProgramPath, request) {
723
+ const runtime = options.getRuntime(model);
724
+ if (!runtime) {
725
+ return null;
726
+ }
727
+ const response = runtime.editorService(model.getValue(), options.getFiles(model), request, resolveProgramPath(model));
728
+ if (response.error) {
729
+ console.warn(`PDL editor service failed: ${response.error}`);
730
+ return null;
731
+ }
732
+ return response.result;
733
+ }
734
+ function toTextPosition(position) {
735
+ return {
736
+ line: Math.max(0, position.lineNumber - 1),
737
+ character: Math.max(0, position.column - 1)
738
+ };
739
+ }
740
+ function fromTextPosition(position) {
741
+ return {
742
+ lineNumber: position.line + 1,
743
+ column: position.character + 1
744
+ };
745
+ }
746
+ function fromTextRange(range) {
747
+ const start = fromTextPosition(range.start);
748
+ const end = fromTextPosition(range.end);
749
+ return new monaco.Range(start.lineNumber, start.column, end.lineNumber, end.column);
750
+ }
751
+ function completionItem(item, position) {
752
+ return {
753
+ label: item.label,
754
+ kind: completionKind(item.kind),
755
+ detail: item.detail,
756
+ insertText: item.insert_text,
757
+ range: new monaco.Range(position.lineNumber, position.column, position.lineNumber, position.column)
758
+ };
759
+ }
760
+ function completionKind(kind) {
761
+ switch (kind) {
762
+ case "Binding":
763
+ case "Context":
764
+ return monaco.languages.CompletionItemKind.Variable;
765
+ case "Column":
766
+ return monaco.languages.CompletionItemKind.Field;
767
+ case "Format":
768
+ return monaco.languages.CompletionItemKind.EnumMember;
769
+ case "Function":
770
+ return monaco.languages.CompletionItemKind.Function;
771
+ case "Keyword":
772
+ case "Stage":
773
+ return monaco.languages.CompletionItemKind.Keyword;
774
+ }
775
+ }
776
+ function textEdit(edit) {
777
+ return {
778
+ range: fromTextRange(edit.range),
779
+ text: edit.new_text
780
+ };
781
+ }
782
+ function encodeSemanticTokens(tokens) {
783
+ let previousLine = 0;
784
+ let previousStart = 0;
785
+ const data = [];
786
+ for (const token of tokens) {
787
+ if (token.range.start.line !== token.range.end.line) {
788
+ continue;
789
+ }
790
+ const deltaLine = token.range.start.line - previousLine;
791
+ const deltaStart = deltaLine === 0 ? token.range.start.character - previousStart : token.range.start.character;
792
+ const length = token.range.end.character - token.range.start.character;
793
+ if (length <= 0) {
794
+ continue;
795
+ }
796
+ data.push(deltaLine, deltaStart, length, semanticTokenIndex(token.token_type), 0);
797
+ previousLine = token.range.start.line;
798
+ previousStart = token.range.start.character;
799
+ }
800
+ return data;
801
+ }
802
+ function semanticTokenIndex(kind) {
803
+ switch (kind) {
804
+ case "Keyword":
805
+ return 0;
806
+ case "Function":
807
+ return 1;
808
+ case "Variable":
809
+ return 2;
810
+ case "String":
811
+ return 3;
812
+ case "Number":
813
+ return 4;
814
+ case "Operator":
815
+ return 5;
816
+ case "BindingDeclaration":
817
+ return 6;
818
+ case "BindingReference":
819
+ return 7;
820
+ case "ColumnDefinition":
821
+ return 8;
822
+ case "ColumnReference":
823
+ return 9;
824
+ case "ContextDeclaration":
825
+ return 10;
826
+ case "ContextReference":
827
+ return 11;
828
+ }
829
+ }
830
+ function documentSymbol(symbol) {
831
+ return {
832
+ name: symbol.name,
833
+ detail: symbol.detail,
834
+ kind: symbolKind(symbol.kind),
835
+ range: fromTextRange(symbol.range),
836
+ selectionRange: fromTextRange(symbol.selection_range),
837
+ tags: [],
838
+ children: symbol.children.map(documentSymbol)
839
+ };
840
+ }
841
+ function symbolKind(kind) {
842
+ switch (kind) {
843
+ case "Binding":
844
+ case "Context":
845
+ return monaco.languages.SymbolKind.Variable;
846
+ case "Function":
847
+ return monaco.languages.SymbolKind.Function;
848
+ case "Stage":
849
+ return monaco.languages.SymbolKind.Method;
850
+ }
851
+ }
852
+ function severityToMarkerSeverity(severity) {
853
+ switch (severity) {
854
+ case "error":
855
+ return monaco.MarkerSeverity.Error;
856
+ case "warning":
857
+ return monaco.MarkerSeverity.Warning;
858
+ case "info":
859
+ return monaco.MarkerSeverity.Info;
860
+ case "hint":
861
+ return monaco.MarkerSeverity.Hint;
862
+ }
863
+ }