marko 5.32.15 → 5.33.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. package/bin/markoc +1 -1
  2. package/dist/node_modules/@internal/components-entry/index.js +5 -7
  3. package/dist/runtime/helpers/dynamic-tag.js +5 -1
  4. package/dist/runtime/helpers/tags-compat-dom.js +265 -0
  5. package/dist/runtime/helpers/tags-compat-html.js +167 -0
  6. package/dist/runtime/html/AsyncStream.js +96 -13
  7. package/dist/runtime/html/helpers/_dynamic-attr.js +2 -2
  8. package/dist/runtime/html/helpers/attr.js +3 -3
  9. package/dist/runtime/html/helpers/data-marko.js +1 -1
  10. package/dist/runtime/html/helpers/escape-quotes.js +1 -1
  11. package/dist/runtime/html/helpers/escape-xml.js +1 -1
  12. package/dist/runtime/renderable.js +52 -3
  13. package/dist/runtime/vdom/AsyncVDOMBuilder.js +67 -67
  14. package/dist/runtime/vdom/VComponent.js +3 -3
  15. package/dist/runtime/vdom/VDocumentFragment.js +7 -7
  16. package/dist/runtime/vdom/VElement.js +35 -35
  17. package/dist/runtime/vdom/VFragment.js +5 -5
  18. package/dist/runtime/vdom/VNode.js +31 -31
  19. package/dist/runtime/vdom/VText.js +8 -8
  20. package/dist/runtime/vdom/helpers/const-element.js +3 -3
  21. package/dist/runtime/vdom/hot-reload.js +2 -2
  22. package/dist/runtime/vdom/morphdom/fragment.js +3 -3
  23. package/dist/runtime/vdom/morphdom/helpers.js +1 -1
  24. package/dist/runtime/vdom/morphdom/index.js +31 -31
  25. package/dist/runtime/vdom/vdom.js +14 -14
  26. package/docs/compiler.md +1 -1
  27. package/index.d.ts +4 -6
  28. package/package.json +83 -83
  29. package/src/node_modules/@internal/components-entry/index.js +5 -7
  30. package/src/runtime/helpers/dynamic-tag.js +5 -1
  31. package/src/runtime/helpers/tags-compat-dom.js +265 -0
  32. package/src/runtime/helpers/tags-compat-html.js +167 -0
  33. package/src/runtime/html/AsyncStream.js +87 -4
  34. package/src/runtime/renderable.js +49 -0
package/package.json CHANGED
@@ -1,85 +1,85 @@
1
1
  {
2
- "name": "marko",
3
- "version": "5.32.15",
4
- "description": "UI Components + streaming, async, high performance, HTML templating for Node.js and the browser.",
5
- "keywords": [
6
- "front-end",
7
- "templating",
8
- "template",
9
- "async",
10
- "streaming",
11
- "components",
12
- "ui",
13
- "vdom",
14
- "dom",
15
- "morphdom",
16
- "virtual",
17
- "virtual-dom"
18
- ],
19
- "homepage": "https://markojs.com/",
20
- "repository": {
21
- "type": "git",
22
- "url": "https://github.com/marko-js/marko.git"
23
- },
24
- "license": "MIT",
25
- "author": "Patrick Steele-Idem <pnidem@gmail.com>",
26
- "maintainers": [
27
- "Patrick Steele-Idem <pnidem@gmail.com>",
28
- "Michael Rawlings <ml.rawlings@gmail.com>",
29
- "Phillip Gates-Idem <phillip.idem@gmail.com>",
30
- "Austin Kelleher <a@alk.im>",
31
- "Dylan Piercey <pierceydylan@gmail.com>",
32
- "Martin Aberer"
33
- ],
34
- "main": "index.js",
35
- "browser": {
36
- "./compiler.js": "./compiler-browser.marko",
37
- "./components.js": "./components-browser.marko",
38
- "./legacy-components.js": "./legacy-components-browser.marko",
39
- "./index.js": "./index-browser.marko"
40
- },
41
- "types": "index.d.ts",
42
- "bin": {
43
- "markoc": "bin/markoc"
44
- },
45
- "files": [
46
- "bin",
47
- "dist",
48
- "docs",
49
- "src",
50
- "compiler-browser.marko",
51
- "compiler.js",
52
- "components-browser.marko",
53
- "components.js",
54
- "legacy-components-browser.marko",
55
- "legacy-components.js",
56
- "env.js",
57
- "index.d.ts",
58
- "index-browser.marko",
59
- "index.js",
60
- "node-require.js",
61
- "tags-html.d.ts"
62
- ],
63
- "scripts": {
64
- "build": "babel ./src --out-dir ./dist --delete-dir-on-start --copy-files --config-file ../../babel.config.js --env-name=production"
65
- },
66
- "dependencies": {
67
- "@marko/compiler": "^5.34.7",
68
- "@marko/translator-default": "^5.31.17",
69
- "app-module-path": "^2.2.0",
70
- "argly": "^1.2.0",
71
- "browser-refresh-client": "1.1.4",
72
- "complain": "^1.6.0",
73
- "csstype": "^3.1.3",
74
- "events-light": "^1.0.5",
75
- "listener-tracker": "^2.0.0",
76
- "minimatch": "^9.0.3",
77
- "raptor-util": "^3.2.0",
78
- "resolve-from": "^5.0.0",
79
- "self-closing-tags": "^1.0.1",
80
- "warp10": "^2.1.0"
81
- },
82
- "logo": {
83
- "url": "https://raw.githubusercontent.com/marko-js/branding/master/marko-logo-small.png"
84
- }
2
+ "name": "marko",
3
+ "version": "5.33.1",
4
+ "description": "UI Components + streaming, async, high performance, HTML templating for Node.js and the browser.",
5
+ "keywords": [
6
+ "front-end",
7
+ "templating",
8
+ "template",
9
+ "async",
10
+ "streaming",
11
+ "components",
12
+ "ui",
13
+ "vdom",
14
+ "dom",
15
+ "morphdom",
16
+ "virtual",
17
+ "virtual-dom"
18
+ ],
19
+ "homepage": "https://markojs.com/",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "https://github.com/marko-js/marko.git"
23
+ },
24
+ "license": "MIT",
25
+ "author": "Patrick Steele-Idem <pnidem@gmail.com>",
26
+ "maintainers": [
27
+ "Patrick Steele-Idem <pnidem@gmail.com>",
28
+ "Michael Rawlings <ml.rawlings@gmail.com>",
29
+ "Phillip Gates-Idem <phillip.idem@gmail.com>",
30
+ "Austin Kelleher <a@alk.im>",
31
+ "Dylan Piercey <pierceydylan@gmail.com>",
32
+ "Martin Aberer"
33
+ ],
34
+ "main": "index.js",
35
+ "browser": {
36
+ "./compiler.js": "./compiler-browser.marko",
37
+ "./components.js": "./components-browser.marko",
38
+ "./legacy-components.js": "./legacy-components-browser.marko",
39
+ "./index.js": "./index-browser.marko"
40
+ },
41
+ "types": "index.d.ts",
42
+ "bin": {
43
+ "markoc": "bin/markoc"
44
+ },
45
+ "files": [
46
+ "bin",
47
+ "dist",
48
+ "docs",
49
+ "src",
50
+ "compiler-browser.marko",
51
+ "compiler.js",
52
+ "components-browser.marko",
53
+ "components.js",
54
+ "legacy-components-browser.marko",
55
+ "legacy-components.js",
56
+ "env.js",
57
+ "index.d.ts",
58
+ "index-browser.marko",
59
+ "index.js",
60
+ "node-require.js",
61
+ "tags-html.d.ts"
62
+ ],
63
+ "scripts": {
64
+ "build": "babel ./src --out-dir ./dist --copy-files --config-file ../../babel.config.js --env-name=production"
65
+ },
66
+ "dependencies": {
67
+ "@marko/compiler": "^5.35.1",
68
+ "@marko/translator-default": "^5.32.1",
69
+ "app-module-path": "^2.2.0",
70
+ "argly": "^1.2.0",
71
+ "browser-refresh-client": "1.1.4",
72
+ "complain": "^1.6.0",
73
+ "csstype": "^3.1.3",
74
+ "events-light": "^1.0.5",
75
+ "listener-tracker": "^2.0.0",
76
+ "minimatch": "^9.0.3",
77
+ "raptor-util": "^3.2.0",
78
+ "resolve-from": "^5.0.0",
79
+ "self-closing-tags": "^1.0.1",
80
+ "warp10": "^2.1.0"
81
+ },
82
+ "logo": {
83
+ "url": "https://raw.githubusercontent.com/marko-js/branding/master/marko-logo-small.png"
84
+ }
85
85
  }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  var warp10 = require("warp10");
4
+ var w10NOOP = require("warp10/constants").NOOP;
4
5
  var safeJSONRegExp = /<\/|\u2028|\u2029/g;
5
6
  var IGNORE_GLOBAL_TYPES = new Set(["undefined", "function", "symbol"]);
6
7
  var DEFAULT_RUNTIME_ID = "M";
@@ -90,11 +91,6 @@ function addComponentsFromContext(componentsContext, componentsToHydrate) {
90
91
 
91
92
  needsState = true;
92
93
  } else {
93
- if (input && input.renderBody) {
94
- renderBody = input.renderBody;
95
- input.renderBody = undefined;
96
- }
97
-
98
94
  if (
99
95
  !(flags & FLAG_WILL_RERENDER_IN_BROWSER) ||
100
96
  flags & FLAG_OLD_HYDRATE_NO_CREATE
@@ -115,6 +111,8 @@ function addComponentsFromContext(componentsContext, componentsToHydrate) {
115
111
  if (isNotEmpty(component)) {
116
112
  serializedProps = component;
117
113
  }
114
+ } else {
115
+ renderBody = input.renderBody;
118
116
  }
119
117
  }
120
118
 
@@ -138,9 +136,9 @@ function addComponentsFromContext(componentsContext, componentsToHydrate) {
138
136
  }
139
137
  }
140
138
 
141
- if (typeof renderBody === "function") {
139
+ if (typeof renderBody === "function" && renderBody.toJSON && renderBody.toJSON() === w10NOOP) {
142
140
  flags |= FLAG_HAS_RENDER_BODY;
143
- renderBody = undefined;
141
+ renderBody = input.renderBody = undefined;
144
142
  }
145
143
 
146
144
  var extra = {
@@ -68,6 +68,7 @@ module.exports = function dynamicTag(
68
68
  var renderer =
69
69
  tag._ ||
70
70
  (tag.renderer ? tag.renderer.renderer || tag.renderer : tag.render);
71
+ var render = (tag && tag.renderBody) || tag;
71
72
 
72
73
  // eslint-disable-next-line no-constant-condition
73
74
  if ("MARKO_DEBUG") {
@@ -78,12 +79,15 @@ module.exports = function dynamicTag(
78
79
  }
79
80
  }
80
81
 
82
+ if (dynamicTag.___runtimeCompat) {
83
+ renderer = dynamicTag.___runtimeCompat(renderer, render, args);
84
+ }
85
+
81
86
  if (renderer) {
82
87
  out.c(componentDef, key, customEvents);
83
88
  renderer(attrs, out);
84
89
  out.___assignedComponentDef = null;
85
90
  } else {
86
- var render = (tag && tag.renderBody) || tag;
87
91
  var isFn = typeof render === "function";
88
92
 
89
93
  // eslint-disable-next-line no-constant-condition
@@ -0,0 +1,265 @@
1
+ import { ___getComponentsContext } from "../components/ComponentsContext";
2
+ import { ___createFragmentNode } from "../vdom/morphdom/fragment";
3
+
4
+ const {
5
+ prepare,
6
+ runEffects,
7
+ patchConditionals,
8
+ createScopeWithRenderer,
9
+ queueEffect,
10
+ scopeLookup,
11
+ getRegisteredWithScope,
12
+ register,
13
+ } = require(
14
+ // eslint-disable-next-line no-constant-condition
15
+ "MARKO_DEBUG" ? "@marko/runtime-tags/debug/dom" : "@marko/runtime-tags/dom",
16
+ );
17
+ const { ___componentLookup } = require("@internal/components-util");
18
+ const defineComponent = require("../components/defineComponent");
19
+ const { r: registerComponent } = require("../components/registry");
20
+ const createRenderer = require("../components/renderer");
21
+ const defaultCreateOut = require("../createOut");
22
+ const morphdom = require("../vdom/morphdom");
23
+ const dynamicTag = require("./dynamic-tag");
24
+
25
+ export default dynamicTag.___runtimeCompat = function tagsToVdom(
26
+ tagsRenderer,
27
+ renderBody,
28
+ args,
29
+ ) {
30
+ if (
31
+ tagsRenderer
32
+ ? tagsRenderer.___clone === undefined
33
+ : !Array.isArray(renderBody) && renderBody?.___clone === undefined
34
+ )
35
+ return tagsRenderer;
36
+
37
+ return (input, out) =>
38
+ TagsCompat({ i: args ? args : input, r: tagsRenderer || renderBody }, out);
39
+ };
40
+
41
+ const TagsCompatId = "tags-compat";
42
+ const TagsCompat = createRenderer(
43
+ function (_, out, componentDef, component) {
44
+ let existing = false;
45
+ const isHydrate =
46
+ ___getComponentsContext(out).___globalContext.___isHydrate;
47
+ const input = Array.isArray(_.i) ? _.i : [_.i];
48
+ const tagsRenderer = resolveRegistered(_.r);
49
+ const args = tagsRenderer.___args;
50
+
51
+ component.effects = prepare(() => {
52
+ if (isHydrate) {
53
+ const scopeId = out.global.componentIdToScopeId[component.id];
54
+ component.scope = scopeLookup[scopeId];
55
+ }
56
+ if (!component.scope) {
57
+ component.scope = createScopeWithRenderer(
58
+ tagsRenderer /* out.global as context */,
59
+ );
60
+ for (const signal of tagsRenderer.___closureSignals) {
61
+ signal(component.scope, true);
62
+ }
63
+ } else {
64
+ args && args(component.scope, input, 1);
65
+ existing = true;
66
+ }
67
+ args && args(component.scope, input);
68
+ });
69
+ out.bf(out.___assignedKey, component, existing);
70
+ if (!existing) {
71
+ out.node({
72
+ ___actualize: () =>
73
+ component.scope.___startNode === component.scope.___endNode
74
+ ? component.scope.___startNode
75
+ : component.scope.___startNode.parentNode,
76
+ });
77
+ }
78
+ out.ef();
79
+ },
80
+ {
81
+ t: TagsCompatId,
82
+ d: "MARKO_DEBUG",
83
+ },
84
+ {},
85
+ );
86
+
87
+ registerComponent(TagsCompatId, () => ({
88
+ _: TagsCompat,
89
+ Component: defineComponent(
90
+ {
91
+ onMount() {
92
+ runEffects(this.effects);
93
+ },
94
+ onUpdate() {
95
+ runEffects(this.effects);
96
+ },
97
+ },
98
+ TagsCompat,
99
+ ),
100
+ }));
101
+
102
+ // (
103
+ // nodeAccessor: Accessor,
104
+ // dynamicTagAttrs?: IntersectionSignal,
105
+ // intersection?: IntersectionSignal,
106
+ // valueWithIntersection?: ValueSignal
107
+ // )
108
+
109
+ const rendererCache = new WeakMap();
110
+
111
+ patchConditionals((conditional) => (...args) => {
112
+ const signal = conditional(...args);
113
+ const hasAttrs = args.length > 1;
114
+ return (scope, renderer, clean) => {
115
+ return signal(scope, create5to6Renderer(renderer, hasAttrs), clean);
116
+ };
117
+ });
118
+
119
+ function create5to6Renderer(renderer, hasAttrs) {
120
+ let newRenderer = renderer;
121
+ if (renderer) {
122
+ const rendererFromAnywhere =
123
+ renderer._ ||
124
+ renderer.render ||
125
+ (renderer.renderer && renderer.renderer.renderer) ||
126
+ renderer.renderer;
127
+ const isMarko6 = rendererFromAnywhere
128
+ ? rendererFromAnywhere.___clone
129
+ : renderer.___clone;
130
+
131
+ if (typeof renderer !== "string" && !isMarko6) {
132
+ newRenderer = rendererCache.get(renderer);
133
+ if (!newRenderer) {
134
+ const { Component } = renderer;
135
+ if (Component) {
136
+ const setCustomEvents = Component.prototype.___setCustomEvents;
137
+ Component.prototype.___setCustomEvents = function (
138
+ customEvents,
139
+ scopeId,
140
+ ) {
141
+ for (const customEvent of customEvents) {
142
+ customEvent[1] = resolveRegistered(customEvent[1]);
143
+ }
144
+
145
+ setCustomEvents.call(this, customEvents, scopeId);
146
+ };
147
+ }
148
+ newRenderer = {
149
+ ___setup(scope) {
150
+ if (!hasAttrs) {
151
+ renderAndMorph(scope, rendererFromAnywhere, renderer, {});
152
+ }
153
+ },
154
+ ___clone() {
155
+ const realFragment = document.createDocumentFragment();
156
+ ___createFragmentNode(null, null, realFragment);
157
+ return realFragment;
158
+ },
159
+ ___hasUserEffects: 1,
160
+ ___args(scope, input, clean) {
161
+ if (clean) return;
162
+ renderAndMorph(scope, rendererFromAnywhere, renderer, input);
163
+ },
164
+ };
165
+ rendererCache.set(renderer, newRenderer);
166
+ }
167
+ }
168
+ }
169
+ return newRenderer;
170
+ }
171
+
172
+ register("@marko/tags-compat-5-to-6", create5to6Renderer);
173
+
174
+ function renderAndMorph(scope, renderer, renderBody, input) {
175
+ const out = defaultCreateOut();
176
+ let rootNode = scope.___startNode.fragment;
177
+ if (!rootNode) {
178
+ const component = (scope.marko5Component = ___componentLookup[scope.m5c]);
179
+ rootNode = component.___rootNode;
180
+ scope.___startNode = rootNode.startNode;
181
+ scope.___endNode = rootNode.endNode;
182
+ }
183
+ const host = scope.___startNode;
184
+ const existingComponent = scope.marko5Component;
185
+ const componentsContext = ___getComponentsContext(out);
186
+ const globalComponentsContext = componentsContext.___globalContext;
187
+ let customEvents;
188
+ globalComponentsContext.___rerenderComponent = existingComponent;
189
+ out.sync();
190
+ if (renderer) {
191
+ const [rawInput] = input;
192
+ const normalizedInput = {};
193
+
194
+ for (const key in rawInput) {
195
+ let value = rawInput[key];
196
+ if (key.startsWith("on")) {
197
+ const c = key[2];
198
+ customEvents = customEvents || {};
199
+ customEvents[(c === "-" ? "" : c.toLowerCase()) + key.slice(3)] = [
200
+ value,
201
+ ];
202
+ } else {
203
+ normalizedInput[key] = rawInput[key];
204
+ }
205
+ }
206
+
207
+ renderer(normalizedInput, out);
208
+ } else {
209
+ RenderBodyComponent({ renderBody, args: input }, out);
210
+ }
211
+
212
+ queueEffect(scope, () => {
213
+ const targetNode = out.___getOutput().___firstChild;
214
+ morphdom(rootNode, targetNode, host, componentsContext);
215
+ const componentDefs = componentsContext.___initComponents(
216
+ getRootNode(host),
217
+ );
218
+ const component = componentDefs[0].___component;
219
+ component.___rootNode = rootNode;
220
+ component.___input = input[0];
221
+ component.___customEvents = customEvents;
222
+ scope.marko5Component = component;
223
+ });
224
+ }
225
+
226
+ function getRootNode(el) {
227
+ var cur = el;
228
+ while (cur.parentNode) cur = cur.parentNode;
229
+ return cur;
230
+ }
231
+
232
+ const RenderBodyComponentId = "renderbody-renderer";
233
+ const RenderBodyComponent = createRenderer(
234
+ function (input, out, _componentDef) {
235
+ dynamicTag(
236
+ out,
237
+ input.renderBody,
238
+ null,
239
+ null,
240
+ input.args,
241
+ null,
242
+ _componentDef,
243
+ "0",
244
+ );
245
+ },
246
+ {
247
+ t: RenderBodyComponentId,
248
+ i: true,
249
+ d: "MARKO_DEBUG",
250
+ },
251
+ {},
252
+ );
253
+
254
+ registerComponent(RenderBodyComponentId, () => ({
255
+ _: RenderBodyComponent,
256
+ Component: defineComponent({}, RenderBodyComponent),
257
+ }));
258
+
259
+ function resolveRegistered(renderer) {
260
+ if (!Array.isArray(renderer)) return renderer;
261
+
262
+ const [registerId, scopeId] = renderer;
263
+ const scope = scopeLookup[scopeId];
264
+ return getRegisteredWithScope(registerId, scope);
265
+ }
@@ -0,0 +1,167 @@
1
+ import initComponentsTag from "../../core-tags/components/init-components-tag";
2
+ import { ___getComponentsContext } from "../components/ComponentsContext";
3
+
4
+ const tagsAPI = require(
5
+ // eslint-disable-next-line no-constant-condition
6
+ "MARKO_DEBUG" ? "@marko/runtime-tags/debug/html" : "@marko/runtime-tags/html",
7
+ );
8
+ const createRenderer = require("../components/renderer");
9
+ const defaultCreateOut = require("../createOut");
10
+ const dynamicTag5 = require("./dynamic-tag");
11
+ const {
12
+ patchDynamicTag,
13
+ createRenderFn,
14
+ fork,
15
+ write,
16
+ makeSerializable,
17
+ register,
18
+ writeScope,
19
+ nextScopeId,
20
+ getRegistryInfo,
21
+ } = tagsAPI;
22
+
23
+ const FN_TO_JSON = function () {
24
+ // TODO: this should instead return an object that contains getRegistryInfo
25
+ // then in the dom-compat, handle that object to lookup the function in the registry
26
+ // (we also need to do this for events)
27
+ return getRegistryInfo(this);
28
+ };
29
+
30
+ const isMarko6 = (fn) => !!fn.___isTagsAPI;
31
+ const isMarko5 = (fn) => !fn.___isTagsAPI;
32
+
33
+ export default dynamicTag5.___runtimeCompat = function tagsToVdom(
34
+ tagsRenderer,
35
+ renderBody,
36
+ args,
37
+ ) {
38
+ if (tagsRenderer ? isMarko5(tagsRenderer) : isMarko5(renderBody))
39
+ return tagsRenderer;
40
+
41
+ if (!tagsRenderer && renderBody) {
42
+ renderBody.toJSON = FN_TO_JSON;
43
+ }
44
+
45
+ return (input, out) =>
46
+ TagsCompat(
47
+ args
48
+ ? { i: args, r: (args) => (tagsRenderer || renderBody)(...args) }
49
+ : { i: input, r: tagsRenderer || renderBody },
50
+ out,
51
+ );
52
+ };
53
+
54
+ const TagsCompatId = "tags-compat";
55
+ const TagsCompat = createRenderer(
56
+ function (_, out, componentDef, component) {
57
+ const input = _.i;
58
+ const tagsRenderer = _.r;
59
+ const renderFn = createRenderFn(tagsRenderer);
60
+ const $global = out.global;
61
+ const streamData = ($global.streamData = $global.streamData || {});
62
+
63
+ $global.serializedGlobals = $global.serializedGlobals || {};
64
+ $global.serializedGlobals.componentIdToScopeId = true;
65
+ $global.componentIdToScopeId = $global.componentIdToScopeId || {};
66
+ $global.componentIdToScopeId[component.id] = streamData.scopeId || 0;
67
+ out.bf(out.___assignedKey, component, true);
68
+ renderFn(out.beginAsync(), input, {}, streamData);
69
+ out.ef();
70
+ },
71
+ {
72
+ t: TagsCompatId,
73
+ d: "MARKO_DEBUG",
74
+ },
75
+ {},
76
+ );
77
+
78
+ patchDynamicTag(
79
+ function getRenderer(tag) {
80
+ const renderer = tag._ || tag.renderBody || tag;
81
+ if (isMarko6(renderer)) return renderer;
82
+
83
+ const renderer5 =
84
+ tag._ ||
85
+ tag.render ||
86
+ (tag.renderer && tag.renderer.renderer) ||
87
+ tag.renderer;
88
+ const renderBody5 = tag.renderBody || tag;
89
+
90
+ return (input, ...args) => {
91
+ const out = defaultCreateOut();
92
+ let customEvents;
93
+
94
+ out.global.streamData = tagsAPI.$_streamData;
95
+
96
+ if (renderer5) {
97
+ const normalizedInput = {};
98
+
99
+ for (const key in input) {
100
+ let value = input[key];
101
+ if (key.startsWith("on") && typeof value === "function") {
102
+ const c = key[2];
103
+ customEvents = customEvents || [];
104
+ customEvents.push([
105
+ (c === "-" ? "" : c.toLowerCase()) + key.slice(3),
106
+ value,
107
+ ]);
108
+ value.toJSON = FN_TO_JSON;
109
+ } else {
110
+ normalizedInput[key] = input[key];
111
+ }
112
+ }
113
+ renderer5(normalizedInput, out);
114
+ } else {
115
+ renderBody5(out, input, ...args);
116
+ }
117
+
118
+ const componentsContext = ___getComponentsContext(out);
119
+ const component = componentsContext.___components[0];
120
+ if (component) {
121
+ component.___component.___customEvents = customEvents;
122
+ writeScope(nextScopeId(), {
123
+ m5c: component.id,
124
+ });
125
+ }
126
+
127
+ initComponentsTag({}, out);
128
+
129
+ let async;
130
+ out.once("finish", (result) => {
131
+ if (!async) {
132
+ async = false;
133
+ write(result.toString());
134
+ }
135
+ });
136
+
137
+ out.end();
138
+
139
+ if (async !== false) {
140
+ async = true;
141
+ fork(out, (result) => {
142
+ write(result.toString());
143
+ });
144
+ }
145
+ };
146
+ },
147
+ function createRenderer(renderFn) {
148
+ renderFn.___isTagsAPI = true;
149
+ return renderFn;
150
+ },
151
+ );
152
+
153
+ function dummyCreate5to6Renderer() {}
154
+
155
+ register(dummyCreate5to6Renderer, "@marko/tags-compat-5-to-6");
156
+
157
+ export function serialized5to6(renderer, id) {
158
+ const dummyRenderer = () => {};
159
+ register(dummyRenderer, id);
160
+ return makeSerializable(renderer, (s) =>
161
+ s
162
+ .value(dummyCreate5to6Renderer)
163
+ .code("(")
164
+ .value(dummyRenderer)
165
+ .code(",!0)"),
166
+ );
167
+ }