server-renderer.esm-bundler.js 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117
  1. /**
  2. * @vue/server-renderer v3.4.23
  3. * (c) 2018-present Yuxi (Evan) You and Vue contributors
  4. * @license MIT
  5. **/
  6. import { createVNode, ssrContextKey, warn as warn$2, Fragment, Static, Comment, Text, mergeProps, ssrUtils, createApp, initDirectivesForSSR } from 'vue';
  7. import { isOn, isRenderableAttrValue, isSVGTag, propsToAttrMap, isBooleanAttr, includeBooleanAttr, isSSRSafeAttrName, escapeHtml, normalizeClass, isString, normalizeStyle, stringifyStyle, makeMap, isArray, toDisplayString, extend, isFunction, getGlobalThis, NOOP, isObject, looseEqual, looseIndexOf, isPromise, escapeHtmlComment, isVoidTag } from '@vue/shared';
  8. export { includeBooleanAttr as ssrIncludeBooleanAttr } from '@vue/shared';
  9. const shouldIgnoreProp = /* @__PURE__ */ makeMap(
  10. `,key,ref,innerHTML,textContent,ref_key,ref_for`
  11. );
  12. function ssrRenderAttrs(props, tag) {
  13. let ret = "";
  14. for (const key in props) {
  15. if (shouldIgnoreProp(key) || isOn(key) || tag === "textarea" && key === "value") {
  16. continue;
  17. }
  18. const value = props[key];
  19. if (key === "class") {
  20. ret += ` class="${ssrRenderClass(value)}"`;
  21. } else if (key === "style") {
  22. ret += ` style="${ssrRenderStyle(value)}"`;
  23. } else {
  24. ret += ssrRenderDynamicAttr(key, value, tag);
  25. }
  26. }
  27. return ret;
  28. }
  29. function ssrRenderDynamicAttr(key, value, tag) {
  30. if (!isRenderableAttrValue(value)) {
  31. return ``;
  32. }
  33. const attrKey = tag && (tag.indexOf("-") > 0 || isSVGTag(tag)) ? key : propsToAttrMap[key] || key.toLowerCase();
  34. if (isBooleanAttr(attrKey)) {
  35. return includeBooleanAttr(value) ? ` ${attrKey}` : ``;
  36. } else if (isSSRSafeAttrName(attrKey)) {
  37. return value === "" ? ` ${attrKey}` : ` ${attrKey}="${escapeHtml(value)}"`;
  38. } else {
  39. console.warn(
  40. `[@vue/server-renderer] Skipped rendering unsafe attribute name: ${attrKey}`
  41. );
  42. return ``;
  43. }
  44. }
  45. function ssrRenderAttr(key, value) {
  46. if (!isRenderableAttrValue(value)) {
  47. return ``;
  48. }
  49. return ` ${key}="${escapeHtml(value)}"`;
  50. }
  51. function ssrRenderClass(raw) {
  52. return escapeHtml(normalizeClass(raw));
  53. }
  54. function ssrRenderStyle(raw) {
  55. if (!raw) {
  56. return "";
  57. }
  58. if (isString(raw)) {
  59. return escapeHtml(raw);
  60. }
  61. const styles = normalizeStyle(raw);
  62. return escapeHtml(stringifyStyle(styles));
  63. }
  64. function ssrRenderComponent(comp, props = null, children = null, parentComponent = null, slotScopeId) {
  65. return renderComponentVNode(
  66. createVNode(comp, props, children),
  67. parentComponent,
  68. slotScopeId
  69. );
  70. }
  71. function ssrRenderSlot(slots, slotName, slotProps, fallbackRenderFn, push, parentComponent, slotScopeId) {
  72. push(`<!--[-->`);
  73. ssrRenderSlotInner(
  74. slots,
  75. slotName,
  76. slotProps,
  77. fallbackRenderFn,
  78. push,
  79. parentComponent,
  80. slotScopeId
  81. );
  82. push(`<!--]-->`);
  83. }
  84. function ssrRenderSlotInner(slots, slotName, slotProps, fallbackRenderFn, push, parentComponent, slotScopeId, transition) {
  85. const slotFn = slots[slotName];
  86. if (slotFn) {
  87. const slotBuffer = [];
  88. const bufferedPush = (item) => {
  89. slotBuffer.push(item);
  90. };
  91. const ret = slotFn(
  92. slotProps,
  93. bufferedPush,
  94. parentComponent,
  95. slotScopeId ? " " + slotScopeId : ""
  96. );
  97. if (isArray(ret)) {
  98. renderVNodeChildren(push, ret, parentComponent, slotScopeId);
  99. } else {
  100. let isEmptySlot = true;
  101. if (transition) {
  102. isEmptySlot = false;
  103. } else {
  104. for (let i = 0; i < slotBuffer.length; i++) {
  105. if (!isComment(slotBuffer[i])) {
  106. isEmptySlot = false;
  107. break;
  108. }
  109. }
  110. }
  111. if (isEmptySlot) {
  112. if (fallbackRenderFn) {
  113. fallbackRenderFn();
  114. }
  115. } else {
  116. let start = 0;
  117. let end = slotBuffer.length;
  118. if (transition && slotBuffer[0] === "<!--[-->" && slotBuffer[end - 1] === "<!--]-->") {
  119. start++;
  120. end--;
  121. }
  122. for (let i = start; i < end; i++) {
  123. push(slotBuffer[i]);
  124. }
  125. }
  126. }
  127. } else if (fallbackRenderFn) {
  128. fallbackRenderFn();
  129. }
  130. }
  131. const commentTestRE = /^<!--.*-->$/s;
  132. const commentRE = /<!--[^]*?-->/gm;
  133. function isComment(item) {
  134. if (typeof item !== "string" || !commentTestRE.test(item))
  135. return false;
  136. if (item.length <= 8)
  137. return true;
  138. return !item.replace(commentRE, "").trim();
  139. }
  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. 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-->");
  158. }
  159. function ssrInterpolate(value) {
  160. return escapeHtml(toDisplayString(value));
  161. }
  162. let activeEffect;
  163. function cleanupDepEffect(dep, effect2) {
  164. const trackId = dep.get(effect2);
  165. if (trackId !== void 0 && effect2._trackId !== trackId) {
  166. dep.delete(effect2);
  167. if (dep.size === 0) {
  168. dep.cleanup();
  169. }
  170. }
  171. }
  172. let shouldTrack = true;
  173. const trackStack = [];
  174. function pauseTracking() {
  175. trackStack.push(shouldTrack);
  176. shouldTrack = false;
  177. }
  178. function resetTracking() {
  179. const last = trackStack.pop();
  180. shouldTrack = last === void 0 ? true : last;
  181. }
  182. function trackEffect(effect2, dep, debuggerEventExtraInfo) {
  183. var _a;
  184. if (dep.get(effect2) !== effect2._trackId) {
  185. dep.set(effect2, effect2._trackId);
  186. const oldDep = effect2.deps[effect2._depsLength];
  187. if (oldDep !== dep) {
  188. if (oldDep) {
  189. cleanupDepEffect(oldDep, effect2);
  190. }
  191. effect2.deps[effect2._depsLength++] = dep;
  192. } else {
  193. effect2._depsLength++;
  194. }
  195. if (!!(process.env.NODE_ENV !== "production")) {
  196. (_a = effect2.onTrack) == null ? void 0 : _a.call(effect2, extend({ effect: effect2 }, debuggerEventExtraInfo));
  197. }
  198. }
  199. }
  200. const createDep = (cleanup, computed) => {
  201. const dep = /* @__PURE__ */ new Map();
  202. dep.cleanup = cleanup;
  203. dep.computed = computed;
  204. return dep;
  205. };
  206. const targetMap = /* @__PURE__ */ new WeakMap();
  207. Symbol(!!(process.env.NODE_ENV !== "production") ? "iterate" : "");
  208. Symbol(!!(process.env.NODE_ENV !== "production") ? "Map key iterate" : "");
  209. function track(target, type, key) {
  210. if (shouldTrack && activeEffect) {
  211. let depsMap = targetMap.get(target);
  212. if (!depsMap) {
  213. targetMap.set(target, depsMap = /* @__PURE__ */ new Map());
  214. }
  215. let dep = depsMap.get(key);
  216. if (!dep) {
  217. depsMap.set(key, dep = createDep(() => depsMap.delete(key)));
  218. }
  219. trackEffect(
  220. activeEffect,
  221. dep,
  222. !!(process.env.NODE_ENV !== "production") ? {
  223. target,
  224. type,
  225. key
  226. } : void 0
  227. );
  228. }
  229. }
  230. function toRaw(observed) {
  231. const raw = observed && observed["__v_raw"];
  232. return raw ? toRaw(raw) : observed;
  233. }
  234. function isRef(r) {
  235. return !!(r && r.__v_isRef === true);
  236. }
  237. const stack = [];
  238. function pushWarningContext(vnode) {
  239. stack.push(vnode);
  240. }
  241. function popWarningContext() {
  242. stack.pop();
  243. }
  244. function warn$1(msg, ...args) {
  245. pauseTracking();
  246. const instance = stack.length ? stack[stack.length - 1].component : null;
  247. const appWarnHandler = instance && instance.appContext.config.warnHandler;
  248. const trace = getComponentTrace();
  249. if (appWarnHandler) {
  250. callWithErrorHandling(
  251. appWarnHandler,
  252. instance,
  253. 11,
  254. [
  255. msg + args.map((a) => {
  256. var _a, _b;
  257. return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a);
  258. }).join(""),
  259. instance && instance.proxy,
  260. trace.map(
  261. ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`
  262. ).join("\n"),
  263. trace
  264. ]
  265. );
  266. } else {
  267. const warnArgs = [`[Vue warn]: ${msg}`, ...args];
  268. if (trace.length && // avoid spamming console during tests
  269. true) {
  270. warnArgs.push(`
  271. `, ...formatTrace(trace));
  272. }
  273. console.warn(...warnArgs);
  274. }
  275. resetTracking();
  276. }
  277. function getComponentTrace() {
  278. let currentVNode = stack[stack.length - 1];
  279. if (!currentVNode) {
  280. return [];
  281. }
  282. const normalizedStack = [];
  283. while (currentVNode) {
  284. const last = normalizedStack[0];
  285. if (last && last.vnode === currentVNode) {
  286. last.recurseCount++;
  287. } else {
  288. normalizedStack.push({
  289. vnode: currentVNode,
  290. recurseCount: 0
  291. });
  292. }
  293. const parentInstance = currentVNode.component && currentVNode.component.parent;
  294. currentVNode = parentInstance && parentInstance.vnode;
  295. }
  296. return normalizedStack;
  297. }
  298. function formatTrace(trace) {
  299. const logs = [];
  300. trace.forEach((entry, i) => {
  301. logs.push(...i === 0 ? [] : [`
  302. `], ...formatTraceEntry(entry));
  303. });
  304. return logs;
  305. }
  306. function formatTraceEntry({ vnode, recurseCount }) {
  307. const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;
  308. const isRoot = vnode.component ? vnode.component.parent == null : false;
  309. const open = ` at <${formatComponentName(
  310. vnode.component,
  311. vnode.type,
  312. isRoot
  313. )}`;
  314. const close = `>` + postfix;
  315. return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];
  316. }
  317. function formatProps(props) {
  318. const res = [];
  319. const keys = Object.keys(props);
  320. keys.slice(0, 3).forEach((key) => {
  321. res.push(...formatProp(key, props[key]));
  322. });
  323. if (keys.length > 3) {
  324. res.push(` ...`);
  325. }
  326. return res;
  327. }
  328. function formatProp(key, value, raw) {
  329. if (isString(value)) {
  330. value = JSON.stringify(value);
  331. return raw ? value : [`${key}=${value}`];
  332. } else if (typeof value === "number" || typeof value === "boolean" || value == null) {
  333. return raw ? value : [`${key}=${value}`];
  334. } else if (isRef(value)) {
  335. value = formatProp(key, toRaw(value.value), true);
  336. return raw ? value : [`${key}=Ref<`, value, `>`];
  337. } else if (isFunction(value)) {
  338. return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];
  339. } else {
  340. value = toRaw(value);
  341. return raw ? value : [`${key}=`, value];
  342. }
  343. }
  344. const ErrorTypeStrings = {
  345. ["sp"]: "serverPrefetch hook",
  346. ["bc"]: "beforeCreate hook",
  347. ["c"]: "created hook",
  348. ["bm"]: "beforeMount hook",
  349. ["m"]: "mounted hook",
  350. ["bu"]: "beforeUpdate hook",
  351. ["u"]: "updated",
  352. ["bum"]: "beforeUnmount hook",
  353. ["um"]: "unmounted hook",
  354. ["a"]: "activated hook",
  355. ["da"]: "deactivated hook",
  356. ["ec"]: "errorCaptured hook",
  357. ["rtc"]: "renderTracked hook",
  358. ["rtg"]: "renderTriggered hook",
  359. [0]: "setup function",
  360. [1]: "render function",
  361. [2]: "watcher getter",
  362. [3]: "watcher callback",
  363. [4]: "watcher cleanup function",
  364. [5]: "native event handler",
  365. [6]: "component event handler",
  366. [7]: "vnode hook",
  367. [8]: "directive hook",
  368. [9]: "transition hook",
  369. [10]: "app errorHandler",
  370. [11]: "app warnHandler",
  371. [12]: "ref function",
  372. [13]: "async component loader",
  373. [14]: "scheduler flush. This is likely a Vue internals bug. Please open an issue at https://github.com/vuejs/core ."
  374. };
  375. function callWithErrorHandling(fn, instance, type, args) {
  376. try {
  377. return args ? fn(...args) : fn();
  378. } catch (err) {
  379. handleError(err, instance, type);
  380. }
  381. }
  382. function handleError(err, instance, type, throwInDev = true) {
  383. const contextVNode = instance ? instance.vnode : null;
  384. if (instance) {
  385. let cur = instance.parent;
  386. const exposedInstance = instance.proxy;
  387. const errorInfo = !!(process.env.NODE_ENV !== "production") ? ErrorTypeStrings[type] : `https://vuejs.org/error-reference/#runtime-${type}`;
  388. while (cur) {
  389. const errorCapturedHooks = cur.ec;
  390. if (errorCapturedHooks) {
  391. for (let i = 0; i < errorCapturedHooks.length; i++) {
  392. if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {
  393. return;
  394. }
  395. }
  396. }
  397. cur = cur.parent;
  398. }
  399. const appErrorHandler = instance.appContext.config.errorHandler;
  400. if (appErrorHandler) {
  401. pauseTracking();
  402. callWithErrorHandling(
  403. appErrorHandler,
  404. null,
  405. 10,
  406. [err, exposedInstance, errorInfo]
  407. );
  408. resetTracking();
  409. return;
  410. }
  411. }
  412. logError(err, type, contextVNode, throwInDev);
  413. }
  414. function logError(err, type, contextVNode, throwInDev = true) {
  415. if (!!(process.env.NODE_ENV !== "production")) {
  416. const info = ErrorTypeStrings[type];
  417. if (contextVNode) {
  418. pushWarningContext(contextVNode);
  419. }
  420. warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`);
  421. if (contextVNode) {
  422. popWarningContext();
  423. }
  424. if (throwInDev) {
  425. throw err;
  426. } else {
  427. console.error(err);
  428. }
  429. } else {
  430. console.error(err);
  431. }
  432. }
  433. let devtools;
  434. let buffer = [];
  435. function setDevtoolsHook(hook, target) {
  436. var _a, _b;
  437. devtools = hook;
  438. if (devtools) {
  439. devtools.enabled = true;
  440. buffer.forEach(({ event, args }) => devtools.emit(event, ...args));
  441. buffer = [];
  442. } else if (
  443. // handle late devtools injection - only do this if we are in an actual
  444. // browser environment to avoid the timer handle stalling test runner exit
  445. // (#4815)
  446. typeof window !== "undefined" && // some envs mock window but not fully
  447. window.HTMLElement && // also exclude jsdom
  448. !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes("jsdom"))
  449. ) {
  450. const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];
  451. replay.push((newHook) => {
  452. setDevtoolsHook(newHook, target);
  453. });
  454. setTimeout(() => {
  455. if (!devtools) {
  456. target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;
  457. buffer = [];
  458. }
  459. }, 3e3);
  460. } else {
  461. buffer = [];
  462. }
  463. }
  464. {
  465. const g = getGlobalThis();
  466. const registerGlobalSetter = (key, setter) => {
  467. let setters;
  468. if (!(setters = g[key]))
  469. setters = g[key] = [];
  470. setters.push(setter);
  471. return (v) => {
  472. if (setters.length > 1)
  473. setters.forEach((set) => set(v));
  474. else
  475. setters[0](v);
  476. };
  477. };
  478. registerGlobalSetter(
  479. `__VUE_INSTANCE_SETTERS__`,
  480. (v) => v
  481. );
  482. registerGlobalSetter(
  483. `__VUE_SSR_SETTERS__`,
  484. (v) => v
  485. );
  486. }
  487. !!(process.env.NODE_ENV !== "production") ? {
  488. get(target, key) {
  489. track(target, "get", "");
  490. return target[key];
  491. },
  492. set() {
  493. warn$1(`setupContext.attrs is readonly.`);
  494. return false;
  495. },
  496. deleteProperty() {
  497. warn$1(`setupContext.attrs is readonly.`);
  498. return false;
  499. }
  500. } : {
  501. get(target, key) {
  502. track(target, "get", "");
  503. return target[key];
  504. }
  505. };
  506. const classifyRE = /(?:^|[-_])(\w)/g;
  507. const classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, "");
  508. function getComponentName(Component, includeInferred = true) {
  509. return isFunction(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name;
  510. }
  511. function formatComponentName(instance, Component, isRoot = false) {
  512. let name = getComponentName(Component);
  513. if (!name && Component.__file) {
  514. const match = Component.__file.match(/([^/\\]+)\.\w+$/);
  515. if (match) {
  516. name = match[1];
  517. }
  518. }
  519. if (!name && instance && instance.parent) {
  520. const inferFromRegistry = (registry) => {
  521. for (const key in registry) {
  522. if (registry[key] === Component) {
  523. return key;
  524. }
  525. }
  526. };
  527. name = inferFromRegistry(
  528. instance.components || instance.parent.type.components
  529. ) || inferFromRegistry(instance.appContext.components);
  530. }
  531. return name ? classify(name) : isRoot ? `App` : `Anonymous`;
  532. }
  533. const warn = !!(process.env.NODE_ENV !== "production") ? warn$1 : NOOP;
  534. !!(process.env.NODE_ENV !== "production") || true ? devtools : void 0;
  535. !!(process.env.NODE_ENV !== "production") || true ? setDevtoolsHook : NOOP;
  536. function ssrRenderList(source, renderItem) {
  537. if (isArray(source) || isString(source)) {
  538. for (let i = 0, l = source.length; i < l; i++) {
  539. renderItem(source[i], i);
  540. }
  541. } else if (typeof source === "number") {
  542. if (!!(process.env.NODE_ENV !== "production") && !Number.isInteger(source)) {
  543. warn(`The v-for range expect an integer value but got ${source}.`);
  544. return;
  545. }
  546. for (let i = 0; i < source; i++) {
  547. renderItem(i + 1, i);
  548. }
  549. } else if (isObject(source)) {
  550. if (source[Symbol.iterator]) {
  551. const arr = Array.from(source);
  552. for (let i = 0, l = arr.length; i < l; i++) {
  553. renderItem(arr[i], i);
  554. }
  555. } else {
  556. const keys = Object.keys(source);
  557. for (let i = 0, l = keys.length; i < l; i++) {
  558. const key = keys[i];
  559. renderItem(source[key], key, i);
  560. }
  561. }
  562. }
  563. }
  564. async function ssrRenderSuspense(push, { default: renderContent }) {
  565. if (renderContent) {
  566. renderContent();
  567. } else {
  568. push(`<!---->`);
  569. }
  570. }
  571. function ssrGetDirectiveProps(instance, dir, value, arg, modifiers = {}) {
  572. if (typeof dir !== "function" && dir.getSSRProps) {
  573. return dir.getSSRProps(
  574. {
  575. dir,
  576. instance,
  577. value,
  578. oldValue: void 0,
  579. arg,
  580. modifiers
  581. },
  582. null
  583. ) || {};
  584. }
  585. return {};
  586. }
  587. const ssrLooseEqual = looseEqual;
  588. function ssrLooseContain(arr, value) {
  589. return looseIndexOf(arr, value) > -1;
  590. }
  591. function ssrRenderDynamicModel(type, model, value) {
  592. switch (type) {
  593. case "radio":
  594. return looseEqual(model, value) ? " checked" : "";
  595. case "checkbox":
  596. return (isArray(model) ? ssrLooseContain(model, value) : model) ? " checked" : "";
  597. default:
  598. return ssrRenderAttr("value", model);
  599. }
  600. }
  601. function ssrGetDynamicModelProps(existingProps = {}, model) {
  602. const { type, value } = existingProps;
  603. switch (type) {
  604. case "radio":
  605. return looseEqual(model, value) ? { checked: true } : null;
  606. case "checkbox":
  607. return (isArray(model) ? ssrLooseContain(model, value) : model) ? { checked: true } : null;
  608. default:
  609. return { value: model };
  610. }
  611. }
  612. function ssrCompile(template, instance) {
  613. {
  614. throw new Error(
  615. `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.`
  616. );
  617. }
  618. }
  619. const {
  620. createComponentInstance,
  621. setCurrentRenderingInstance,
  622. setupComponent,
  623. renderComponentRoot,
  624. normalizeVNode
  625. } = ssrUtils;
  626. function createBuffer() {
  627. let appendable = false;
  628. const buffer = [];
  629. return {
  630. getBuffer() {
  631. return buffer;
  632. },
  633. push(item) {
  634. const isStringItem = isString(item);
  635. if (appendable && isStringItem) {
  636. buffer[buffer.length - 1] += item;
  637. } else {
  638. buffer.push(item);
  639. }
  640. appendable = isStringItem;
  641. if (isPromise(item) || isArray(item) && item.hasAsync) {
  642. buffer.hasAsync = true;
  643. }
  644. }
  645. };
  646. }
  647. function renderComponentVNode(vnode, parentComponent = null, slotScopeId) {
  648. const instance = createComponentInstance(vnode, parentComponent, null);
  649. const res = setupComponent(
  650. instance,
  651. true
  652. /* isSSR */
  653. );
  654. const hasAsyncSetup = isPromise(res);
  655. const prefetches = instance.sp;
  656. if (hasAsyncSetup || prefetches) {
  657. let p = hasAsyncSetup ? res : Promise.resolve();
  658. if (prefetches) {
  659. p = p.then(
  660. () => Promise.all(
  661. prefetches.map((prefetch) => prefetch.call(instance.proxy))
  662. )
  663. ).catch(NOOP);
  664. }
  665. return p.then(() => renderComponentSubTree(instance, slotScopeId));
  666. } else {
  667. return renderComponentSubTree(instance, slotScopeId);
  668. }
  669. }
  670. function renderComponentSubTree(instance, slotScopeId) {
  671. const comp = instance.type;
  672. const { getBuffer, push } = createBuffer();
  673. if (isFunction(comp)) {
  674. let root = renderComponentRoot(instance);
  675. if (!comp.props) {
  676. for (const key in instance.attrs) {
  677. if (key.startsWith(`data-v-`)) {
  678. (root.props || (root.props = {}))[key] = ``;
  679. }
  680. }
  681. }
  682. renderVNode(push, instance.subTree = root, instance, slotScopeId);
  683. } else {
  684. if ((!instance.render || instance.render === NOOP) && !instance.ssrRender && !comp.ssrRender && isString(comp.template)) {
  685. comp.ssrRender = ssrCompile(comp.template);
  686. }
  687. for (const e of instance.scope.effects) {
  688. if (e.computed) {
  689. e.computed._dirty = true;
  690. e.computed._cacheable = true;
  691. }
  692. }
  693. const ssrRender = instance.ssrRender || comp.ssrRender;
  694. if (ssrRender) {
  695. let attrs = instance.inheritAttrs !== false ? instance.attrs : void 0;
  696. let hasCloned = false;
  697. let cur = instance;
  698. while (true) {
  699. const scopeId = cur.vnode.scopeId;
  700. if (scopeId) {
  701. if (!hasCloned) {
  702. attrs = { ...attrs };
  703. hasCloned = true;
  704. }
  705. attrs[scopeId] = "";
  706. }
  707. const parent = cur.parent;
  708. if (parent && parent.subTree && parent.subTree === cur.vnode) {
  709. cur = parent;
  710. } else {
  711. break;
  712. }
  713. }
  714. if (slotScopeId) {
  715. if (!hasCloned)
  716. attrs = { ...attrs };
  717. attrs[slotScopeId.trim()] = "";
  718. }
  719. const prev = setCurrentRenderingInstance(instance);
  720. try {
  721. ssrRender(
  722. instance.proxy,
  723. push,
  724. instance,
  725. attrs,
  726. // compiler-optimized bindings
  727. instance.props,
  728. instance.setupState,
  729. instance.data,
  730. instance.ctx
  731. );
  732. } finally {
  733. setCurrentRenderingInstance(prev);
  734. }
  735. } else if (instance.render && instance.render !== NOOP) {
  736. renderVNode(
  737. push,
  738. instance.subTree = renderComponentRoot(instance),
  739. instance,
  740. slotScopeId
  741. );
  742. } else {
  743. const componentName = comp.name || comp.__file || `<Anonymous>`;
  744. warn$2(`Component ${componentName} is missing template or render function.`);
  745. push(`<!---->`);
  746. }
  747. }
  748. return getBuffer();
  749. }
  750. function renderVNode(push, vnode, parentComponent, slotScopeId) {
  751. const { type, shapeFlag, children } = vnode;
  752. switch (type) {
  753. case Text:
  754. push(escapeHtml(children));
  755. break;
  756. case Comment:
  757. push(
  758. children ? `<!--${escapeHtmlComment(children)}-->` : `<!---->`
  759. );
  760. break;
  761. case Static:
  762. push(children);
  763. break;
  764. case Fragment:
  765. if (vnode.slotScopeIds) {
  766. slotScopeId = (slotScopeId ? slotScopeId + " " : "") + vnode.slotScopeIds.join(" ");
  767. }
  768. push(`<!--[-->`);
  769. renderVNodeChildren(
  770. push,
  771. children,
  772. parentComponent,
  773. slotScopeId
  774. );
  775. push(`<!--]-->`);
  776. break;
  777. default:
  778. if (shapeFlag & 1) {
  779. renderElementVNode(push, vnode, parentComponent, slotScopeId);
  780. } else if (shapeFlag & 6) {
  781. push(renderComponentVNode(vnode, parentComponent, slotScopeId));
  782. } else if (shapeFlag & 64) {
  783. renderTeleportVNode(push, vnode, parentComponent, slotScopeId);
  784. } else if (shapeFlag & 128) {
  785. renderVNode(push, vnode.ssContent, parentComponent, slotScopeId);
  786. } else {
  787. warn$2(
  788. "[@vue/server-renderer] Invalid VNode type:",
  789. type,
  790. `(${typeof type})`
  791. );
  792. }
  793. }
  794. }
  795. function renderVNodeChildren(push, children, parentComponent, slotScopeId) {
  796. for (let i = 0; i < children.length; i++) {
  797. renderVNode(push, normalizeVNode(children[i]), parentComponent, slotScopeId);
  798. }
  799. }
  800. function renderElementVNode(push, vnode, parentComponent, slotScopeId) {
  801. const tag = vnode.type;
  802. let { props, children, shapeFlag, scopeId, dirs } = vnode;
  803. let openTag = `<${tag}`;
  804. if (dirs) {
  805. props = applySSRDirectives(vnode, props, dirs);
  806. }
  807. if (props) {
  808. openTag += ssrRenderAttrs(props, tag);
  809. }
  810. if (scopeId) {
  811. openTag += ` ${scopeId}`;
  812. }
  813. let curParent = parentComponent;
  814. let curVnode = vnode;
  815. while (curParent && curVnode === curParent.subTree) {
  816. curVnode = curParent.vnode;
  817. if (curVnode.scopeId) {
  818. openTag += ` ${curVnode.scopeId}`;
  819. }
  820. curParent = curParent.parent;
  821. }
  822. if (slotScopeId) {
  823. openTag += ` ${slotScopeId}`;
  824. }
  825. push(openTag + `>`);
  826. if (!isVoidTag(tag)) {
  827. let hasChildrenOverride = false;
  828. if (props) {
  829. if (props.innerHTML) {
  830. hasChildrenOverride = true;
  831. push(props.innerHTML);
  832. } else if (props.textContent) {
  833. hasChildrenOverride = true;
  834. push(escapeHtml(props.textContent));
  835. } else if (tag === "textarea" && props.value) {
  836. hasChildrenOverride = true;
  837. push(escapeHtml(props.value));
  838. }
  839. }
  840. if (!hasChildrenOverride) {
  841. if (shapeFlag & 8) {
  842. push(escapeHtml(children));
  843. } else if (shapeFlag & 16) {
  844. renderVNodeChildren(
  845. push,
  846. children,
  847. parentComponent,
  848. slotScopeId
  849. );
  850. }
  851. }
  852. push(`</${tag}>`);
  853. }
  854. }
  855. function applySSRDirectives(vnode, rawProps, dirs) {
  856. const toMerge = [];
  857. for (let i = 0; i < dirs.length; i++) {
  858. const binding = dirs[i];
  859. const {
  860. dir: { getSSRProps }
  861. } = binding;
  862. if (getSSRProps) {
  863. const props = getSSRProps(binding, vnode);
  864. if (props)
  865. toMerge.push(props);
  866. }
  867. }
  868. return mergeProps(rawProps || {}, ...toMerge);
  869. }
  870. function renderTeleportVNode(push, vnode, parentComponent, slotScopeId) {
  871. const target = vnode.props && vnode.props.to;
  872. const disabled = vnode.props && vnode.props.disabled;
  873. if (!target) {
  874. if (!disabled) {
  875. warn$2(`[@vue/server-renderer] Teleport is missing target prop.`);
  876. }
  877. return [];
  878. }
  879. if (!isString(target)) {
  880. warn$2(
  881. `[@vue/server-renderer] Teleport target must be a query selector string.`
  882. );
  883. return [];
  884. }
  885. ssrRenderTeleport(
  886. push,
  887. (push2) => {
  888. renderVNodeChildren(
  889. push2,
  890. vnode.children,
  891. parentComponent,
  892. slotScopeId
  893. );
  894. },
  895. target,
  896. disabled || disabled === "",
  897. parentComponent
  898. );
  899. }
  900. const { isVNode: isVNode$1 } = ssrUtils;
  901. async function unrollBuffer$1(buffer) {
  902. if (buffer.hasAsync) {
  903. let ret = "";
  904. for (let i = 0; i < buffer.length; i++) {
  905. let item = buffer[i];
  906. if (isPromise(item)) {
  907. item = await item;
  908. }
  909. if (isString(item)) {
  910. ret += item;
  911. } else {
  912. ret += await unrollBuffer$1(item);
  913. }
  914. }
  915. return ret;
  916. } else {
  917. return unrollBufferSync$1(buffer);
  918. }
  919. }
  920. function unrollBufferSync$1(buffer) {
  921. let ret = "";
  922. for (let i = 0; i < buffer.length; i++) {
  923. let item = buffer[i];
  924. if (isString(item)) {
  925. ret += item;
  926. } else {
  927. ret += unrollBufferSync$1(item);
  928. }
  929. }
  930. return ret;
  931. }
  932. async function renderToString(input, context = {}) {
  933. if (isVNode$1(input)) {
  934. return renderToString(createApp({ render: () => input }), context);
  935. }
  936. const vnode = createVNode(input._component, input._props);
  937. vnode.appContext = input._context;
  938. input.provide(ssrContextKey, context);
  939. const buffer = await renderComponentVNode(vnode);
  940. const result = await unrollBuffer$1(buffer);
  941. await resolveTeleports(context);
  942. if (context.__watcherHandles) {
  943. for (const unwatch of context.__watcherHandles) {
  944. unwatch();
  945. }
  946. }
  947. return result;
  948. }
  949. async function resolveTeleports(context) {
  950. if (context.__teleportBuffers) {
  951. context.teleports = context.teleports || {};
  952. for (const key in context.__teleportBuffers) {
  953. context.teleports[key] = await unrollBuffer$1(
  954. await Promise.all([context.__teleportBuffers[key]])
  955. );
  956. }
  957. }
  958. }
  959. const { isVNode } = ssrUtils;
  960. async function unrollBuffer(buffer, stream) {
  961. if (buffer.hasAsync) {
  962. for (let i = 0; i < buffer.length; i++) {
  963. let item = buffer[i];
  964. if (isPromise(item)) {
  965. item = await item;
  966. }
  967. if (isString(item)) {
  968. stream.push(item);
  969. } else {
  970. await unrollBuffer(item, stream);
  971. }
  972. }
  973. } else {
  974. unrollBufferSync(buffer, stream);
  975. }
  976. }
  977. function unrollBufferSync(buffer, stream) {
  978. for (let i = 0; i < buffer.length; i++) {
  979. let item = buffer[i];
  980. if (isString(item)) {
  981. stream.push(item);
  982. } else {
  983. unrollBufferSync(item, stream);
  984. }
  985. }
  986. }
  987. function renderToSimpleStream(input, context, stream) {
  988. if (isVNode(input)) {
  989. return renderToSimpleStream(
  990. createApp({ render: () => input }),
  991. context,
  992. stream
  993. );
  994. }
  995. const vnode = createVNode(input._component, input._props);
  996. vnode.appContext = input._context;
  997. input.provide(ssrContextKey, context);
  998. Promise.resolve(renderComponentVNode(vnode)).then((buffer) => unrollBuffer(buffer, stream)).then(() => resolveTeleports(context)).then(() => {
  999. if (context.__watcherHandles) {
  1000. for (const unwatch of context.__watcherHandles) {
  1001. unwatch();
  1002. }
  1003. }
  1004. }).then(() => stream.push(null)).catch((error) => {
  1005. stream.destroy(error);
  1006. });
  1007. return stream;
  1008. }
  1009. function renderToStream(input, context = {}) {
  1010. console.warn(
  1011. `[@vue/server-renderer] renderToStream is deprecated - use renderToNodeStream instead.`
  1012. );
  1013. return renderToNodeStream(input, context);
  1014. }
  1015. function renderToNodeStream(input, context = {}) {
  1016. {
  1017. throw new Error(
  1018. `ESM build of renderToStream() does not support renderToNodeStream(). Use pipeToNodeWritable() with an existing Node.js Writable stream instance instead.`
  1019. );
  1020. }
  1021. }
  1022. function pipeToNodeWritable(input, context = {}, writable) {
  1023. renderToSimpleStream(input, context, {
  1024. push(content) {
  1025. if (content != null) {
  1026. writable.write(content);
  1027. } else {
  1028. writable.end();
  1029. }
  1030. },
  1031. destroy(err) {
  1032. writable.destroy(err);
  1033. }
  1034. });
  1035. }
  1036. function renderToWebStream(input, context = {}) {
  1037. if (typeof ReadableStream !== "function") {
  1038. throw new Error(
  1039. `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.`
  1040. );
  1041. }
  1042. const encoder = new TextEncoder();
  1043. let cancelled = false;
  1044. return new ReadableStream({
  1045. start(controller) {
  1046. renderToSimpleStream(input, context, {
  1047. push(content) {
  1048. if (cancelled)
  1049. return;
  1050. if (content != null) {
  1051. controller.enqueue(encoder.encode(content));
  1052. } else {
  1053. controller.close();
  1054. }
  1055. },
  1056. destroy(err) {
  1057. controller.error(err);
  1058. }
  1059. });
  1060. },
  1061. cancel() {
  1062. cancelled = true;
  1063. }
  1064. });
  1065. }
  1066. function pipeToWebWritable(input, context = {}, writable) {
  1067. const writer = writable.getWriter();
  1068. const encoder = new TextEncoder();
  1069. let hasReady = false;
  1070. try {
  1071. hasReady = isPromise(writer.ready);
  1072. } catch (e) {
  1073. }
  1074. renderToSimpleStream(input, context, {
  1075. async push(content) {
  1076. if (hasReady) {
  1077. await writer.ready;
  1078. }
  1079. if (content != null) {
  1080. return writer.write(encoder.encode(content));
  1081. } else {
  1082. return writer.close();
  1083. }
  1084. },
  1085. destroy(err) {
  1086. console.log(err);
  1087. writer.close();
  1088. }
  1089. });
  1090. }
  1091. initDirectivesForSSR();
  1092. export { pipeToNodeWritable, pipeToWebWritable, renderToNodeStream, renderToSimpleStream, renderToStream, renderToString, renderToWebStream, ssrGetDirectiveProps, ssrGetDynamicModelProps, ssrInterpolate, ssrLooseContain, ssrLooseEqual, ssrRenderAttr, ssrRenderAttrs, ssrRenderClass, ssrRenderComponent, ssrRenderDynamicAttr, ssrRenderDynamicModel, ssrRenderList, ssrRenderSlot, ssrRenderSlotInner, ssrRenderStyle, ssrRenderSuspense, ssrRenderTeleport, renderVNode as ssrRenderVNode };