marko 5.33.2 → 5.33.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
- }