apprun 4.0.0 → 6.0.0-rc.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 (135) hide show
  1. package/CHANGELOG.md +235 -12
  2. package/LICENSE +1 -1
  3. package/README.md +225 -110
  4. package/apprun.d.ts +240 -34
  5. package/cli/app.js +29 -0
  6. package/cli/colors.js +69 -0
  7. package/cli/index.html +13 -0
  8. package/cli/index.js +96 -0
  9. package/dist/apprun-code.js +2 -0
  10. package/dist/apprun-code.js.map +1 -0
  11. package/dist/apprun-dev-tools.js +1 -1
  12. package/dist/apprun-dev-tools.js.map +1 -1
  13. package/dist/apprun-html.esm.js +34 -0
  14. package/dist/apprun-html.esm.js.map +1 -0
  15. package/dist/apprun-html.js +2 -1
  16. package/dist/apprun-html.js.LICENSE.txt +11 -0
  17. package/dist/apprun-html.js.map +1 -1
  18. package/dist/apprun-play.js +2 -0
  19. package/dist/apprun-play.js.map +1 -0
  20. package/dist/apprun.esm.js +2 -0
  21. package/dist/apprun.esm.js.map +1 -0
  22. package/dist/apprun.js +1 -1
  23. package/dist/apprun.js.map +1 -1
  24. package/dist/createState.js +2 -0
  25. package/dist/createState.js.map +1 -0
  26. package/esm/add-components.js +90 -0
  27. package/esm/add-components.js.map +1 -0
  28. package/esm/app.js +209 -0
  29. package/esm/app.js.map +1 -0
  30. package/esm/apprun-code.js +170 -0
  31. package/esm/apprun-code.js.map +1 -0
  32. package/esm/apprun-dev-tools-tests.js +95 -0
  33. package/esm/apprun-dev-tools-tests.js.map +1 -0
  34. package/esm/apprun-dev-tools.js +281 -0
  35. package/esm/apprun-dev-tools.js.map +1 -0
  36. package/esm/apprun-html.js +24 -0
  37. package/esm/apprun-html.js.map +1 -0
  38. package/esm/apprun-play.js +248 -0
  39. package/esm/apprun-play.js.map +1 -0
  40. package/esm/apprun.js +220 -0
  41. package/esm/apprun.js.map +1 -0
  42. package/esm/component.js +413 -0
  43. package/esm/component.js.map +1 -0
  44. package/esm/createState.js +9 -0
  45. package/esm/createState.js.map +1 -0
  46. package/esm/decorator.js +88 -0
  47. package/esm/decorator.js.map +1 -0
  48. package/esm/directive.js +306 -0
  49. package/esm/directive.js.map +1 -0
  50. package/esm/router.js +345 -0
  51. package/esm/router.js.map +1 -0
  52. package/esm/type-utils.js +90 -0
  53. package/esm/type-utils.js.map +1 -0
  54. package/esm/types.js +58 -0
  55. package/esm/types.js.map +1 -0
  56. package/esm/vdom-lit-html.js +65 -0
  57. package/esm/vdom-lit-html.js.map +1 -0
  58. package/esm/vdom-my-prop-attr.js +227 -0
  59. package/esm/vdom-my-prop-attr.js.map +1 -0
  60. package/esm/vdom-my.js +293 -0
  61. package/esm/vdom-my.js.map +1 -0
  62. package/esm/vdom-to-html.js +54 -0
  63. package/esm/vdom-to-html.js.map +1 -0
  64. package/esm/vdom.js +28 -0
  65. package/esm/vdom.js.map +1 -0
  66. package/esm/version.js +15 -0
  67. package/esm/version.js.map +1 -0
  68. package/esm/web-component.js +155 -0
  69. package/esm/web-component.js.map +1 -0
  70. package/jsx-runtime.js +2 -0
  71. package/jsx-runtime.js.map +1 -0
  72. package/package.json +90 -41
  73. package/.travis.yml +0 -10
  74. package/.vscode/launch.json +0 -19
  75. package/BACKERS.md +0 -3
  76. package/apprun-cli.js +0 -177
  77. package/cli-templates/_gitignore +0 -6
  78. package/cli-templates/component.ts_ +0 -16
  79. package/cli-templates/index.html +0 -11
  80. package/cli-templates/karma.conf.js +0 -24
  81. package/cli-templates/main.ts_ +0 -13
  82. package/cli-templates/readme.md +0 -7
  83. package/cli-templates/spa_index.html +0 -14
  84. package/cli-templates/spa_main.ts_ +0 -47
  85. package/cli-templates/spec.ts_ +0 -11
  86. package/cli-templates/tsconfig.json +0 -12
  87. package/cli-templates/webpack.config.js +0 -23
  88. package/demo-html/app.js +0 -2
  89. package/demo-html/app.js.map +0 -1
  90. package/demo-html/counter-c.html +0 -29
  91. package/demo-html/counter-wc-event.html +0 -29
  92. package/demo-html/counter-wc.html +0 -29
  93. package/demo-html/counter.html +0 -26
  94. package/demo-html/index.html +0 -14
  95. package/demo-html/main.tsx +0 -31
  96. package/docs/README.md +0 -326
  97. package/docs/index.html +0 -23
  98. package/index.html +0 -85
  99. package/logo.png +0 -0
  100. package/src/app.ts +0 -69
  101. package/src/apprun-dev-tools.tsx +0 -67
  102. package/src/apprun-html.ts +0 -13
  103. package/src/apprun.ts +0 -53
  104. package/src/component.ts +0 -189
  105. package/src/createComponent.tsx +0 -38
  106. package/src/decorator.ts +0 -36
  107. package/src/router.ts +0 -19
  108. package/src/types.ts +0 -9
  109. package/src/vdom-html.ts +0 -17
  110. package/src/vdom-my.ts +0 -191
  111. package/src/vdom-to-html.tsx +0 -45
  112. package/src/vdom.ts +0 -7
  113. package/src/web-component.ts +0 -29
  114. package/tests/app-rx.spec_ +0 -41
  115. package/tests/app.spec.ts +0 -122
  116. package/tests/application.spec.tsx +0 -23
  117. package/tests/component.spec.tsx +0 -296
  118. package/tests/custom-element.spec.tsx +0 -19
  119. package/tests/data-attr.spec.tsx +0 -42
  120. package/tests/decorator.spec.tsx +0 -104
  121. package/tests/fragment.spec.tsx +0 -79
  122. package/tests/hyperscript.spec.ts +0 -43
  123. package/tests/node-test.js +0 -7
  124. package/tests/router.spec.ts +0 -69
  125. package/tests/stateful-component.spec.tsx +0 -248
  126. package/tests/typed.spec.tsx +0 -63
  127. package/tests/vdom-html.spec.ts +0 -35
  128. package/tests/vdom-jsx.spec.tsx +0 -131
  129. package/tests/vdom-my.spec.tsx +0 -195
  130. package/tests/view-engine.spec.js +0 -59
  131. package/tsconfig.json +0 -11
  132. package/tslint.json +0 -124
  133. package/typescriptreact.json +0 -87
  134. package/viewEngine.js +0 -54
  135. package/webpack.config.js +0 -30
@@ -0,0 +1,248 @@
1
+ /**
2
+ * AppRun play popup component for running embedded examples.
3
+ *
4
+ * Builds the popup preview/editor UI and uses explicit HTMLElement casts for
5
+ * mounted DOM access under the Phase 3 component typing contract.
6
+ */
7
+ import { app, Component } from './apprun';
8
+ const popup_div = `<div id="play-popup" class="overlay">
9
+ <style id="apprun-play-style">
10
+ .apprun-play .col {
11
+ height: 100%;
12
+ flex: 1;
13
+ }
14
+ .apprun-preview {
15
+ width: 100%
16
+ }
17
+ .apprun-play .editor, .apprun-play .preview {
18
+ display: inline-block;
19
+ width: calc(100% - 20px);
20
+ height: calc(100% - 10px);
21
+ }
22
+
23
+ a.button {
24
+ font-size: .8em;
25
+ padding: 10px;
26
+ cursor: pointer;
27
+ color: var(--md-primary-bg-color);
28
+ background: var(--md-primary-fg-color)
29
+ }
30
+ a.button:hover {
31
+ color: var(--md-primary-fg-color);
32
+ background: var(--md-primary-bg-color)
33
+ }
34
+
35
+ .overlay {
36
+ position: fixed;
37
+ top: 0;
38
+ bottom: 0;
39
+ left: 0;
40
+ right: 0;
41
+ background: rgba(0, 0, 0, 0.7);
42
+ visibility: hidden;
43
+ opacity: 0;
44
+ z-index: 999;
45
+ }
46
+ .overlay.show {
47
+ visibility: visible;
48
+ opacity: 1;
49
+ }
50
+
51
+ .popup {
52
+ margin: 80px auto;
53
+ padding: 20px;
54
+ background: #fff;
55
+ border-radius: 3px;
56
+ position: relative;
57
+ width: 90%;
58
+ height: calc(100% - 150px);
59
+ }
60
+
61
+ .popup .close {
62
+ position: absolute;
63
+ top: 10px;
64
+ right: 20px;
65
+ font-size: 20px;
66
+ font-weight: bold;
67
+ text-decoration: none;
68
+ color: #333;
69
+ }
70
+ .popup .close:hover {
71
+ color: #06D85F;
72
+ }
73
+ .popup .content {
74
+ height: 100%;
75
+ overflow: hidden;
76
+ display: flex;
77
+ }
78
+
79
+ .cm-s-default {
80
+ height: 100%;
81
+ font-size: small;
82
+ line-height: 1.5em;
83
+ z-index: 0;
84
+ }
85
+ </style>
86
+
87
+ <div class="popup apprun-play">
88
+ <a class="close" href="javascript:app.run('@close-popup')">&times;</a>
89
+ <div class="content">
90
+ <div class="col">
91
+ <textarea class="editor"></textarea>
92
+ </div>
93
+ <div class="col">
94
+ <iframe class="preview"/>
95
+ </div>
96
+ </div>
97
+ </div>
98
+ </div>`;
99
+ const encodeHTML = code => {
100
+ return code.replace(/&/g, '&amp;')
101
+ .replace(/</g, '&lt;')
102
+ .replace(/>/g, '&gt;')
103
+ .replace(/"/g, '&quot;')
104
+ .replace(/'/g, '&#039;');
105
+ };
106
+ const code_html = code => `<!DOCTYPE html>
107
+ <html lang="en">
108
+ <head>
109
+ <meta charset="UTF-8">
110
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
111
+ <meta http-equiv="X-UA-Compatible" content="ie=edge">
112
+ <title>AppRun Playground</title>
113
+ <style>
114
+ body {
115
+ font-family: "Benton Sans", "Helvetica Neue", helvetica, arial, sans-serif;
116
+ margin: 2em;
117
+ }
118
+ </style>
119
+ <script src="https://cdn.jsdelivr.net/npm/typescript@5.8.3"></script>
120
+ <script src="https://unpkg.com/apprun/dist/apprun-html.js"></script>
121
+ </head>
122
+ <body>
123
+ <pre id="code" style="display:none">${encodeHTML(code)}</pre>
124
+ <script type="module">
125
+ const code = document.getElementById('code').innerText;
126
+ const compiled = ts.transpileModule(code, {
127
+ compilerOptions: {
128
+ "jsx": "react",
129
+ "jsxFactory": "app.h",
130
+ "jsxFragmentFactory": "app.Fragment",
131
+ "target": "es2020",
132
+ "module": "esnext",
133
+ },
134
+ reportDiagnostics: true,
135
+ });
136
+
137
+ if (compiled.diagnostics && compiled.diagnostics.length) {
138
+ const pre = document.createElement('pre');
139
+ pre.style = 'font-size: 10px;';
140
+ pre.innerText = compiled.diagnostics.map(d => {
141
+ const start = d.start;
142
+ const end = d.start + d.length;
143
+ const line = code.substring(0, end).split('\\n').length;
144
+ const column = code.substring(0, end).split('\\n').pop().length;
145
+ return \`Line: \${line}, Column: \${column}, \${d.messageText}\`;
146
+ }).join('\\n');
147
+ document.body.appendChild(pre);
148
+ } else {
149
+ window.onerror = function () {
150
+ const pre = document.createElement('pre');
151
+ pre.style = 'font-size: 10px;';
152
+ pre.innerText = compiled.outputText;;
153
+ document.body.appendChild(pre);
154
+ };
155
+ const script = document.createElement('script');
156
+ script.type = 'module';
157
+ script.text = compiled.outputText;
158
+ document.body.appendChild(script);
159
+ }
160
+ </script>
161
+ </body>
162
+ </html>`;
163
+ const setup_editor = (textarea, iframe, code, hide_src) => {
164
+ if (!iframe || !code)
165
+ return;
166
+ const run_code = code => {
167
+ const iframe_clone = iframe.cloneNode();
168
+ iframe.parentNode?.replaceChild(iframe_clone, iframe);
169
+ iframe = iframe_clone;
170
+ const doc = iframe.contentWindow?.document;
171
+ if (!doc)
172
+ return;
173
+ doc.open();
174
+ if (code.indexOf('<html') >= 0)
175
+ doc.write(code);
176
+ else
177
+ doc.write(code_html(code));
178
+ doc.close();
179
+ };
180
+ run_code(code);
181
+ if (hide_src || !textarea || textarea.nodeName !== 'TEXTAREA')
182
+ return;
183
+ if (typeof CodeMirror === 'undefined') {
184
+ textarea.onkeyup = () => run_code(textarea.value);
185
+ }
186
+ else {
187
+ if (!textarea.editor) {
188
+ textarea.editor = CodeMirror.fromTextArea(textarea, {
189
+ lineNumbers: true,
190
+ mode: 'jsx'
191
+ });
192
+ textarea.editor.on('change', (cm) => run_code(cm.getValue()));
193
+ }
194
+ }
195
+ };
196
+ class Play extends Component {
197
+ constructor() {
198
+ super(...arguments);
199
+ this.view = (state) => {
200
+ const code_id = state['code-element-id'];
201
+ const element = this.element;
202
+ let code_area, code;
203
+ if (code_id) {
204
+ code_area = document.getElementById(code_id);
205
+ }
206
+ else {
207
+ code_area = element.previousElementSibling ||
208
+ element.parentElement.previousElementSibling;
209
+ }
210
+ code = code_area?.innerText // from div-code
211
+ || code_area?.value // from textarea
212
+ || state['code']; // from code attr
213
+ this.state.code_area = code_area;
214
+ this.state.code = code;
215
+ return code ? app.h(app.Fragment, null,
216
+ app.h("div", { class: "toolbox" }, !state.hide_button && app.h("a", { class: "button", "$onclick": "show-popup" }, "Try the Code")))
217
+ : app.h("div", null, "AppRun Play cannot find code to run, please set code-element-id or code.");
218
+ };
219
+ this.rendered = ({ style, hide_src, code_area, code }) => {
220
+ if (!code)
221
+ return;
222
+ if (!document.getElementById('play-popup')) {
223
+ document.body.insertAdjacentHTML('beforeend', popup_div);
224
+ const textarea = document.querySelector(".apprun-play .editor");
225
+ const iframe = document.querySelector('.apprun-play .preview');
226
+ textarea.value = code;
227
+ setup_editor(textarea, iframe, code, false);
228
+ }
229
+ const iframe = document.createElement('iframe');
230
+ iframe.classList.add('apprun-preview');
231
+ iframe.style.cssText = style;
232
+ this.element.before(iframe);
233
+ if (hide_src)
234
+ code_area.style.display = 'none';
235
+ setup_editor(code_area, iframe, code, hide_src);
236
+ };
237
+ this.update = {
238
+ 'show-popup': ({ code }) => {
239
+ const textarea = document.querySelector(".apprun-play .editor");
240
+ textarea.editor?.setValue(code);
241
+ document.getElementById('play-popup').classList.add('show');
242
+ },
243
+ '@close-popup': () => { document.getElementById('play-popup').classList.remove('show'); },
244
+ };
245
+ }
246
+ }
247
+ app.webComponent('apprun-play', Play);
248
+ //# sourceMappingURL=apprun-play.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apprun-play.js","sourceRoot":"","sources":["../src/apprun-play.tsx"],"names":[],"mappings":"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"}
package/esm/apprun.js ADDED
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Main AppRun framework entry point
3
+ *
4
+ * This file:
5
+ * 1. Assembles core AppRun modules into a complete framework
6
+ * 2. Exports public API and types
7
+ * 3. Initializes global app instance with:
8
+ * - Virtual DOM rendering
9
+ * - Component system
10
+ * - Router with improved null safety
11
+ * - Web component support
12
+ * - Type-safe React integration
13
+ * - Component batch mounting system
14
+ *
15
+ * Key exports:
16
+ * - app: Global event system instance
17
+ * - Component: Base component class
18
+ * - Decorators: @on, @update, @customElement
19
+ * - Router events and configuration
20
+ * - Web component registration
21
+ * - trustedHTML: Parses caller-owned trusted HTML
22
+ *
23
+ * Features:
24
+ * - Event-driven architecture with pub/sub pattern
25
+ * - Virtual DOM rendering with multiple renderer support
26
+ * - Component lifecycle management
27
+ * - Client-side routing with hash/path support and native link behavior guards
28
+ * - Web Components integration
29
+ * - React compatibility layer
30
+ * - TypeScript support with strong typing
31
+ * - Batch component mounting with addComponents(element, components)
32
+ *
33
+ * Type Safety Improvements (v3.35.1):
34
+ * - Added null checks for DOM event targets
35
+ * - Browser script-tag globals are limited to the app singleton in core builds
36
+ * - Enhanced React integration parameter validation
37
+ * - Better error handling for invalid event handlers
38
+ * - Safer element access with proper type assertions
39
+ *
40
+ * Recent Changes:
41
+ * - Modified addComponents to accept (element, components) where components is a key-value object with routes as keys and components as values
42
+ * - Simplified component mounting API for better usability
43
+ *
44
+ * Usage:
45
+ * ```ts
46
+ * import { app, Component } from 'apprun';
47
+ *
48
+ * // Create components
49
+ * class MyComponent extends Component {
50
+ * state = // Initial state
51
+ * view = state => // Render view
52
+ * update = {
53
+ * 'event': (state, ...args) => // Handle events
54
+ * }
55
+ * }
56
+ *
57
+ * // Mount multiple components
58
+ * app.addComponents(document.body, {
59
+ * '/home': MyComponent,
60
+ * '/about': AnotherComponent
61
+ * });
62
+ * ```
63
+ */
64
+ import _app, { App } from './app';
65
+ import { createElement, render, Fragment, trustedHTML, safeHTML } from './vdom';
66
+ import { Component } from './component';
67
+ import { on, update, customElement } from './decorator';
68
+ import { route, ROUTER_EVENT, ROUTER_404_EVENT } from './router';
69
+ import webComponent from './web-component';
70
+ import addComponents from './add-components';
71
+ import { APPRUN_VERSION } from './version';
72
+ const app = _app;
73
+ export default app;
74
+ const shouldRouteLinkClick = (e, menu) => {
75
+ if (!menu)
76
+ return false;
77
+ if (e.defaultPrevented)
78
+ return false;
79
+ if (e.button !== 0)
80
+ return false;
81
+ if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey)
82
+ return false;
83
+ if (menu.target && menu.target.toLowerCase() !== '_self')
84
+ return false;
85
+ if (menu.hasAttribute('download'))
86
+ return false;
87
+ if ((menu.getAttribute('rel') || '').toLowerCase().split(/\s+/).includes('external'))
88
+ return false;
89
+ return menu.origin === location.origin && !!menu.pathname;
90
+ };
91
+ const routeLinkClick = (e, menu) => {
92
+ if (!shouldRouteLinkClick(e, menu))
93
+ return false;
94
+ e.preventDefault();
95
+ // Handle base path for navigation
96
+ const basePath = app.basePath || '';
97
+ const fullPath = basePath + menu.pathname;
98
+ history.pushState(null, '', fullPath);
99
+ route(menu.pathname); // Route with relative path (without base path)
100
+ return true;
101
+ };
102
+ export { App, app, Component, on, update, Fragment, trustedHTML, safeHTML };
103
+ export { update as event };
104
+ export { ROUTER_EVENT, ROUTER_404_EVENT };
105
+ export { customElement };
106
+ if (!app.start) {
107
+ app.version = APPRUN_VERSION;
108
+ app.h = app.createElement = createElement;
109
+ app.render = render;
110
+ app.Fragment = Fragment;
111
+ app.webComponent = webComponent;
112
+ app.trustedHTML = trustedHTML;
113
+ app.safeHTML = safeHTML;
114
+ app.start = (element, state, view, update, options) => {
115
+ const opts = { render: true, global_event: true, ...options };
116
+ const component = new Component(state, view, update);
117
+ if (options && options.rendered)
118
+ component.rendered = options.rendered;
119
+ if (options && options.mounted)
120
+ component.mounted = options.mounted;
121
+ component.start(element, opts);
122
+ return component;
123
+ };
124
+ const NOOP = _ => { };
125
+ app.on('/', NOOP);
126
+ app.on('debug', _ => NOOP);
127
+ app.on(ROUTER_EVENT, NOOP);
128
+ app.on(ROUTER_404_EVENT, NOOP);
129
+ app.route = route;
130
+ app.on('route', url => app['route'] && app['route'](url));
131
+ if (typeof document === 'object') {
132
+ document.addEventListener("DOMContentLoaded", () => {
133
+ const no_init_route = document.body.hasAttribute('apprun-no-init') || app['no-init-route'] || false;
134
+ const use_hash = app.find('#') || app.find('#/') || false;
135
+ // console.log(`AppRun ${app.version} started with ${use_hash ? 'hash' : 'path'} routing. Initial load: ${init_load ? 'disabled' : 'enabled'}.`);
136
+ window.addEventListener('hashchange', () => route(location.hash));
137
+ window.addEventListener('popstate', () => route(location.pathname));
138
+ if (use_hash) {
139
+ !no_init_route && route(location.hash);
140
+ }
141
+ else {
142
+ !no_init_route && (() => {
143
+ const basePath = app.basePath || '';
144
+ let initialPath = location.pathname;
145
+ // Strip base path if present
146
+ if (basePath && initialPath.startsWith(basePath)) {
147
+ initialPath = initialPath.substring(basePath.length);
148
+ if (!initialPath.startsWith('/'))
149
+ initialPath = '/' + initialPath;
150
+ }
151
+ route(initialPath);
152
+ })();
153
+ document.body.addEventListener('click', e => {
154
+ const target = e.target;
155
+ const element = target instanceof Element ? target : target?.parentElement;
156
+ if (!element)
157
+ return;
158
+ const menu = (element.tagName === 'A' ? element : element.closest('a'));
159
+ routeLinkClick(e, menu);
160
+ });
161
+ }
162
+ });
163
+ }
164
+ if (typeof window === 'object') {
165
+ const globalWindow = window;
166
+ globalWindow['Component'] = Component;
167
+ globalWindow['on'] = on;
168
+ globalWindow['customElement'] = customElement;
169
+ globalWindow['trustedHTML'] = trustedHTML;
170
+ globalWindow['safeHTML'] = safeHTML;
171
+ }
172
+ app.use_render = (render, mode = 0) => {
173
+ if (mode === 0) {
174
+ app.render = (el, vdom) => render(vdom, el); // react style
175
+ }
176
+ else {
177
+ app.render = (el, vdom) => render(el, vdom); // apprun style
178
+ }
179
+ };
180
+ app.use_react = (React, ReactDOM) => {
181
+ if (!React || !ReactDOM) {
182
+ console.error('AppRun use_react: React and ReactDOM parameters are required');
183
+ return;
184
+ }
185
+ if (typeof React.createElement !== 'function') {
186
+ console.error('AppRun use_react: Invalid React object - createElement method not found');
187
+ return;
188
+ }
189
+ if (!React.Fragment) {
190
+ console.error('AppRun use_react: Invalid React object - Fragment not found');
191
+ return;
192
+ }
193
+ app.h = app.createElement = React.createElement;
194
+ app.Fragment = React.Fragment;
195
+ // React 18+ uses createRoot API
196
+ if (React.version && React.version.startsWith('18')) {
197
+ if (!ReactDOM.createRoot || typeof ReactDOM.createRoot !== 'function') {
198
+ console.error('AppRun use_react: ReactDOM.createRoot not found in React 18+');
199
+ return;
200
+ }
201
+ app.render = (el, vdom) => {
202
+ if (!el || vdom === undefined)
203
+ return;
204
+ if (!el._root)
205
+ el._root = ReactDOM.createRoot(el);
206
+ el._root.render(vdom);
207
+ };
208
+ }
209
+ else {
210
+ // Legacy React versions
211
+ if (!ReactDOM.render || typeof ReactDOM.render !== 'function') {
212
+ console.error('AppRun use_react: ReactDOM.render not found in legacy React');
213
+ return;
214
+ }
215
+ app.render = (el, vdom) => ReactDOM.render(vdom, el);
216
+ }
217
+ };
218
+ app.addComponents = addComponents;
219
+ }
220
+ //# sourceMappingURL=apprun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apprun.js","sourceRoot":"","sources":["../src/apprun.ts"],"names":[],"mappings":"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"}