@vue/server-renderer 3.6.0-rc.1 → 3.6.0-rc.10

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.
@@ -1,12 +1,12 @@
1
1
  /**
2
- * @vue/server-renderer v3.6.0-rc.1
2
+ * @vue/server-renderer v3.6.0-rc.10
3
3
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
4
4
  * @license MIT
5
5
  **/
6
- import { Comment, Fragment, Static, Text, createApp, createVNode, handleError, initDirectivesForSSR, mergeProps, ssrContextKey, ssrUtils, warn } from "@vue/runtime-dom";
6
+ import { Comment, Fragment, Static, Text, createApp, createVNode, getCurrentInstance, handleError, initDirectivesForSSR, mergeProps, ssrContextKey, ssrUtils, warn } from "@vue/runtime-dom";
7
7
  import { NOOP, escapeHtml, escapeHtmlComment, hasOwn, includeBooleanAttr, includeBooleanAttr as ssrIncludeBooleanAttr, isArray, isBooleanAttr, isFunction, isObject, isOn, isPromise, isRenderableAttrValue, isSSRSafeAttrName, isSVGTag, isString, isVoidTag, looseEqual, looseIndexOf, makeMap, normalizeClass, normalizeCssVarValue, normalizeStyle, propsToAttrMap, stringifyStyle, toDisplayString } from "@vue/shared";
8
8
  //#region packages/server-renderer/src/helpers/ssrRenderAttrs.ts
9
- const shouldIgnoreProp = /* @__PURE__ */ makeMap(`,key,ref,innerHTML,textContent,ref_key,ref_for`);
9
+ const shouldIgnoreProp = /*@__PURE__*/ makeMap(`,key,ref,innerHTML,textContent,ref_key,ref_for`);
10
10
  function ssrRenderAttrs(props, tag) {
11
11
  let ret = "";
12
12
  for (let key in props) {
@@ -24,7 +24,7 @@ function ssrRenderAttrs(props, tag) {
24
24
  function ssrRenderDynamicAttr(key, value, tag) {
25
25
  if (!isRenderableAttrValue(value)) return ``;
26
26
  const attrKey = tag && (tag.indexOf("-") > 0 || isSVGTag(tag)) ? key : propsToAttrMap[key] || key.toLowerCase();
27
- if (isBooleanAttr(attrKey)) return includeBooleanAttr(value) ? ` ${attrKey}` : ``;
27
+ if (isBooleanAttr(attrKey) || attrKey === "hidden" && (typeof value === "boolean" || typeof value === "number")) return includeBooleanAttr(value) ? ` ${attrKey}` : ``;
28
28
  else if (isSSRSafeAttrName(attrKey)) return value === "" ? ` ${attrKey}` : ` ${attrKey}="${escapeHtml(value)}"`;
29
29
  else {
30
30
  console.warn(`[@vue/server-renderer] Skipped rendering unsafe attribute name: ${attrKey}`);
@@ -41,7 +41,8 @@ function ssrRenderClass(raw) {
41
41
  function ssrRenderStyle(raw) {
42
42
  if (!raw) return "";
43
43
  if (isString(raw)) return escapeHtml(raw);
44
- return escapeHtml(stringifyStyle(normalizeStyle(ssrResetCssVars(raw))));
44
+ const styles = normalizeStyle(ssrResetCssVars(raw));
45
+ return escapeHtml(stringifyStyle(styles));
45
46
  }
46
47
  function ssrResetCssVars(raw) {
47
48
  if (!isArray(raw) && isObject(raw)) {
@@ -53,58 +54,76 @@ function ssrResetCssVars(raw) {
53
54
  return raw;
54
55
  }
55
56
  //#endregion
56
- //#region packages/server-renderer/src/helpers/ssrRenderComponent.ts
57
- function ssrRenderComponent(comp, props = null, children = null, parentComponent = null, slotScopeId) {
58
- if (isString(comp)) {
59
- const { getBuffer, push } = createBuffer();
60
- renderVNode(push, createVNode(comp, props, children), parentComponent, slotScopeId);
61
- return getBuffer();
62
- }
63
- return renderComponentVNode(createVNode(comp, props, children), parentComponent, slotScopeId);
64
- }
65
- //#endregion
66
57
  //#region packages/server-renderer/src/helpers/ssrRenderSlot.ts
67
- const { ensureValidVNode } = ssrUtils;
58
+ const { ensureValidVNode, rawVaporSlotKey: rawVaporSlotKey$1 } = ssrUtils;
59
+ let vaporSlots = 0;
68
60
  function ssrRenderSlot(slots, slotName, slotProps, fallbackRenderFn, push, parentComponent, slotScopeId) {
69
- push(`<!--[-->`);
70
61
  ssrRenderSlotInner(slots, slotName, slotProps, fallbackRenderFn, push, parentComponent, slotScopeId);
71
- push(`<!--]-->`);
72
62
  }
73
63
  function ssrRenderSlotInner(slots, slotName, slotProps, fallbackRenderFn, push, parentComponent, slotScopeId, transition) {
74
64
  const slotFn = slots[slotName];
65
+ let fallback = false;
75
66
  if (slotFn) {
67
+ if (slotFn[rawVaporSlotKey$1]) vaporSlots++;
68
+ const before = vaporSlots;
76
69
  const slotBuffer = [];
77
70
  const bufferedPush = (item) => {
78
71
  slotBuffer.push(item);
79
72
  };
80
- const ret = slotFn(slotProps, bufferedPush, parentComponent, slotScopeId ? " " + slotScopeId : "");
73
+ const ret = slotFn(slotProps || {}, bufferedPush, parentComponent, slotScopeId ? " " + slotScopeId : "");
74
+ let vnodes;
81
75
  if (isArray(ret)) {
82
- const validSlotContent = ensureValidVNode(ret);
83
- if (validSlotContent) renderVNodeChildren(push, validSlotContent, parentComponent, slotScopeId);
76
+ vnodes = ensureValidVNode(ret);
77
+ if (vnodes && isVaporSlotContent(vnodes)) {
78
+ renderVNodeChildren(bufferedPush, vnodes, parentComponent, slotScopeId);
79
+ vnodes = void 0;
80
+ }
81
+ }
82
+ if (vnodes !== void 0) {
83
+ if (!transition) {
84
+ fallback = !vnodes && !!fallbackRenderFn;
85
+ push(fallback ? `<!--(-->` : `<!--[-->`);
86
+ }
87
+ if (vnodes) renderVNodeChildren(push, vnodes, parentComponent, slotScopeId);
84
88
  else if (fallbackRenderFn) fallbackRenderFn();
85
89
  else if (transition) push(`<!---->`);
86
90
  } else {
87
91
  let isEmptySlot = true;
88
- if (transition) isEmptySlot = false;
92
+ const owner = getCurrentInstance();
93
+ if (transition || !(owner && owner.type.__vapor) && !fallbackRenderFn && vaporSlots !== before) isEmptySlot = false;
89
94
  else for (let i = 0; i < slotBuffer.length; i++) if (!isComment(slotBuffer[i])) {
90
95
  isEmptySlot = false;
91
96
  break;
92
97
  }
98
+ if (!transition) {
99
+ fallback = isEmptySlot && !!fallbackRenderFn;
100
+ push(fallback ? `<!--(-->` : `<!--[-->`);
101
+ }
93
102
  if (isEmptySlot) {
94
103
  if (fallbackRenderFn) fallbackRenderFn();
95
104
  } else {
96
105
  let start = 0;
97
106
  let end = slotBuffer.length;
98
- if (transition && slotBuffer[0] === "<!--[-->" && slotBuffer[end - 1] === "<!--]-->") {
99
- start++;
100
- end--;
107
+ if (transition) {
108
+ const first = slotBuffer[0];
109
+ if ((first === "<!--[-->" || first === "<!--(-->") && slotBuffer[end - 1] === (first === "<!--(-->" ? "<!--)-->" : "<!--]-->")) {
110
+ start++;
111
+ end--;
112
+ }
101
113
  }
102
114
  if (start < end) for (let i = start; i < end; i++) push(slotBuffer[i]);
103
115
  else if (transition) push(`<!---->`);
104
116
  }
105
117
  }
106
- } else if (fallbackRenderFn) fallbackRenderFn();
107
- else if (transition) push(`<!---->`);
118
+ } else {
119
+ if (!transition) {
120
+ fallback = !!fallbackRenderFn;
121
+ push(fallback ? `<!--(-->` : `<!--[-->`);
122
+ }
123
+ if (fallbackRenderFn) fallbackRenderFn();
124
+ else if (transition) push(`<!---->`);
125
+ }
126
+ if (!transition) push(fallback ? `<!--)-->` : `<!--]-->`);
108
127
  }
109
128
  const commentTestRE = /^<!--[\s\S]*-->$/;
110
129
  const commentRE = /<!--[^]*?-->/gm;
@@ -114,6 +133,16 @@ function isComment(item) {
114
133
  return !item.replace(commentRE, "").trim();
115
134
  }
116
135
  //#endregion
136
+ //#region packages/server-renderer/src/helpers/ssrRenderComponent.ts
137
+ function ssrRenderComponent(comp, props = null, children = null, parentComponent = null, slotScopeId) {
138
+ if (isString(comp)) {
139
+ const { getBuffer, push } = createBuffer();
140
+ renderVNode(push, createVNode(comp, props, children), parentComponent, slotScopeId);
141
+ return getBuffer();
142
+ }
143
+ return renderComponentVNode(createVNode(comp, props, children), parentComponent, slotScopeId);
144
+ }
145
+ //#endregion
117
146
  //#region packages/server-renderer/src/helpers/ssrRenderTeleport.ts
118
147
  function ssrRenderTeleport(parentPush, contentRenderFn, target, disabled, parentComponent) {
119
148
  parentPush("<!--teleport start-->");
@@ -151,14 +180,16 @@ function ssrRenderList(source, renderItem) {
151
180
  return;
152
181
  }
153
182
  for (let i = 0; i < source; i++) renderItem(i + 1, i);
154
- } else if (isObject(source)) if (source[Symbol.iterator]) {
155
- let i = 0;
156
- for (const item of source) renderItem(item, i++);
157
- } else {
158
- const keys = Object.keys(source);
159
- for (let i = 0, l = keys.length; i < l; i++) {
160
- const key = keys[i];
161
- renderItem(source[key], key, i);
183
+ } else if (isObject(source)) {
184
+ if (source[Symbol.iterator]) {
185
+ let i = 0;
186
+ for (const item of source) renderItem(item, i++);
187
+ } else {
188
+ const keys = Object.keys(source);
189
+ for (let i = 0, l = keys.length; i < l; i++) {
190
+ const key = keys[i];
191
+ renderItem(source[key], key, i);
192
+ }
162
193
  }
163
194
  }
164
195
  }
@@ -209,7 +240,7 @@ function ssrCompile(template, instance) {
209
240
  }
210
241
  //#endregion
211
242
  //#region packages/server-renderer/src/render.ts
212
- const { createComponentInstance, setCurrentRenderingInstance, setupComponent, renderComponentRoot, normalizeVNode, pushWarningContext, popWarningContext } = ssrUtils;
243
+ const { createComponentInstance, setCurrentRenderingInstance, setupComponent, renderComponentRoot, isVNode: isVNode$2, normalizeVNode, pushWarningContext, popWarningContext, VaporSlot, rawVaporSlotKey, invokeSlotFallback } = ssrUtils;
213
244
  function cleanupContext(context) {
214
245
  let firstError;
215
246
  if (context.__watcherHandles) {
@@ -249,7 +280,41 @@ function createBuffer() {
249
280
  }
250
281
  };
251
282
  }
283
+ const vaporOutlets = /* @__PURE__ */ new WeakMap();
284
+ const vaporInterface = { attachSlotOutlet(content, fallback, owner) {
285
+ const lone = isVaporSlotContent(content);
286
+ if (lone) vaporOutlets.set(content, {
287
+ fallback,
288
+ owner
289
+ });
290
+ return lone;
291
+ } };
292
+ function isVaporSlotContent(children) {
293
+ const lone = findVaporSlot(children);
294
+ vaporSlot = null;
295
+ return lone;
296
+ }
297
+ let vaporSlot = null;
298
+ function findVaporSlot(children) {
299
+ for (let i = 0; i < children.length; i++) {
300
+ const child = children[i];
301
+ if (!isVNode$2(child)) return false;
302
+ if (child.type === VaporSlot) {
303
+ if (vaporSlot) return false;
304
+ vaporSlot = child;
305
+ } else if (child.type === Fragment) {
306
+ if (child.patchFlag > 0 && child.patchFlag & 384 || !findVaporSlot(child.children)) return false;
307
+ } else if (child.type !== Comment) return false;
308
+ }
309
+ return true;
310
+ }
252
311
  function renderComponentVNode(vnode, parentComponent = null, slotScopeId) {
312
+ const ctx = vnode.ctx;
313
+ if (vnode.shapeFlag & 32 && ctx && ctx.type.__vapor) {
314
+ const slots = vnode.children;
315
+ for (const name in slots) if (isFunction(slots[name])) slots[name][rawVaporSlotKey] = slots[name];
316
+ if (!ctx.appContext.vapor) ctx.appContext.vapor = vaporInterface;
317
+ }
253
318
  const instance = vnode.component = createComponentInstance(vnode, parentComponent, null);
254
319
  const context = instance.appContext.provides[ssrContextKey];
255
320
  if (context) (context.__instanceScopes || (context.__instanceScopes = [])).push(instance.scope);
@@ -313,7 +378,8 @@ function renderComponentSubTree(instance, slotScopeId) {
313
378
  }
314
379
  } else if (instance.render && instance.render !== NOOP) renderVNode(push, instance.subTree = renderComponentRoot(instance), instance, slotScopeId);
315
380
  else {
316
- warn(`Component ${comp.name || comp.__file || `<Anonymous>`} is missing template or render function.`);
381
+ const componentName = comp.name || comp.__file || `<Anonymous>`;
382
+ warn(`Component ${componentName} is missing template or render function.`);
317
383
  push(`<!---->`);
318
384
  }
319
385
  }
@@ -333,12 +399,25 @@ function renderVNode(push, vnode, parentComponent, slotScopeId) {
333
399
  case Static:
334
400
  push(children);
335
401
  break;
336
- case Fragment:
402
+ case Fragment: {
337
403
  if (vnode.slotScopeIds) slotScopeId = (slotScopeId ? slotScopeId + " " : "") + vnode.slotScopeIds.join(" ");
338
- push(`<!--[-->`);
404
+ const outlet = vnode.vo && vaporOutlets.get(children);
405
+ if (outlet) {
406
+ renderVaporOutlet(push, (_, push) => renderVNodeChildren(push, children, parentComponent, slotScopeId), null, outlet, parentComponent, slotScopeId);
407
+ break;
408
+ }
409
+ const isFallback = shapeFlag & 1024;
410
+ push(isFallback ? `<!--(-->` : `<!--[-->`);
339
411
  renderVNodeChildren(push, children, parentComponent, slotScopeId);
340
- push(`<!--]-->`);
412
+ push(isFallback ? `<!--)-->` : `<!--]-->`);
341
413
  break;
414
+ }
415
+ case VaporSlot: {
416
+ if (vnode.slotScopeIds) slotScopeId = (slotScopeId ? slotScopeId + " " : "") + vnode.slotScopeIds.join(" ");
417
+ const { slot, outlets } = vnode.vs;
418
+ renderVaporOutlet(push, slot, vnode.props, outlets && outlets[0], parentComponent, slotScopeId);
419
+ break;
420
+ }
342
421
  default: if (shapeFlag & 1) renderElementVNode(push, vnode, parentComponent, slotScopeId);
343
422
  else if (shapeFlag & 6) push(renderComponentVNode(vnode, parentComponent, slotScopeId));
344
423
  else if (shapeFlag & 64) renderTeleportVNode(push, vnode, parentComponent, slotScopeId);
@@ -346,6 +425,11 @@ function renderVNode(push, vnode, parentComponent, slotScopeId) {
346
425
  else warn("[@vue/server-renderer] Invalid VNode type:", type, `(${typeof type})`);
347
426
  }
348
427
  }
428
+ function renderVaporOutlet(push, slot, props, outlet, parentComponent, slotScopeId) {
429
+ const prev = setCurrentRenderingInstance(parentComponent);
430
+ ssrRenderSlot({ default: slot }, "default", props, outlet ? () => renderVNodeChildren(push, invokeSlotFallback(outlet.fallback, outlet.owner), parentComponent, slotScopeId) : null, push, parentComponent, slotScopeId);
431
+ setCurrentRenderingInstance(prev);
432
+ }
349
433
  function renderVNodeChildren(push, children, parentComponent, slotScopeId) {
350
434
  for (let i = 0; i < children.length; i++) renderVNode(push, normalizeVNode(children[i]), parentComponent, slotScopeId);
351
435
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vue/server-renderer",
3
- "version": "3.6.0-rc.1",
3
+ "version": "3.6.0-rc.10",
4
4
  "description": "@vue/server-renderer",
5
5
  "main": "index.js",
6
6
  "module": "dist/server-renderer.esm-bundler.js",
@@ -46,8 +46,8 @@
46
46
  },
47
47
  "homepage": "https://github.com/vuejs/core/tree/main/packages/server-renderer#readme",
48
48
  "dependencies": {
49
- "@vue/shared": "3.6.0-rc.1",
50
- "@vue/compiler-ssr": "3.6.0-rc.1",
51
- "@vue/runtime-dom": "3.6.0-rc.1"
49
+ "@vue/shared": "3.6.0-rc.10",
50
+ "@vue/compiler-ssr": "3.6.0-rc.10",
51
+ "@vue/runtime-dom": "3.6.0-rc.10"
52
52
  }
53
53
  }