mbeditor 0.5.2 → 0.5.3

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: cd0837fbeccc3634d7804e6f9957bbbaca06bb4c02942eb4decc5e8b174499ab
4
- data.tar.gz: 9f97239369b2968c17cd3909abdced4917329a349564d02ebde6beb89cb8c36f
3
+ metadata.gz: 31199cd73e4e3321d8851a62ab20decd6e9c8d9ab328b50d9f987f85da1333b2
4
+ data.tar.gz: 27de9f3e0641c41e693023b3fcbedbe0d89d35d8d1fd7f3606aaa8095ceeb5b2
5
5
  SHA512:
6
- metadata.gz: 6310dc010236970bf25c0945a465122e1f8a081c399696d8870dc852d85454153863b01b1f1e9a8871abc3fbe07b1489724a065835c2909daa15426899701833
7
- data.tar.gz: f8ed953601769d6785a4fecd4c3b16a6ce820e6e7f5c88a7cb12750d8f32b5122dc6bc25fd67be5e86bd7ef02ae1beba9ece2dbc5fc5bc0324df47785a03c9ba
6
+ metadata.gz: 5f86f17e33bfd43248d7dc1a122f6ed3d85a0fcf3e745ca805561d7d490c3497e1bfaa53339ed28ed068a401ed91447888eb5f92a89654d89fe3b8ae0fd7c5b1
7
+ data.tar.gz: fea980a035f785508e1bc5444fce65c7a8c0824307c48e4db7ea73fcf7218f23889c1c687d999fc252f3ffb97fc732b1aae8292ec65938f40d97c48b95a470c7
@@ -35,7 +35,7 @@ var EditorPanel = function EditorPanel(_ref) {
35
35
  var editorRef = useRef(null);
36
36
  var monacoRef = useRef(null);
37
37
  var latestContentRef = useRef('');
38
- var lastAppliedExternalVersionRef = useRef(-1);
38
+ var lastAppliedExternalVersionRef = useRef(0);
39
39
  var aviBaseRef = useRef(0);
40
40
  var aviMaxRef = useRef(0);
41
41
 
@@ -832,12 +832,19 @@ var EditorPanel = function EditorPanel(_ref) {
832
832
  EditorStore.setState({ canUndo: false, canRedo: false });
833
833
  } else {
834
834
  // Keep undo stack for formats or replaces by using executeEdits
835
+ var _extEntry = window.__mbeditorModels && window.__mbeditorModels[tab.path];
836
+ if (_extEntry) _extEntry.cleanVersionId = null;
835
837
  editor.pushUndoStop();
836
838
  editor.executeEdits("external", [{
837
839
  range: model.getFullModelRange(),
838
840
  text: tab.content
839
841
  }]);
840
842
  editor.pushUndoStop();
843
+ // Re-anchor the clean baseline so onDidChangeContent doesn't mark this
844
+ // externally-applied content as a dirty edit.
845
+ var _newExtAvi = model.getAlternativeVersionId();
846
+ if (_extEntry) _extEntry.cleanVersionId = _newExtAvi;
847
+ aviBaseRef.current = _newExtAvi;
841
848
  }
842
849
  }, [tab.content, tab.externalContentVersion]);
843
850
 
@@ -68,9 +68,6 @@
68
68
  var key = keys[i];
69
69
  if (alreadyDeclared[key]) continue;
70
70
  if (!/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key)) continue;
71
- var desc;
72
- try { desc = Object.getOwnPropertyDescriptor(window, key); } catch (e) { continue; }
73
- if (!desc || !desc.configurable || !desc.writable || desc.get) continue;
74
71
  var value;
75
72
  try { value = window[key]; } catch (e) { continue; }
76
73
  if (value === null || value === undefined) continue;
@@ -488,11 +485,11 @@
488
485
  });
489
486
  }
490
487
 
491
- // Declare globals that the sprockets asset pipeline injects at runtime so
492
- // checkJs doesn't flag them as undefined. `interface Window` augmentation
493
- // covers `window.myAppGlobal` access patterns. For app-specific component
494
- // names not listed here, add `/* global MyComponent */` at the top of the
495
- // file TypeScript's checkJs mode respects that directive.
488
+ // Declare globals that are injected at runtime so checkJs doesn't flag them
489
+ // as undefined. The buildWindowGlobalsShim() function automatically detects
490
+ // window globals from the host application. Common Sprockets globals
491
+ // (React, ReactDOM, etc.) are declared explicitly. For additional globals
492
+ // not auto-detected, add `/* global MyComponent */` at the top of the file.
496
493
  if (monaco.languages.typescript && monaco.languages.typescript.javascriptDefaults) {
497
494
  monaco.languages.typescript.javascriptDefaults.addExtraLib(
498
495
  [
@@ -515,12 +512,18 @@
515
512
  );
516
513
  }
517
514
 
518
- // Downgrade "declared but never read" (TS6133) from Error to Warning.
519
- // TypeScript has no built-in way to emit this as a warning, so we intercept
515
+ // Downgrade certain TypeScript diagnostic codes from Error to Warning.
516
+ // TypeScript has no built-in way to emit these as warnings, so we intercept
520
517
  // the marker set after the worker fires and re-apply with lower severity.
521
- // JS files use owner 'javascript', TS files use 'typescript'.
522
- var WARN_CODES = { '6133': true };
523
- var TS_OWNERS = ['javascript', 'typescript'];
518
+ //
519
+ // Patch markers after the TypeScript worker fires:
520
+ // - 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
+ var JS_SUPPRESS_CODES = {};
525
+ var JS_WARN_CODES = { '6133': true };
526
+ var TS_WARN_CODES = { '6133': true };
524
527
  var _severityPatchActive = false;
525
528
  monaco.editor.onDidChangeMarkers(function(uris) {
526
529
  if (_severityPatchActive) return;
@@ -529,14 +532,20 @@
529
532
  uris.forEach(function(uri) {
530
533
  var model = monaco.editor.getModel(uri);
531
534
  if (!model) return;
532
- TS_OWNERS.forEach(function(owner) {
533
- var markers = monaco.editor.getModelMarkers({ resource: uri, owner: owner });
535
+ [
536
+ { owner: 'javascript', suppress: JS_SUPPRESS_CODES, warn: JS_WARN_CODES },
537
+ { owner: 'typescript', suppress: {}, warn: TS_WARN_CODES }
538
+ ].forEach(function(entry) {
539
+ var markers = monaco.editor.getModelMarkers({ resource: uri, owner: entry.owner });
534
540
  var needsPatch = markers.some(function(m) {
535
- return m.severity === monaco.MarkerSeverity.Error && WARN_CODES[String(m.code)];
541
+ var code = String(m.code);
542
+ return (m.severity === monaco.MarkerSeverity.Error && (entry.suppress[code] || entry.warn[code]));
536
543
  });
537
544
  if (!needsPatch) return;
538
- monaco.editor.setModelMarkers(model, owner, markers.map(function(m) {
539
- return (m.severity === monaco.MarkerSeverity.Error && WARN_CODES[String(m.code)])
545
+ monaco.editor.setModelMarkers(model, entry.owner, markers.filter(function(m) {
546
+ return !entry.suppress[String(m.code)];
547
+ }).map(function(m) {
548
+ return (m.severity === monaco.MarkerSeverity.Error && entry.warn[String(m.code)])
540
549
  ? Object.assign({}, m, { severity: monaco.MarkerSeverity.Warning })
541
550
  : m;
542
551
  }));
@@ -548,7 +557,7 @@
548
557
  });
549
558
  }
550
559
 
551
- // TypeScript: enable JSX for .tsx files and catch unused locals.
560
+ // TypeScript: enable JSX for .tsx files.
552
561
  if (monaco.languages.typescript && monaco.languages.typescript.typescriptDefaults) {
553
562
  monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
554
563
  target: monaco.languages.typescript.ScriptTarget.ES2020,
@@ -36,6 +36,15 @@ module Mbeditor
36
36
  private
37
37
 
38
38
  def editor_shell_html(base)
39
+ prettier_scripts = %w[
40
+ prettier-standalone.js
41
+ prettier-plugin-babel.js
42
+ prettier-plugin-estree.js
43
+ prettier-plugin-html.js
44
+ prettier-plugin-postcss.js
45
+ prettier-plugin-markdown.js
46
+ ].map { |f| "#{base}/assets/#{f}" }.to_json
47
+
39
48
  <<~HTML
40
49
  <!DOCTYPE html>
41
50
  <html lang="en">
@@ -45,6 +54,16 @@ module Mbeditor
45
54
  <title>Mbeditor</title>
46
55
  <link rel="stylesheet" href="#{base}/assets/fontawesome.min.css" />
47
56
  <link rel="stylesheet" href="#{base}/assets/mbeditor/application.css" />
57
+ <script defer src="#{base}/assets/react.min.js"></script>
58
+ <script defer src="#{base}/assets/react-dom.min.js"></script>
59
+ <script defer src="#{base}/assets/axios.min.js"></script>
60
+ <script defer src="#{base}/assets/lodash.min.js"></script>
61
+ <script defer src="#{base}/assets/minisearch.min.js"></script>
62
+ <script defer src="#{base}/assets/marked.min.js"></script>
63
+ <script defer src="#{base}/assets/emmet.js"></script>
64
+ <script defer src="#{base}/assets/monaco-themes-bundle.js"></script>
65
+ <script>var require = { paths: { vs: '#{base}/monaco-editor/vs', 'monaco-editor/esm/vs': '#{base}/monaco-editor/vs', 'monaco-vim': '#{base}/assets/monaco-vim' } };</script>
66
+ <script src="#{base}/monaco-editor/vs/loader.js"></script>
48
67
  </head>
49
68
  <body>
50
69
  <script>
@@ -60,68 +79,70 @@ module Mbeditor
60
79
  <div class="mbeditor-loading-text">Loading editor&hellip;</div>
61
80
  </div>
62
81
  </div>
63
- <script defer src="#{base}/assets/react.min.js"></script>
64
- <script defer src="#{base}/assets/react-dom.min.js"></script>
65
- <script defer src="#{base}/assets/axios.min.js"></script>
66
- <script defer src="#{base}/assets/lodash.min.js"></script>
67
- <script defer src="#{base}/assets/minisearch.min.js"></script>
68
- <script defer src="#{base}/assets/marked.min.js"></script>
69
- <script defer src="#{base}/assets/emmet.js"></script>
70
- <script defer src="#{base}/assets/monaco-themes-bundle.js"></script>
71
82
  <script>
72
83
  window.MonacoEnvironment = {
73
84
  getWorkerUrl: function(workerId, label) {
74
- if (label === 'typescript' || label === 'javascript') return '#{base}/ts_worker.js';
75
- return '#{base}/monaco_worker.js';
85
+ var b = window.MBEDITOR_BASE_PATH || '';
86
+ if (label === 'typescript' || label === 'javascript') return b + '/ts_worker.js';
87
+ return b + '/monaco_worker.js';
76
88
  }
77
89
  };
78
- var require = { paths: { vs: '#{base}/monaco-editor/vs', 'monaco-editor/esm/vs': '#{base}/monaco-editor/vs', 'monaco-vim': '#{base}/assets/monaco-vim' } };
79
- </script>
80
- <script src="#{base}/monaco-editor/vs/loader.js"></script>
81
- <script>
82
90
  (function() {
83
- var prettierScripts = [
84
- '#{base}/assets/prettier-standalone.js',
85
- '#{base}/assets/prettier-plugin-babel.js',
86
- '#{base}/assets/prettier-plugin-estree.js',
87
- '#{base}/assets/prettier-plugin-html.js',
88
- '#{base}/assets/prettier-plugin-postcss.js',
89
- '#{base}/assets/prettier-plugin-markdown.js'
90
- ];
91
91
  var _define = window.define;
92
92
  window.define = undefined;
93
- var pending = prettierScripts.length;
94
- function onAllPrettierLoaded() {
95
- function proceed() {
96
- window.MbeditorRuntime = { React: window.React, ReactDOM: window.ReactDOM };
97
- window.React = window._mbeditorHostReact;
98
- window.ReactDOM = window._mbeditorHostReactDOM;
99
- window.define = _define;
100
- require(['vs/editor/editor.main'], function() {
101
- if (window.MBEDITOR_CUSTOM_THEMES && window.monaco) {
102
- Object.keys(window.MBEDITOR_CUSTOM_THEMES).forEach(function(id) {
103
- window.monaco.editor.defineTheme(id, window.MBEDITOR_CUSTOM_THEMES[id]);
104
- });
105
- }
93
+
94
+ var prettierScripts = #{prettier_scripts};
95
+ window.loadPrettierPlugins = function() {
96
+ if (window._prettierLoadPromise) return window._prettierLoadPromise;
97
+ window._prettierLoadPromise = new Promise(function(resolve, reject) {
98
+ var savedDefine = window.define;
99
+ window.define = undefined;
100
+ var pending = prettierScripts.length;
101
+ prettierScripts.forEach(function(src) {
106
102
  var s = document.createElement('script');
107
- s.src = '#{base}/assets/mbeditor/application.js';
108
- s.onload = function() {
109
- var root = document.getElementById('mbeditor-root');
110
- var _R = window.MbeditorRuntime.React, _RD = window.MbeditorRuntime.ReactDOM;
111
- if (window.MbeditorApp && _R && _RD) _RD.render(_R.createElement(window.MbeditorApp), root);
112
- };
113
- document.body.appendChild(s);
103
+ s.src = src;
104
+ s.onload = function() { if (--pending === 0) { window.define = savedDefine; resolve(); } };
105
+ s.onerror = function() { window.define = savedDefine; reject(new Error('Failed to load Prettier: ' + src)); };
106
+ document.head.appendChild(s);
114
107
  });
115
- }
116
- if (window._mbeditorDOMReady) proceed();
117
- else document.addEventListener('DOMContentLoaded', proceed, { once: true });
108
+ });
109
+ return window._prettierLoadPromise;
110
+ };
111
+
112
+ function proceed() {
113
+ window.MbeditorRuntime = { React: window.React, ReactDOM: window.ReactDOM };
114
+ window.React = window._mbeditorHostReact;
115
+ window.ReactDOM = window._mbeditorHostReactDOM;
116
+ window.define = _define;
117
+
118
+ var _monacoResolve;
119
+ window.__monacoReady = new Promise(function(resolve) { _monacoResolve = resolve; });
120
+
121
+ var appScript = document.createElement('script');
122
+ appScript.src = '#{base}/assets/mbeditor/application.js';
123
+ appScript.onload = function() {
124
+ var root = document.getElementById('mbeditor-root');
125
+ var _R = window.MbeditorRuntime.React, _RD = window.MbeditorRuntime.ReactDOM;
126
+ if (window.MbeditorApp && _R && _RD) _RD.render(_R.createElement(window.MbeditorApp), root);
127
+ };
128
+ appScript.onerror = function() {
129
+ document.getElementById('mbeditor-root').innerHTML =
130
+ '<div style="padding:2rem;font-family:sans-serif;color:#c00">Editor failed to load. Please refresh the page.</div>';
131
+ };
132
+ document.body.appendChild(appScript);
133
+
134
+ require(['vs/editor/editor.main'], function() {
135
+ if (window.MBEDITOR_CUSTOM_THEMES && window.monaco) {
136
+ Object.keys(window.MBEDITOR_CUSTOM_THEMES).forEach(function(id) {
137
+ window.monaco.editor.defineTheme(id, window.MBEDITOR_CUSTOM_THEMES[id]);
138
+ });
139
+ }
140
+ _monacoResolve();
141
+ });
118
142
  }
119
- prettierScripts.forEach(function(src) {
120
- var s = document.createElement('script');
121
- s.src = src;
122
- s.onload = function() { if (--pending === 0) onAllPrettierLoaded(); };
123
- document.head.appendChild(s);
124
- });
143
+
144
+ if (window._mbeditorDOMReady) proceed();
145
+ else document.addEventListener('DOMContentLoaded', proceed, { once: true });
125
146
  })();
126
147
  </script>
127
148
  </body>
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mbeditor
4
- VERSION = "0.5.2"
4
+ VERSION = "0.5.3"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mbeditor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oliver Noonan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-04-30 00:00:00.000000000 Z
11
+ date: 2026-05-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails