mbeditor 0.5.5 → 0.5.6

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 041ce3cd1e0cc69e9c9d4fbf4a3578d8681ce4ed54cbaf6351f36e4642d161b9
4
- data.tar.gz: e65f221f2bad0d72957225ba5836104878e27865c4e86b82b45857509922d571
3
+ metadata.gz: acc982f027b14cfd3ad12a911b327edef848a353f11fc64df7b2c5e194557a45
4
+ data.tar.gz: 768bf200ae935e14b4974249e41b27c26d2b2d105207a03a2399727f3b951912
5
5
  SHA512:
6
- metadata.gz: 9f51620ece5851894a862bc5ed080bb0a4d73a4263a987b069b212ed15d705f3a2ce1383dcb6850578bd2bb6f1aa5a00734132d11ab62cf91cfb945cf8042a5d
7
- data.tar.gz: da12cdf3ddceaf8d91f173ca11df458e88f4c294294eef005401a6b2ecc3457d5d76f4ce9bb148d6fbd18e572a0b669f154ef4675855ebb170fe63859aef82dd
6
+ metadata.gz: 43a3c2adfdaf54835bca24a81d2dfbfd668b85be02ea62113ce3bb038baafbe2f717e0651cdb9e9c40657548ef3ceb3e4ee94dbf5633baf6e267a4b92fefeabf
7
+ data.tar.gz: 26fd951cc646560d6bdb2b0db9a02ef8f0f821e76232bfceea2c40dfcdb99d1768a8f2ddb5cc0efb037862899485845ecffe28274a5bcb9ff04e17f7fe049024
@@ -51,6 +51,13 @@
51
51
 
52
52
  var globalsRegistered = false;
53
53
 
54
+ // JS global discovery: populated as definitions are found via hover/goto/auto-resolve.
55
+ // Persists for the page lifetime so each symbol is only declared once.
56
+ var discoveredJsGlobals = {};
57
+ var attemptedJsGlobals = {}; // symbols already looked up (found OR not found)
58
+ var jsHoverCache = {};
59
+ var jsMembersCache = {};
60
+
54
61
  // Enumerate window for user-defined globals and return a TypeScript declaration string.
55
62
  // Sprockets exposes every top-level var/function as a window property before Monaco
56
63
  // initialises, so scanning at registration time captures all components and helpers.
@@ -77,6 +84,39 @@
77
84
  return lines.join('\n');
78
85
  }
79
86
 
87
+ // Declare a discovered global in Monaco's extra libs so the TS2304 warning disappears.
88
+ // Calling addExtraLib with the same URI replaces the previous content in-place.
89
+ function addDiscoveredGlobal(name) {
90
+ if (discoveredJsGlobals[name]) return;
91
+ discoveredJsGlobals[name] = true;
92
+ var mts = window.monaco && window.monaco.languages && window.monaco.languages.typescript;
93
+ if (!mts) return;
94
+ var decls = Object.keys(discoveredJsGlobals)
95
+ .map(function(k) { return 'declare var ' + k + ': any;'; }).join('\n');
96
+ mts.javascriptDefaults.addExtraLib(decls, 'inmemory://mbeditor/discovered-globals.d.ts');
97
+ }
98
+
99
+ // Navigate to the first workspace definition of a JS symbol.
100
+ // Returns a Promise<boolean> — true if a definition was found and opened.
101
+ function navigateToJsWord(editor, word) {
102
+ if (typeof FileService === 'undefined' || !FileService.getJsDefinition) return Promise.resolve(false);
103
+ var currentPath = editor.getModel && editor.getModel() && editor.getModel()._mbeditorPath;
104
+ return FileService.getJsDefinition(word)
105
+ .then(function(data) {
106
+ var results = data && data.results;
107
+ if (!results || !results.length) return false;
108
+ var r = results[0];
109
+ // Only declare as a global when the definition lives in a different file.
110
+ // Locally-defined functions/classes must not get a duplicate declare var.
111
+ if (r.file !== currentPath) addDiscoveredGlobal(word);
112
+ if (typeof TabManager !== 'undefined' && TabManager.openTab) {
113
+ TabManager.openTab(r.file, r.file.split('/').pop(), r.line);
114
+ }
115
+ return true;
116
+ })
117
+ .catch(function() { return false; });
118
+ }
119
+
80
120
  function leadingWhitespace(line) {
81
121
  var match = line.match(/^\s*/);
82
122
  return match ? match[0] : '';
@@ -231,6 +271,8 @@
231
271
  var emmetTabDisposable = null;
232
272
  var gotoMouseDisposable = null;
233
273
  var gotoActionDisposable = null;
274
+ var jsGotoMouseDisposable = null;
275
+ var jsGotoActionDisposable = null;
234
276
 
235
277
  // Emmet Tab expansion — active for markup and stylesheet languages
236
278
  var EMMET_MARKUP_LANGS = { html: true, xml: true, erb: true, 'html.erb': true, haml: true };
@@ -383,6 +425,42 @@
383
425
  });
384
426
  }
385
427
 
428
+ if (language === 'javascript') {
429
+ // Ctrl/Cmd+click — look up workspace definition; fall back to Monaco's built-in.
430
+ jsGotoMouseDisposable = editor.onMouseDown(function(event) {
431
+ var ctrlOrCmd = event.event.ctrlKey || event.event.metaKey;
432
+ if (!ctrlOrCmd) return;
433
+ if (!event.target || event.target.type !== 6) return;
434
+ var position = event.target.position;
435
+ if (!position) return;
436
+ var wordInfo = model.getWordAtPosition(position);
437
+ if (!wordInfo || !wordInfo.word || wordInfo.word.length < 2) return;
438
+ event.event.preventDefault();
439
+ navigateToJsWord(editor, wordInfo.word).then(function(found) {
440
+ if (!found) editor.trigger('', 'editor.action.revealDefinition', null);
441
+ });
442
+ });
443
+
444
+ // F12 — go to JS definition from keyboard
445
+ jsGotoActionDisposable = editor.addAction({
446
+ id: 'mbeditor.gotoJsDefinition',
447
+ label: 'Go to JS Definition',
448
+ keybindings: [window.monaco.KeyCode.F12],
449
+ precondition: 'editorLangId == javascript',
450
+ contextMenuGroupId: 'navigation',
451
+ contextMenuOrder: 1.5,
452
+ run: function(ed) {
453
+ var pos = ed.getPosition();
454
+ if (!pos) return;
455
+ var wordInfo = model.getWordAtPosition(pos);
456
+ if (!wordInfo || !wordInfo.word || wordInfo.word.length < 2) return;
457
+ navigateToJsWord(ed, wordInfo.word).then(function(found) {
458
+ if (!found) ed.trigger('', 'editor.action.revealDefinition', null);
459
+ });
460
+ }
461
+ });
462
+ }
463
+
386
464
  // Unused method dimming — grey out `def method_name` for methods with no
387
465
  // call-sites anywhere in the workspace.
388
466
  var unusedDecIds = [];
@@ -453,6 +531,8 @@
453
531
  if (emmetTabDisposable) emmetTabDisposable.dispose();
454
532
  if (gotoMouseDisposable) gotoMouseDisposable.dispose();
455
533
  if (gotoActionDisposable) gotoActionDisposable.dispose();
534
+ if (jsGotoMouseDisposable) jsGotoMouseDisposable.dispose();
535
+ if (jsGotoActionDisposable) jsGotoActionDisposable.dispose();
456
536
  contentDisposable.dispose();
457
537
  if (unusedSaveDisposable) unusedSaveDisposable.dispose();
458
538
  clearTimeout(unusedTimer);
@@ -517,12 +597,13 @@
517
597
  // the marker set after the worker fires and re-apply with lower severity.
518
598
  //
519
599
  // Patch markers after the TypeScript worker fires:
600
+ // - JS files: downgrade TS2304 ("Cannot find name") to Warning — host-app
601
+ // globals injected at runtime are invisible to the language service, so
602
+ // hard errors are almost always false positives. Downgrading keeps the
603
+ // signal without blocking genuine undefined-variable detection.
520
604
  // - Both: downgrade TS6133 ("declared but never read") from Error to Warning.
521
- // Host-app globals are handled by the dynamic window shim and explicit
522
- // addExtraLib declarations above — we do not suppress TS2304 globally so
523
- // that genuinely undefined names are still flagged as errors.
524
605
  var JS_SUPPRESS_CODES = {};
525
- var JS_WARN_CODES = { '6133': true };
606
+ var JS_WARN_CODES = { '2304': true, '6133': true };
526
607
  var TS_WARN_CODES = { '6133': true };
527
608
  var _severityPatchActive = false;
528
609
  monaco.editor.onDidChangeMarkers(function(uris) {
@@ -554,6 +635,35 @@
554
635
  } finally {
555
636
  _severityPatchActive = false;
556
637
  }
638
+
639
+ // Auto-resolve TS2304 ("Cannot find name 'X'") for JS files by
640
+ // looking up the symbol in the workspace. If found, addDiscoveredGlobal
641
+ // declares it via addExtraLib and Monaco re-validates, removing the warning.
642
+ if (typeof FileService !== 'undefined' && FileService.getJsDefinition) {
643
+ uris.forEach(function(uri) {
644
+ var model = monaco.editor.getModel(uri);
645
+ if (!model) return;
646
+ var markers = monaco.editor.getModelMarkers({ resource: uri, owner: 'javascript' });
647
+ markers.forEach(function(m) {
648
+ if (String(m.code) !== '2304') return;
649
+ // Extract symbol name from message: "Cannot find name 'ReactWindow'."
650
+ var match = m.message && m.message.match(/Cannot find name '([^']+)'/);
651
+ if (!match) return;
652
+ var sym = match[1];
653
+ if (attemptedJsGlobals[sym]) return;
654
+ attemptedJsGlobals[sym] = true;
655
+ var modelPath = model._mbeditorPath;
656
+ FileService.getJsDefinition(sym)
657
+ .then(function(data) {
658
+ var results = data && data.results;
659
+ if (results && results.length && results[0].file !== modelPath) {
660
+ addDiscoveredGlobal(sym);
661
+ }
662
+ })
663
+ .catch(function() {});
664
+ });
665
+ });
666
+ }
557
667
  });
558
668
  }
559
669
 
@@ -1076,6 +1186,94 @@
1076
1186
  }
1077
1187
  });
1078
1188
 
1189
+ // JS/JSX hover provider: looks up workspace definitions for window globals.
1190
+ // Only fires for mixed-case identifiers (skips lowercase-only names that are
1191
+ // almost always browser builtins or local vars).
1192
+ var JS_HOVER_CACHE_TTL_MS = 60000;
1193
+ monaco.languages.registerHoverProvider('javascript', {
1194
+ provideHover: function(model, position, token) {
1195
+ var wordInfo = model.getWordAtPosition(position);
1196
+ if (!wordInfo || !wordInfo.word || wordInfo.word.length < 2) return null;
1197
+ var word = wordInfo.word;
1198
+ if (!/[A-Z]/.test(word)) return null;
1199
+ if (typeof FileService === 'undefined' || !FileService.getJsDefinition) return null;
1200
+
1201
+ var cached = jsHoverCache[word];
1202
+ if (cached && (Date.now() - cached.ts) < JS_HOVER_CACHE_TTL_MS) {
1203
+ return cached.value || null;
1204
+ }
1205
+
1206
+ var controller = typeof AbortController !== 'undefined' ? new AbortController() : null;
1207
+ if (controller && token && token.onCancellationRequested) {
1208
+ token.onCancellationRequested(function() { controller.abort(); });
1209
+ }
1210
+ return FileService.getJsDefinition(word, controller ? { signal: controller.signal } : {})
1211
+ .then(function(data) {
1212
+ if (token && token.isCancellationRequested) return null;
1213
+ var results = data && data.results;
1214
+ if (!results || !results.length) {
1215
+ jsHoverCache[word] = { ts: Date.now(), value: null };
1216
+ return null;
1217
+ }
1218
+ var r = results[0];
1219
+ // Only declare as global when the definition is in a different file —
1220
+ // locally-defined functions must not get a duplicate declare var.
1221
+ if (r.file !== model._mbeditorPath) addDiscoveredGlobal(word);
1222
+ var fileRef = r.file + ':' + r.line;
1223
+ var value = {
1224
+ contents: [
1225
+ { value: '```javascript\n' + r.snippet + '\n```', isTrusted: true },
1226
+ { value: '<span style="opacity:0.55;font-size:0.9em;">' + fileRef + '</span>', isTrusted: true, supportHtml: true }
1227
+ ]
1228
+ };
1229
+ jsHoverCache[word] = { ts: Date.now(), value: value };
1230
+ return value;
1231
+ }).catch(function() { return null; });
1232
+ }
1233
+ });
1234
+
1235
+ // JS/JSX member completion provider: suggests properties/methods of workspace globals after '.'.
1236
+ // Only looks up PascalCase/mixed-case identifiers or previously discovered globals.
1237
+ var JS_MEMBERS_CACHE_TTL_MS = 60000;
1238
+ monaco.languages.registerCompletionItemProvider('javascript', {
1239
+ triggerCharacters: ['.'],
1240
+ provideCompletionItems: function(model, position) {
1241
+ var line = model.getLineContent(position.lineNumber);
1242
+ var col = position.column - 2; // index of character just before the '.'
1243
+ var end = col;
1244
+ while (col >= 0 && /[a-zA-Z0-9_$]/.test(line[col])) col--;
1245
+ var symbol = line.slice(col + 1, end + 1);
1246
+ if (!symbol || symbol.length < 2) return { suggestions: [] };
1247
+ if (!discoveredJsGlobals[symbol] && !/^[A-Z]/.test(symbol)) return { suggestions: [] };
1248
+ if (typeof FileService === 'undefined' || !FileService.getJsMembers) return { suggestions: [] };
1249
+
1250
+ var cached = jsMembersCache[symbol];
1251
+ if (cached && (Date.now() - cached.ts) < JS_MEMBERS_CACHE_TTL_MS) {
1252
+ return { suggestions: cached.suggestions };
1253
+ }
1254
+
1255
+ return FileService.getJsMembers(symbol)
1256
+ .then(function(data) {
1257
+ var members = (data && data.members) || [];
1258
+ var suggestions = members.map(function(m) {
1259
+ return {
1260
+ label: m.name,
1261
+ kind: monaco.languages.CompletionItemKind.Method,
1262
+ detail: symbol,
1263
+ documentation: m.snippet,
1264
+ insertText: m.name,
1265
+ range: {
1266
+ startLineNumber: position.lineNumber, endLineNumber: position.lineNumber,
1267
+ startColumn: position.column, endColumn: position.column
1268
+ }
1269
+ };
1270
+ });
1271
+ jsMembersCache[symbol] = { ts: Date.now(), suggestions: suggestions };
1272
+ return { suggestions: suggestions };
1273
+ }).catch(function() { return { suggestions: [] }; });
1274
+ }
1275
+ });
1276
+
1079
1277
  // Vim-style fold-marker folding provider.
1080
1278
  // Recognises {{{ (open) and }}} (close) anywhere in a line, matching the
1081
1279
  // convention used by vim's `foldmethod=marker`. Registered for every
@@ -189,6 +189,16 @@ var FileService = (function () {
189
189
  prefetchCache.delete(path);
190
190
  }
191
191
 
192
+ function getJsDefinition(symbol, extraOptions) {
193
+ var config = Object.assign({ params: { symbol: symbol }, timeout: 5000 }, extraOptions || {});
194
+ return axios.get(window.mbeditorBasePath() + '/js_definition', config).then(function(res) { return res.data; });
195
+ }
196
+
197
+ function getJsMembers(symbol, extraOptions) {
198
+ var config = Object.assign({ params: { symbol: symbol }, timeout: 5000 }, extraOptions || {});
199
+ return axios.get(window.mbeditorBasePath() + '/js_members', config).then(function(res) { return res.data; });
200
+ }
201
+
192
202
  function getModuleMembers(name, extraOptions) {
193
203
  var config = Object.assign({ params: { name: name }, timeout: 8000 }, extraOptions || {});
194
204
  return axios.get(window.mbeditorBasePath() + '/module_members', config).then(function(res) { return res.data; });
@@ -225,6 +235,8 @@ var FileService = (function () {
225
235
  saveBranchState: saveBranchState,
226
236
  pruneBranchStates: pruneBranchStates,
227
237
  getDefinition: getDefinition,
238
+ getJsDefinition: getJsDefinition,
239
+ getJsMembers: getJsMembers,
228
240
  prefetch: prefetch,
229
241
  getPrefetched: getPrefetched,
230
242
  cancelPrefetch: cancelPrefetch,
@@ -351,6 +351,34 @@ module Mbeditor
351
351
  render json: { error: e.message }, status: :unprocessable_content
352
352
  end
353
353
 
354
+ # GET /mbeditor/js_definition?symbol=ReactWindow
355
+ # Searches workspace JS/JSX/TS/TSX files for global definitions of the named symbol.
356
+ def js_definition
357
+ symbol = params[:symbol].to_s.strip
358
+ return render json: { results: [] } if symbol.blank?
359
+ return render json: { error: "Invalid symbol" }, status: :bad_request \
360
+ unless symbol.match?(/\A[a-zA-Z_$][a-zA-Z0-9_$]{0,59}\z/)
361
+
362
+ results = JsDefinitionService.new(symbol, workspace_root).call
363
+ render json: { results: results }
364
+ rescue StandardError => e
365
+ render json: { error: e.message }, status: :unprocessable_content
366
+ end
367
+
368
+ # GET /mbeditor/js_members?symbol=ReactWindow
369
+ # Searches workspace JS/JSX/TS/TSX files for properties/methods of the named global.
370
+ def js_members
371
+ symbol = params[:symbol].to_s.strip
372
+ return render json: { members: [] } if symbol.blank?
373
+ return render json: { error: "Invalid symbol" }, status: :bad_request \
374
+ unless symbol.match?(/\A[a-zA-Z_$][a-zA-Z0-9_$]{0,59}\z/)
375
+
376
+ members = JsMembersService.new(symbol, workspace_root).call
377
+ render json: { symbol: symbol, members: members }
378
+ rescue StandardError => e
379
+ render json: { error: e.message }, status: :unprocessable_content
380
+ end
381
+
354
382
  # GET /mbeditor/module_members?name=ArticlesHelper
355
383
  # Returns methods defined in the workspace file that defines the named module/class.
356
384
  def module_members
@@ -702,8 +730,8 @@ module Mbeditor
702
730
 
703
731
  # GET /mbeditor/manifest.webmanifest — PWA manifest
704
732
  def pwa_manifest
705
- _mount = request.script_name.to_s.gsub(%r{(^/+|/+$)}, "")
706
- base = _mount.empty? ? "" : "/#{_mount}"
733
+ raw = root_path.chomp("/")
734
+ base = raw.start_with?("/") || raw.empty? ? raw : "/#{raw}"
707
735
  manifest = {
708
736
  name: "Mbeditor — #{Rails.root.basename}",
709
737
  short_name: "Mbeditor",
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+
5
+ module Mbeditor
6
+ # Searches JS/JSX/TS/TSX files in the workspace for definitions of a named
7
+ # JavaScript global (variable, function, class, or window property assignment).
8
+ #
9
+ # Uses ripgrep (falling back to grep) to locate lines matching common
10
+ # definition patterns, then returns workspace-relative results.
11
+ #
12
+ # Returns an array of hashes:
13
+ # { file: String, line: Integer, snippet: String }
14
+ class JsDefinitionService
15
+ MAX_RESULTS = 20
16
+
17
+ JS_GLOBS = %w[*.js *.jsx *.ts *.tsx *.js.jsx *.js.erb *.jsx.erb].freeze
18
+
19
+ def initialize(symbol, workspace_root)
20
+ @symbol = symbol.to_s
21
+ @workspace_root = workspace_root.to_s.chomp("/")
22
+ end
23
+
24
+ def call
25
+ return [] if @symbol.empty? || @workspace_root.empty?
26
+ return [] unless File.directory?(@workspace_root)
27
+
28
+ pattern = build_pattern
29
+ lines = run_search(pattern)
30
+ parse_results(lines)
31
+ end
32
+
33
+ private
34
+
35
+ def build_pattern
36
+ s = Regexp.escape(@symbol)
37
+ # Matches the most common JS global-definition forms, anchored so we
38
+ # don't pick up every usage — only assignment / declaration lines.
39
+ "(?:window\\.#{s}\\s*=|\\b(?:var|let|const)\\s+#{s}[\\s=;,]|\\bfunction\\s+#{s}[\\s({]|\\bclass\\s+#{s}\\b|\\bexport\\s+(?:default\\s+)?(?:var|let|const|function|class)\\s+#{s}\\b)"
40
+ end
41
+
42
+ def glob_args
43
+ JS_GLOBS.flat_map { |g| ["-g", g] }
44
+ end
45
+
46
+ def run_search(pattern)
47
+ if rg_available?
48
+ run_rg(pattern)
49
+ else
50
+ run_grep(pattern)
51
+ end
52
+ end
53
+
54
+ def rg_available?
55
+ system("which rg > /dev/null 2>&1")
56
+ end
57
+
58
+ def run_rg(pattern)
59
+ args = ["rg", "--no-heading", "-n", "--color=never",
60
+ "-e", pattern] + glob_args + [@workspace_root]
61
+ out, = Open3.capture2(*args)
62
+ out.lines
63
+ rescue StandardError
64
+ []
65
+ end
66
+
67
+ def run_grep(pattern)
68
+ globs = JS_GLOBS.map { |g| "--include=#{g}" }
69
+ args = ["grep", "-rn", "--color=never", "-E", pattern] + globs + [@workspace_root]
70
+ out, = Open3.capture2(*args)
71
+ out.lines
72
+ rescue StandardError
73
+ []
74
+ end
75
+
76
+ def parse_results(lines)
77
+ results = []
78
+ lines.each do |raw|
79
+ raw = raw.chomp
80
+ # ripgrep/grep output: /abs/path/file.js:42: window.ReactWindow = ...
81
+ m = raw.match(/\A(.+?):(\d+):(.+)\z/)
82
+ next unless m
83
+
84
+ abs_path = m[1]
85
+ line_num = m[2].to_i
86
+ snippet = m[3].strip
87
+
88
+ next unless abs_path.start_with?(@workspace_root)
89
+
90
+ rel_path = abs_path.delete_prefix(@workspace_root).delete_prefix("/")
91
+ results << { file: rel_path, line: line_num, snippet: snippet }
92
+ break if results.length >= MAX_RESULTS
93
+ end
94
+ results
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+
5
+ module Mbeditor
6
+ # Searches JS/JSX/TS/TSX files for properties/methods attached to a named
7
+ # global object (direct assignment and prototype assignment patterns).
8
+ #
9
+ # Examples matched for symbol "ReactWindow":
10
+ # ReactWindow.open = function() { ... }
11
+ # ReactWindow.prototype.close = function() { ... }
12
+ #
13
+ # Returns an array of hashes:
14
+ # { name: String, snippet: String }
15
+ class JsMembersService
16
+ MAX_RESULTS = 50
17
+
18
+ JS_GLOBS = %w[*.js *.jsx *.ts *.tsx *.js.jsx *.js.erb *.jsx.erb].freeze
19
+
20
+ def initialize(symbol, workspace_root)
21
+ @symbol = symbol.to_s
22
+ @workspace_root = workspace_root.to_s.chomp("/")
23
+ end
24
+
25
+ def call
26
+ return [] if @symbol.empty? || @workspace_root.empty?
27
+ return [] unless File.directory?(@workspace_root)
28
+
29
+ pattern = build_pattern
30
+ lines = run_search(pattern)
31
+ parse_results(lines)
32
+ end
33
+
34
+ private
35
+
36
+ def build_pattern
37
+ s = Regexp.escape(@symbol)
38
+ "#{s}\\.(?:prototype\\.)?([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*="
39
+ end
40
+
41
+ def glob_args
42
+ JS_GLOBS.flat_map { |g| ["-g", g] }
43
+ end
44
+
45
+ def rg_available?
46
+ system("which rg > /dev/null 2>&1")
47
+ end
48
+
49
+ def run_search(pattern)
50
+ if rg_available?
51
+ run_rg(pattern)
52
+ else
53
+ run_grep(pattern)
54
+ end
55
+ end
56
+
57
+ def run_rg(pattern)
58
+ args = ["rg", "--no-heading", "-n", "--color=never",
59
+ "-e", pattern] + glob_args + [@workspace_root]
60
+ out, = Open3.capture2(*args)
61
+ out.lines
62
+ rescue StandardError
63
+ []
64
+ end
65
+
66
+ def run_grep(pattern)
67
+ globs = JS_GLOBS.map { |g| "--include=#{g}" }
68
+ args = ["grep", "-rn", "--color=never", "-E", pattern] + globs + [@workspace_root]
69
+ out, = Open3.capture2(*args)
70
+ out.lines
71
+ rescue StandardError
72
+ []
73
+ end
74
+
75
+ def parse_results(lines)
76
+ results = []
77
+ seen = {}
78
+ lines.each do |raw|
79
+ raw = raw.chomp
80
+ m = raw.match(/\A.+?:\d+:(.+)\z/)
81
+ next unless m
82
+
83
+ snippet = m[1].strip
84
+
85
+ # Extract member name from pattern like ReactWindow.foo = or ReactWindow.prototype.foo =
86
+ s = Regexp.escape(@symbol)
87
+ member_match = snippet.match(/#{s}\.(?:prototype\.)?([a-zA-Z_$][a-zA-Z0-9_$]*)\s*=/)
88
+ next unless member_match
89
+
90
+ name = member_match[1]
91
+ next if seen[name]
92
+
93
+ seen[name] = true
94
+ results << { name: name, snippet: snippet }
95
+ break if results.length >= MAX_RESULTS
96
+ end
97
+ results
98
+ end
99
+ end
100
+ end
@@ -7,7 +7,7 @@
7
7
  <meta name="theme-color" content="#1e1e2e" />
8
8
  <meta name="mobile-web-app-capable" content="yes" />
9
9
  <meta name="apple-mobile-web-app-capable" content="yes" />
10
- <% _mount = request.script_name.to_s.gsub(%r{(^/+|/+$)}, ''); pwa_base = _mount.empty? ? '' : "/#{_mount}" %>
10
+ <% _raw_base = root_path.chomp('/'); pwa_base = (_raw_base.start_with?('/') || _raw_base.empty?) ? _raw_base : "/#{_raw_base}" %>
11
11
  <link rel="manifest" href="<%= "#{pwa_base}/manifest.webmanifest" %>" />
12
12
  <script>
13
13
  if ('serviceWorker' in navigator) {
data/config/routes.rb CHANGED
@@ -21,6 +21,8 @@ Mbeditor::Engine.routes.draw do
21
21
  get 'search', to: 'editors#search'
22
22
  post 'replace_in_files', to: 'editors#replace_in_files'
23
23
  get 'definition', to: 'editors#definition'
24
+ get 'js_definition', to: 'editors#js_definition'
25
+ get 'js_members', to: 'editors#js_members'
24
26
  get 'module_members', to: 'editors#module_members'
25
27
  get 'file_includes', to: 'editors#file_includes'
26
28
  get 'unused_methods', to: 'editors#unused_methods'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mbeditor
4
- VERSION = "0.5.5"
4
+ VERSION = "0.5.6"
5
5
  end
@@ -0,0 +1,13 @@
1
+ /*!-----------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1)
4
+ * Released under the MIT license
5
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
6
+ *-----------------------------------------------------------------------------*/
7
+ define("vs/language/css/cssMode", ["require","require"],(require)=>{
8
+ "use strict";var moduleExports=(()=>{var Tt=Object.create;var X=Object.defineProperty;var _t=Object.getOwnPropertyDescriptor;var Ct=Object.getOwnPropertyNames;var bt=Object.getPrototypeOf,wt=Object.prototype.hasOwnProperty;var Et=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,i)=>(typeof require<"u"?require:n)[i]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var Rt=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports),Pt=(e,n)=>{for(var i in n)X(e,i,{get:n[i],enumerable:!0})},z=(e,n,i,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of Ct(n))!wt.call(e,t)&&t!==i&&X(e,t,{get:()=>n[t],enumerable:!(r=_t(n,t))||r.enumerable});return e},he=(e,n,i)=>(z(e,n,"default"),i&&z(i,n,"default")),me=(e,n,i)=>(i=e!=null?Tt(bt(e)):{},z(n||!e||!e.__esModule?X(i,"default",{value:e,enumerable:!0}):i,e)),Lt=e=>z(X({},"__esModule",{value:!0}),e);var ye=Rt((Qt,xe)=>{var Wt=me(Et("vs/editor/editor.api"));xe.exports=Wt});var Bt={};Pt(Bt,{CompletionAdapter:()=>D,DefinitionAdapter:()=>A,DiagnosticsAdapter:()=>W,DocumentColorAdapter:()=>N,DocumentFormattingEditProvider:()=>U,DocumentHighlightAdapter:()=>F,DocumentLinkAdapter:()=>fe,DocumentRangeFormattingEditProvider:()=>H,DocumentSymbolAdapter:()=>j,FoldingRangeAdapter:()=>O,HoverAdapter:()=>S,ReferenceAdapter:()=>M,RenameAdapter:()=>K,SelectionRangeAdapter:()=>V,WorkerManager:()=>_,fromPosition:()=>k,fromRange:()=>pe,setupMode:()=>$t,toRange:()=>y,toTextEdit:()=>P});var d={};he(d,me(ye()));var Dt=2*60*1e3,_=class{constructor(n){this._defaults=n,this._worker=null,this._client=null,this._idleCheckInterval=window.setInterval(()=>this._checkIfIdle(),30*1e3),this._lastUsedTime=0,this._configChangeListener=this._defaults.onDidChange(()=>this._stopWorker())}_stopWorker(){this._worker&&(this._worker.dispose(),this._worker=null),this._client=null}dispose(){clearInterval(this._idleCheckInterval),this._configChangeListener.dispose(),this._stopWorker()}_checkIfIdle(){if(!this._worker)return;Date.now()-this._lastUsedTime>Dt&&this._stopWorker()}_getClient(){return this._lastUsedTime=Date.now(),this._client||(this._worker=d.editor.createWebWorker({moduleId:"vs/language/css/cssWorker",label:this._defaults.languageId,createData:{options:this._defaults.options,languageId:this._defaults.languageId}}),this._client=this._worker.getProxy()),this._client}getLanguageServiceWorker(...n){let i;return this._getClient().then(r=>{i=r}).then(r=>{if(this._worker)return this._worker.withSyncedResources(n)}).then(r=>i)}};var ve;(function(e){function n(i){return typeof i=="string"}e.is=n})(ve||(ve={}));var Z;(function(e){function n(i){return typeof i=="string"}e.is=n})(Z||(Z={}));var Ie;(function(e){e.MIN_VALUE=-2147483648,e.MAX_VALUE=2147483647;function n(i){return typeof i=="number"&&e.MIN_VALUE<=i&&i<=e.MAX_VALUE}e.is=n})(Ie||(Ie={}));var $;(function(e){e.MIN_VALUE=0,e.MAX_VALUE=2147483647;function n(i){return typeof i=="number"&&e.MIN_VALUE<=i&&i<=e.MAX_VALUE}e.is=n})($||($={}));var I;(function(e){function n(r,t){return r===Number.MAX_VALUE&&(r=$.MAX_VALUE),t===Number.MAX_VALUE&&(t=$.MAX_VALUE),{line:r,character:t}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&a.uinteger(t.line)&&a.uinteger(t.character)}e.is=i})(I||(I={}));var h;(function(e){function n(r,t,o,s){if(a.uinteger(r)&&a.uinteger(t)&&a.uinteger(o)&&a.uinteger(s))return{start:I.create(r,t),end:I.create(o,s)};if(I.is(r)&&I.is(t))return{start:r,end:t};throw new Error(`Range#create called with invalid arguments[${r}, ${t}, ${o}, ${s}]`)}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&I.is(t.start)&&I.is(t.end)}e.is=i})(h||(h={}));var B;(function(e){function n(r,t){return{uri:r,range:t}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&h.is(t.range)&&(a.string(t.uri)||a.undefined(t.uri))}e.is=i})(B||(B={}));var ke;(function(e){function n(r,t,o,s){return{targetUri:r,targetRange:t,targetSelectionRange:o,originSelectionRange:s}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&h.is(t.targetRange)&&a.string(t.targetUri)&&h.is(t.targetSelectionRange)&&(h.is(t.originSelectionRange)||a.undefined(t.originSelectionRange))}e.is=i})(ke||(ke={}));var ee;(function(e){function n(r,t,o,s){return{red:r,green:t,blue:o,alpha:s}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&a.numberRange(t.red,0,1)&&a.numberRange(t.green,0,1)&&a.numberRange(t.blue,0,1)&&a.numberRange(t.alpha,0,1)}e.is=i})(ee||(ee={}));var Te;(function(e){function n(r,t){return{range:r,color:t}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&h.is(t.range)&&ee.is(t.color)}e.is=i})(Te||(Te={}));var _e;(function(e){function n(r,t,o){return{label:r,textEdit:t,additionalTextEdits:o}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&a.string(t.label)&&(a.undefined(t.textEdit)||w.is(t))&&(a.undefined(t.additionalTextEdits)||a.typedArray(t.additionalTextEdits,w.is))}e.is=i})(_e||(_e={}));var C;(function(e){e.Comment="comment",e.Imports="imports",e.Region="region"})(C||(C={}));var Ce;(function(e){function n(r,t,o,s,u,g){let f={startLine:r,endLine:t};return a.defined(o)&&(f.startCharacter=o),a.defined(s)&&(f.endCharacter=s),a.defined(u)&&(f.kind=u),a.defined(g)&&(f.collapsedText=g),f}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&a.uinteger(t.startLine)&&a.uinteger(t.startLine)&&(a.undefined(t.startCharacter)||a.uinteger(t.startCharacter))&&(a.undefined(t.endCharacter)||a.uinteger(t.endCharacter))&&(a.undefined(t.kind)||a.string(t.kind))}e.is=i})(Ce||(Ce={}));var te;(function(e){function n(r,t){return{location:r,message:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&B.is(t.location)&&a.string(t.message)}e.is=i})(te||(te={}));var T;(function(e){e.Error=1,e.Warning=2,e.Information=3,e.Hint=4})(T||(T={}));var be;(function(e){e.Unnecessary=1,e.Deprecated=2})(be||(be={}));var we;(function(e){function n(i){let r=i;return a.objectLiteral(r)&&a.string(r.href)}e.is=n})(we||(we={}));var q;(function(e){function n(r,t,o,s,u,g){let f={range:r,message:t};return a.defined(o)&&(f.severity=o),a.defined(s)&&(f.code=s),a.defined(u)&&(f.source=u),a.defined(g)&&(f.relatedInformation=g),f}e.create=n;function i(r){var t;let o=r;return a.defined(o)&&h.is(o.range)&&a.string(o.message)&&(a.number(o.severity)||a.undefined(o.severity))&&(a.integer(o.code)||a.string(o.code)||a.undefined(o.code))&&(a.undefined(o.codeDescription)||a.string((t=o.codeDescription)===null||t===void 0?void 0:t.href))&&(a.string(o.source)||a.undefined(o.source))&&(a.undefined(o.relatedInformation)||a.typedArray(o.relatedInformation,te.is))}e.is=i})(q||(q={}));var b;(function(e){function n(r,t,...o){let s={title:r,command:t};return a.defined(o)&&o.length>0&&(s.arguments=o),s}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.title)&&a.string(t.command)}e.is=i})(b||(b={}));var w;(function(e){function n(o,s){return{range:o,newText:s}}e.replace=n;function i(o,s){return{range:{start:o,end:o},newText:s}}e.insert=i;function r(o){return{range:o,newText:""}}e.del=r;function t(o){let s=o;return a.objectLiteral(s)&&a.string(s.newText)&&h.is(s.range)}e.is=t})(w||(w={}));var ne;(function(e){function n(r,t,o){let s={label:r};return t!==void 0&&(s.needsConfirmation=t),o!==void 0&&(s.description=o),s}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&a.string(t.label)&&(a.boolean(t.needsConfirmation)||t.needsConfirmation===void 0)&&(a.string(t.description)||t.description===void 0)}e.is=i})(ne||(ne={}));var E;(function(e){function n(i){let r=i;return a.string(r)}e.is=n})(E||(E={}));var Ee;(function(e){function n(o,s,u){return{range:o,newText:s,annotationId:u}}e.replace=n;function i(o,s,u){return{range:{start:o,end:o},newText:s,annotationId:u}}e.insert=i;function r(o,s){return{range:o,newText:"",annotationId:s}}e.del=r;function t(o){let s=o;return w.is(s)&&(ne.is(s.annotationId)||E.is(s.annotationId))}e.is=t})(Ee||(Ee={}));var re;(function(e){function n(r,t){return{textDocument:r,edits:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&ue.is(t.textDocument)&&Array.isArray(t.edits)}e.is=i})(re||(re={}));var ie;(function(e){function n(r,t,o){let s={kind:"create",uri:r};return t!==void 0&&(t.overwrite!==void 0||t.ignoreIfExists!==void 0)&&(s.options=t),o!==void 0&&(s.annotationId=o),s}e.create=n;function i(r){let t=r;return t&&t.kind==="create"&&a.string(t.uri)&&(t.options===void 0||(t.options.overwrite===void 0||a.boolean(t.options.overwrite))&&(t.options.ignoreIfExists===void 0||a.boolean(t.options.ignoreIfExists)))&&(t.annotationId===void 0||E.is(t.annotationId))}e.is=i})(ie||(ie={}));var oe;(function(e){function n(r,t,o,s){let u={kind:"rename",oldUri:r,newUri:t};return o!==void 0&&(o.overwrite!==void 0||o.ignoreIfExists!==void 0)&&(u.options=o),s!==void 0&&(u.annotationId=s),u}e.create=n;function i(r){let t=r;return t&&t.kind==="rename"&&a.string(t.oldUri)&&a.string(t.newUri)&&(t.options===void 0||(t.options.overwrite===void 0||a.boolean(t.options.overwrite))&&(t.options.ignoreIfExists===void 0||a.boolean(t.options.ignoreIfExists)))&&(t.annotationId===void 0||E.is(t.annotationId))}e.is=i})(oe||(oe={}));var se;(function(e){function n(r,t,o){let s={kind:"delete",uri:r};return t!==void 0&&(t.recursive!==void 0||t.ignoreIfNotExists!==void 0)&&(s.options=t),o!==void 0&&(s.annotationId=o),s}e.create=n;function i(r){let t=r;return t&&t.kind==="delete"&&a.string(t.uri)&&(t.options===void 0||(t.options.recursive===void 0||a.boolean(t.options.recursive))&&(t.options.ignoreIfNotExists===void 0||a.boolean(t.options.ignoreIfNotExists)))&&(t.annotationId===void 0||E.is(t.annotationId))}e.is=i})(se||(se={}));var ae;(function(e){function n(i){let r=i;return r&&(r.changes!==void 0||r.documentChanges!==void 0)&&(r.documentChanges===void 0||r.documentChanges.every(t=>a.string(t.kind)?ie.is(t)||oe.is(t)||se.is(t):re.is(t)))}e.is=n})(ae||(ae={}));var Re;(function(e){function n(r){return{uri:r}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.uri)}e.is=i})(Re||(Re={}));var Pe;(function(e){function n(r,t){return{uri:r,version:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.uri)&&a.integer(t.version)}e.is=i})(Pe||(Pe={}));var ue;(function(e){function n(r,t){return{uri:r,version:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.uri)&&(t.version===null||a.integer(t.version))}e.is=i})(ue||(ue={}));var Le;(function(e){function n(r,t,o,s){return{uri:r,languageId:t,version:o,text:s}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.uri)&&a.string(t.languageId)&&a.integer(t.version)&&a.string(t.text)}e.is=i})(Le||(Le={}));var de;(function(e){e.PlainText="plaintext",e.Markdown="markdown";function n(i){let r=i;return r===e.PlainText||r===e.Markdown}e.is=n})(de||(de={}));var L;(function(e){function n(i){let r=i;return a.objectLiteral(i)&&de.is(r.kind)&&a.string(r.value)}e.is=n})(L||(L={}));var m;(function(e){e.Text=1,e.Method=2,e.Function=3,e.Constructor=4,e.Field=5,e.Variable=6,e.Class=7,e.Interface=8,e.Module=9,e.Property=10,e.Unit=11,e.Value=12,e.Enum=13,e.Keyword=14,e.Snippet=15,e.Color=16,e.File=17,e.Reference=18,e.Folder=19,e.EnumMember=20,e.Constant=21,e.Struct=22,e.Event=23,e.Operator=24,e.TypeParameter=25})(m||(m={}));var Q;(function(e){e.PlainText=1,e.Snippet=2})(Q||(Q={}));var We;(function(e){e.Deprecated=1})(We||(We={}));var De;(function(e){function n(r,t,o){return{newText:r,insert:t,replace:o}}e.create=n;function i(r){let t=r;return t&&a.string(t.newText)&&h.is(t.insert)&&h.is(t.replace)}e.is=i})(De||(De={}));var Se;(function(e){e.asIs=1,e.adjustIndentation=2})(Se||(Se={}));var Fe;(function(e){function n(i){let r=i;return r&&(a.string(r.detail)||r.detail===void 0)&&(a.string(r.description)||r.description===void 0)}e.is=n})(Fe||(Fe={}));var Ae;(function(e){function n(i){return{label:i}}e.create=n})(Ae||(Ae={}));var Me;(function(e){function n(i,r){return{items:i||[],isIncomplete:!!r}}e.create=n})(Me||(Me={}));var G;(function(e){function n(r){return r.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}e.fromPlainText=n;function i(r){let t=r;return a.string(t)||a.objectLiteral(t)&&a.string(t.language)&&a.string(t.value)}e.is=i})(G||(G={}));var Ke;(function(e){function n(i){let r=i;return!!r&&a.objectLiteral(r)&&(L.is(r.contents)||G.is(r.contents)||a.typedArray(r.contents,G.is))&&(i.range===void 0||h.is(i.range))}e.is=n})(Ke||(Ke={}));var je;(function(e){function n(i,r){return r?{label:i,documentation:r}:{label:i}}e.create=n})(je||(je={}));var Ue;(function(e){function n(i,r,...t){let o={label:i};return a.defined(r)&&(o.documentation=r),a.defined(t)?o.parameters=t:o.parameters=[],o}e.create=n})(Ue||(Ue={}));var R;(function(e){e.Text=1,e.Read=2,e.Write=3})(R||(R={}));var He;(function(e){function n(i,r){let t={range:i};return a.number(r)&&(t.kind=r),t}e.create=n})(He||(He={}));var x;(function(e){e.File=1,e.Module=2,e.Namespace=3,e.Package=4,e.Class=5,e.Method=6,e.Property=7,e.Field=8,e.Constructor=9,e.Enum=10,e.Interface=11,e.Function=12,e.Variable=13,e.Constant=14,e.String=15,e.Number=16,e.Boolean=17,e.Array=18,e.Object=19,e.Key=20,e.Null=21,e.EnumMember=22,e.Struct=23,e.Event=24,e.Operator=25,e.TypeParameter=26})(x||(x={}));var Ne;(function(e){e.Deprecated=1})(Ne||(Ne={}));var Oe;(function(e){function n(i,r,t,o,s){let u={name:i,kind:r,location:{uri:o,range:t}};return s&&(u.containerName=s),u}e.create=n})(Oe||(Oe={}));var Ve;(function(e){function n(i,r,t,o){return o!==void 0?{name:i,kind:r,location:{uri:t,range:o}}:{name:i,kind:r,location:{uri:t}}}e.create=n})(Ve||(Ve={}));var ze;(function(e){function n(r,t,o,s,u,g){let f={name:r,detail:t,kind:o,range:s,selectionRange:u};return g!==void 0&&(f.children=g),f}e.create=n;function i(r){let t=r;return t&&a.string(t.name)&&a.number(t.kind)&&h.is(t.range)&&h.is(t.selectionRange)&&(t.detail===void 0||a.string(t.detail))&&(t.deprecated===void 0||a.boolean(t.deprecated))&&(t.children===void 0||Array.isArray(t.children))&&(t.tags===void 0||Array.isArray(t.tags))}e.is=i})(ze||(ze={}));var Xe;(function(e){e.Empty="",e.QuickFix="quickfix",e.Refactor="refactor",e.RefactorExtract="refactor.extract",e.RefactorInline="refactor.inline",e.RefactorRewrite="refactor.rewrite",e.Source="source",e.SourceOrganizeImports="source.organizeImports",e.SourceFixAll="source.fixAll"})(Xe||(Xe={}));var J;(function(e){e.Invoked=1,e.Automatic=2})(J||(J={}));var $e;(function(e){function n(r,t,o){let s={diagnostics:r};return t!=null&&(s.only=t),o!=null&&(s.triggerKind=o),s}e.create=n;function i(r){let t=r;return a.defined(t)&&a.typedArray(t.diagnostics,q.is)&&(t.only===void 0||a.typedArray(t.only,a.string))&&(t.triggerKind===void 0||t.triggerKind===J.Invoked||t.triggerKind===J.Automatic)}e.is=i})($e||($e={}));var Be;(function(e){function n(r,t,o){let s={title:r},u=!0;return typeof t=="string"?(u=!1,s.kind=t):b.is(t)?s.command=t:s.edit=t,u&&o!==void 0&&(s.kind=o),s}e.create=n;function i(r){let t=r;return t&&a.string(t.title)&&(t.diagnostics===void 0||a.typedArray(t.diagnostics,q.is))&&(t.kind===void 0||a.string(t.kind))&&(t.edit!==void 0||t.command!==void 0)&&(t.command===void 0||b.is(t.command))&&(t.isPreferred===void 0||a.boolean(t.isPreferred))&&(t.edit===void 0||ae.is(t.edit))}e.is=i})(Be||(Be={}));var qe;(function(e){function n(r,t){let o={range:r};return a.defined(t)&&(o.data=t),o}e.create=n;function i(r){let t=r;return a.defined(t)&&h.is(t.range)&&(a.undefined(t.command)||b.is(t.command))}e.is=i})(qe||(qe={}));var Qe;(function(e){function n(r,t){return{tabSize:r,insertSpaces:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.uinteger(t.tabSize)&&a.boolean(t.insertSpaces)}e.is=i})(Qe||(Qe={}));var Ge;(function(e){function n(r,t,o){return{range:r,target:t,data:o}}e.create=n;function i(r){let t=r;return a.defined(t)&&h.is(t.range)&&(a.undefined(t.target)||a.string(t.target))}e.is=i})(Ge||(Ge={}));var Je;(function(e){function n(r,t){return{range:r,parent:t}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&h.is(t.range)&&(t.parent===void 0||e.is(t.parent))}e.is=i})(Je||(Je={}));var Ye;(function(e){e.namespace="namespace",e.type="type",e.class="class",e.enum="enum",e.interface="interface",e.struct="struct",e.typeParameter="typeParameter",e.parameter="parameter",e.variable="variable",e.property="property",e.enumMember="enumMember",e.event="event",e.function="function",e.method="method",e.macro="macro",e.keyword="keyword",e.modifier="modifier",e.comment="comment",e.string="string",e.number="number",e.regexp="regexp",e.operator="operator",e.decorator="decorator"})(Ye||(Ye={}));var Ze;(function(e){e.declaration="declaration",e.definition="definition",e.readonly="readonly",e.static="static",e.deprecated="deprecated",e.abstract="abstract",e.async="async",e.modification="modification",e.documentation="documentation",e.defaultLibrary="defaultLibrary"})(Ze||(Ze={}));var et;(function(e){function n(i){let r=i;return a.objectLiteral(r)&&(r.resultId===void 0||typeof r.resultId=="string")&&Array.isArray(r.data)&&(r.data.length===0||typeof r.data[0]=="number")}e.is=n})(et||(et={}));var tt;(function(e){function n(r,t){return{range:r,text:t}}e.create=n;function i(r){let t=r;return t!=null&&h.is(t.range)&&a.string(t.text)}e.is=i})(tt||(tt={}));var nt;(function(e){function n(r,t,o){return{range:r,variableName:t,caseSensitiveLookup:o}}e.create=n;function i(r){let t=r;return t!=null&&h.is(t.range)&&a.boolean(t.caseSensitiveLookup)&&(a.string(t.variableName)||t.variableName===void 0)}e.is=i})(nt||(nt={}));var rt;(function(e){function n(r,t){return{range:r,expression:t}}e.create=n;function i(r){let t=r;return t!=null&&h.is(t.range)&&(a.string(t.expression)||t.expression===void 0)}e.is=i})(rt||(rt={}));var it;(function(e){function n(r,t){return{frameId:r,stoppedLocation:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&h.is(r.stoppedLocation)}e.is=i})(it||(it={}));var ce;(function(e){e.Type=1,e.Parameter=2;function n(i){return i===1||i===2}e.is=n})(ce||(ce={}));var le;(function(e){function n(r){return{value:r}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&(t.tooltip===void 0||a.string(t.tooltip)||L.is(t.tooltip))&&(t.location===void 0||B.is(t.location))&&(t.command===void 0||b.is(t.command))}e.is=i})(le||(le={}));var ot;(function(e){function n(r,t,o){let s={position:r,label:t};return o!==void 0&&(s.kind=o),s}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&I.is(t.position)&&(a.string(t.label)||a.typedArray(t.label,le.is))&&(t.kind===void 0||ce.is(t.kind))&&t.textEdits===void 0||a.typedArray(t.textEdits,w.is)&&(t.tooltip===void 0||a.string(t.tooltip)||L.is(t.tooltip))&&(t.paddingLeft===void 0||a.boolean(t.paddingLeft))&&(t.paddingRight===void 0||a.boolean(t.paddingRight))}e.is=i})(ot||(ot={}));var st;(function(e){function n(i){return{kind:"snippet",value:i}}e.createSnippet=n})(st||(st={}));var at;(function(e){function n(i,r,t,o){return{insertText:i,filterText:r,range:t,command:o}}e.create=n})(at||(at={}));var ut;(function(e){function n(i){return{items:i}}e.create=n})(ut||(ut={}));var dt;(function(e){e.Invoked=0,e.Automatic=1})(dt||(dt={}));var ct;(function(e){function n(i,r){return{range:i,text:r}}e.create=n})(ct||(ct={}));var lt;(function(e){function n(i,r){return{triggerKind:i,selectedCompletionInfo:r}}e.create=n})(lt||(lt={}));var gt;(function(e){function n(i){let r=i;return a.objectLiteral(r)&&Z.is(r.uri)&&a.string(r.name)}e.is=n})(gt||(gt={}));var ft;(function(e){function n(o,s,u,g){return new ge(o,s,u,g)}e.create=n;function i(o){let s=o;return!!(a.defined(s)&&a.string(s.uri)&&(a.undefined(s.languageId)||a.string(s.languageId))&&a.uinteger(s.lineCount)&&a.func(s.getText)&&a.func(s.positionAt)&&a.func(s.offsetAt))}e.is=i;function r(o,s){let u=o.getText(),g=t(s,(l,p)=>{let v=l.range.start.line-p.range.start.line;return v===0?l.range.start.character-p.range.start.character:v}),f=u.length;for(let l=g.length-1;l>=0;l--){let p=g[l],v=o.offsetAt(p.range.start),c=o.offsetAt(p.range.end);if(c<=f)u=u.substring(0,v)+p.newText+u.substring(c,u.length);else throw new Error("Overlapping edit");f=v}return u}e.applyEdits=r;function t(o,s){if(o.length<=1)return o;let u=o.length/2|0,g=o.slice(0,u),f=o.slice(u);t(g,s),t(f,s);let l=0,p=0,v=0;for(;l<g.length&&p<f.length;)s(g[l],f[p])<=0?o[v++]=g[l++]:o[v++]=f[p++];for(;l<g.length;)o[v++]=g[l++];for(;p<f.length;)o[v++]=f[p++];return o}})(ft||(ft={}));var ge=class{constructor(n,i,r,t){this._uri=n,this._languageId=i,this._version=r,this._content=t,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(n){if(n){let i=this.offsetAt(n.start),r=this.offsetAt(n.end);return this._content.substring(i,r)}return this._content}update(n,i){this._content=n.text,this._version=i,this._lineOffsets=void 0}getLineOffsets(){if(this._lineOffsets===void 0){let n=[],i=this._content,r=!0;for(let t=0;t<i.length;t++){r&&(n.push(t),r=!1);let o=i.charAt(t);r=o==="\r"||o===`
9
+ `,o==="\r"&&t+1<i.length&&i.charAt(t+1)===`
10
+ `&&t++}r&&i.length>0&&n.push(i.length),this._lineOffsets=n}return this._lineOffsets}positionAt(n){n=Math.max(Math.min(n,this._content.length),0);let i=this.getLineOffsets(),r=0,t=i.length;if(t===0)return I.create(0,n);for(;r<t;){let s=Math.floor((r+t)/2);i[s]>n?t=s:r=s+1}let o=r-1;return I.create(o,n-i[o])}offsetAt(n){let i=this.getLineOffsets();if(n.line>=i.length)return this._content.length;if(n.line<0)return 0;let r=i[n.line],t=n.line+1<i.length?i[n.line+1]:this._content.length;return Math.max(Math.min(r+n.character,t),r)}get lineCount(){return this.getLineOffsets().length}},a;(function(e){let n=Object.prototype.toString;function i(c){return typeof c<"u"}e.defined=i;function r(c){return typeof c>"u"}e.undefined=r;function t(c){return c===!0||c===!1}e.boolean=t;function o(c){return n.call(c)==="[object String]"}e.string=o;function s(c){return n.call(c)==="[object Number]"}e.number=s;function u(c,Y,kt){return n.call(c)==="[object Number]"&&Y<=c&&c<=kt}e.numberRange=u;function g(c){return n.call(c)==="[object Number]"&&-2147483648<=c&&c<=2147483647}e.integer=g;function f(c){return n.call(c)==="[object Number]"&&0<=c&&c<=2147483647}e.uinteger=f;function l(c){return n.call(c)==="[object Function]"}e.func=l;function p(c){return c!==null&&typeof c=="object"}e.objectLiteral=p;function v(c,Y){return Array.isArray(c)&&c.every(Y)}e.typedArray=v})(a||(a={}));var W=class{constructor(n,i,r){this._languageId=n;this._worker=i;this._disposables=[];this._listener=Object.create(null);let t=s=>{let u=s.getLanguageId();if(u!==this._languageId)return;let g;this._listener[s.uri.toString()]=s.onDidChangeContent(()=>{window.clearTimeout(g),g=window.setTimeout(()=>this._doValidate(s.uri,u),500)}),this._doValidate(s.uri,u)},o=s=>{d.editor.setModelMarkers(s,this._languageId,[]);let u=s.uri.toString(),g=this._listener[u];g&&(g.dispose(),delete this._listener[u])};this._disposables.push(d.editor.onDidCreateModel(t)),this._disposables.push(d.editor.onWillDisposeModel(o)),this._disposables.push(d.editor.onDidChangeModelLanguage(s=>{o(s.model),t(s.model)})),this._disposables.push(r(s=>{d.editor.getModels().forEach(u=>{u.getLanguageId()===this._languageId&&(o(u),t(u))})})),this._disposables.push({dispose:()=>{d.editor.getModels().forEach(o);for(let s in this._listener)this._listener[s].dispose()}}),d.editor.getModels().forEach(t)}dispose(){this._disposables.forEach(n=>n&&n.dispose()),this._disposables.length=0}_doValidate(n,i){this._worker(n).then(r=>r.doValidation(n.toString())).then(r=>{let t=r.map(s=>At(n,s)),o=d.editor.getModel(n);o&&o.getLanguageId()===i&&d.editor.setModelMarkers(o,i,t)}).then(void 0,r=>{console.error(r)})}};function Ft(e){switch(e){case T.Error:return d.MarkerSeverity.Error;case T.Warning:return d.MarkerSeverity.Warning;case T.Information:return d.MarkerSeverity.Info;case T.Hint:return d.MarkerSeverity.Hint;default:return d.MarkerSeverity.Info}}function At(e,n){let i=typeof n.code=="number"?String(n.code):n.code;return{severity:Ft(n.severity),startLineNumber:n.range.start.line+1,startColumn:n.range.start.character+1,endLineNumber:n.range.end.line+1,endColumn:n.range.end.character+1,message:n.message,code:i,source:n.source}}var D=class{constructor(n,i){this._worker=n;this._triggerCharacters=i}get triggerCharacters(){return this._triggerCharacters}provideCompletionItems(n,i,r,t){let o=n.uri;return this._worker(o).then(s=>s.doComplete(o.toString(),k(i))).then(s=>{if(!s)return;let u=n.getWordUntilPosition(i),g=new d.Range(i.lineNumber,u.startColumn,i.lineNumber,u.endColumn),f=s.items.map(l=>{let p={label:l.label,insertText:l.insertText||l.label,sortText:l.sortText,filterText:l.filterText,documentation:l.documentation,detail:l.detail,command:jt(l.command),range:g,kind:Kt(l.kind)};return l.textEdit&&(Mt(l.textEdit)?p.range={insert:y(l.textEdit.insert),replace:y(l.textEdit.replace)}:p.range=y(l.textEdit.range),p.insertText=l.textEdit.newText),l.additionalTextEdits&&(p.additionalTextEdits=l.additionalTextEdits.map(P)),l.insertTextFormat===Q.Snippet&&(p.insertTextRules=d.languages.CompletionItemInsertTextRule.InsertAsSnippet),p});return{isIncomplete:s.isIncomplete,suggestions:f}})}};function k(e){if(e)return{character:e.column-1,line:e.lineNumber-1}}function pe(e){if(e)return{start:{line:e.startLineNumber-1,character:e.startColumn-1},end:{line:e.endLineNumber-1,character:e.endColumn-1}}}function y(e){if(e)return new d.Range(e.start.line+1,e.start.character+1,e.end.line+1,e.end.character+1)}function Mt(e){return typeof e.insert<"u"&&typeof e.replace<"u"}function Kt(e){let n=d.languages.CompletionItemKind;switch(e){case m.Text:return n.Text;case m.Method:return n.Method;case m.Function:return n.Function;case m.Constructor:return n.Constructor;case m.Field:return n.Field;case m.Variable:return n.Variable;case m.Class:return n.Class;case m.Interface:return n.Interface;case m.Module:return n.Module;case m.Property:return n.Property;case m.Unit:return n.Unit;case m.Value:return n.Value;case m.Enum:return n.Enum;case m.Keyword:return n.Keyword;case m.Snippet:return n.Snippet;case m.Color:return n.Color;case m.File:return n.File;case m.Reference:return n.Reference}return n.Property}function P(e){if(e)return{range:y(e.range),text:e.newText}}function jt(e){return e&&e.command==="editor.action.triggerSuggest"?{id:e.command,title:e.title,arguments:e.arguments}:void 0}var S=class{constructor(n){this._worker=n}provideHover(n,i,r){let t=n.uri;return this._worker(t).then(o=>o.doHover(t.toString(),k(i))).then(o=>{if(o)return{range:y(o.range),contents:Ht(o.contents)}})}};function Ut(e){return e&&typeof e=="object"&&typeof e.kind=="string"}function pt(e){return typeof e=="string"?{value:e}:Ut(e)?e.kind==="plaintext"?{value:e.value.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}:{value:e.value}:{value:"```"+e.language+`
11
+ `+e.value+"\n```\n"}}function Ht(e){if(e)return Array.isArray(e)?e.map(pt):[pt(e)]}var F=class{constructor(n){this._worker=n}provideDocumentHighlights(n,i,r){let t=n.uri;return this._worker(t).then(o=>o.findDocumentHighlights(t.toString(),k(i))).then(o=>{if(o)return o.map(s=>({range:y(s.range),kind:Nt(s.kind)}))})}};function Nt(e){switch(e){case R.Read:return d.languages.DocumentHighlightKind.Read;case R.Write:return d.languages.DocumentHighlightKind.Write;case R.Text:return d.languages.DocumentHighlightKind.Text}return d.languages.DocumentHighlightKind.Text}var A=class{constructor(n){this._worker=n}provideDefinition(n,i,r){let t=n.uri;return this._worker(t).then(o=>o.findDefinition(t.toString(),k(i))).then(o=>{if(o)return[ht(o)]})}};function ht(e){return{uri:d.Uri.parse(e.uri),range:y(e.range)}}var M=class{constructor(n){this._worker=n}provideReferences(n,i,r,t){let o=n.uri;return this._worker(o).then(s=>s.findReferences(o.toString(),k(i))).then(s=>{if(s)return s.map(ht)})}},K=class{constructor(n){this._worker=n}provideRenameEdits(n,i,r,t){let o=n.uri;return this._worker(o).then(s=>s.doRename(o.toString(),k(i),r)).then(s=>Ot(s))}};function Ot(e){if(!e||!e.changes)return;let n=[];for(let i in e.changes){let r=d.Uri.parse(i);for(let t of e.changes[i])n.push({resource:r,versionId:void 0,textEdit:{range:y(t.range),text:t.newText}})}return{edits:n}}var j=class{constructor(n){this._worker=n}provideDocumentSymbols(n,i){let r=n.uri;return this._worker(r).then(t=>t.findDocumentSymbols(r.toString())).then(t=>{if(t)return t.map(o=>Vt(o)?mt(o):{name:o.name,detail:"",containerName:o.containerName,kind:xt(o.kind),range:y(o.location.range),selectionRange:y(o.location.range),tags:[]})})}};function Vt(e){return"children"in e}function mt(e){return{name:e.name,detail:e.detail??"",kind:xt(e.kind),range:y(e.range),selectionRange:y(e.selectionRange),tags:e.tags??[],children:(e.children??[]).map(n=>mt(n))}}function xt(e){let n=d.languages.SymbolKind;switch(e){case x.File:return n.File;case x.Module:return n.Module;case x.Namespace:return n.Namespace;case x.Package:return n.Package;case x.Class:return n.Class;case x.Method:return n.Method;case x.Property:return n.Property;case x.Field:return n.Field;case x.Constructor:return n.Constructor;case x.Enum:return n.Enum;case x.Interface:return n.Interface;case x.Function:return n.Function;case x.Variable:return n.Variable;case x.Constant:return n.Constant;case x.String:return n.String;case x.Number:return n.Number;case x.Boolean:return n.Boolean;case x.Array:return n.Array}return n.Function}var fe=class{constructor(n){this._worker=n}provideLinks(n,i){let r=n.uri;return this._worker(r).then(t=>t.findDocumentLinks(r.toString())).then(t=>{if(t)return{links:t.map(o=>({range:y(o.range),url:o.target}))}})}},U=class{constructor(n){this._worker=n}provideDocumentFormattingEdits(n,i,r){let t=n.uri;return this._worker(t).then(o=>o.format(t.toString(),null,yt(i)).then(s=>{if(!(!s||s.length===0))return s.map(P)}))}},H=class{constructor(n){this._worker=n;this.canFormatMultipleRanges=!1}provideDocumentRangeFormattingEdits(n,i,r,t){let o=n.uri;return this._worker(o).then(s=>s.format(o.toString(),pe(i),yt(r)).then(u=>{if(!(!u||u.length===0))return u.map(P)}))}};function yt(e){return{tabSize:e.tabSize,insertSpaces:e.insertSpaces}}var N=class{constructor(n){this._worker=n}provideDocumentColors(n,i){let r=n.uri;return this._worker(r).then(t=>t.findDocumentColors(r.toString())).then(t=>{if(t)return t.map(o=>({color:o.color,range:y(o.range)}))})}provideColorPresentations(n,i,r){let t=n.uri;return this._worker(t).then(o=>o.getColorPresentations(t.toString(),i.color,pe(i.range))).then(o=>{if(o)return o.map(s=>{let u={label:s.label};return s.textEdit&&(u.textEdit=P(s.textEdit)),s.additionalTextEdits&&(u.additionalTextEdits=s.additionalTextEdits.map(P)),u})})}},O=class{constructor(n){this._worker=n}provideFoldingRanges(n,i,r){let t=n.uri;return this._worker(t).then(o=>o.getFoldingRanges(t.toString(),i)).then(o=>{if(o)return o.map(s=>{let u={start:s.startLine+1,end:s.endLine+1};return typeof s.kind<"u"&&(u.kind=zt(s.kind)),u})})}};function zt(e){switch(e){case C.Comment:return d.languages.FoldingRangeKind.Comment;case C.Imports:return d.languages.FoldingRangeKind.Imports;case C.Region:return d.languages.FoldingRangeKind.Region}}var V=class{constructor(n){this._worker=n}provideSelectionRanges(n,i,r){let t=n.uri;return this._worker(t).then(o=>o.getSelectionRanges(t.toString(),i.map(k))).then(o=>{if(o)return o.map(s=>{let u=[];for(;s;)u.push({range:y(s.range)}),s=s.parent;return u})})}};function $t(e){let n=[],i=[],r=new _(e);n.push(r);let t=(...s)=>r.getLanguageServiceWorker(...s);function o(){let{languageId:s,modeConfiguration:u}=e;It(i),u.completionItems&&i.push(d.languages.registerCompletionItemProvider(s,new D(t,["/","-",":"]))),u.hovers&&i.push(d.languages.registerHoverProvider(s,new S(t))),u.documentHighlights&&i.push(d.languages.registerDocumentHighlightProvider(s,new F(t))),u.definitions&&i.push(d.languages.registerDefinitionProvider(s,new A(t))),u.references&&i.push(d.languages.registerReferenceProvider(s,new M(t))),u.documentSymbols&&i.push(d.languages.registerDocumentSymbolProvider(s,new j(t))),u.rename&&i.push(d.languages.registerRenameProvider(s,new K(t))),u.colors&&i.push(d.languages.registerColorProvider(s,new N(t))),u.foldingRanges&&i.push(d.languages.registerFoldingRangeProvider(s,new O(t))),u.diagnostics&&i.push(new W(s,t,e.onDidChange)),u.selectionRanges&&i.push(d.languages.registerSelectionRangeProvider(s,new V(t))),u.documentFormattingEdits&&i.push(d.languages.registerDocumentFormattingEditProvider(s,new U(t))),u.documentRangeFormattingEdits&&i.push(d.languages.registerDocumentRangeFormattingEditProvider(s,new H(t)))}return o(),n.push(vt(i)),vt(n)}function vt(e){return{dispose:()=>It(e)}}function It(e){for(;e.length;)e.pop().dispose()}return Lt(Bt);})();
12
+ return moduleExports;
13
+ });