@actualwave/react-native-codeditor 1.0.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.
Files changed (210) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +790 -0
  3. package/app.plugin.js +133 -0
  4. package/lib/module/BlockingView.js +25 -0
  5. package/lib/module/CodeEditor.js +239 -0
  6. package/lib/module/EditorAPI.js +2 -0
  7. package/lib/module/WebViewAPI.js +133 -0
  8. package/lib/module/index.js +6 -0
  9. package/lib/module/package.json +1 -0
  10. package/lib/typescript/app.plugin.d.ts +3 -0
  11. package/lib/typescript/babel.config.d.ts +10 -0
  12. package/lib/typescript/package.json +1 -0
  13. package/lib/typescript/react-native.config.d.ts +2 -0
  14. package/lib/typescript/scripts/copy-assets.d.ts +2 -0
  15. package/lib/typescript/src/BlockingView.d.ts +3 -0
  16. package/lib/typescript/src/CodeEditor.d.ts +33 -0
  17. package/lib/typescript/src/EditorAPI.d.ts +66 -0
  18. package/lib/typescript/src/WebViewAPI.d.ts +46 -0
  19. package/lib/typescript/src/index.d.ts +7 -0
  20. package/package.json +106 -0
  21. package/react-native.config.js +3 -0
  22. package/src/assets/codemirror/@actualwave_codemirror-lang-sksl.js +15 -0
  23. package/src/assets/codemirror/@babel_runtime_helpers_interopRequireDefault.js +1 -0
  24. package/src/assets/codemirror/@babel_runtime_helpers_objectSpread2.js +1 -0
  25. package/src/assets/codemirror/@babel_runtime_helpers_toConsumableArray.js +1 -0
  26. package/src/assets/codemirror/@codemirror_autocomplete.js +206 -0
  27. package/src/assets/codemirror/@codemirror_collab.js +31 -0
  28. package/src/assets/codemirror/@codemirror_commands.js +411 -0
  29. package/src/assets/codemirror/@codemirror_lang-angular.js +7 -0
  30. package/src/assets/codemirror/@codemirror_lang-cpp.js +7 -0
  31. package/src/assets/codemirror/@codemirror_lang-css.js +14 -0
  32. package/src/assets/codemirror/@codemirror_lang-go.js +13 -0
  33. package/src/assets/codemirror/@codemirror_lang-html.js +20 -0
  34. package/src/assets/codemirror/@codemirror_lang-java.js +7 -0
  35. package/src/assets/codemirror/@codemirror_lang-javascript.js +54 -0
  36. package/src/assets/codemirror/@codemirror_lang-jinja.js +15 -0
  37. package/src/assets/codemirror/@codemirror_lang-json.js +10 -0
  38. package/src/assets/codemirror/@codemirror_lang-less.js +10 -0
  39. package/src/assets/codemirror/@codemirror_lang-lezer.js +7 -0
  40. package/src/assets/codemirror/@codemirror_lang-liquid.js +15 -0
  41. package/src/assets/codemirror/@codemirror_lang-markdown.js +55 -0
  42. package/src/assets/codemirror/@codemirror_lang-php.js +7 -0
  43. package/src/assets/codemirror/@codemirror_lang-python.js +19 -0
  44. package/src/assets/codemirror/@codemirror_lang-rust.js +7 -0
  45. package/src/assets/codemirror/@codemirror_lang-sass.js +10 -0
  46. package/src/assets/codemirror/@codemirror_lang-sql.js +52 -0
  47. package/src/assets/codemirror/@codemirror_lang-vue.js +6 -0
  48. package/src/assets/codemirror/@codemirror_lang-wast.js +2 -0
  49. package/src/assets/codemirror/@codemirror_lang-xml.js +13 -0
  50. package/src/assets/codemirror/@codemirror_lang-yaml.js +13 -0
  51. package/src/assets/codemirror/@codemirror_language-data.js +5 -0
  52. package/src/assets/codemirror/@codemirror_language.js +524 -0
  53. package/src/assets/codemirror/@codemirror_legacy-modes_mode_apl.js +1 -0
  54. package/src/assets/codemirror/@codemirror_legacy-modes_mode_asciiarmor.js +1 -0
  55. package/src/assets/codemirror/@codemirror_legacy-modes_mode_asn1.js +3 -0
  56. package/src/assets/codemirror/@codemirror_legacy-modes_mode_asterisk.js +9 -0
  57. package/src/assets/codemirror/@codemirror_legacy-modes_mode_brainfuck.js +13 -0
  58. package/src/assets/codemirror/@codemirror_legacy-modes_mode_clike.js +31 -0
  59. package/src/assets/codemirror/@codemirror_legacy-modes_mode_clojure.js +5 -0
  60. package/src/assets/codemirror/@codemirror_legacy-modes_mode_cmake.js +6 -0
  61. package/src/assets/codemirror/@codemirror_legacy-modes_mode_cobol.js +7 -0
  62. package/src/assets/codemirror/@codemirror_legacy-modes_mode_coffeescript.js +14 -0
  63. package/src/assets/codemirror/@codemirror_legacy-modes_mode_commonlisp.js +1 -0
  64. package/src/assets/codemirror/@codemirror_legacy-modes_mode_crystal.js +18 -0
  65. package/src/assets/codemirror/@codemirror_legacy-modes_mode_css.js +5 -0
  66. package/src/assets/codemirror/@codemirror_legacy-modes_mode_cypher.js +1 -0
  67. package/src/assets/codemirror/@codemirror_legacy-modes_mode_d.js +2 -0
  68. package/src/assets/codemirror/@codemirror_legacy-modes_mode_diff.js +1 -0
  69. package/src/assets/codemirror/@codemirror_legacy-modes_mode_dockerfile.js +9 -0
  70. package/src/assets/codemirror/@codemirror_legacy-modes_mode_dtd.js +3 -0
  71. package/src/assets/codemirror/@codemirror_legacy-modes_mode_dylan.js +35 -0
  72. package/src/assets/codemirror/@codemirror_legacy-modes_mode_ebnf.js +9 -0
  73. package/src/assets/codemirror/@codemirror_legacy-modes_mode_ecl.js +3 -0
  74. package/src/assets/codemirror/@codemirror_legacy-modes_mode_eiffel.js +1 -0
  75. package/src/assets/codemirror/@codemirror_legacy-modes_mode_elm.js +3 -0
  76. package/src/assets/codemirror/@codemirror_legacy-modes_mode_erlang.js +52 -0
  77. package/src/assets/codemirror/@codemirror_legacy-modes_mode_factor.js +14 -0
  78. package/src/assets/codemirror/@codemirror_legacy-modes_mode_fcl.js +2 -0
  79. package/src/assets/codemirror/@codemirror_legacy-modes_mode_forth.js +5 -0
  80. package/src/assets/codemirror/@codemirror_legacy-modes_mode_fortran.js +2 -0
  81. package/src/assets/codemirror/@codemirror_legacy-modes_mode_gas.js +13 -0
  82. package/src/assets/codemirror/@codemirror_legacy-modes_mode_gherkin.js +5 -0
  83. package/src/assets/codemirror/@codemirror_legacy-modes_mode_go.js +2 -0
  84. package/src/assets/codemirror/@codemirror_legacy-modes_mode_groovy.js +3 -0
  85. package/src/assets/codemirror/@codemirror_legacy-modes_mode_haskell.js +5 -0
  86. package/src/assets/codemirror/@codemirror_legacy-modes_mode_haxe.js +12 -0
  87. package/src/assets/codemirror/@codemirror_legacy-modes_mode_http.js +1 -0
  88. package/src/assets/codemirror/@codemirror_legacy-modes_mode_idl.js +7 -0
  89. package/src/assets/codemirror/@codemirror_legacy-modes_mode_javascript.js +23 -0
  90. package/src/assets/codemirror/@codemirror_legacy-modes_mode_jinja2.js +8 -0
  91. package/src/assets/codemirror/@codemirror_legacy-modes_mode_julia.js +17 -0
  92. package/src/assets/codemirror/@codemirror_legacy-modes_mode_livescript.js +1 -0
  93. package/src/assets/codemirror/@codemirror_legacy-modes_mode_lua.js +2 -0
  94. package/src/assets/codemirror/@codemirror_legacy-modes_mode_mathematica.js +26 -0
  95. package/src/assets/codemirror/@codemirror_legacy-modes_mode_mbox.js +11 -0
  96. package/src/assets/codemirror/@codemirror_legacy-modes_mode_mirc.js +1 -0
  97. package/src/assets/codemirror/@codemirror_legacy-modes_mode_mllike.js +8 -0
  98. package/src/assets/codemirror/@codemirror_legacy-modes_mode_modelica.js +12 -0
  99. package/src/assets/codemirror/@codemirror_legacy-modes_mode_mscgen.js +3 -0
  100. package/src/assets/codemirror/@codemirror_legacy-modes_mode_mumps.js +16 -0
  101. package/src/assets/codemirror/@codemirror_legacy-modes_mode_nginx.js +1 -0
  102. package/src/assets/codemirror/@codemirror_legacy-modes_mode_nsis.js +20 -0
  103. package/src/assets/codemirror/@codemirror_legacy-modes_mode_ntriples.js +1 -0
  104. package/src/assets/codemirror/@codemirror_legacy-modes_mode_octave.js +8 -0
  105. package/src/assets/codemirror/@codemirror_legacy-modes_mode_oz.js +17 -0
  106. package/src/assets/codemirror/@codemirror_legacy-modes_mode_pascal.js +2 -0
  107. package/src/assets/codemirror/@codemirror_legacy-modes_mode_pegjs.js +25 -0
  108. package/src/assets/codemirror/@codemirror_legacy-modes_mode_perl.js +247 -0
  109. package/src/assets/codemirror/@codemirror_legacy-modes_mode_pig.js +6 -0
  110. package/src/assets/codemirror/@codemirror_legacy-modes_mode_powershell.js +7 -0
  111. package/src/assets/codemirror/@codemirror_legacy-modes_mode_properties.js +5 -0
  112. package/src/assets/codemirror/@codemirror_legacy-modes_mode_protobuf.js +7 -0
  113. package/src/assets/codemirror/@codemirror_legacy-modes_mode_pug.js +24 -0
  114. package/src/assets/codemirror/@codemirror_legacy-modes_mode_puppet.js +42 -0
  115. package/src/assets/codemirror/@codemirror_legacy-modes_mode_python.js +15 -0
  116. package/src/assets/codemirror/@codemirror_legacy-modes_mode_q.js +2 -0
  117. package/src/assets/codemirror/@codemirror_legacy-modes_mode_r.js +1 -0
  118. package/src/assets/codemirror/@codemirror_legacy-modes_mode_rpm.js +9 -0
  119. package/src/assets/codemirror/@codemirror_legacy-modes_mode_ruby.js +4 -0
  120. package/src/assets/codemirror/@codemirror_legacy-modes_mode_rust.js +5 -0
  121. package/src/assets/codemirror/@codemirror_legacy-modes_mode_sas.js +23 -0
  122. package/src/assets/codemirror/@codemirror_legacy-modes_mode_sass.js +26 -0
  123. package/src/assets/codemirror/@codemirror_legacy-modes_mode_scheme.js +14 -0
  124. package/src/assets/codemirror/@codemirror_legacy-modes_mode_shell.js +1 -0
  125. package/src/assets/codemirror/@codemirror_legacy-modes_mode_sieve.js +7 -0
  126. package/src/assets/codemirror/@codemirror_legacy-modes_mode_simple-mode.js +1 -0
  127. package/src/assets/codemirror/@codemirror_legacy-modes_mode_smalltalk.js +1 -0
  128. package/src/assets/codemirror/@codemirror_legacy-modes_mode_solr.js +1 -0
  129. package/src/assets/codemirror/@codemirror_legacy-modes_mode_sparql.js +1 -0
  130. package/src/assets/codemirror/@codemirror_legacy-modes_mode_spreadsheet.js +6 -0
  131. package/src/assets/codemirror/@codemirror_legacy-modes_mode_sql.js +84 -0
  132. package/src/assets/codemirror/@codemirror_legacy-modes_mode_stex.js +11 -0
  133. package/src/assets/codemirror/@codemirror_legacy-modes_mode_stylus.js +45 -0
  134. package/src/assets/codemirror/@codemirror_legacy-modes_mode_swift.js +2 -0
  135. package/src/assets/codemirror/@codemirror_legacy-modes_mode_tcl.js +1 -0
  136. package/src/assets/codemirror/@codemirror_legacy-modes_mode_textile.js +2 -0
  137. package/src/assets/codemirror/@codemirror_legacy-modes_mode_tiddlywiki.js +33 -0
  138. package/src/assets/codemirror/@codemirror_legacy-modes_mode_tiki.js +20 -0
  139. package/src/assets/codemirror/@codemirror_legacy-modes_mode_toml.js +4 -0
  140. package/src/assets/codemirror/@codemirror_legacy-modes_mode_troff.js +1 -0
  141. package/src/assets/codemirror/@codemirror_legacy-modes_mode_ttcn-cfg.js +3 -0
  142. package/src/assets/codemirror/@codemirror_legacy-modes_mode_ttcn.js +3 -0
  143. package/src/assets/codemirror/@codemirror_legacy-modes_mode_turtle.js +1 -0
  144. package/src/assets/codemirror/@codemirror_legacy-modes_mode_vb.js +11 -0
  145. package/src/assets/codemirror/@codemirror_legacy-modes_mode_vbscript.js +26 -0
  146. package/src/assets/codemirror/@codemirror_legacy-modes_mode_velocity.js +15 -0
  147. package/src/assets/codemirror/@codemirror_legacy-modes_mode_verilog.js +67 -0
  148. package/src/assets/codemirror/@codemirror_legacy-modes_mode_vhdl.js +2 -0
  149. package/src/assets/codemirror/@codemirror_legacy-modes_mode_wast.js +7 -0
  150. package/src/assets/codemirror/@codemirror_legacy-modes_mode_webidl.js +25 -0
  151. package/src/assets/codemirror/@codemirror_legacy-modes_mode_xml.js +6 -0
  152. package/src/assets/codemirror/@codemirror_legacy-modes_mode_xquery.js +51 -0
  153. package/src/assets/codemirror/@codemirror_legacy-modes_mode_yacas.js +16 -0
  154. package/src/assets/codemirror/@codemirror_legacy-modes_mode_yaml.js +1 -0
  155. package/src/assets/codemirror/@codemirror_legacy-modes_mode_z80.js +1 -0
  156. package/src/assets/codemirror/@codemirror_lint.js +46 -0
  157. package/src/assets/codemirror/@codemirror_merge.js +167 -0
  158. package/src/assets/codemirror/@codemirror_search.js +121 -0
  159. package/src/assets/codemirror/@codemirror_state.js +793 -0
  160. package/src/assets/codemirror/@codemirror_theme-one-dark.js +12 -0
  161. package/src/assets/codemirror/@codemirror_view.js +1210 -0
  162. package/src/assets/codemirror/@lezer_common.js +407 -0
  163. package/src/assets/codemirror/@lezer_cpp.js +4 -0
  164. package/src/assets/codemirror/@lezer_css.js +4 -0
  165. package/src/assets/codemirror/@lezer_go.js +3 -0
  166. package/src/assets/codemirror/@lezer_highlight.js +380 -0
  167. package/src/assets/codemirror/@lezer_html.js +20 -0
  168. package/src/assets/codemirror/@lezer_java.js +2 -0
  169. package/src/assets/codemirror/@lezer_javascript.js +7 -0
  170. package/src/assets/codemirror/@lezer_json.js +2 -0
  171. package/src/assets/codemirror/@lezer_lezer.js +2 -0
  172. package/src/assets/codemirror/@lezer_lr.js +325 -0
  173. package/src/assets/codemirror/@lezer_markdown.js +286 -0
  174. package/src/assets/codemirror/@lezer_php.js +3 -0
  175. package/src/assets/codemirror/@lezer_python.js +5 -0
  176. package/src/assets/codemirror/@lezer_rust.js +3 -0
  177. package/src/assets/codemirror/@lezer_sass.js +5 -0
  178. package/src/assets/codemirror/@lezer_xml.js +3 -0
  179. package/src/assets/codemirror/@lezer_yaml.js +12 -0
  180. package/src/assets/codemirror/@marijn_find-cluster-break.js +10 -0
  181. package/src/assets/codemirror/@uiw_codemirror-theme-androidstudio.js +3 -0
  182. package/src/assets/codemirror/@uiw_codemirror-theme-andromeda.js +1 -0
  183. package/src/assets/codemirror/@uiw_codemirror-theme-atomone.js +6 -0
  184. package/src/assets/codemirror/@uiw_codemirror-theme-aura.js +1 -0
  185. package/src/assets/codemirror/@uiw_codemirror-theme-basic.js +1 -0
  186. package/src/assets/codemirror/@uiw_codemirror-theme-bbedit.js +1 -0
  187. package/src/assets/codemirror/@uiw_codemirror-theme-copilot.js +1 -0
  188. package/src/assets/codemirror/@uiw_codemirror-theme-darcula.js +6 -0
  189. package/src/assets/codemirror/@uiw_codemirror-theme-dracula.js +6 -0
  190. package/src/assets/codemirror/@uiw_codemirror-theme-duotone.js +5 -0
  191. package/src/assets/codemirror/@uiw_codemirror-theme-eclipse.js +1 -0
  192. package/src/assets/codemirror/@uiw_codemirror-theme-github.js +3 -0
  193. package/src/assets/codemirror/@uiw_codemirror-theme-material.js +1 -0
  194. package/src/assets/codemirror/@uiw_codemirror-theme-monokai.js +1 -0
  195. package/src/assets/codemirror/@uiw_codemirror-theme-nord.js +2 -0
  196. package/src/assets/codemirror/@uiw_codemirror-theme-okaidia.js +2 -0
  197. package/src/assets/codemirror/@uiw_codemirror-theme-solarized.js +1 -0
  198. package/src/assets/codemirror/@uiw_codemirror-theme-sublime.js +2 -0
  199. package/src/assets/codemirror/@uiw_codemirror-theme-tokyo-night.js +1 -0
  200. package/src/assets/codemirror/@uiw_codemirror-theme-vscode.js +5 -0
  201. package/src/assets/codemirror/@uiw_codemirror-theme-xcode.js +3 -0
  202. package/src/assets/codemirror/@uiw_codemirror-themes.js +1 -0
  203. package/src/assets/codemirror/_core.js +4494 -0
  204. package/src/assets/codemirror/codemirror.js +46 -0
  205. package/src/assets/codemirror/crelt.js +1 -0
  206. package/src/assets/codemirror/style-mod.js +36 -0
  207. package/src/assets/codemirror/w3c-keyname.js +8 -0
  208. package/src/assets/codemirror-editor.umd.js +415 -0
  209. package/src/assets/editor.html +377 -0
  210. package/src/assets/webview-interface.umd.js +2 -0
@@ -0,0 +1,377 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
5
+ <style>
6
+ html, body {
7
+ margin: 0;
8
+ padding: 0;
9
+ width: 100%;
10
+ height: 100%;
11
+ overflow: hidden;
12
+ background: transparent;
13
+ }
14
+ .cm-editor { height: 100%; }
15
+ .cm-scroller { overflow: auto; }
16
+ </style>
17
+ </head>
18
+ <body></body>
19
+ <script>
20
+ // Renders a fixed banner visible on the physical device — useful when
21
+ // Chrome remote debugging is unavailable (e.g. emulator + Metro combo).
22
+ const _showOnScreen = (color, msg) => {
23
+ try {
24
+ const div = document.createElement('div');
25
+ div.style.cssText = 'position:fixed;top:0;left:0;right:0;background:' + color + ';color:#fff;padding:6px 8px;font-size:11px;z-index:9999;word-break:break-all;white-space:pre-wrap;font-family:monospace;';
26
+ div.textContent = msg;
27
+ (document.body || document.documentElement).appendChild(div);
28
+ } catch(e) {}
29
+ };
30
+
31
+ // Out-of-band postMessage used for log/error/ready signals that bypass DDA.
32
+ // Falls back to window.postMessage when ReactNativeWebView is absent (browser preview).
33
+ const _rnPost = (type, data) => {
34
+ const msg = JSON.stringify({ type, data });
35
+ if (window.ReactNativeWebView) {
36
+ window.ReactNativeWebView.postMessage(msg);
37
+ } else {
38
+ try { window.top.postMessage(msg, '*'); } catch(e) {}
39
+ try { window.postMessage(msg, '*'); } catch(e) {}
40
+ }
41
+ };
42
+
43
+ window.onerror = (message, source, lineno, colno) => {
44
+ _showOnScreen('#c0392b', 'ERROR: ' + message + '\n' + source + ':' + lineno);
45
+ _rnPost('__editorError__', { message, source, lineno, colno });
46
+ };
47
+
48
+ window.addEventListener('unhandledrejection', (event) => {
49
+ const msg = String(event.reason);
50
+ _showOnScreen('#c0392b', 'UNHANDLED: ' + msg);
51
+ _rnPost('__editorError__', { message: msg, source: 'unhandledrejection' });
52
+ });
53
+
54
+ window.log = (...args) => _rnPost('__editorLog__', args);
55
+ window._rnPost = _rnPost;
56
+ window._showOnScreen = _showOnScreen;
57
+ </script>
58
+ <script src="./webview-interface.umd.js"></script>
59
+ <script src="./codemirror-editor.umd.js"></script>
60
+ <script>
61
+ (async function() {
62
+ try {
63
+
64
+ const { configure, createEditor, requireAsyncModule } = window.CodeMirrorEditor;
65
+
66
+ // Maps theme name → [packageSuffix, exportName] for themes in multi-export packages.
67
+ // Single-export packages (darcula, monokai, etc.) export under the same name as the package.
68
+ const _themePackageMap = {
69
+ githubDark: ['github', 'githubDark'],
70
+ githubLight: ['github', 'githubLight'],
71
+ vscodeDark: ['vscode', 'vscodeDark'],
72
+ xcodeDark: ['xcode', 'xcodeDark'],
73
+ xcodeLight: ['xcode', 'xcodeLight'],
74
+ solarizedDark: ['solarized', 'solarizedDark'],
75
+ solarizedLight:['solarized', 'solarizedLight'],
76
+ tokyoNight: ['tokyo-night', 'tokyoNight'],
77
+ };
78
+
79
+ // fetch() is blocked for file:// origins even when same-origin in Android WebView.
80
+ // XHR works; status 0 means success for file:// (no HTTP status in that context).
81
+ configure({
82
+ loader: (url) => new Promise((resolve, reject) => {
83
+ const xhr = new XMLHttpRequest();
84
+ xhr.open('GET', url);
85
+ xhr.onload = () => {
86
+ if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {
87
+ resolve(xhr.responseText);
88
+ } else {
89
+ reject(new Error('Failed to load ' + url + ': HTTP ' + xhr.status));
90
+ }
91
+ };
92
+ xhr.onerror = () => reject(new Error('Failed to load ' + url));
93
+ xhr.send();
94
+ }),
95
+ });
96
+
97
+ // Assigned to window to prevent Chromium's GC from collecting it.
98
+ // DDA's ResourcePool holds resources weakly (WeakValueMap + FinalizationRegistry);
99
+ // without a strong reference from a long-lived scope, the GC would clean up the
100
+ // resource and all subsequent HOST calls would fail with "Resource does not exist".
101
+ const editorTarget = window._editorRoot = {};
102
+
103
+ const { root: nativeApi } = await WebViewInterface.initializeGuest({
104
+ root: editorTarget,
105
+ handshakeTimeout: 30000,
106
+ handshakeInterval: 200,
107
+ });
108
+
109
+ const config = await nativeApi.getInitialConfig();
110
+
111
+ const extensions = config.extensions ?? [];
112
+
113
+ const editor = await createEditor({
114
+ parent: document.body,
115
+ doc: config.content ?? '',
116
+ language: config.language,
117
+ extensions,
118
+ onChange: (() => {
119
+ let _timer = null;
120
+ return () => {
121
+ clearTimeout(_timer);
122
+ _timer = setTimeout(() => {
123
+ const cmds = requireAsyncModule('@codemirror/commands');
124
+ const state = editor.view.state;
125
+ _rnPost('__contentChange__', {
126
+ value: state.doc.toString(),
127
+ undo: cmds.undoDepth(state),
128
+ redo: cmds.redoDepth(state),
129
+ });
130
+ }, 300);
131
+ };
132
+ })(),
133
+ });
134
+
135
+ // Pre-fetch commands from cache (core bundle already loaded by createEditor).
136
+ const {
137
+ undo, redo, undoDepth, redoDepth,
138
+ indentMore, indentLess,
139
+ toggleComment, moveLineUp, moveLineDown, deleteLine,
140
+ selectLine, selectParentSyntax,
141
+ } = await requireAsyncModule('@codemirror/commands');
142
+ const { EditorView } = await requireAsyncModule('@codemirror/view');
143
+
144
+ // Separate compartment for the theme so setTheme and setExtensions never clobber each other.
145
+ // appendConfig adds it to the live state; themeCompartment.reconfigure() updates it in-place.
146
+ const { Compartment, StateEffect, Transaction } = await requireAsyncModule('@codemirror/state');
147
+ const themeCompartment = new Compartment();
148
+ editor.view.dispatch({ effects: StateEffect.appendConfig.of(themeCompartment.of([])) });
149
+
150
+ // Load and apply a theme by name.
151
+ const _applyTheme = async (themeName) => {
152
+ if (!themeName || themeName === 'default') {
153
+ editor.view.dispatch({ effects: themeCompartment.reconfigure([]) });
154
+ return;
155
+ }
156
+ const spec = _themePackageMap[themeName];
157
+ const pkgSuffix = spec ? spec[0] : themeName;
158
+ const exportName = spec ? spec[1] : themeName;
159
+ const mod = await requireAsyncModule(`@uiw/codemirror-theme-${pkgSuffix}`);
160
+ editor.view.dispatch({ effects: themeCompartment.reconfigure(mod[exportName]) });
161
+ };
162
+
163
+ if (config.theme) {
164
+ await _applyTheme(config.theme);
165
+ }
166
+
167
+ // Autocomplete + bracket closing
168
+ const {
169
+ autocompletion, closeBrackets,
170
+ closeBracketsKeymap, completionKeymap,
171
+ startCompletion,
172
+ } = await requireAsyncModule('@codemirror/autocomplete');
173
+ const { keymap } = await requireAsyncModule('@codemirror/view');
174
+
175
+ let _customCompletions = [];
176
+
177
+ const _customCompletionSource = (context) => {
178
+ if (!_customCompletions.length) return null;
179
+ const word = context.matchBefore(/\w+/);
180
+ if (!word || (word.from === word.to && !context.explicit)) return null;
181
+ return { from: word.from, options: _customCompletions, validFor: /^\w*$/ };
182
+ };
183
+
184
+ editor.view.dispatch({
185
+ effects: StateEffect.appendConfig.of([
186
+ closeBrackets(),
187
+ autocompletion({ override: [_customCompletionSource], activateOnTyping: true }),
188
+ keymap.of([...closeBracketsKeymap, ...completionKeymap]),
189
+ ]),
190
+ });
191
+
192
+ // Spread EditorController methods directly — getValue, setValue, setLanguage,
193
+ // setExtensions, loadExtension, destroy — then add methods not in EditorController.
194
+ const { getValue, setValue, setLanguage, setExtensions, loadExtension, destroy } = editor;
195
+
196
+ Object.assign(editorTarget, {
197
+ getValue,
198
+ setValue: (value) => {
199
+ const { doc, selection } = editor.view.state;
200
+ editor.view.dispatch({
201
+ changes: { from: 0, to: doc.length, insert: value ?? '' },
202
+ selection: {
203
+ anchor: Math.min(selection.main.anchor, (value ?? '').length),
204
+ head: Math.min(selection.main.head, (value ?? '').length),
205
+ },
206
+ });
207
+ },
208
+ setLanguage,
209
+ setExtensions,
210
+ loadExtension,
211
+ destroy,
212
+
213
+ resetValue: (value) => {
214
+ const view = editor.view;
215
+ view.dispatch({
216
+ changes: { from: 0, to: view.state.doc.length, insert: value ?? '' },
217
+ annotations: Transaction.addToHistory.of(false),
218
+ });
219
+ },
220
+
221
+ setTheme: (themeName) => _applyTheme(themeName),
222
+
223
+ setFontSize: (size) => {
224
+ editor.view.dom.style.fontSize = size ? size + 'px' : '';
225
+ requestAnimationFrame(() => {
226
+ const { head } = editor.view.state.selection.main;
227
+ editor.view.dispatch({
228
+ effects: EditorView.scrollIntoView(head, { y: 'center' }),
229
+ });
230
+ });
231
+ },
232
+
233
+ setViewport: (options) => {
234
+ const {
235
+ intialScale = 1,
236
+ maximumScale,
237
+ minimumScale,
238
+ userScalable,
239
+ viewportWidth,
240
+ } = options ?? {};
241
+ let content = 'width=' + (viewportWidth ?? 'device-width') + ', initial-scale=' + intialScale;
242
+ if (maximumScale !== undefined) content += ', maximum-scale=' + maximumScale;
243
+ if (minimumScale !== undefined) content += ', minimum-scale=' + minimumScale;
244
+ if (userScalable !== undefined)
245
+ content += ', user-scalable=' + (userScalable ? 'yes' : 'no');
246
+ let meta = document.querySelector('meta[name="viewport"]');
247
+ if (!meta) {
248
+ meta = document.createElement('meta');
249
+ meta.setAttribute('name', 'viewport');
250
+ document.head.appendChild(meta);
251
+ }
252
+ meta.setAttribute('content', content);
253
+ },
254
+
255
+ focus: () => editor.view.focus(),
256
+
257
+ getCursor: (where) => {
258
+ const state = editor.view.state;
259
+ const sel = state.selection.main;
260
+ const pos =
261
+ where === 'from' ? sel.from : where === 'to' ? sel.to : sel.head;
262
+ const line = state.doc.lineAt(pos);
263
+ return { line: line.number - 1, ch: pos - line.from, index: pos };
264
+ },
265
+
266
+ setCursor: (line, ch) => {
267
+ const view = editor.view;
268
+ const lineObj = view.state.doc.line(line + 1);
269
+ const pos = lineObj.from + (ch ?? 0);
270
+ view.dispatch({ selection: { anchor: pos } });
271
+ },
272
+
273
+ getSelection: () => {
274
+ const state = editor.view.state;
275
+ return state.sliceDoc(state.selection.main.from, state.selection.main.to);
276
+ },
277
+
278
+ setSelection: (anchor, head) => {
279
+ editor.view.dispatch({ selection: { anchor, head: head ?? anchor } });
280
+ },
281
+
282
+ replaceSelection: (text) => {
283
+ const view = editor.view;
284
+ view.dispatch(view.state.replaceSelection(text));
285
+ },
286
+
287
+ cancelSelection: () => {
288
+ const view = editor.view;
289
+ const { head } = view.state.selection.main;
290
+ view.dispatch({ selection: { anchor: head } });
291
+ },
292
+
293
+ indentMore: () => indentMore(editor.view),
294
+
295
+ indentLess: () => indentLess(editor.view),
296
+
297
+ toggleComment: () => toggleComment(editor.view),
298
+
299
+ moveLineUp: () => moveLineUp(editor.view),
300
+
301
+ moveLineDown: () => moveLineDown(editor.view),
302
+
303
+ deleteLine: () => deleteLine(editor.view),
304
+
305
+ selectLine: () => selectLine(editor.view),
306
+
307
+ selectParentSyntax: () => selectParentSyntax(editor.view),
308
+
309
+ historyUndo: () => undo(editor.view),
310
+
311
+ historyRedo: () => redo(editor.view),
312
+
313
+ historyClear: () => {
314
+ // clearHistory StateEffect was removed from @codemirror/commands 6.7+.
315
+ // Dispatch a no-doc-change transaction marked as not-in-history so
316
+ // callers don't crash, though the undo stack is not actually emptied.
317
+ editor.view.dispatch({ annotations: Transaction.addToHistory.of(false) });
318
+ },
319
+
320
+ startCompletion: () => startCompletion(editor.view),
321
+
322
+ setCompletions: (items) => {
323
+ _customCompletions = Array.isArray(items) ? items : [];
324
+ },
325
+
326
+ setSoftKeyboard: (enabled) => {
327
+ const dom = editor.view.contentDOM;
328
+ if (enabled) {
329
+ dom.removeAttribute('inputmode');
330
+ } else {
331
+ dom.setAttribute('inputmode', 'none');
332
+ }
333
+ },
334
+
335
+ historySize: () => {
336
+ const state = editor.view.state;
337
+ return { undo: undoDepth(state), redo: redoDepth(state) };
338
+ },
339
+
340
+ scrollToCursor: (margin) => {
341
+ const view = editor.view;
342
+ const { head } = view.state.selection.main;
343
+ view.dispatch({
344
+ effects: EditorView.scrollIntoView(head, margin !== undefined ? { y: 'center' } : {}),
345
+ });
346
+ },
347
+ });
348
+
349
+ if (config.viewport) {
350
+ editorTarget.setViewport(config.viewport);
351
+ }
352
+
353
+ // Fire __selectionChange__ out-of-band whenever the user changes the selection.
354
+ // React Native stores the last known selection so it can be read synchronously
355
+ // (getSelection() via DDA fails after WebView loses focus on mobile).
356
+ editor.view.dispatch({
357
+ effects: StateEffect.appendConfig.of(
358
+ EditorView.updateListener.of((update) => {
359
+ if (update.selectionSet) {
360
+ const sel = update.state.selection.main;
361
+ const text = sel.empty ? '' : update.state.sliceDoc(sel.from, sel.to);
362
+ _rnPost('__selectionChange__', text);
363
+ }
364
+ })
365
+ ),
366
+ });
367
+
368
+ // Signal HOST that the editor is fully ready (theme and language applied).
369
+ // WebViewAPI.onMessage intercepts this and fires onInitialized, which removes the BlockingView.
370
+ _rnPost('__editorReady__', null);
371
+ } catch (err) {
372
+ _rnPost('__editorError__', { message: String(err), stack: err?.stack, source: 'bootstrap-catch' });
373
+ _showOnScreen('#c0392b', 'bootstrap error: ' + String(err));
374
+ }
375
+ })();
376
+ </script>
377
+ </html>
@@ -0,0 +1,2 @@
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).WebViewInterface={})}(this,function(e){"use strict";const t=Date.now()-Math.floor(1e3*Math.random());let r=0;var o;!function(e){e.THEN="then",e.CATCH="catch"}(o||(o={}));const n=e=>"string"==typeof e&&(e===o.THEN||e===o.CATCH),s=(e="")=>{const o=`${e?`${e}/`:""}${t}/`;return()=>`${o}${++r};`},i=s();class a{constructor(e=i()){this.id=e,Object.defineProperty(this,"id",{value:this.id,writable:!1,configurable:!1})}}class c{constructor(e,t,r,o){this.type=e,this.name=t,this.value=r,this.context=o,Object.defineProperty(this,"type",{value:e,writable:!1,configurable:!1}),Object.defineProperty(this,"name",{value:t,writable:!1,configurable:!1})}toObject(e=!1){const{type:t,name:r,value:o,context:n}=this;return{type:t,name:r,value:o,context:e?n:void 0}}toJSON(e=!1){const{type:t,name:r,value:o,context:n}=this;return e?JSON.stringify([t,r,o,n]):JSON.stringify([t,r,o])}static fromJSON(e){const[t,r,o,n]=JSON.parse(e);return new c(t,r,o,n)}}class u extends c{constructor(e,t,r,o,n){super(t,r,o,n),this.prev=e}*[Symbol.iterator](){let e=this;for(;e;)yield e,e=e.prev}isTail(){return!this.prev}forEach(e){let t=this;do{e(t),t=t.prev}while(t)}map(e){let t=this;const r=[];do{r.push(e(t)),t=t.prev}while(t);return r}reduce(e,t){let r=this,o=t;do{o=e(o,r),r=r.prev}while(r);return o}withoutPrev(){return new u(void 0,this.type,this.name,this.value,this.context)}static fromCommand({type:e,name:t,value:r,context:o},n){return new u(n,e,t,r,o)}}var l;!function(e){e.GET="P:get",e.SET="P:set",e.APPLY="P:apply",e.DELETE_PROPERTY="P:del",e.METHOD_CALL="P:call",e.CONSTRUCT="P:new"}(l||(l={}));const p={arguments:!0,caller:!0,prototype:!0},d=Symbol("P:api"),h=(e,t,r={})=>{const o=Object.assign("function"==typeof e?function(...t){return e.apply(this,t)}:function(){},{target:e,[d]:{getTarget:()=>e,...r}});return new Proxy(o,t)},f=e=>e===d||Object.hasOwn(p,e),m=e=>(t,r)=>{const{target:o}=t;return f(r)?t[r]:e(l.GET,r,void 0,o)},v=e=>({target:t},r,o)=>e(l.APPLY,void 0,o,t),y=e=>({target:t},r,o)=>!f(r)&&(e(l.SET,r,o,t),!0),w=e=>({target:t},r)=>e(l.CONSTRUCT,void 0,r,t),g=e=>(t,r)=>!f(r)&&(e(l.DELETE_PROPERTY,r,void 0,t.target),!0),b=(e,t)=>!!f(t)&&e[t],E=()=>Object.getOwnPropertyNames(p),P=(e,t)=>f(t)?Object.getOwnPropertyDescriptor(e,t):Object.getOwnPropertyDescriptor(e.target,t);class T{constructor(e){this.map=e,this.mapIterator=this.map.keys()}[Symbol.iterator](){return new T(this.map)}next(){for(;;){const e=this.mapIterator.next();if(e.done)return{done:!0,value:void 0};const t=e.value;if(void 0!==this.map.get(t).deref())return{done:!1,value:t}}}}class O{constructor(e){this.mapIterator=e}[Symbol.iterator](){return new O(this.mapIterator[Symbol.iterator]())}next(){for(;;){const e=this.mapIterator.next();if(e.done)return{done:!0,value:void 0};const t=e.value.deref();if(void 0!==t)return{done:!1,value:t}}}}class S{constructor(e){this.mapIterator=e}[Symbol.iterator](){return new S(this.mapIterator[Symbol.iterator]())}next(){for(;;){const e=this.mapIterator.next();if(e.done)return{done:!0,value:void 0};const[t,r]=e.value,o=r.deref();if(void 0!==o)return{done:!1,value:[t,o]}}}}class x{constructor(e=globalThis.FinalizationRegistry){this.map=new Map;const t=e;void 0===t?console.warn("WeakValueMap: FinalizationRegistry is not available in this environment. Stale entries will not be removed automatically."):t&&(this.finalizer=new t(e=>{const t=this.map.get(e);t&&void 0!==t.deref()||this.map.delete(e)}))}get approximateSize(){return this.map.size}keys(){return new T(this.map)}values(){return new O(this.map.values())}entries(){return new S(this.map.entries())}set(e,t){return this.map.set(e,new WeakRef(t)),this.finalizer?.register(t,e),this}get(e){const t=this.map.get(e);return t&&t.deref()}has(e){return void 0!==this.get(e)}delete(e){return this.map.delete(e)}clear(){this.map.clear()}forEach(e){this.map.forEach((t,r)=>{const o=t.deref();void 0!==o&&e(o,r,this)})}verify(){const e=new Map;this.map.forEach((t,r)=>{void 0!==t.deref()&&e.set(r,t)}),this.map=e}}class R extends a{constructor(e,t){super(),this.pool=e,this.type=t,Object.defineProperty(this,"pool",{value:e,writable:!1,configurable:!1}),Object.defineProperty(this,"type",{value:t,writable:!1,configurable:!1})}toObject(){return{id:this.id,poolId:this.pool.id,type:this.type}}toJSON(){return JSON.stringify(this.toObject())}}const j=e=>null!=e&&"object"==typeof e&&"string"==typeof e.id&&"string"==typeof e.poolId,C=new Set;var L;L=["object","function"],C.clear(),L.forEach(e=>C.add(e));class N extends a{constructor(e=void 0){super(),this.resources=new WeakMap,this.refs=new x(e)}get active(){return!!this.resources}set(e,t){if(null===(r=e)||!C.has(typeof r))return null;var r;const o=this.resources.get(e);if(o)return o;const n=((e,t,r)=>new R(e,r||typeof t))(this,e,t);return this.refs.set(n.id,e),this.resources.set(e,n),n}has(e){if(!this.resources.has(e))return!1;const t=this.resources.get(e);return void 0!==t&&void 0!==this.refs.get(t.id)}get({id:e}){return this.getById(e)}getById(e){return this.refs.get(e)}getResource(e){return this.resources.get(e)}remove(e){const t=this.resources.get(e);return!!t&&(this.refs.delete(t.id),this.resources.delete(e))}clear(){this.refs.forEach((e,t)=>{const r=this.refs.get(t);void 0!==r&&this.resources.delete(r)}),this.refs.clear()}}let M;class A extends a{constructor(){super(),this.pools={},this.register((M||(M=new N),M))}createPool(){const e=new N;return this.register(e),e}register(e){return!Object.hasOwn(this.pools,e.id)&&(this.pools[e.id]=e,!0)}get(e){return this.pools[e]||null}isRegistered(e){return Object.hasOwn(this.pools,e.id)}remove(e){const t="string"==typeof e?e:e.id;return delete this.pools[t]}}let $;const I=()=>($||($=new A),$);let H;const k=()=>(H||(H=I().createPool()),H),D=e=>{if(!j(e))return e;const{poolId:t,id:r}=e,o=I().get(t);if(!o)throw new Error(`Resource Pool "${t}" does not exist.`);const n=o.getById(r);if(void 0===n)throw new Error(`Resource "${r}" does not exist, pool "${t}".`);return n},U={[l.GET]:(e,t)=>e[t],[l.SET]:(e,t,r)=>(e[t]=D(r),e[t]),[l.DELETE_PROPERTY]:(e,t)=>delete e[t],[l.APPLY]:(e,t,r)=>{const[o,n]=r;return e.apply(D(o),n.map(D))},[l.METHOD_CALL]:(e,t,r)=>e[t](...r.map(D)),[l.CONSTRUCT]:(e,t,r)=>new e(...r.map(D))};var Y,J;!function(e){e.HOST="host",e.GUEST="guest"}(Y||(Y={})),function(e){e.REQUEST="request",e.RESPONSE="response"}(J||(J={}));const G=s("wi"),z=s("m"),_=async e=>{if(null==e)return e;if(Array.isArray(e)){const t=[];for(const r of e)t.push(await _(r));return t}if((null!=(t=e)&&"object"==typeof t||"function"==typeof t)&&t&&t[d]){const t=await(e=>null!=e&&e[d]?e[d].getTarget():e)(e);return _(t)}var t;if("function"==typeof e){return k().set(e).toObject()}return e},W=(e="")=>t=>{if(null==t||"object"!=typeof t)return!1;const r=t.id;return"string"==typeof r&&(e?e===r:/^wi/.test(r))},V=({handler:e,timeout:t,timeoutError:r=`Async operation didn't complete in ${t}ms.`,onTimeout:o})=>{const n="function"==typeof e?new Promise(e):e;if(!t)return n;let s;const i=new Promise((e,n)=>{s=setTimeout(()=>{n(r),o&&o(r)},t)});return Promise.race([n.then(e=>(clearTimeout(s),e),e=>{throw clearTimeout(s),e}),i])},q=e=>null!=e&&"object"==typeof e&&"data"in e?e.data:e,B=({type:e,remoteId:t,handshakeTimeout:r,...o})=>{const n={...o,isMessage:W(t)},s=e===Y.HOST?(({id:e,root:t,isMessage:r,subscribe:o,unsubscribe:n,sendMessage:s,preprocessResponse:i=e=>e})=>a=>{const c=o=>{const u=q(i(o));r(u)&&(n(c),s({id:e,root:t}),a(u))};o(c)})(n):(({id:e,root:t,isMessage:r,subscribe:o,unsubscribe:n,sendMessage:s,handshakeInterval:i,preprocessResponse:a=e=>e})=>c=>{let u;const l=e=>{const t=q(a(e));r(t)&&(n(l),void 0!==u&&clearInterval(u),c(t))};o(l);const p=()=>s({id:e,root:t});i?u=setInterval(p,i):p()})(n);return V({handler:s,timeout:r,timeoutError:`Handshake sequence could not complete in ${r}ms.`})},Q=Promise.resolve(void 0),F=(e,t,r)=>{switch(t){case o.THEN:return e.then(...r);case o.CATCH:return e.catch(...r);default:throw new Error(`Unexpected Error: Promise method "${String(t)}" could not be called.`)}},K=(e,t=!0)=>(r,o)=>{const s=(r,o)=>{const i=(a=(r,i,a,c)=>{const p=((e,t,r,o,n,s)=>t===l.APPLY&&s&&e?.type===l.GET?new u(e.prev,l.METHOD_CALL,e.name,o,e.context):new u(e,t,r,o,n))(o,r,i,a,c,t);let d;return(e=>{const{type:t}=e;return t===l.GET||t===l.METHOD_CALL?n(e.name):t===l.APPLY&&n(e.prev?.name)})(p)?((e,t,r,o,n)=>{switch(e.type){case l.GET:{const{name:s,prev:i}=e;let{context:a}=e;return r&&(a=i?t(i,i.context,o):n),(...e)=>a[s](...e)}case l.METHOD_CALL:if(!e.context)throw new Error("Unexpected Error: Could not apply Promise method of unknown context.");return F(e.context,e.name,e.value);case l.APPLY:{const{prev:t}=e;if(!t?.context||!t?.name)throw new Error("Unexpected Error: Could not apply Promise method of unknown context.");return F(t.context,t.name,e.value)}default:throw new Error(`Command type "${e.type}" could not be executed as a Promise command.`)}})(p,e,t,s,c):(d=r!==l.APPLY&&r!==l.GET||!t?e(p,c,s):Q,s(d,p))},{get:m(a),apply:v(a),construct:w(a),set:y(a),deleteProperty:g(a),has:b,ownKeys:E,getOwnPropertyDescriptor:P});var a;return h(r,i,{getCommand:()=>o,dropCommandChain(){o&&(o=o.withoutPrev?.()??o)}})};return s(Promise.resolve(r),o?u.fromCommand(o):void 0)},X=async({id:e,root:t,...r})=>{const o=e||G(),n=t?k().set(t).toObject():void 0,{subscribe:s,unsubscribe:i,sendMessage:a,preprocessResponse:c=e=>e}=r,{id:u,root:p}=await B({id:o,root:n,...r}),d=new Map,h=(f=o,e=>{if(null==e||"object"!=typeof e)return!1;const{id:t,target:r}=e;return"string"==typeof t&&f===r});var f;const m=((e,t)=>async(r,o,n=z())=>{const s=r.toObject(),i=await o;if(s.type===l.APPLY){let e;r.prev&&(e=await r.prev.context),s.value=[e,await _(s.value)]}else s.value=await _(s.value);return{id:n,type:J.REQUEST,source:e,target:t,command:s,context:i}})(o,u),v=(y=o,({id:e,source:t},r,o)=>({id:e,type:J.RESPONSE,source:y,target:t,value:r,error:o}));var y;const w=async e=>{const t=q(c(e));if(h(t))switch(t.type){case J.REQUEST:{const e=t;try{const t=await(({command:e,command:{type:t,value:r},context:o})=>{const n=D(o),s=e.name;if(t!==l.APPLY&&!n)throw new Error(`Cannot execute command ${t}/${String(s)} on non-existent target (${n}).`);const i=U[t];if(!i)throw new Error(`Unknown command type "${t}" cannot be applied remotely.`);const a=i(n,s,r);if(t===l.SET||t===l.DELETE_PROPERTY)return a;if(null!=a&&("function"==typeof a||t===l.CONSTRUCT))return k().set(a).toObject();return a})(e);a(v(e,t))}catch(t){a(v(e,void 0,{message:t.message}))}break}case J.RESPONSE:{const{id:e,value:r,error:o}=t,n=d.get(e);if(!n)return;d.delete(e),o?n.reject(o):n.resolve(r);break}}};s(w);const g=()=>i(w);if(!p)return{stop:g,pool:k()};const b=K(async(e,t,o)=>{const{responseTimeout:n}=r,s=z(),i=`Could not receive command ${e.type}/${String(e.name)} response in ${n}ms.`,c=V({handler:async(r,o)=>{try{const n=await m(e,t,s);d.set(s,{resolve:r,reject:o}),a(n)}catch(e){o(e)}},timeout:n||0,timeoutError:i,onTimeout:()=>{d.delete(s)}}),u=await c;return j(u)?o(c,e):c},!1);return{stop:g,wrap:b,pendingRequests:d,pool:k(),root:p?b(p):null}},Z=e=>{if("string"==typeof e)try{return JSON.parse(e)}catch{return e}return e};e.initializeGuest=(e={})=>{const t=globalThis.window,r=t?.ReactNativeWebView;if(!r)throw new Error("ReactNativeWebView is not available. initializeGuest() must run inside a React Native WebView.");return X({...e,type:Y.GUEST,subscribe:e=>t.addEventListener("message",e),unsubscribe:e=>t.removeEventListener("message",e),sendMessage:e=>r.postMessage(JSON.stringify(e)),preprocessResponse:e=>Z(e?.data)})},e.initializeHost=({webView:e,...t})=>{const r=new Set;return{onMessage:e=>{r.forEach(t=>t(e))},connection:X({...t,type:Y.HOST,subscribe:e=>r.add(e),unsubscribe:e=>r.delete(e),sendMessage:t=>e.injectJavaScript(`window.dispatchEvent(new MessageEvent('message',{data:${(e=>JSON.stringify(JSON.stringify(e)))(t)}}));true;`),preprocessResponse:e=>Z(e?.nativeEvent?.data??e?.data)})}}});
2
+ //# sourceMappingURL=webview-interface.umd.js.map