@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.
- package/LICENSE +20 -0
- package/README.md +790 -0
- package/app.plugin.js +133 -0
- package/lib/module/BlockingView.js +25 -0
- package/lib/module/CodeEditor.js +239 -0
- package/lib/module/EditorAPI.js +2 -0
- package/lib/module/WebViewAPI.js +133 -0
- package/lib/module/index.js +6 -0
- package/lib/module/package.json +1 -0
- package/lib/typescript/app.plugin.d.ts +3 -0
- package/lib/typescript/babel.config.d.ts +10 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/react-native.config.d.ts +2 -0
- package/lib/typescript/scripts/copy-assets.d.ts +2 -0
- package/lib/typescript/src/BlockingView.d.ts +3 -0
- package/lib/typescript/src/CodeEditor.d.ts +33 -0
- package/lib/typescript/src/EditorAPI.d.ts +66 -0
- package/lib/typescript/src/WebViewAPI.d.ts +46 -0
- package/lib/typescript/src/index.d.ts +7 -0
- package/package.json +106 -0
- package/react-native.config.js +3 -0
- package/src/assets/codemirror/@actualwave_codemirror-lang-sksl.js +15 -0
- package/src/assets/codemirror/@babel_runtime_helpers_interopRequireDefault.js +1 -0
- package/src/assets/codemirror/@babel_runtime_helpers_objectSpread2.js +1 -0
- package/src/assets/codemirror/@babel_runtime_helpers_toConsumableArray.js +1 -0
- package/src/assets/codemirror/@codemirror_autocomplete.js +206 -0
- package/src/assets/codemirror/@codemirror_collab.js +31 -0
- package/src/assets/codemirror/@codemirror_commands.js +411 -0
- package/src/assets/codemirror/@codemirror_lang-angular.js +7 -0
- package/src/assets/codemirror/@codemirror_lang-cpp.js +7 -0
- package/src/assets/codemirror/@codemirror_lang-css.js +14 -0
- package/src/assets/codemirror/@codemirror_lang-go.js +13 -0
- package/src/assets/codemirror/@codemirror_lang-html.js +20 -0
- package/src/assets/codemirror/@codemirror_lang-java.js +7 -0
- package/src/assets/codemirror/@codemirror_lang-javascript.js +54 -0
- package/src/assets/codemirror/@codemirror_lang-jinja.js +15 -0
- package/src/assets/codemirror/@codemirror_lang-json.js +10 -0
- package/src/assets/codemirror/@codemirror_lang-less.js +10 -0
- package/src/assets/codemirror/@codemirror_lang-lezer.js +7 -0
- package/src/assets/codemirror/@codemirror_lang-liquid.js +15 -0
- package/src/assets/codemirror/@codemirror_lang-markdown.js +55 -0
- package/src/assets/codemirror/@codemirror_lang-php.js +7 -0
- package/src/assets/codemirror/@codemirror_lang-python.js +19 -0
- package/src/assets/codemirror/@codemirror_lang-rust.js +7 -0
- package/src/assets/codemirror/@codemirror_lang-sass.js +10 -0
- package/src/assets/codemirror/@codemirror_lang-sql.js +52 -0
- package/src/assets/codemirror/@codemirror_lang-vue.js +6 -0
- package/src/assets/codemirror/@codemirror_lang-wast.js +2 -0
- package/src/assets/codemirror/@codemirror_lang-xml.js +13 -0
- package/src/assets/codemirror/@codemirror_lang-yaml.js +13 -0
- package/src/assets/codemirror/@codemirror_language-data.js +5 -0
- package/src/assets/codemirror/@codemirror_language.js +524 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_apl.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_asciiarmor.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_asn1.js +3 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_asterisk.js +9 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_brainfuck.js +13 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_clike.js +31 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_clojure.js +5 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_cmake.js +6 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_cobol.js +7 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_coffeescript.js +14 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_commonlisp.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_crystal.js +18 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_css.js +5 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_cypher.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_d.js +2 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_diff.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_dockerfile.js +9 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_dtd.js +3 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_dylan.js +35 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_ebnf.js +9 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_ecl.js +3 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_eiffel.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_elm.js +3 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_erlang.js +52 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_factor.js +14 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_fcl.js +2 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_forth.js +5 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_fortran.js +2 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_gas.js +13 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_gherkin.js +5 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_go.js +2 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_groovy.js +3 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_haskell.js +5 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_haxe.js +12 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_http.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_idl.js +7 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_javascript.js +23 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_jinja2.js +8 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_julia.js +17 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_livescript.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_lua.js +2 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_mathematica.js +26 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_mbox.js +11 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_mirc.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_mllike.js +8 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_modelica.js +12 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_mscgen.js +3 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_mumps.js +16 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_nginx.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_nsis.js +20 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_ntriples.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_octave.js +8 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_oz.js +17 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_pascal.js +2 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_pegjs.js +25 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_perl.js +247 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_pig.js +6 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_powershell.js +7 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_properties.js +5 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_protobuf.js +7 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_pug.js +24 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_puppet.js +42 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_python.js +15 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_q.js +2 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_r.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_rpm.js +9 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_ruby.js +4 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_rust.js +5 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_sas.js +23 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_sass.js +26 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_scheme.js +14 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_shell.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_sieve.js +7 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_simple-mode.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_smalltalk.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_solr.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_sparql.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_spreadsheet.js +6 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_sql.js +84 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_stex.js +11 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_stylus.js +45 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_swift.js +2 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_tcl.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_textile.js +2 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_tiddlywiki.js +33 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_tiki.js +20 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_toml.js +4 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_troff.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_ttcn-cfg.js +3 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_ttcn.js +3 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_turtle.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_vb.js +11 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_vbscript.js +26 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_velocity.js +15 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_verilog.js +67 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_vhdl.js +2 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_wast.js +7 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_webidl.js +25 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_xml.js +6 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_xquery.js +51 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_yacas.js +16 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_yaml.js +1 -0
- package/src/assets/codemirror/@codemirror_legacy-modes_mode_z80.js +1 -0
- package/src/assets/codemirror/@codemirror_lint.js +46 -0
- package/src/assets/codemirror/@codemirror_merge.js +167 -0
- package/src/assets/codemirror/@codemirror_search.js +121 -0
- package/src/assets/codemirror/@codemirror_state.js +793 -0
- package/src/assets/codemirror/@codemirror_theme-one-dark.js +12 -0
- package/src/assets/codemirror/@codemirror_view.js +1210 -0
- package/src/assets/codemirror/@lezer_common.js +407 -0
- package/src/assets/codemirror/@lezer_cpp.js +4 -0
- package/src/assets/codemirror/@lezer_css.js +4 -0
- package/src/assets/codemirror/@lezer_go.js +3 -0
- package/src/assets/codemirror/@lezer_highlight.js +380 -0
- package/src/assets/codemirror/@lezer_html.js +20 -0
- package/src/assets/codemirror/@lezer_java.js +2 -0
- package/src/assets/codemirror/@lezer_javascript.js +7 -0
- package/src/assets/codemirror/@lezer_json.js +2 -0
- package/src/assets/codemirror/@lezer_lezer.js +2 -0
- package/src/assets/codemirror/@lezer_lr.js +325 -0
- package/src/assets/codemirror/@lezer_markdown.js +286 -0
- package/src/assets/codemirror/@lezer_php.js +3 -0
- package/src/assets/codemirror/@lezer_python.js +5 -0
- package/src/assets/codemirror/@lezer_rust.js +3 -0
- package/src/assets/codemirror/@lezer_sass.js +5 -0
- package/src/assets/codemirror/@lezer_xml.js +3 -0
- package/src/assets/codemirror/@lezer_yaml.js +12 -0
- package/src/assets/codemirror/@marijn_find-cluster-break.js +10 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-androidstudio.js +3 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-andromeda.js +1 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-atomone.js +6 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-aura.js +1 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-basic.js +1 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-bbedit.js +1 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-copilot.js +1 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-darcula.js +6 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-dracula.js +6 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-duotone.js +5 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-eclipse.js +1 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-github.js +3 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-material.js +1 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-monokai.js +1 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-nord.js +2 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-okaidia.js +2 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-solarized.js +1 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-sublime.js +2 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-tokyo-night.js +1 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-vscode.js +5 -0
- package/src/assets/codemirror/@uiw_codemirror-theme-xcode.js +3 -0
- package/src/assets/codemirror/@uiw_codemirror-themes.js +1 -0
- package/src/assets/codemirror/_core.js +4494 -0
- package/src/assets/codemirror/codemirror.js +46 -0
- package/src/assets/codemirror/crelt.js +1 -0
- package/src/assets/codemirror/style-mod.js +36 -0
- package/src/assets/codemirror/w3c-keyname.js +8 -0
- package/src/assets/codemirror-editor.umd.js +415 -0
- package/src/assets/editor.html +377 -0
- 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
|