@vue/server-renderer 3.2.47 → 3.3.0-alpha.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,1011 +1,979 @@
1
1
  import { createVNode, ssrContextKey, warn as warn$1, Fragment, Static, Comment, Text, mergeProps, ssrUtils, createApp, initDirectivesForSSR } from 'vue';
2
- import { makeMap, isOn, isSVGTag, propsToAttrMap, isBooleanAttr, includeBooleanAttr, isSSRSafeAttrName, escapeHtml, normalizeClass, isString, normalizeStyle, stringifyStyle, isArray, toDisplayString, isFunction, isObject, looseEqual, looseIndexOf, isPromise, NOOP, escapeHtmlComment, isVoidTag } from '@vue/shared';
2
+ import { makeMap, isOn, isSVGTag, propsToAttrMap, isBooleanAttr, includeBooleanAttr, isSSRSafeAttrName, escapeHtml, normalizeClass, isString, normalizeStyle, stringifyStyle, isArray, toDisplayString, isFunction, getGlobalThis, isObject, looseEqual, looseIndexOf, isPromise, NOOP, escapeHtmlComment, isVoidTag } from '@vue/shared';
3
3
  export { includeBooleanAttr as ssrIncludeBooleanAttr } from '@vue/shared';
4
4
 
5
- // leading comma for empty string ""
6
- const shouldIgnoreProp = makeMap(`,key,ref,innerHTML,textContent,ref_key,ref_for`);
5
+ const shouldIgnoreProp = makeMap(
6
+ `,key,ref,innerHTML,textContent,ref_key,ref_for`
7
+ );
7
8
  function ssrRenderAttrs(props, tag) {
8
- let ret = '';
9
- for (const key in props) {
10
- if (shouldIgnoreProp(key) ||
11
- isOn(key) ||
12
- (tag === 'textarea' && key === 'value')) {
13
- continue;
14
- }
15
- const value = props[key];
16
- if (key === 'class') {
17
- ret += ` class="${ssrRenderClass(value)}"`;
18
- }
19
- else if (key === 'style') {
20
- ret += ` style="${ssrRenderStyle(value)}"`;
21
- }
22
- else {
23
- ret += ssrRenderDynamicAttr(key, value, tag);
24
- }
25
- }
26
- return ret;
9
+ let ret = "";
10
+ for (const key in props) {
11
+ if (shouldIgnoreProp(key) || isOn(key) || tag === "textarea" && key === "value") {
12
+ continue;
13
+ }
14
+ const value = props[key];
15
+ if (key === "class") {
16
+ ret += ` class="${ssrRenderClass(value)}"`;
17
+ } else if (key === "style") {
18
+ ret += ` style="${ssrRenderStyle(value)}"`;
19
+ } else {
20
+ ret += ssrRenderDynamicAttr(key, value, tag);
21
+ }
22
+ }
23
+ return ret;
27
24
  }
28
- // render an attr with dynamic (unknown) key.
29
25
  function ssrRenderDynamicAttr(key, value, tag) {
30
- if (!isRenderableValue(value)) {
31
- return ``;
32
- }
33
- const attrKey = tag && (tag.indexOf('-') > 0 || isSVGTag(tag))
34
- ? key // preserve raw name on custom elements and svg
35
- : propsToAttrMap[key] || key.toLowerCase();
36
- if (isBooleanAttr(attrKey)) {
37
- return includeBooleanAttr(value) ? ` ${attrKey}` : ``;
38
- }
39
- else if (isSSRSafeAttrName(attrKey)) {
40
- return value === '' ? ` ${attrKey}` : ` ${attrKey}="${escapeHtml(value)}"`;
41
- }
42
- else {
43
- console.warn(`[@vue/server-renderer] Skipped rendering unsafe attribute name: ${attrKey}`);
44
- return ``;
45
- }
26
+ if (!isRenderableValue(value)) {
27
+ return ``;
28
+ }
29
+ const attrKey = tag && (tag.indexOf("-") > 0 || isSVGTag(tag)) ? key : propsToAttrMap[key] || key.toLowerCase();
30
+ if (isBooleanAttr(attrKey)) {
31
+ return includeBooleanAttr(value) ? ` ${attrKey}` : ``;
32
+ } else if (isSSRSafeAttrName(attrKey)) {
33
+ return value === "" ? ` ${attrKey}` : ` ${attrKey}="${escapeHtml(value)}"`;
34
+ } else {
35
+ console.warn(
36
+ `[@vue/server-renderer] Skipped rendering unsafe attribute name: ${attrKey}`
37
+ );
38
+ return ``;
39
+ }
46
40
  }
47
- // Render a v-bind attr with static key. The key is pre-processed at compile
48
- // time and we only need to check and escape value.
49
41
  function ssrRenderAttr(key, value) {
50
- if (!isRenderableValue(value)) {
51
- return ``;
52
- }
53
- return ` ${key}="${escapeHtml(value)}"`;
42
+ if (!isRenderableValue(value)) {
43
+ return ``;
44
+ }
45
+ return ` ${key}="${escapeHtml(value)}"`;
54
46
  }
55
47
  function isRenderableValue(value) {
56
- if (value == null) {
57
- return false;
58
- }
59
- const type = typeof value;
60
- return type === 'string' || type === 'number' || type === 'boolean';
48
+ if (value == null) {
49
+ return false;
50
+ }
51
+ const type = typeof value;
52
+ return type === "string" || type === "number" || type === "boolean";
61
53
  }
62
54
  function ssrRenderClass(raw) {
63
- return escapeHtml(normalizeClass(raw));
55
+ return escapeHtml(normalizeClass(raw));
64
56
  }
65
57
  function ssrRenderStyle(raw) {
66
- if (!raw) {
67
- return '';
68
- }
69
- if (isString(raw)) {
70
- return escapeHtml(raw);
71
- }
72
- const styles = normalizeStyle(raw);
73
- return escapeHtml(stringifyStyle(styles));
58
+ if (!raw) {
59
+ return "";
60
+ }
61
+ if (isString(raw)) {
62
+ return escapeHtml(raw);
63
+ }
64
+ const styles = normalizeStyle(raw);
65
+ return escapeHtml(stringifyStyle(styles));
74
66
  }
75
67
 
76
68
  function ssrRenderComponent(comp, props = null, children = null, parentComponent = null, slotScopeId) {
77
- return renderComponentVNode(createVNode(comp, props, children), parentComponent, slotScopeId);
69
+ return renderComponentVNode(
70
+ createVNode(comp, props, children),
71
+ parentComponent,
72
+ slotScopeId
73
+ );
78
74
  }
79
75
 
80
76
  function ssrRenderSlot(slots, slotName, slotProps, fallbackRenderFn, push, parentComponent, slotScopeId) {
81
- // template-compiled slots are always rendered as fragments
82
- push(`<!--[-->`);
83
- ssrRenderSlotInner(slots, slotName, slotProps, fallbackRenderFn, push, parentComponent, slotScopeId);
84
- push(`<!--]-->`);
77
+ push(`<!--[-->`);
78
+ ssrRenderSlotInner(
79
+ slots,
80
+ slotName,
81
+ slotProps,
82
+ fallbackRenderFn,
83
+ push,
84
+ parentComponent,
85
+ slotScopeId
86
+ );
87
+ push(`<!--]-->`);
85
88
  }
86
89
  function ssrRenderSlotInner(slots, slotName, slotProps, fallbackRenderFn, push, parentComponent, slotScopeId, transition) {
87
- const slotFn = slots[slotName];
88
- if (slotFn) {
89
- const slotBuffer = [];
90
- const bufferedPush = (item) => {
91
- slotBuffer.push(item);
92
- };
93
- const ret = slotFn(slotProps, bufferedPush, parentComponent, slotScopeId ? ' ' + slotScopeId : '');
94
- if (isArray(ret)) {
95
- // normal slot
96
- renderVNodeChildren(push, ret, parentComponent, slotScopeId);
90
+ const slotFn = slots[slotName];
91
+ if (slotFn) {
92
+ const slotBuffer = [];
93
+ const bufferedPush = (item) => {
94
+ slotBuffer.push(item);
95
+ };
96
+ const ret = slotFn(
97
+ slotProps,
98
+ bufferedPush,
99
+ parentComponent,
100
+ slotScopeId ? " " + slotScopeId : ""
101
+ );
102
+ if (isArray(ret)) {
103
+ renderVNodeChildren(push, ret, parentComponent, slotScopeId);
104
+ } else {
105
+ let isEmptySlot = true;
106
+ if (transition) {
107
+ isEmptySlot = false;
108
+ } else {
109
+ for (let i = 0; i < slotBuffer.length; i++) {
110
+ if (!isComment(slotBuffer[i])) {
111
+ isEmptySlot = false;
112
+ break;
113
+ }
97
114
  }
98
- else {
99
- // ssr slot.
100
- // check if the slot renders all comments, in which case use the fallback
101
- let isEmptySlot = true;
102
- if (transition) {
103
- isEmptySlot = false;
104
- }
105
- else {
106
- for (let i = 0; i < slotBuffer.length; i++) {
107
- if (!isComment(slotBuffer[i])) {
108
- isEmptySlot = false;
109
- break;
110
- }
111
- }
112
- }
113
- if (isEmptySlot) {
114
- if (fallbackRenderFn) {
115
- fallbackRenderFn();
116
- }
117
- }
118
- else {
119
- for (let i = 0; i < slotBuffer.length; i++) {
120
- push(slotBuffer[i]);
121
- }
122
- }
115
+ }
116
+ if (isEmptySlot) {
117
+ if (fallbackRenderFn) {
118
+ fallbackRenderFn();
123
119
  }
120
+ } else {
121
+ for (let i = 0; i < slotBuffer.length; i++) {
122
+ push(slotBuffer[i]);
123
+ }
124
+ }
124
125
  }
125
- else if (fallbackRenderFn) {
126
- fallbackRenderFn();
127
- }
126
+ } else if (fallbackRenderFn) {
127
+ fallbackRenderFn();
128
+ }
128
129
  }
129
130
  const commentTestRE = /^<!--.*-->$/s;
130
131
  const commentRE = /<!--[^]*?-->/gm;
131
132
  function isComment(item) {
132
- if (typeof item !== 'string' || !commentTestRE.test(item))
133
- return false;
134
- // if item is '<!---->' or '<!--[-->' or '<!--]-->', return true directly
135
- if (item.length <= 8)
136
- return true;
137
- return !item.replace(commentRE, '').trim();
133
+ if (typeof item !== "string" || !commentTestRE.test(item))
134
+ return false;
135
+ if (item.length <= 8)
136
+ return true;
137
+ return !item.replace(commentRE, "").trim();
138
138
  }
139
139
 
140
140
  function ssrRenderTeleport(parentPush, contentRenderFn, target, disabled, parentComponent) {
141
- parentPush('<!--teleport start-->');
142
- const context = parentComponent.appContext.provides[ssrContextKey];
143
- const teleportBuffers = context.__teleportBuffers || (context.__teleportBuffers = {});
144
- const targetBuffer = teleportBuffers[target] || (teleportBuffers[target] = []);
145
- // record current index of the target buffer to handle nested teleports
146
- // since the parent needs to be rendered before the child
147
- const bufferIndex = targetBuffer.length;
148
- let teleportContent;
149
- if (disabled) {
150
- contentRenderFn(parentPush);
151
- teleportContent = `<!--teleport anchor-->`;
152
- }
153
- else {
154
- const { getBuffer, push } = createBuffer();
155
- contentRenderFn(push);
156
- push(`<!--teleport anchor-->`);
157
- teleportContent = getBuffer();
158
- }
159
- targetBuffer.splice(bufferIndex, 0, teleportContent);
160
- parentPush('<!--teleport end-->');
141
+ parentPush("<!--teleport start-->");
142
+ const context = parentComponent.appContext.provides[ssrContextKey];
143
+ const teleportBuffers = context.__teleportBuffers || (context.__teleportBuffers = {});
144
+ const targetBuffer = teleportBuffers[target] || (teleportBuffers[target] = []);
145
+ const bufferIndex = targetBuffer.length;
146
+ let teleportContent;
147
+ if (disabled) {
148
+ contentRenderFn(parentPush);
149
+ teleportContent = `<!--teleport anchor-->`;
150
+ } else {
151
+ const { getBuffer, push } = createBuffer();
152
+ contentRenderFn(push);
153
+ push(`<!--teleport anchor-->`);
154
+ teleportContent = getBuffer();
155
+ }
156
+ targetBuffer.splice(bufferIndex, 0, teleportContent);
157
+ parentPush("<!--teleport end-->");
161
158
  }
162
159
 
163
160
  function ssrInterpolate(value) {
164
- return escapeHtml(toDisplayString(value));
161
+ return escapeHtml(toDisplayString(value));
165
162
  }
166
163
 
167
- Symbol((process.env.NODE_ENV !== 'production') ? 'iterate' : '');
168
- Symbol((process.env.NODE_ENV !== 'production') ? 'Map key iterate' : '');
164
+ Symbol(process.env.NODE_ENV !== "production" ? "iterate" : "");
165
+ Symbol(process.env.NODE_ENV !== "production" ? "Map key iterate" : "");
169
166
  let shouldTrack = true;
170
167
  const trackStack = [];
171
168
  function pauseTracking() {
172
- trackStack.push(shouldTrack);
173
- shouldTrack = false;
169
+ trackStack.push(shouldTrack);
170
+ shouldTrack = false;
174
171
  }
175
172
  function resetTracking() {
176
- const last = trackStack.pop();
177
- shouldTrack = last === undefined ? true : last;
173
+ const last = trackStack.pop();
174
+ shouldTrack = last === void 0 ? true : last;
178
175
  }
179
176
 
180
177
  function toRaw(observed) {
181
- const raw = observed && observed["__v_raw" /* ReactiveFlags.RAW */];
182
- return raw ? toRaw(raw) : observed;
178
+ const raw = observed && observed["__v_raw"];
179
+ return raw ? toRaw(raw) : observed;
183
180
  }
184
181
 
185
182
  function isRef(r) {
186
- return !!(r && r.__v_isRef === true);
183
+ return !!(r && r.__v_isRef === true);
187
184
  }
188
185
 
189
186
  const stack = [];
190
187
  function pushWarningContext(vnode) {
191
- stack.push(vnode);
188
+ stack.push(vnode);
192
189
  }
193
190
  function popWarningContext() {
194
- stack.pop();
191
+ stack.pop();
195
192
  }
196
193
  function warn(msg, ...args) {
197
- if (!(process.env.NODE_ENV !== 'production'))
198
- return;
199
- // avoid props formatting or warn handler tracking deps that might be mutated
200
- // during patch, leading to infinite recursion.
201
- pauseTracking();
202
- const instance = stack.length ? stack[stack.length - 1].component : null;
203
- const appWarnHandler = instance && instance.appContext.config.warnHandler;
204
- const trace = getComponentTrace();
205
- if (appWarnHandler) {
206
- callWithErrorHandling(appWarnHandler, instance, 11 /* ErrorCodes.APP_WARN_HANDLER */, [
207
- msg + args.join(''),
208
- instance && instance.proxy,
209
- trace
210
- .map(({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`)
211
- .join('\n'),
212
- trace
213
- ]);
214
- }
215
- else {
216
- const warnArgs = [`[Vue warn]: ${msg}`, ...args];
217
- /* istanbul ignore if */
218
- if (trace.length &&
219
- // avoid spamming console during tests
220
- !false) {
221
- warnArgs.push(`\n`, ...formatTrace(trace));
222
- }
223
- console.warn(...warnArgs);
224
- }
225
- resetTracking();
194
+ if (!process.env.NODE_ENV !== "production")
195
+ return;
196
+ pauseTracking();
197
+ const instance = stack.length ? stack[stack.length - 1].component : null;
198
+ const appWarnHandler = instance && instance.appContext.config.warnHandler;
199
+ const trace = getComponentTrace();
200
+ if (appWarnHandler) {
201
+ callWithErrorHandling(
202
+ appWarnHandler,
203
+ instance,
204
+ 11,
205
+ [
206
+ msg + args.join(""),
207
+ instance && instance.proxy,
208
+ trace.map(
209
+ ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`
210
+ ).join("\n"),
211
+ trace
212
+ ]
213
+ );
214
+ } else {
215
+ const warnArgs = [`[Vue warn]: ${msg}`, ...args];
216
+ if (trace.length && // avoid spamming console during tests
217
+ true) {
218
+ warnArgs.push(`
219
+ `, ...formatTrace(trace));
220
+ }
221
+ console.warn(...warnArgs);
222
+ }
223
+ resetTracking();
226
224
  }
227
225
  function getComponentTrace() {
228
- let currentVNode = stack[stack.length - 1];
229
- if (!currentVNode) {
230
- return [];
231
- }
232
- // we can't just use the stack because it will be incomplete during updates
233
- // that did not start from the root. Re-construct the parent chain using
234
- // instance parent pointers.
235
- const normalizedStack = [];
236
- while (currentVNode) {
237
- const last = normalizedStack[0];
238
- if (last && last.vnode === currentVNode) {
239
- last.recurseCount++;
240
- }
241
- else {
242
- normalizedStack.push({
243
- vnode: currentVNode,
244
- recurseCount: 0
245
- });
246
- }
247
- const parentInstance = currentVNode.component && currentVNode.component.parent;
248
- currentVNode = parentInstance && parentInstance.vnode;
249
- }
250
- return normalizedStack;
226
+ let currentVNode = stack[stack.length - 1];
227
+ if (!currentVNode) {
228
+ return [];
229
+ }
230
+ const normalizedStack = [];
231
+ while (currentVNode) {
232
+ const last = normalizedStack[0];
233
+ if (last && last.vnode === currentVNode) {
234
+ last.recurseCount++;
235
+ } else {
236
+ normalizedStack.push({
237
+ vnode: currentVNode,
238
+ recurseCount: 0
239
+ });
240
+ }
241
+ const parentInstance = currentVNode.component && currentVNode.component.parent;
242
+ currentVNode = parentInstance && parentInstance.vnode;
243
+ }
244
+ return normalizedStack;
251
245
  }
252
- /* istanbul ignore next */
253
246
  function formatTrace(trace) {
254
- const logs = [];
255
- trace.forEach((entry, i) => {
256
- logs.push(...(i === 0 ? [] : [`\n`]), ...formatTraceEntry(entry));
257
- });
258
- return logs;
247
+ const logs = [];
248
+ trace.forEach((entry, i) => {
249
+ logs.push(...i === 0 ? [] : [`
250
+ `], ...formatTraceEntry(entry));
251
+ });
252
+ return logs;
259
253
  }
260
254
  function formatTraceEntry({ vnode, recurseCount }) {
261
- const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;
262
- const isRoot = vnode.component ? vnode.component.parent == null : false;
263
- const open = ` at <${formatComponentName(vnode.component, vnode.type, isRoot)}`;
264
- const close = `>` + postfix;
265
- return vnode.props
266
- ? [open, ...formatProps(vnode.props), close]
267
- : [open + close];
268
- }
269
- /* istanbul ignore next */
255
+ const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;
256
+ const isRoot = vnode.component ? vnode.component.parent == null : false;
257
+ const open = ` at <${formatComponentName(
258
+ vnode.component,
259
+ vnode.type,
260
+ isRoot
261
+ )}`;
262
+ const close = `>` + postfix;
263
+ return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];
264
+ }
270
265
  function formatProps(props) {
271
- const res = [];
272
- const keys = Object.keys(props);
273
- keys.slice(0, 3).forEach(key => {
274
- res.push(...formatProp(key, props[key]));
275
- });
276
- if (keys.length > 3) {
277
- res.push(` ...`);
278
- }
279
- return res;
266
+ const res = [];
267
+ const keys = Object.keys(props);
268
+ keys.slice(0, 3).forEach((key) => {
269
+ res.push(...formatProp(key, props[key]));
270
+ });
271
+ if (keys.length > 3) {
272
+ res.push(` ...`);
273
+ }
274
+ return res;
280
275
  }
281
- /* istanbul ignore next */
282
276
  function formatProp(key, value, raw) {
283
- if (isString(value)) {
284
- value = JSON.stringify(value);
285
- return raw ? value : [`${key}=${value}`];
286
- }
287
- else if (typeof value === 'number' ||
288
- typeof value === 'boolean' ||
289
- value == null) {
290
- return raw ? value : [`${key}=${value}`];
291
- }
292
- else if (isRef(value)) {
293
- value = formatProp(key, toRaw(value.value), true);
294
- return raw ? value : [`${key}=Ref<`, value, `>`];
295
- }
296
- else if (isFunction(value)) {
297
- return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];
298
- }
299
- else {
300
- value = toRaw(value);
301
- return raw ? value : [`${key}=`, value];
302
- }
277
+ if (isString(value)) {
278
+ value = JSON.stringify(value);
279
+ return raw ? value : [`${key}=${value}`];
280
+ } else if (typeof value === "number" || typeof value === "boolean" || value == null) {
281
+ return raw ? value : [`${key}=${value}`];
282
+ } else if (isRef(value)) {
283
+ value = formatProp(key, toRaw(value.value), true);
284
+ return raw ? value : [`${key}=Ref<`, value, `>`];
285
+ } else if (isFunction(value)) {
286
+ return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];
287
+ } else {
288
+ value = toRaw(value);
289
+ return raw ? value : [`${key}=`, value];
290
+ }
303
291
  }
304
292
 
305
293
  const ErrorTypeStrings = {
306
- ["sp" /* LifecycleHooks.SERVER_PREFETCH */]: 'serverPrefetch hook',
307
- ["bc" /* LifecycleHooks.BEFORE_CREATE */]: 'beforeCreate hook',
308
- ["c" /* LifecycleHooks.CREATED */]: 'created hook',
309
- ["bm" /* LifecycleHooks.BEFORE_MOUNT */]: 'beforeMount hook',
310
- ["m" /* LifecycleHooks.MOUNTED */]: 'mounted hook',
311
- ["bu" /* LifecycleHooks.BEFORE_UPDATE */]: 'beforeUpdate hook',
312
- ["u" /* LifecycleHooks.UPDATED */]: 'updated',
313
- ["bum" /* LifecycleHooks.BEFORE_UNMOUNT */]: 'beforeUnmount hook',
314
- ["um" /* LifecycleHooks.UNMOUNTED */]: 'unmounted hook',
315
- ["a" /* LifecycleHooks.ACTIVATED */]: 'activated hook',
316
- ["da" /* LifecycleHooks.DEACTIVATED */]: 'deactivated hook',
317
- ["ec" /* LifecycleHooks.ERROR_CAPTURED */]: 'errorCaptured hook',
318
- ["rtc" /* LifecycleHooks.RENDER_TRACKED */]: 'renderTracked hook',
319
- ["rtg" /* LifecycleHooks.RENDER_TRIGGERED */]: 'renderTriggered hook',
320
- [0 /* ErrorCodes.SETUP_FUNCTION */]: 'setup function',
321
- [1 /* ErrorCodes.RENDER_FUNCTION */]: 'render function',
322
- [2 /* ErrorCodes.WATCH_GETTER */]: 'watcher getter',
323
- [3 /* ErrorCodes.WATCH_CALLBACK */]: 'watcher callback',
324
- [4 /* ErrorCodes.WATCH_CLEANUP */]: 'watcher cleanup function',
325
- [5 /* ErrorCodes.NATIVE_EVENT_HANDLER */]: 'native event handler',
326
- [6 /* ErrorCodes.COMPONENT_EVENT_HANDLER */]: 'component event handler',
327
- [7 /* ErrorCodes.VNODE_HOOK */]: 'vnode hook',
328
- [8 /* ErrorCodes.DIRECTIVE_HOOK */]: 'directive hook',
329
- [9 /* ErrorCodes.TRANSITION_HOOK */]: 'transition hook',
330
- [10 /* ErrorCodes.APP_ERROR_HANDLER */]: 'app errorHandler',
331
- [11 /* ErrorCodes.APP_WARN_HANDLER */]: 'app warnHandler',
332
- [12 /* ErrorCodes.FUNCTION_REF */]: 'ref function',
333
- [13 /* ErrorCodes.ASYNC_COMPONENT_LOADER */]: 'async component loader',
334
- [14 /* ErrorCodes.SCHEDULER */]: 'scheduler flush. This is likely a Vue internals bug. ' +
335
- 'Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/core'
294
+ ["sp"]: "serverPrefetch hook",
295
+ ["bc"]: "beforeCreate hook",
296
+ ["c"]: "created hook",
297
+ ["bm"]: "beforeMount hook",
298
+ ["m"]: "mounted hook",
299
+ ["bu"]: "beforeUpdate hook",
300
+ ["u"]: "updated",
301
+ ["bum"]: "beforeUnmount hook",
302
+ ["um"]: "unmounted hook",
303
+ ["a"]: "activated hook",
304
+ ["da"]: "deactivated hook",
305
+ ["ec"]: "errorCaptured hook",
306
+ ["rtc"]: "renderTracked hook",
307
+ ["rtg"]: "renderTriggered hook",
308
+ [0]: "setup function",
309
+ [1]: "render function",
310
+ [2]: "watcher getter",
311
+ [3]: "watcher callback",
312
+ [4]: "watcher cleanup function",
313
+ [5]: "native event handler",
314
+ [6]: "component event handler",
315
+ [7]: "vnode hook",
316
+ [8]: "directive hook",
317
+ [9]: "transition hook",
318
+ [10]: "app errorHandler",
319
+ [11]: "app warnHandler",
320
+ [12]: "ref function",
321
+ [13]: "async component loader",
322
+ [14]: "scheduler flush. This is likely a Vue internals bug. Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/core"
336
323
  };
337
324
  function callWithErrorHandling(fn, instance, type, args) {
338
- let res;
339
- try {
340
- res = args ? fn(...args) : fn();
341
- }
342
- catch (err) {
343
- handleError(err, instance, type);
344
- }
345
- return res;
325
+ let res;
326
+ try {
327
+ res = args ? fn(...args) : fn();
328
+ } catch (err) {
329
+ handleError(err, instance, type);
330
+ }
331
+ return res;
346
332
  }
347
333
  function handleError(err, instance, type, throwInDev = true) {
348
- const contextVNode = instance ? instance.vnode : null;
349
- if (instance) {
350
- let cur = instance.parent;
351
- // the exposed instance is the render proxy to keep it consistent with 2.x
352
- const exposedInstance = instance.proxy;
353
- // in production the hook receives only the error code
354
- const errorInfo = (process.env.NODE_ENV !== 'production') ? ErrorTypeStrings[type] : type;
355
- while (cur) {
356
- const errorCapturedHooks = cur.ec;
357
- if (errorCapturedHooks) {
358
- for (let i = 0; i < errorCapturedHooks.length; i++) {
359
- if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {
360
- return;
361
- }
362
- }
363
- }
364
- cur = cur.parent;
365
- }
366
- // app-level handling
367
- const appErrorHandler = instance.appContext.config.errorHandler;
368
- if (appErrorHandler) {
369
- callWithErrorHandling(appErrorHandler, null, 10 /* ErrorCodes.APP_ERROR_HANDLER */, [err, exposedInstance, errorInfo]);
334
+ const contextVNode = instance ? instance.vnode : null;
335
+ if (instance) {
336
+ let cur = instance.parent;
337
+ const exposedInstance = instance.proxy;
338
+ const errorInfo = process.env.NODE_ENV !== "production" ? ErrorTypeStrings[type] : type;
339
+ while (cur) {
340
+ const errorCapturedHooks = cur.ec;
341
+ if (errorCapturedHooks) {
342
+ for (let i = 0; i < errorCapturedHooks.length; i++) {
343
+ if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {
370
344
  return;
345
+ }
371
346
  }
347
+ }
348
+ cur = cur.parent;
349
+ }
350
+ const appErrorHandler = instance.appContext.config.errorHandler;
351
+ if (appErrorHandler) {
352
+ callWithErrorHandling(
353
+ appErrorHandler,
354
+ null,
355
+ 10,
356
+ [err, exposedInstance, errorInfo]
357
+ );
358
+ return;
372
359
  }
373
- logError(err, type, contextVNode, throwInDev);
360
+ }
361
+ logError(err, type, contextVNode, throwInDev);
374
362
  }
375
363
  function logError(err, type, contextVNode, throwInDev = true) {
376
- if ((process.env.NODE_ENV !== 'production')) {
377
- const info = ErrorTypeStrings[type];
378
- if (contextVNode) {
379
- pushWarningContext(contextVNode);
380
- }
381
- warn(`Unhandled error${info ? ` during execution of ${info}` : ``}`);
382
- if (contextVNode) {
383
- popWarningContext();
384
- }
385
- // crash in dev by default so it's more noticeable
386
- if (throwInDev) {
387
- throw err;
388
- }
389
- else {
390
- console.error(err);
391
- }
364
+ if (process.env.NODE_ENV !== "production") {
365
+ const info = ErrorTypeStrings[type];
366
+ if (contextVNode) {
367
+ pushWarningContext(contextVNode);
392
368
  }
393
- else {
394
- // recover in prod to reduce the impact on end-user
395
- console.error(err);
369
+ warn(`Unhandled error${info ? ` during execution of ${info}` : ``}`);
370
+ if (contextVNode) {
371
+ popWarningContext();
396
372
  }
373
+ if (throwInDev) {
374
+ throw err;
375
+ } else {
376
+ console.error(err);
377
+ }
378
+ } else {
379
+ console.error(err);
380
+ }
397
381
  }
398
382
 
383
+ let globalCurrentInstanceSetters;
384
+ let settersKey = "__VUE_INSTANCE_SETTERS__";
385
+ {
386
+ if (!(globalCurrentInstanceSetters = getGlobalThis()[settersKey])) {
387
+ globalCurrentInstanceSetters = getGlobalThis()[settersKey] = [];
388
+ }
389
+ globalCurrentInstanceSetters.push((i) => i);
390
+ }
399
391
  const classifyRE = /(?:^|[-_])(\w)/g;
400
- const classify = (str) => str.replace(classifyRE, c => c.toUpperCase()).replace(/[-_]/g, '');
392
+ const classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, "");
401
393
  function getComponentName(Component, includeInferred = true) {
402
- return isFunction(Component)
403
- ? Component.displayName || Component.name
404
- : Component.name || (includeInferred && Component.__name);
394
+ return isFunction(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name;
405
395
  }
406
- /* istanbul ignore next */
407
396
  function formatComponentName(instance, Component, isRoot = false) {
408
- let name = getComponentName(Component);
409
- if (!name && Component.__file) {
410
- const match = Component.__file.match(/([^/\\]+)\.\w+$/);
411
- if (match) {
412
- name = match[1];
413
- }
414
- }
415
- if (!name && instance && instance.parent) {
416
- // try to infer the name based on reverse resolution
417
- const inferFromRegistry = (registry) => {
418
- for (const key in registry) {
419
- if (registry[key] === Component) {
420
- return key;
421
- }
422
- }
423
- };
424
- name =
425
- inferFromRegistry(instance.components ||
426
- instance.parent.type.components) || inferFromRegistry(instance.appContext.components);
427
- }
428
- return name ? classify(name) : isRoot ? `App` : `Anonymous`;
397
+ let name = getComponentName(Component);
398
+ if (!name && Component.__file) {
399
+ const match = Component.__file.match(/([^/\\]+)\.\w+$/);
400
+ if (match) {
401
+ name = match[1];
402
+ }
403
+ }
404
+ if (!name && instance && instance.parent) {
405
+ const inferFromRegistry = (registry) => {
406
+ for (const key in registry) {
407
+ if (registry[key] === Component) {
408
+ return key;
409
+ }
410
+ }
411
+ };
412
+ name = inferFromRegistry(
413
+ instance.components || instance.parent.type.components
414
+ ) || inferFromRegistry(instance.appContext.components);
415
+ }
416
+ return name ? classify(name) : isRoot ? `App` : `Anonymous`;
429
417
  }
430
418
 
431
419
  function ssrRenderList(source, renderItem) {
432
- if (isArray(source) || isString(source)) {
433
- for (let i = 0, l = source.length; i < l; i++) {
434
- renderItem(source[i], i);
435
- }
436
- }
437
- else if (typeof source === 'number') {
438
- if ((process.env.NODE_ENV !== 'production') && !Number.isInteger(source)) {
439
- warn(`The v-for range expect an integer value but got ${source}.`);
440
- return;
441
- }
442
- for (let i = 0; i < source; i++) {
443
- renderItem(i + 1, i);
444
- }
445
- }
446
- else if (isObject(source)) {
447
- if (source[Symbol.iterator]) {
448
- const arr = Array.from(source);
449
- for (let i = 0, l = arr.length; i < l; i++) {
450
- renderItem(arr[i], i);
451
- }
452
- }
453
- else {
454
- const keys = Object.keys(source);
455
- for (let i = 0, l = keys.length; i < l; i++) {
456
- const key = keys[i];
457
- renderItem(source[key], key, i);
458
- }
459
- }
460
- }
420
+ if (isArray(source) || isString(source)) {
421
+ for (let i = 0, l = source.length; i < l; i++) {
422
+ renderItem(source[i], i);
423
+ }
424
+ } else if (typeof source === "number") {
425
+ if (process.env.NODE_ENV !== "production" && !Number.isInteger(source)) {
426
+ warn(`The v-for range expect an integer value but got ${source}.`);
427
+ return;
428
+ }
429
+ for (let i = 0; i < source; i++) {
430
+ renderItem(i + 1, i);
431
+ }
432
+ } else if (isObject(source)) {
433
+ if (source[Symbol.iterator]) {
434
+ const arr = Array.from(source);
435
+ for (let i = 0, l = arr.length; i < l; i++) {
436
+ renderItem(arr[i], i);
437
+ }
438
+ } else {
439
+ const keys = Object.keys(source);
440
+ for (let i = 0, l = keys.length; i < l; i++) {
441
+ const key = keys[i];
442
+ renderItem(source[key], key, i);
443
+ }
444
+ }
445
+ }
461
446
  }
462
447
 
463
448
  async function ssrRenderSuspense(push, { default: renderContent }) {
464
- if (renderContent) {
465
- renderContent();
466
- }
467
- else {
468
- push(`<!---->`);
469
- }
449
+ if (renderContent) {
450
+ renderContent();
451
+ } else {
452
+ push(`<!---->`);
453
+ }
470
454
  }
471
455
 
472
456
  function ssrGetDirectiveProps(instance, dir, value, arg, modifiers = {}) {
473
- if (typeof dir !== 'function' && dir.getSSRProps) {
474
- return (dir.getSSRProps({
475
- dir,
476
- instance,
477
- value,
478
- oldValue: undefined,
479
- arg,
480
- modifiers
481
- }, null) || {});
482
- }
483
- return {};
457
+ if (typeof dir !== "function" && dir.getSSRProps) {
458
+ return dir.getSSRProps(
459
+ {
460
+ dir,
461
+ instance,
462
+ value,
463
+ oldValue: void 0,
464
+ arg,
465
+ modifiers
466
+ },
467
+ null
468
+ ) || {};
469
+ }
470
+ return {};
484
471
  }
485
472
 
486
473
  const ssrLooseEqual = looseEqual;
487
474
  function ssrLooseContain(arr, value) {
488
- return looseIndexOf(arr, value) > -1;
475
+ return looseIndexOf(arr, value) > -1;
489
476
  }
490
- // for <input :type="type" v-model="model" value="value">
491
477
  function ssrRenderDynamicModel(type, model, value) {
492
- switch (type) {
493
- case 'radio':
494
- return looseEqual(model, value) ? ' checked' : '';
495
- case 'checkbox':
496
- return (isArray(model) ? ssrLooseContain(model, value) : model)
497
- ? ' checked'
498
- : '';
499
- default:
500
- // text types
501
- return ssrRenderAttr('value', model);
502
- }
503
- }
504
- // for <input v-bind="obj" v-model="model">
478
+ switch (type) {
479
+ case "radio":
480
+ return looseEqual(model, value) ? " checked" : "";
481
+ case "checkbox":
482
+ return (isArray(model) ? ssrLooseContain(model, value) : model) ? " checked" : "";
483
+ default:
484
+ return ssrRenderAttr("value", model);
485
+ }
486
+ }
505
487
  function ssrGetDynamicModelProps(existingProps = {}, model) {
506
- const { type, value } = existingProps;
507
- switch (type) {
508
- case 'radio':
509
- return looseEqual(model, value) ? { checked: true } : null;
510
- case 'checkbox':
511
- return (isArray(model) ? ssrLooseContain(model, value) : model)
512
- ? { checked: true }
513
- : null;
514
- default:
515
- // text types
516
- return { value: model };
517
- }
488
+ const { type, value } = existingProps;
489
+ switch (type) {
490
+ case "radio":
491
+ return looseEqual(model, value) ? { checked: true } : null;
492
+ case "checkbox":
493
+ return (isArray(model) ? ssrLooseContain(model, value) : model) ? { checked: true } : null;
494
+ default:
495
+ return { value: model };
496
+ }
518
497
  }
519
498
 
520
499
  function ssrCompile(template, instance) {
521
- // TODO: this branch should now work in ESM builds, enable it in a minor
522
- {
523
- throw new Error(`On-the-fly template compilation is not supported in the ESM build of ` +
524
- `@vue/server-renderer. All templates must be pre-compiled into ` +
525
- `render functions.`);
526
- }
500
+ {
501
+ throw new Error(
502
+ `On-the-fly template compilation is not supported in the ESM build of @vue/server-renderer. All templates must be pre-compiled into render functions.`
503
+ );
504
+ }
527
505
  }
528
506
 
529
- const { createComponentInstance, setCurrentRenderingInstance, setupComponent, renderComponentRoot, normalizeVNode } = ssrUtils;
530
- // Each component has a buffer array.
531
- // A buffer array can contain one of the following:
532
- // - plain string
533
- // - A resolved buffer (recursive arrays of strings that can be unrolled
534
- // synchronously)
535
- // - An async buffer (a Promise that resolves to a resolved buffer)
507
+ const {
508
+ createComponentInstance,
509
+ setCurrentRenderingInstance,
510
+ setupComponent,
511
+ renderComponentRoot,
512
+ normalizeVNode
513
+ } = ssrUtils;
536
514
  function createBuffer() {
537
- let appendable = false;
538
- const buffer = [];
539
- return {
540
- getBuffer() {
541
- // Return static buffer and await on items during unroll stage
542
- return buffer;
543
- },
544
- push(item) {
545
- const isStringItem = isString(item);
546
- if (appendable && isStringItem) {
547
- buffer[buffer.length - 1] += item;
548
- }
549
- else {
550
- buffer.push(item);
551
- }
552
- appendable = isStringItem;
553
- if (isPromise(item) || (isArray(item) && item.hasAsync)) {
554
- // promise, or child buffer with async, mark as async.
555
- // this allows skipping unnecessary await ticks during unroll stage
556
- buffer.hasAsync = true;
557
- }
558
- }
559
- };
515
+ let appendable = false;
516
+ const buffer = [];
517
+ return {
518
+ getBuffer() {
519
+ return buffer;
520
+ },
521
+ push(item) {
522
+ const isStringItem = isString(item);
523
+ if (appendable && isStringItem) {
524
+ buffer[buffer.length - 1] += item;
525
+ } else {
526
+ buffer.push(item);
527
+ }
528
+ appendable = isStringItem;
529
+ if (isPromise(item) || isArray(item) && item.hasAsync) {
530
+ buffer.hasAsync = true;
531
+ }
532
+ }
533
+ };
560
534
  }
561
535
  function renderComponentVNode(vnode, parentComponent = null, slotScopeId) {
562
- const instance = createComponentInstance(vnode, parentComponent, null);
563
- const res = setupComponent(instance, true /* isSSR */);
564
- const hasAsyncSetup = isPromise(res);
565
- const prefetches = instance.sp; /* LifecycleHooks.SERVER_PREFETCH */
566
- if (hasAsyncSetup || prefetches) {
567
- let p = hasAsyncSetup
568
- ? res
569
- : Promise.resolve();
570
- if (prefetches) {
571
- p = p
572
- .then(() => Promise.all(prefetches.map(prefetch => prefetch.call(instance.proxy))))
573
- // Note: error display is already done by the wrapped lifecycle hook function.
574
- .catch(() => { });
575
- }
576
- return p.then(() => renderComponentSubTree(instance, slotScopeId));
577
- }
578
- else {
579
- return renderComponentSubTree(instance, slotScopeId);
580
- }
536
+ const instance = createComponentInstance(vnode, parentComponent, null);
537
+ const res = setupComponent(
538
+ instance,
539
+ true
540
+ /* isSSR */
541
+ );
542
+ const hasAsyncSetup = isPromise(res);
543
+ const prefetches = instance.sp;
544
+ if (hasAsyncSetup || prefetches) {
545
+ let p = hasAsyncSetup ? res : Promise.resolve();
546
+ if (prefetches) {
547
+ p = p.then(
548
+ () => Promise.all(prefetches.map((prefetch) => prefetch.call(instance.proxy)))
549
+ ).catch(() => {
550
+ });
551
+ }
552
+ return p.then(() => renderComponentSubTree(instance, slotScopeId));
553
+ } else {
554
+ return renderComponentSubTree(instance, slotScopeId);
555
+ }
581
556
  }
582
557
  function renderComponentSubTree(instance, slotScopeId) {
583
- const comp = instance.type;
584
- const { getBuffer, push } = createBuffer();
585
- if (isFunction(comp)) {
586
- let root = renderComponentRoot(instance);
587
- // #5817 scope ID attrs not falling through if functional component doesn't
588
- // have props
589
- if (!comp.props) {
590
- for (const key in instance.attrs) {
591
- if (key.startsWith(`data-v-`)) {
592
- (root.props || (root.props = {}))[key] = ``;
593
- }
594
- }
595
- }
596
- renderVNode(push, (instance.subTree = root), instance, slotScopeId);
597
- }
598
- else {
599
- if ((!instance.render || instance.render === NOOP) &&
600
- !instance.ssrRender &&
601
- !comp.ssrRender &&
602
- isString(comp.template)) {
603
- comp.ssrRender = ssrCompile(comp.template);
604
- }
605
- // perf: enable caching of computed getters during render
606
- // since there cannot be state mutations during render.
607
- for (const e of instance.scope.effects) {
608
- if (e.computed)
609
- e.computed._cacheable = true;
610
- }
611
- const ssrRender = instance.ssrRender || comp.ssrRender;
612
- if (ssrRender) {
613
- // optimized
614
- // resolve fallthrough attrs
615
- let attrs = instance.inheritAttrs !== false ? instance.attrs : undefined;
616
- let hasCloned = false;
617
- let cur = instance;
618
- while (true) {
619
- const scopeId = cur.vnode.scopeId;
620
- if (scopeId) {
621
- if (!hasCloned) {
622
- attrs = { ...attrs };
623
- hasCloned = true;
624
- }
625
- attrs[scopeId] = '';
626
- }
627
- const parent = cur.parent;
628
- if (parent && parent.subTree && parent.subTree === cur.vnode) {
629
- // parent is a non-SSR compiled component and is rendering this
630
- // component as root. inherit its scopeId if present.
631
- cur = parent;
632
- }
633
- else {
634
- break;
635
- }
636
- }
637
- if (slotScopeId) {
638
- if (!hasCloned)
639
- attrs = { ...attrs };
640
- attrs[slotScopeId.trim()] = '';
641
- }
642
- // set current rendering instance for asset resolution
643
- const prev = setCurrentRenderingInstance(instance);
644
- try {
645
- ssrRender(instance.proxy, push, instance, attrs,
646
- // compiler-optimized bindings
647
- instance.props, instance.setupState, instance.data, instance.ctx);
648
- }
649
- finally {
650
- setCurrentRenderingInstance(prev);
651
- }
652
- }
653
- else if (instance.render && instance.render !== NOOP) {
654
- renderVNode(push, (instance.subTree = renderComponentRoot(instance)), instance, slotScopeId);
655
- }
656
- else {
657
- const componentName = comp.name || comp.__file || `<Anonymous>`;
658
- warn$1(`Component ${componentName} is missing template or render function.`);
659
- push(`<!---->`);
660
- }
661
- }
662
- return getBuffer();
558
+ const comp = instance.type;
559
+ const { getBuffer, push } = createBuffer();
560
+ if (isFunction(comp)) {
561
+ let root = renderComponentRoot(instance);
562
+ if (!comp.props) {
563
+ for (const key in instance.attrs) {
564
+ if (key.startsWith(`data-v-`)) {
565
+ (root.props || (root.props = {}))[key] = ``;
566
+ }
567
+ }
568
+ }
569
+ renderVNode(push, instance.subTree = root, instance, slotScopeId);
570
+ } else {
571
+ if ((!instance.render || instance.render === NOOP) && !instance.ssrRender && !comp.ssrRender && isString(comp.template)) {
572
+ comp.ssrRender = ssrCompile(comp.template);
573
+ }
574
+ for (const e of instance.scope.effects) {
575
+ if (e.computed)
576
+ e.computed._cacheable = true;
577
+ }
578
+ const ssrRender = instance.ssrRender || comp.ssrRender;
579
+ if (ssrRender) {
580
+ let attrs = instance.inheritAttrs !== false ? instance.attrs : void 0;
581
+ let hasCloned = false;
582
+ let cur = instance;
583
+ while (true) {
584
+ const scopeId = cur.vnode.scopeId;
585
+ if (scopeId) {
586
+ if (!hasCloned) {
587
+ attrs = { ...attrs };
588
+ hasCloned = true;
589
+ }
590
+ attrs[scopeId] = "";
591
+ }
592
+ const parent = cur.parent;
593
+ if (parent && parent.subTree && parent.subTree === cur.vnode) {
594
+ cur = parent;
595
+ } else {
596
+ break;
597
+ }
598
+ }
599
+ if (slotScopeId) {
600
+ if (!hasCloned)
601
+ attrs = { ...attrs };
602
+ attrs[slotScopeId.trim()] = "";
603
+ }
604
+ const prev = setCurrentRenderingInstance(instance);
605
+ try {
606
+ ssrRender(
607
+ instance.proxy,
608
+ push,
609
+ instance,
610
+ attrs,
611
+ // compiler-optimized bindings
612
+ instance.props,
613
+ instance.setupState,
614
+ instance.data,
615
+ instance.ctx
616
+ );
617
+ } finally {
618
+ setCurrentRenderingInstance(prev);
619
+ }
620
+ } else if (instance.render && instance.render !== NOOP) {
621
+ renderVNode(
622
+ push,
623
+ instance.subTree = renderComponentRoot(instance),
624
+ instance,
625
+ slotScopeId
626
+ );
627
+ } else {
628
+ const componentName = comp.name || comp.__file || `<Anonymous>`;
629
+ warn$1(`Component ${componentName} is missing template or render function.`);
630
+ push(`<!---->`);
631
+ }
632
+ }
633
+ return getBuffer();
663
634
  }
664
635
  function renderVNode(push, vnode, parentComponent, slotScopeId) {
665
- const { type, shapeFlag, children } = vnode;
666
- switch (type) {
667
- case Text:
668
- push(escapeHtml(children));
669
- break;
670
- case Comment:
671
- push(children ? `<!--${escapeHtmlComment(children)}-->` : `<!---->`);
672
- break;
673
- case Static:
674
- push(children);
675
- break;
676
- case Fragment:
677
- if (vnode.slotScopeIds) {
678
- slotScopeId =
679
- (slotScopeId ? slotScopeId + ' ' : '') + vnode.slotScopeIds.join(' ');
680
- }
681
- push(`<!--[-->`); // open
682
- renderVNodeChildren(push, children, parentComponent, slotScopeId);
683
- push(`<!--]-->`); // close
684
- break;
685
- default:
686
- if (shapeFlag & 1 /* ShapeFlags.ELEMENT */) {
687
- renderElementVNode(push, vnode, parentComponent, slotScopeId);
688
- }
689
- else if (shapeFlag & 6 /* ShapeFlags.COMPONENT */) {
690
- push(renderComponentVNode(vnode, parentComponent, slotScopeId));
691
- }
692
- else if (shapeFlag & 64 /* ShapeFlags.TELEPORT */) {
693
- renderTeleportVNode(push, vnode, parentComponent, slotScopeId);
694
- }
695
- else if (shapeFlag & 128 /* ShapeFlags.SUSPENSE */) {
696
- renderVNode(push, vnode.ssContent, parentComponent, slotScopeId);
697
- }
698
- else {
699
- warn$1('[@vue/server-renderer] Invalid VNode type:', type, `(${typeof type})`);
700
- }
701
- }
636
+ const { type, shapeFlag, children } = vnode;
637
+ switch (type) {
638
+ case Text:
639
+ push(escapeHtml(children));
640
+ break;
641
+ case Comment:
642
+ push(
643
+ children ? `<!--${escapeHtmlComment(children)}-->` : `<!---->`
644
+ );
645
+ break;
646
+ case Static:
647
+ push(children);
648
+ break;
649
+ case Fragment:
650
+ if (vnode.slotScopeIds) {
651
+ slotScopeId = (slotScopeId ? slotScopeId + " " : "") + vnode.slotScopeIds.join(" ");
652
+ }
653
+ push(`<!--[-->`);
654
+ renderVNodeChildren(
655
+ push,
656
+ children,
657
+ parentComponent,
658
+ slotScopeId
659
+ );
660
+ push(`<!--]-->`);
661
+ break;
662
+ default:
663
+ if (shapeFlag & 1) {
664
+ renderElementVNode(push, vnode, parentComponent, slotScopeId);
665
+ } else if (shapeFlag & 6) {
666
+ push(renderComponentVNode(vnode, parentComponent, slotScopeId));
667
+ } else if (shapeFlag & 64) {
668
+ renderTeleportVNode(push, vnode, parentComponent, slotScopeId);
669
+ } else if (shapeFlag & 128) {
670
+ renderVNode(push, vnode.ssContent, parentComponent, slotScopeId);
671
+ } else {
672
+ warn$1(
673
+ "[@vue/server-renderer] Invalid VNode type:",
674
+ type,
675
+ `(${typeof type})`
676
+ );
677
+ }
678
+ }
702
679
  }
703
680
  function renderVNodeChildren(push, children, parentComponent, slotScopeId) {
704
- for (let i = 0; i < children.length; i++) {
705
- renderVNode(push, normalizeVNode(children[i]), parentComponent, slotScopeId);
706
- }
681
+ for (let i = 0; i < children.length; i++) {
682
+ renderVNode(push, normalizeVNode(children[i]), parentComponent, slotScopeId);
683
+ }
707
684
  }
708
685
  function renderElementVNode(push, vnode, parentComponent, slotScopeId) {
709
- const tag = vnode.type;
710
- let { props, children, shapeFlag, scopeId, dirs } = vnode;
711
- let openTag = `<${tag}`;
712
- if (dirs) {
713
- props = applySSRDirectives(vnode, props, dirs);
714
- }
686
+ const tag = vnode.type;
687
+ let { props, children, shapeFlag, scopeId, dirs } = vnode;
688
+ let openTag = `<${tag}`;
689
+ if (dirs) {
690
+ props = applySSRDirectives(vnode, props, dirs);
691
+ }
692
+ if (props) {
693
+ openTag += ssrRenderAttrs(props, tag);
694
+ }
695
+ if (scopeId) {
696
+ openTag += ` ${scopeId}`;
697
+ }
698
+ let curParent = parentComponent;
699
+ let curVnode = vnode;
700
+ while (curParent && curVnode === curParent.subTree) {
701
+ curVnode = curParent.vnode;
702
+ if (curVnode.scopeId) {
703
+ openTag += ` ${curVnode.scopeId}`;
704
+ }
705
+ curParent = curParent.parent;
706
+ }
707
+ if (slotScopeId) {
708
+ openTag += ` ${slotScopeId}`;
709
+ }
710
+ push(openTag + `>`);
711
+ if (!isVoidTag(tag)) {
712
+ let hasChildrenOverride = false;
715
713
  if (props) {
716
- openTag += ssrRenderAttrs(props, tag);
717
- }
718
- if (scopeId) {
719
- openTag += ` ${scopeId}`;
720
- }
721
- // inherit parent chain scope id if this is the root node
722
- let curParent = parentComponent;
723
- let curVnode = vnode;
724
- while (curParent && curVnode === curParent.subTree) {
725
- curVnode = curParent.vnode;
726
- if (curVnode.scopeId) {
727
- openTag += ` ${curVnode.scopeId}`;
728
- }
729
- curParent = curParent.parent;
730
- }
731
- if (slotScopeId) {
732
- openTag += ` ${slotScopeId}`;
733
- }
734
- push(openTag + `>`);
735
- if (!isVoidTag(tag)) {
736
- let hasChildrenOverride = false;
737
- if (props) {
738
- if (props.innerHTML) {
739
- hasChildrenOverride = true;
740
- push(props.innerHTML);
741
- }
742
- else if (props.textContent) {
743
- hasChildrenOverride = true;
744
- push(escapeHtml(props.textContent));
745
- }
746
- else if (tag === 'textarea' && props.value) {
747
- hasChildrenOverride = true;
748
- push(escapeHtml(props.value));
749
- }
750
- }
751
- if (!hasChildrenOverride) {
752
- if (shapeFlag & 8 /* ShapeFlags.TEXT_CHILDREN */) {
753
- push(escapeHtml(children));
754
- }
755
- else if (shapeFlag & 16 /* ShapeFlags.ARRAY_CHILDREN */) {
756
- renderVNodeChildren(push, children, parentComponent, slotScopeId);
757
- }
758
- }
759
- push(`</${tag}>`);
760
- }
714
+ if (props.innerHTML) {
715
+ hasChildrenOverride = true;
716
+ push(props.innerHTML);
717
+ } else if (props.textContent) {
718
+ hasChildrenOverride = true;
719
+ push(escapeHtml(props.textContent));
720
+ } else if (tag === "textarea" && props.value) {
721
+ hasChildrenOverride = true;
722
+ push(escapeHtml(props.value));
723
+ }
724
+ }
725
+ if (!hasChildrenOverride) {
726
+ if (shapeFlag & 8) {
727
+ push(escapeHtml(children));
728
+ } else if (shapeFlag & 16) {
729
+ renderVNodeChildren(
730
+ push,
731
+ children,
732
+ parentComponent,
733
+ slotScopeId
734
+ );
735
+ }
736
+ }
737
+ push(`</${tag}>`);
738
+ }
761
739
  }
762
740
  function applySSRDirectives(vnode, rawProps, dirs) {
763
- const toMerge = [];
764
- for (let i = 0; i < dirs.length; i++) {
765
- const binding = dirs[i];
766
- const { dir: { getSSRProps } } = binding;
767
- if (getSSRProps) {
768
- const props = getSSRProps(binding, vnode);
769
- if (props)
770
- toMerge.push(props);
771
- }
772
- }
773
- return mergeProps(rawProps || {}, ...toMerge);
741
+ const toMerge = [];
742
+ for (let i = 0; i < dirs.length; i++) {
743
+ const binding = dirs[i];
744
+ const {
745
+ dir: { getSSRProps }
746
+ } = binding;
747
+ if (getSSRProps) {
748
+ const props = getSSRProps(binding, vnode);
749
+ if (props)
750
+ toMerge.push(props);
751
+ }
752
+ }
753
+ return mergeProps(rawProps || {}, ...toMerge);
774
754
  }
775
755
  function renderTeleportVNode(push, vnode, parentComponent, slotScopeId) {
776
- const target = vnode.props && vnode.props.to;
777
- const disabled = vnode.props && vnode.props.disabled;
778
- if (!target) {
779
- if (!disabled) {
780
- warn$1(`[@vue/server-renderer] Teleport is missing target prop.`);
781
- }
782
- return [];
783
- }
784
- if (!isString(target)) {
785
- warn$1(`[@vue/server-renderer] Teleport target must be a query selector string.`);
786
- return [];
787
- }
788
- ssrRenderTeleport(push, push => {
789
- renderVNodeChildren(push, vnode.children, parentComponent, slotScopeId);
790
- }, target, disabled || disabled === '', parentComponent);
756
+ const target = vnode.props && vnode.props.to;
757
+ const disabled = vnode.props && vnode.props.disabled;
758
+ if (!target) {
759
+ if (!disabled) {
760
+ warn$1(`[@vue/server-renderer] Teleport is missing target prop.`);
761
+ }
762
+ return [];
763
+ }
764
+ if (!isString(target)) {
765
+ warn$1(
766
+ `[@vue/server-renderer] Teleport target must be a query selector string.`
767
+ );
768
+ return [];
769
+ }
770
+ ssrRenderTeleport(
771
+ push,
772
+ (push2) => {
773
+ renderVNodeChildren(
774
+ push2,
775
+ vnode.children,
776
+ parentComponent,
777
+ slotScopeId
778
+ );
779
+ },
780
+ target,
781
+ disabled || disabled === "",
782
+ parentComponent
783
+ );
791
784
  }
792
785
 
793
786
  const { isVNode: isVNode$1 } = ssrUtils;
794
787
  async function unrollBuffer$1(buffer) {
795
- if (buffer.hasAsync) {
796
- let ret = '';
797
- for (let i = 0; i < buffer.length; i++) {
798
- let item = buffer[i];
799
- if (isPromise(item)) {
800
- item = await item;
801
- }
802
- if (isString(item)) {
803
- ret += item;
804
- }
805
- else {
806
- ret += await unrollBuffer$1(item);
807
- }
808
- }
809
- return ret;
810
- }
811
- else {
812
- // sync buffer can be more efficiently unrolled without unnecessary await
813
- // ticks
814
- return unrollBufferSync$1(buffer);
788
+ if (buffer.hasAsync) {
789
+ let ret = "";
790
+ for (let i = 0; i < buffer.length; i++) {
791
+ let item = buffer[i];
792
+ if (isPromise(item)) {
793
+ item = await item;
794
+ }
795
+ if (isString(item)) {
796
+ ret += item;
797
+ } else {
798
+ ret += await unrollBuffer$1(item);
799
+ }
815
800
  }
801
+ return ret;
802
+ } else {
803
+ return unrollBufferSync$1(buffer);
804
+ }
816
805
  }
817
806
  function unrollBufferSync$1(buffer) {
818
- let ret = '';
819
- for (let i = 0; i < buffer.length; i++) {
820
- let item = buffer[i];
821
- if (isString(item)) {
822
- ret += item;
823
- }
824
- else {
825
- // since this is a sync buffer, child buffers are never promises
826
- ret += unrollBufferSync$1(item);
827
- }
807
+ let ret = "";
808
+ for (let i = 0; i < buffer.length; i++) {
809
+ let item = buffer[i];
810
+ if (isString(item)) {
811
+ ret += item;
812
+ } else {
813
+ ret += unrollBufferSync$1(item);
828
814
  }
829
- return ret;
815
+ }
816
+ return ret;
830
817
  }
831
818
  async function renderToString(input, context = {}) {
832
- if (isVNode$1(input)) {
833
- // raw vnode, wrap with app (for context)
834
- return renderToString(createApp({ render: () => input }), context);
835
- }
836
- // rendering an app
837
- const vnode = createVNode(input._component, input._props);
838
- vnode.appContext = input._context;
839
- // provide the ssr context to the tree
840
- input.provide(ssrContextKey, context);
841
- const buffer = await renderComponentVNode(vnode);
842
- const result = await unrollBuffer$1(buffer);
843
- await resolveTeleports(context);
844
- if (context.__watcherHandles) {
845
- for (const unwatch of context.__watcherHandles) {
846
- unwatch();
847
- }
848
- }
849
- return result;
819
+ if (isVNode$1(input)) {
820
+ return renderToString(createApp({ render: () => input }), context);
821
+ }
822
+ const vnode = createVNode(input._component, input._props);
823
+ vnode.appContext = input._context;
824
+ input.provide(ssrContextKey, context);
825
+ const buffer = await renderComponentVNode(vnode);
826
+ const result = await unrollBuffer$1(buffer);
827
+ await resolveTeleports(context);
828
+ if (context.__watcherHandles) {
829
+ for (const unwatch of context.__watcherHandles) {
830
+ unwatch();
831
+ }
832
+ }
833
+ return result;
850
834
  }
851
835
  async function resolveTeleports(context) {
852
- if (context.__teleportBuffers) {
853
- context.teleports = context.teleports || {};
854
- for (const key in context.__teleportBuffers) {
855
- // note: it's OK to await sequentially here because the Promises were
856
- // created eagerly in parallel.
857
- context.teleports[key] = await unrollBuffer$1(await Promise.all([context.__teleportBuffers[key]]));
858
- }
836
+ if (context.__teleportBuffers) {
837
+ context.teleports = context.teleports || {};
838
+ for (const key in context.__teleportBuffers) {
839
+ context.teleports[key] = await unrollBuffer$1(
840
+ await Promise.all([context.__teleportBuffers[key]])
841
+ );
859
842
  }
843
+ }
860
844
  }
861
845
 
862
846
  const { isVNode } = ssrUtils;
863
847
  async function unrollBuffer(buffer, stream) {
864
- if (buffer.hasAsync) {
865
- for (let i = 0; i < buffer.length; i++) {
866
- let item = buffer[i];
867
- if (isPromise(item)) {
868
- item = await item;
869
- }
870
- if (isString(item)) {
871
- stream.push(item);
872
- }
873
- else {
874
- await unrollBuffer(item, stream);
875
- }
876
- }
877
- }
878
- else {
879
- // sync buffer can be more efficiently unrolled without unnecessary await
880
- // ticks
881
- unrollBufferSync(buffer, stream);
882
- }
848
+ if (buffer.hasAsync) {
849
+ for (let i = 0; i < buffer.length; i++) {
850
+ let item = buffer[i];
851
+ if (isPromise(item)) {
852
+ item = await item;
853
+ }
854
+ if (isString(item)) {
855
+ stream.push(item);
856
+ } else {
857
+ await unrollBuffer(item, stream);
858
+ }
859
+ }
860
+ } else {
861
+ unrollBufferSync(buffer, stream);
862
+ }
883
863
  }
884
864
  function unrollBufferSync(buffer, stream) {
885
- for (let i = 0; i < buffer.length; i++) {
886
- let item = buffer[i];
887
- if (isString(item)) {
888
- stream.push(item);
889
- }
890
- else {
891
- // since this is a sync buffer, child buffers are never promises
892
- unrollBufferSync(item, stream);
893
- }
865
+ for (let i = 0; i < buffer.length; i++) {
866
+ let item = buffer[i];
867
+ if (isString(item)) {
868
+ stream.push(item);
869
+ } else {
870
+ unrollBufferSync(item, stream);
894
871
  }
872
+ }
895
873
  }
896
874
  function renderToSimpleStream(input, context, stream) {
897
- if (isVNode(input)) {
898
- // raw vnode, wrap with app (for context)
899
- return renderToSimpleStream(createApp({ render: () => input }), context, stream);
900
- }
901
- // rendering an app
902
- const vnode = createVNode(input._component, input._props);
903
- vnode.appContext = input._context;
904
- // provide the ssr context to the tree
905
- input.provide(ssrContextKey, context);
906
- Promise.resolve(renderComponentVNode(vnode))
907
- .then(buffer => unrollBuffer(buffer, stream))
908
- .then(() => resolveTeleports(context))
909
- .then(() => {
910
- if (context.__watcherHandles) {
911
- for (const unwatch of context.__watcherHandles) {
912
- unwatch();
913
- }
914
- }
915
- })
916
- .then(() => stream.push(null))
917
- .catch(error => {
918
- stream.destroy(error);
919
- });
920
- return stream;
921
- }
922
- /**
923
- * @deprecated
924
- */
875
+ if (isVNode(input)) {
876
+ return renderToSimpleStream(
877
+ createApp({ render: () => input }),
878
+ context,
879
+ stream
880
+ );
881
+ }
882
+ const vnode = createVNode(input._component, input._props);
883
+ vnode.appContext = input._context;
884
+ input.provide(ssrContextKey, context);
885
+ Promise.resolve(renderComponentVNode(vnode)).then((buffer) => unrollBuffer(buffer, stream)).then(() => resolveTeleports(context)).then(() => {
886
+ if (context.__watcherHandles) {
887
+ for (const unwatch of context.__watcherHandles) {
888
+ unwatch();
889
+ }
890
+ }
891
+ }).then(() => stream.push(null)).catch((error) => {
892
+ stream.destroy(error);
893
+ });
894
+ return stream;
895
+ }
925
896
  function renderToStream(input, context = {}) {
926
- console.warn(`[@vue/server-renderer] renderToStream is deprecated - use renderToNodeStream instead.`);
927
- return renderToNodeStream(input, context);
897
+ console.warn(
898
+ `[@vue/server-renderer] renderToStream is deprecated - use renderToNodeStream instead.`
899
+ );
900
+ return renderToNodeStream(input, context);
928
901
  }
929
902
  function renderToNodeStream(input, context = {}) {
930
- {
931
- throw new Error(`ESM build of renderToStream() does not support renderToNodeStream(). ` +
932
- `Use pipeToNodeWritable() with an existing Node.js Writable stream ` +
933
- `instance instead.`);
934
- }
903
+ {
904
+ throw new Error(
905
+ `ESM build of renderToStream() does not support renderToNodeStream(). Use pipeToNodeWritable() with an existing Node.js Writable stream instance instead.`
906
+ );
907
+ }
935
908
  }
936
909
  function pipeToNodeWritable(input, context = {}, writable) {
937
- renderToSimpleStream(input, context, {
938
- push(content) {
939
- if (content != null) {
940
- writable.write(content);
941
- }
942
- else {
943
- writable.end();
944
- }
945
- },
946
- destroy(err) {
947
- writable.destroy(err);
948
- }
949
- });
910
+ renderToSimpleStream(input, context, {
911
+ push(content) {
912
+ if (content != null) {
913
+ writable.write(content);
914
+ } else {
915
+ writable.end();
916
+ }
917
+ },
918
+ destroy(err) {
919
+ writable.destroy(err);
920
+ }
921
+ });
950
922
  }
951
923
  function renderToWebStream(input, context = {}) {
952
- if (typeof ReadableStream !== 'function') {
953
- throw new Error(`ReadableStream constructor is not available in the global scope. ` +
954
- `If the target environment does support web streams, consider using ` +
955
- `pipeToWebWritable() with an existing WritableStream instance instead.`);
956
- }
957
- const encoder = new TextEncoder();
958
- let cancelled = false;
959
- return new ReadableStream({
960
- start(controller) {
961
- renderToSimpleStream(input, context, {
962
- push(content) {
963
- if (cancelled)
964
- return;
965
- if (content != null) {
966
- controller.enqueue(encoder.encode(content));
967
- }
968
- else {
969
- controller.close();
970
- }
971
- },
972
- destroy(err) {
973
- controller.error(err);
974
- }
975
- });
924
+ if (typeof ReadableStream !== "function") {
925
+ throw new Error(
926
+ `ReadableStream constructor is not available in the global scope. If the target environment does support web streams, consider using pipeToWebWritable() with an existing WritableStream instance instead.`
927
+ );
928
+ }
929
+ const encoder = new TextEncoder();
930
+ let cancelled = false;
931
+ return new ReadableStream({
932
+ start(controller) {
933
+ renderToSimpleStream(input, context, {
934
+ push(content) {
935
+ if (cancelled)
936
+ return;
937
+ if (content != null) {
938
+ controller.enqueue(encoder.encode(content));
939
+ } else {
940
+ controller.close();
941
+ }
976
942
  },
977
- cancel() {
978
- cancelled = true;
943
+ destroy(err) {
944
+ controller.error(err);
979
945
  }
980
- });
946
+ });
947
+ },
948
+ cancel() {
949
+ cancelled = true;
950
+ }
951
+ });
981
952
  }
982
953
  function pipeToWebWritable(input, context = {}, writable) {
983
- const writer = writable.getWriter();
984
- const encoder = new TextEncoder();
985
- // #4287 CloudFlare workers do not implement `ready` property
986
- let hasReady = false;
987
- try {
988
- hasReady = isPromise(writer.ready);
989
- }
990
- catch (e) { }
991
- renderToSimpleStream(input, context, {
992
- async push(content) {
993
- if (hasReady) {
994
- await writer.ready;
995
- }
996
- if (content != null) {
997
- return writer.write(encoder.encode(content));
998
- }
999
- else {
1000
- return writer.close();
1001
- }
1002
- },
1003
- destroy(err) {
1004
- // TODO better error handling?
1005
- console.log(err);
1006
- writer.close();
1007
- }
1008
- });
954
+ const writer = writable.getWriter();
955
+ const encoder = new TextEncoder();
956
+ let hasReady = false;
957
+ try {
958
+ hasReady = isPromise(writer.ready);
959
+ } catch (e) {
960
+ }
961
+ renderToSimpleStream(input, context, {
962
+ async push(content) {
963
+ if (hasReady) {
964
+ await writer.ready;
965
+ }
966
+ if (content != null) {
967
+ return writer.write(encoder.encode(content));
968
+ } else {
969
+ return writer.close();
970
+ }
971
+ },
972
+ destroy(err) {
973
+ console.log(err);
974
+ writer.close();
975
+ }
976
+ });
1009
977
  }
1010
978
 
1011
979
  initDirectivesForSSR();