marko 5.33.2 → 5.33.4

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.
@@ -0,0 +1,278 @@
1
+ const { ___componentLookup } = require("@internal/components-util");
2
+ const {
3
+ ___getComponentsContext,
4
+ } = require("../../components/ComponentsContext");
5
+ const defineComponent = require("../../components/defineComponent");
6
+ const { r: registerComponent } = require("../../components/registry");
7
+ const createRenderer = require("../../components/renderer");
8
+ const defaultCreateOut = require("../../createOut");
9
+ const morphdom = require("../../vdom/morphdom");
10
+ const { ___createFragmentNode } = require("../../vdom/morphdom/fragment");
11
+ const dynamicTag = require("../dynamic-tag");
12
+
13
+ exports.p = function ({
14
+ prepare,
15
+ runEffects,
16
+ patchConditionals,
17
+ createScopeWithRenderer,
18
+ queueEffect,
19
+ scopeLookup,
20
+ getRegisteredWithScope,
21
+ register,
22
+ }) {
23
+ dynamicTag.___runtimeCompat = function tagsToVdom(
24
+ tagsRenderer,
25
+ renderBody,
26
+ args,
27
+ ) {
28
+ if (
29
+ tagsRenderer
30
+ ? tagsRenderer.___clone === undefined
31
+ : !Array.isArray(renderBody) && renderBody?.___clone === undefined
32
+ )
33
+ return tagsRenderer;
34
+
35
+ return (input, out) =>
36
+ TagsCompat(
37
+ { i: args ? args : input, r: tagsRenderer || renderBody },
38
+ out,
39
+ );
40
+ };
41
+
42
+ const TagsCompatId = "tags-compat";
43
+ const TagsCompat = createRenderer(
44
+ function (_, out, componentDef, component) {
45
+ let existing = false;
46
+ const isHydrate =
47
+ ___getComponentsContext(out).___globalContext.___isHydrate;
48
+ const input = Array.isArray(_.i) ? _.i : [_.i];
49
+ const tagsRenderer = resolveRegistered(_.r);
50
+ const args = tagsRenderer.___args;
51
+
52
+ component.effects = prepare(() => {
53
+ if (isHydrate) {
54
+ const scopeId = out.global.componentIdToScopeId[component.id];
55
+ component.scope = scopeLookup[scopeId];
56
+ }
57
+ if (!component.scope) {
58
+ component.scope = createScopeWithRenderer(
59
+ tagsRenderer /* out.global as context */,
60
+ );
61
+ for (const signal of tagsRenderer.___closureSignals) {
62
+ signal(component.scope, true);
63
+ }
64
+ } else {
65
+ args && args(component.scope, input, 1);
66
+ existing = true;
67
+ }
68
+ args && args(component.scope, input);
69
+ });
70
+ out.bf(out.___assignedKey, component, existing);
71
+ if (!existing) {
72
+ out.node({
73
+ ___actualize: () =>
74
+ component.scope.___startNode === component.scope.___endNode
75
+ ? component.scope.___startNode
76
+ : component.scope.___startNode.parentNode,
77
+ });
78
+ }
79
+ out.ef();
80
+ },
81
+ // eslint-disable-next-line no-constant-condition
82
+ "MARKO_DEBUG"
83
+ ? {
84
+ t: TagsCompatId,
85
+ d: true,
86
+ }
87
+ : {
88
+ t: TagsCompatId,
89
+ },
90
+ {},
91
+ );
92
+
93
+ registerComponent(TagsCompatId, () => ({
94
+ _: TagsCompat,
95
+ Component: defineComponent(
96
+ {
97
+ onMount() {
98
+ runEffects(this.effects);
99
+ },
100
+ onUpdate() {
101
+ runEffects(this.effects);
102
+ },
103
+ },
104
+ TagsCompat,
105
+ ),
106
+ }));
107
+
108
+ // (
109
+ // nodeAccessor: Accessor,
110
+ // dynamicTagAttrs?: IntersectionSignal,
111
+ // intersection?: IntersectionSignal,
112
+ // valueWithIntersection?: ValueSignal
113
+ // )
114
+
115
+ const rendererCache = new WeakMap();
116
+
117
+ patchConditionals((conditional) => (...args) => {
118
+ const signal = conditional(...args);
119
+ const hasAttrs = args.length > 1;
120
+ return (scope, renderer, clean) => {
121
+ return signal(scope, create5to6Renderer(renderer, hasAttrs), clean);
122
+ };
123
+ });
124
+
125
+ function create5to6Renderer(renderer, hasAttrs) {
126
+ let newRenderer = renderer;
127
+ if (renderer) {
128
+ const rendererFromAnywhere =
129
+ renderer._ ||
130
+ renderer.render ||
131
+ (renderer.renderer && renderer.renderer.renderer) ||
132
+ renderer.renderer;
133
+ const isMarko6 = rendererFromAnywhere
134
+ ? rendererFromAnywhere.___clone
135
+ : renderer.___clone;
136
+
137
+ if (typeof renderer !== "string" && !isMarko6) {
138
+ newRenderer = rendererCache.get(renderer);
139
+ if (!newRenderer) {
140
+ const { Component } = renderer;
141
+ if (Component) {
142
+ const setCustomEvents = Component.prototype.___setCustomEvents;
143
+ Component.prototype.___setCustomEvents = function (
144
+ customEvents,
145
+ scopeId,
146
+ ) {
147
+ for (const customEvent of customEvents) {
148
+ customEvent[1] = resolveRegistered(customEvent[1]);
149
+ }
150
+
151
+ setCustomEvents.call(this, customEvents, scopeId);
152
+ };
153
+ }
154
+ newRenderer = {
155
+ ___setup(scope) {
156
+ if (!hasAttrs) {
157
+ renderAndMorph(scope, rendererFromAnywhere, renderer, {});
158
+ }
159
+ },
160
+ ___clone() {
161
+ const realFragment = document.createDocumentFragment();
162
+ ___createFragmentNode(null, null, realFragment);
163
+ return realFragment;
164
+ },
165
+ ___hasUserEffects: 1,
166
+ ___args(scope, input, clean) {
167
+ if (clean) return;
168
+ renderAndMorph(scope, rendererFromAnywhere, renderer, input);
169
+ },
170
+ };
171
+ rendererCache.set(renderer, newRenderer);
172
+ }
173
+ }
174
+ }
175
+ return newRenderer;
176
+ }
177
+
178
+ register("@marko/tags-compat-5-to-6", create5to6Renderer);
179
+
180
+ function renderAndMorph(scope, renderer, renderBody, input) {
181
+ const out = defaultCreateOut();
182
+ let rootNode = scope.___startNode.fragment;
183
+ if (!rootNode) {
184
+ const component = (scope.marko5Component = ___componentLookup[scope.m5c]);
185
+ rootNode = component.___rootNode;
186
+ scope.___startNode = rootNode.startNode;
187
+ scope.___endNode = rootNode.endNode;
188
+ }
189
+ const host = scope.___startNode;
190
+ const existingComponent = scope.marko5Component;
191
+ const componentsContext = ___getComponentsContext(out);
192
+ const globalComponentsContext = componentsContext.___globalContext;
193
+ let customEvents;
194
+ globalComponentsContext.___rerenderComponent = existingComponent;
195
+ out.sync();
196
+ if (renderer) {
197
+ const [rawInput] = input;
198
+ const normalizedInput = {};
199
+
200
+ for (const key in rawInput) {
201
+ let value = rawInput[key];
202
+ if (key.startsWith("on")) {
203
+ const c = key[2];
204
+ customEvents = customEvents || {};
205
+ customEvents[(c === "-" ? "" : c.toLowerCase()) + key.slice(3)] = [
206
+ value,
207
+ ];
208
+ } else {
209
+ normalizedInput[key] = rawInput[key];
210
+ }
211
+ }
212
+
213
+ renderer(normalizedInput, out);
214
+ } else {
215
+ RenderBodyComponent({ renderBody, args: input }, out);
216
+ }
217
+
218
+ queueEffect(scope, () => {
219
+ const targetNode = out.___getOutput().___firstChild;
220
+ morphdom(rootNode, targetNode, host, componentsContext);
221
+ const componentDefs = componentsContext.___initComponents(
222
+ getRootNode(host),
223
+ );
224
+ const component = componentDefs[0].___component;
225
+ component.___rootNode = rootNode;
226
+ component.___input = input[0];
227
+ component.___customEvents = customEvents;
228
+ scope.marko5Component = component;
229
+ });
230
+ }
231
+
232
+ function getRootNode(el) {
233
+ var cur = el;
234
+ while (cur.parentNode) cur = cur.parentNode;
235
+ return cur;
236
+ }
237
+
238
+ const RenderBodyComponentId = "renderbody-renderer";
239
+ const RenderBodyComponent = createRenderer(
240
+ function (input, out, _componentDef) {
241
+ dynamicTag(
242
+ out,
243
+ input.renderBody,
244
+ null,
245
+ null,
246
+ input.args,
247
+ null,
248
+ _componentDef,
249
+ "0",
250
+ );
251
+ },
252
+ // eslint-disable-next-line no-constant-condition
253
+ "MARKO_DEBUG"
254
+ ? {
255
+ t: RenderBodyComponentId,
256
+ i: true,
257
+ d: true,
258
+ }
259
+ : {
260
+ t: RenderBodyComponentId,
261
+ i: true,
262
+ },
263
+ {},
264
+ );
265
+
266
+ registerComponent(RenderBodyComponentId, () => ({
267
+ _: RenderBodyComponent,
268
+ Component: defineComponent({}, RenderBodyComponent),
269
+ }));
270
+
271
+ function resolveRegistered(renderer) {
272
+ if (!Array.isArray(renderer)) return renderer;
273
+
274
+ const [registerId, scopeId] = renderer;
275
+ const scope = scopeLookup[scopeId];
276
+ return getRegisteredWithScope(registerId, scope);
277
+ }
278
+ };
@@ -0,0 +1,171 @@
1
+ const initComponentsTag = require("../../../core-tags/components/init-components-tag");
2
+ const {
3
+ ___getComponentsContext,
4
+ } = require("../../components/ComponentsContext");
5
+ const createRenderer = require("../../components/renderer");
6
+ const defaultCreateOut = require("../../createOut");
7
+ const dynamicTag5 = require("../dynamic-tag");
8
+
9
+ exports.p = function (tagsAPI) {
10
+ const {
11
+ patchDynamicTag,
12
+ createRenderFn,
13
+ fork,
14
+ write,
15
+ makeSerializable,
16
+ register,
17
+ writeScope,
18
+ nextScopeId,
19
+ getRegistryInfo,
20
+ } = tagsAPI;
21
+ const FN_TO_JSON = function () {
22
+ // TODO: this should instead return an object that contains getRegistryInfo
23
+ // then in the dom-compat, handle that object to lookup the function in the registry
24
+ // (we also need to do this for events)
25
+ return getRegistryInfo(this);
26
+ };
27
+
28
+ const isMarko6 = (fn) => !!fn.___isTagsAPI;
29
+ const isMarko5 = (fn) => !fn.___isTagsAPI;
30
+
31
+ dynamicTag5.___runtimeCompat = function tagsToVdom(
32
+ tagsRenderer,
33
+ renderBody,
34
+ args,
35
+ ) {
36
+ if (tagsRenderer ? isMarko5(tagsRenderer) : isMarko5(renderBody))
37
+ return tagsRenderer;
38
+
39
+ if (!tagsRenderer && renderBody) {
40
+ renderBody.toJSON = FN_TO_JSON;
41
+ }
42
+
43
+ return (input, out) =>
44
+ TagsCompat(
45
+ args
46
+ ? { i: args, r: (args) => (tagsRenderer || renderBody)(...args) }
47
+ : { i: input, r: tagsRenderer || renderBody },
48
+ out,
49
+ );
50
+ };
51
+
52
+ const TagsCompatId = "tags-compat";
53
+ const TagsCompat = createRenderer(
54
+ function (_, out, componentDef, component) {
55
+ const input = _.i;
56
+ const tagsRenderer = _.r;
57
+ const renderFn = createRenderFn(tagsRenderer);
58
+ const $global = out.global;
59
+ const streamData = ($global.streamData = $global.streamData || {});
60
+
61
+ $global.serializedGlobals = $global.serializedGlobals || {};
62
+ $global.serializedGlobals.componentIdToScopeId = true;
63
+ $global.componentIdToScopeId = $global.componentIdToScopeId || {};
64
+ $global.componentIdToScopeId[component.id] = streamData.scopeId || 0;
65
+ out.bf(out.___assignedKey, component, true);
66
+ renderFn(out.beginAsync(), input, {}, streamData);
67
+ out.ef();
68
+ },
69
+ // eslint-disable-next-line no-constant-condition
70
+ "MARKO_DEBUG"
71
+ ? {
72
+ t: TagsCompatId,
73
+ d: true,
74
+ }
75
+ : {
76
+ t: TagsCompatId,
77
+ },
78
+ {},
79
+ );
80
+
81
+ patchDynamicTag(
82
+ function getRenderer(tag) {
83
+ const renderer = tag._ || tag.renderBody || tag;
84
+ if (isMarko6(renderer)) return renderer;
85
+
86
+ const renderer5 =
87
+ tag._ ||
88
+ tag.render ||
89
+ (tag.renderer && tag.renderer.renderer) ||
90
+ tag.renderer;
91
+ const renderBody5 = tag.renderBody || tag;
92
+
93
+ return (input, ...args) => {
94
+ const out = defaultCreateOut();
95
+ let customEvents;
96
+
97
+ out.global.streamData = tagsAPI.$_streamData;
98
+
99
+ if (renderer5) {
100
+ const normalizedInput = {};
101
+
102
+ for (const key in input) {
103
+ let value = input[key];
104
+ if (key.startsWith("on") && typeof value === "function") {
105
+ const c = key[2];
106
+ customEvents = customEvents || [];
107
+ customEvents.push([
108
+ (c === "-" ? "" : c.toLowerCase()) + key.slice(3),
109
+ value,
110
+ ]);
111
+ value.toJSON = FN_TO_JSON;
112
+ } else {
113
+ normalizedInput[key] = input[key];
114
+ }
115
+ }
116
+ renderer5(normalizedInput, out);
117
+ } else {
118
+ renderBody5(out, input, ...args);
119
+ }
120
+
121
+ const componentsContext = ___getComponentsContext(out);
122
+ const component = componentsContext.___components[0];
123
+ if (component) {
124
+ component.___component.___customEvents = customEvents;
125
+ writeScope(nextScopeId(), {
126
+ m5c: component.id,
127
+ });
128
+ }
129
+
130
+ initComponentsTag({}, out);
131
+
132
+ let async;
133
+ out.once("finish", (result) => {
134
+ if (!async) {
135
+ async = false;
136
+ write(result.toString());
137
+ }
138
+ });
139
+
140
+ out.end();
141
+
142
+ if (async !== false) {
143
+ async = true;
144
+ fork(out, (result) => {
145
+ write(result.toString());
146
+ });
147
+ }
148
+ };
149
+ },
150
+ function createRenderer(renderFn) {
151
+ renderFn.___isTagsAPI = true;
152
+ return renderFn;
153
+ },
154
+ );
155
+
156
+ function dummyCreate5to6Renderer() {}
157
+
158
+ register(dummyCreate5to6Renderer, "@marko/tags-compat-5-to-6");
159
+
160
+ return function serialized5to6(renderer, id) {
161
+ const dummyRenderer = () => {};
162
+ register(dummyRenderer, id);
163
+ return makeSerializable(renderer, (s) =>
164
+ s
165
+ .value(dummyCreate5to6Renderer)
166
+ .code("(")
167
+ .value(dummyRenderer)
168
+ .code(",!0)"),
169
+ );
170
+ };
171
+ };
@@ -1,265 +0,0 @@
1
- "use strict";const { _i_ } = require("@internal/components-util");
2
- const { R_ } = require("../components/ComponentsContext");
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/runtime-tags/dom"
16
- );
17
- const defineComponent = require("../components/defineComponent");
18
- const { r: registerComponent } = require("../components/registry");
19
- const createRenderer = require("../components/renderer");
20
- const defaultCreateOut = require("../createOut");
21
- const morphdom = require("../vdom/morphdom");
22
- const { _h_ } = require("../vdom/morphdom/fragment");
23
- const dynamicTag = require("./dynamic-tag");
24
-
25
- dynamicTag.bk_ = function tagsToVdom(
26
- tagsRenderer,
27
- renderBody,
28
- args)
29
- {
30
- if (
31
- tagsRenderer ?
32
- tagsRenderer.bl_ === undefined :
33
- !Array.isArray(renderBody) && renderBody?.bl_ === 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
- R_(out).o_._W_;
47
- const input = Array.isArray(_.i) ? _.i : [_.i];
48
- const tagsRenderer = resolveRegistered(_.r);
49
- const args = tagsRenderer.bm_;
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.bn_) {
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._Y_, component, existing);
70
- if (!existing) {
71
- out.node({
72
- bo_: () =>
73
- component.scope.bp_ === component.scope.bq_ ?
74
- component.scope.bp_ :
75
- component.scope.bp_.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.bl_ :
129
- renderer.bl_;
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.aB_;
137
- Component.prototype.aB_ = 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
- br_(scope) {
150
- if (!hasAttrs) {
151
- renderAndMorph(scope, rendererFromAnywhere, renderer, {});
152
- }
153
- },
154
- bl_() {
155
- const realFragment = document.createDocumentFragment();
156
- _h_(null, null, realFragment);
157
- return realFragment;
158
- },
159
- bs_: 1,
160
- bm_(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.bp_.fragment;
177
- if (!rootNode) {
178
- const component = scope.marko5Component = _i_[scope.m5c];
179
- rootNode = component._A_;
180
- scope.bp_ = rootNode.startNode;
181
- scope.bq_ = rootNode.endNode;
182
- }
183
- const host = scope.bp_;
184
- const existingComponent = scope.marko5Component;
185
- const componentsContext = R_(out);
186
- const globalComponentsContext = componentsContext.o_;
187
- let customEvents;
188
- globalComponentsContext.ax_ = 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.af_().ay_;
214
- morphdom(rootNode, targetNode, host, componentsContext);
215
- const componentDefs = componentsContext.ad_(
216
- getRootNode(host)
217
- );
218
- const component = componentDefs[0].r_;
219
- component._A_ = rootNode;
220
- component.N_ = input[0];
221
- component.U_ = 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
- }