server-renderer.esm-bundler.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810
  1. /**
  2. * @vue/server-renderer v3.5.41
  3. * (c) 2018-present Yuxi (Evan) You and Vue contributors
  4. * @license MIT
  5. **/
  6. import { createVNode, ssrUtils, ssrContextKey, warn, Fragment, Static, Comment, Text, mergeProps, handleError, createApp, initDirectivesForSSR } from '@vue/runtime-dom';
  7. import { isOn, escapeHtml, isRenderableAttrValue, isSVGTag, propsToAttrMap, isBooleanAttr, includeBooleanAttr, isSSRSafeAttrName, normalizeClass, isString, normalizeStyle, stringifyStyle, isArray, isObject, normalizeCssVarValue, makeMap, isPromise, toDisplayString, looseEqual, looseIndexOf, escapeHtmlComment, NOOP, isVoidTag, isFunction, hasOwn } 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 (let key in props) {
  15. if (shouldIgnoreProp(key) || isOn(key) || tag === "textarea" && key === "value" || // force as property (not rendered in SSR)
  16. key.startsWith(".")) {
  17. continue;
  18. }
  19. const value = props[key];
  20. if (key.startsWith("^")) key = key.slice(1);
  21. if (key === "class") {
  22. ret += ` class="${ssrRenderClass(value)}"`;
  23. } else if (key === "style") {
  24. ret += ` style="${ssrRenderStyle(value)}"`;
  25. } else if (key === "className") {
  26. if (value != null) {
  27. ret += ` class="${escapeHtml(String(value))}"`;
  28. }
  29. } else {
  30. ret += ssrRenderDynamicAttr(key, value, tag);
  31. }
  32. }
  33. return ret;
  34. }
  35. function ssrRenderDynamicAttr(key, value, tag) {
  36. if (!isRenderableAttrValue(value)) {
  37. return ``;
  38. }
  39. const attrKey = tag && (tag.indexOf("-") > 0 || isSVGTag(tag)) ? key : propsToAttrMap[key] || key.toLowerCase();
  40. if (isBooleanAttr(attrKey) || attrKey === "hidden" && (typeof value === "boolean" || typeof value === "number")) {
  41. return includeBooleanAttr(value) ? ` ${attrKey}` : ``;
  42. } else if (isSSRSafeAttrName(attrKey)) {
  43. return value === "" ? ` ${attrKey}` : ` ${attrKey}="${escapeHtml(value)}"`;
  44. } else {
  45. console.warn(
  46. `[@vue/server-renderer] Skipped rendering unsafe attribute name: ${attrKey}`
  47. );
  48. return ``;
  49. }
  50. }
  51. function ssrRenderAttr(key, value) {
  52. if (!isRenderableAttrValue(value)) {
  53. return ``;
  54. }
  55. return ` ${key}="${escapeHtml(value)}"`;
  56. }
  57. function ssrRenderClass(raw) {
  58. return escapeHtml(normalizeClass(raw));
  59. }
  60. function ssrRenderStyle(raw) {
  61. if (!raw) {
  62. return "";
  63. }
  64. if (isString(raw)) {
  65. return escapeHtml(raw);
  66. }
  67. const styles = normalizeStyle(ssrResetCssVars(raw));
  68. return escapeHtml(stringifyStyle(styles));
  69. }
  70. function ssrResetCssVars(raw) {
  71. if (!isArray(raw) && isObject(raw)) {
  72. const res = {};
  73. for (const key in raw) {
  74. if (key.startsWith(":--")) {
  75. res[key.slice(1)] = normalizeCssVarValue(raw[key]);
  76. } else {
  77. res[key] = raw[key];
  78. }
  79. }
  80. return res;
  81. }
  82. return raw;
  83. }
  84. function ssrRenderComponent(comp, props = null, children = null, parentComponent = null, slotScopeId) {
  85. return renderComponentVNode(
  86. createVNode(comp, props, children),
  87. parentComponent,
  88. slotScopeId
  89. );
  90. }
  91. const { ensureValidVNode } = ssrUtils;
  92. function ssrRenderSlot(slots, slotName, slotProps, fallbackRenderFn, push, parentComponent, slotScopeId) {
  93. push(`<!--[-->`);
  94. ssrRenderSlotInner(
  95. slots,
  96. slotName,
  97. slotProps,
  98. fallbackRenderFn,
  99. push,
  100. parentComponent,
  101. slotScopeId
  102. );
  103. push(`<!--]-->`);
  104. }
  105. function ssrRenderSlotInner(slots, slotName, slotProps, fallbackRenderFn, push, parentComponent, slotScopeId, transition) {
  106. const slotFn = slots[slotName];
  107. if (slotFn) {
  108. const slotBuffer = [];
  109. const bufferedPush = (item) => {
  110. slotBuffer.push(item);
  111. };
  112. const ret = slotFn(
  113. // keep the slot function's contract in sync with `renderSlot`, which also
  114. // normalizes nullish props before invoking the slot
  115. slotProps || {},
  116. bufferedPush,
  117. parentComponent,
  118. slotScopeId ? " " + slotScopeId : ""
  119. );
  120. if (isArray(ret)) {
  121. const validSlotContent = ensureValidVNode(ret);
  122. if (validSlotContent) {
  123. renderVNodeChildren(
  124. push,
  125. validSlotContent,
  126. parentComponent,
  127. slotScopeId
  128. );
  129. } else if (fallbackRenderFn) {
  130. fallbackRenderFn();
  131. } else if (transition) {
  132. push(`<!---->`);
  133. }
  134. } else {
  135. let isEmptySlot = true;
  136. if (transition) {
  137. isEmptySlot = false;
  138. } else {
  139. for (let i = 0; i < slotBuffer.length; i++) {
  140. if (!isComment(slotBuffer[i])) {
  141. isEmptySlot = false;
  142. break;
  143. }
  144. }
  145. }
  146. if (isEmptySlot) {
  147. if (fallbackRenderFn) {
  148. fallbackRenderFn();
  149. }
  150. } else {
  151. let start = 0;
  152. let end = slotBuffer.length;
  153. if (transition && slotBuffer[0] === "<!--[-->" && slotBuffer[end - 1] === "<!--]-->") {
  154. start++;
  155. end--;
  156. }
  157. if (start < end) {
  158. for (let i = start; i < end; i++) {
  159. push(slotBuffer[i]);
  160. }
  161. } else if (transition) {
  162. push(`<!---->`);
  163. }
  164. }
  165. }
  166. } else if (fallbackRenderFn) {
  167. fallbackRenderFn();
  168. } else if (transition) {
  169. push(`<!---->`);
  170. }
  171. }
  172. const commentTestRE = /^<!--[\s\S]*-->$/;
  173. const commentRE = /<!--[^]*?-->/gm;
  174. function isComment(item) {
  175. if (typeof item !== "string" || !commentTestRE.test(item)) return false;
  176. if (item.length <= 8) return true;
  177. return !item.replace(commentRE, "").trim();
  178. }
  179. function ssrRenderTeleport(parentPush, contentRenderFn, target, disabled, parentComponent) {
  180. parentPush("<!--teleport start-->");
  181. const context = parentComponent.appContext.provides[ssrContextKey];
  182. const teleportBuffers = context.__teleportBuffers || (context.__teleportBuffers = {});
  183. const targetBuffer = teleportBuffers[target] || (teleportBuffers[target] = []);
  184. const bufferIndex = targetBuffer.length;
  185. let teleportContent;
  186. if (disabled) {
  187. contentRenderFn(parentPush);
  188. teleportContent = `<!--teleport start anchor--><!--teleport anchor-->`;
  189. } else {
  190. const { getBuffer, push } = createBuffer();
  191. push(`<!--teleport start anchor-->`);
  192. contentRenderFn(push);
  193. push(`<!--teleport anchor-->`);
  194. teleportContent = getBuffer();
  195. }
  196. targetBuffer.splice(bufferIndex, 0, teleportContent);
  197. if (isPromise(teleportContent) || isArray(teleportContent) && teleportContent.hasAsync) {
  198. targetBuffer.hasAsync = true;
  199. }
  200. parentPush("<!--teleport end-->");
  201. }
  202. function ssrInterpolate(value) {
  203. return escapeHtml(toDisplayString(value));
  204. }
  205. function ssrRenderList(source, renderItem) {
  206. if (isArray(source) || isString(source)) {
  207. for (let i = 0, l = source.length; i < l; i++) {
  208. renderItem(source[i], i);
  209. }
  210. } else if (typeof source === "number") {
  211. if (!!(process.env.NODE_ENV !== "production") && (!Number.isInteger(source) || source < 0)) {
  212. warn(
  213. `The v-for range expects a positive integer value but got ${source}.`
  214. );
  215. return;
  216. }
  217. for (let i = 0; i < source; i++) {
  218. renderItem(i + 1, i);
  219. }
  220. } else if (isObject(source)) {
  221. if (source[Symbol.iterator]) {
  222. let i = 0;
  223. for (const item of source) {
  224. renderItem(item, i++);
  225. }
  226. } else {
  227. const keys = Object.keys(source);
  228. for (let i = 0, l = keys.length; i < l; i++) {
  229. const key = keys[i];
  230. renderItem(source[key], key, i);
  231. }
  232. }
  233. }
  234. }
  235. function ssrRenderSuspense(push, { default: renderContent }) {
  236. if (renderContent) {
  237. renderContent();
  238. } else {
  239. push(`<!---->`);
  240. }
  241. }
  242. function ssrGetDirectiveProps(instance, dir, value, arg, modifiers = {}) {
  243. if (typeof dir !== "function" && dir.getSSRProps) {
  244. return dir.getSSRProps(
  245. {
  246. dir,
  247. instance: ssrUtils.getComponentPublicInstance(instance.$),
  248. value,
  249. oldValue: void 0,
  250. arg,
  251. modifiers
  252. },
  253. null
  254. ) || {};
  255. }
  256. return {};
  257. }
  258. const ssrLooseEqual = looseEqual;
  259. function ssrLooseContain(arr, value) {
  260. return looseIndexOf(arr, value) > -1;
  261. }
  262. function ssrRenderDynamicModel(type, model, value) {
  263. switch (type) {
  264. case "radio":
  265. return looseEqual(model, value) ? " checked" : "";
  266. case "checkbox":
  267. return (isArray(model) ? ssrLooseContain(model, value) : model) ? " checked" : "";
  268. default:
  269. return ssrRenderAttr("value", model);
  270. }
  271. }
  272. function ssrGetDynamicModelProps(existingProps = {}, model) {
  273. const { type, value } = existingProps;
  274. switch (type) {
  275. case "radio":
  276. return looseEqual(model, value) ? { checked: true } : null;
  277. case "checkbox":
  278. return (isArray(model) ? ssrLooseContain(model, value) : model) ? { checked: true } : null;
  279. default:
  280. return { value: model };
  281. }
  282. }
  283. function ssrCompile(template, instance) {
  284. {
  285. throw new Error(
  286. `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.`
  287. );
  288. }
  289. }
  290. const {
  291. createComponentInstance,
  292. setCurrentRenderingInstance,
  293. setupComponent,
  294. renderComponentRoot,
  295. normalizeVNode,
  296. pushWarningContext,
  297. popWarningContext
  298. } = ssrUtils;
  299. function createBuffer() {
  300. let appendable = false;
  301. const buffer = [];
  302. return {
  303. getBuffer() {
  304. return buffer;
  305. },
  306. push(item) {
  307. const isStringItem = isString(item);
  308. if (appendable && isStringItem) {
  309. buffer[buffer.length - 1] += item;
  310. return;
  311. }
  312. buffer.push(item);
  313. appendable = isStringItem;
  314. if (isPromise(item) || isArray(item) && item.hasAsync) {
  315. buffer.hasAsync = true;
  316. }
  317. }
  318. };
  319. }
  320. function renderComponentVNode(vnode, parentComponent = null, slotScopeId) {
  321. const instance = vnode.component = createComponentInstance(
  322. vnode,
  323. parentComponent,
  324. null
  325. );
  326. if (!!(process.env.NODE_ENV !== "production")) pushWarningContext(vnode);
  327. const res = setupComponent(
  328. instance,
  329. true
  330. /* isSSR */
  331. );
  332. if (!!(process.env.NODE_ENV !== "production")) popWarningContext();
  333. const hasAsyncSetup = isPromise(res);
  334. let prefetches = instance.sp;
  335. if (hasAsyncSetup || prefetches) {
  336. const p = Promise.resolve(res).then(() => {
  337. if (hasAsyncSetup) prefetches = instance.sp;
  338. if (prefetches) {
  339. return Promise.all(
  340. prefetches.map((prefetch) => prefetch.call(instance.proxy))
  341. );
  342. }
  343. }).catch(NOOP);
  344. return p.then(() => renderComponentSubTree(instance, slotScopeId));
  345. } else {
  346. try {
  347. return renderComponentSubTree(instance, slotScopeId);
  348. } catch (err) {
  349. return Promise.reject(err);
  350. }
  351. }
  352. }
  353. function renderComponentSubTree(instance, slotScopeId) {
  354. if (!!(process.env.NODE_ENV !== "production")) pushWarningContext(instance.vnode);
  355. const comp = instance.type;
  356. const { getBuffer, push } = createBuffer();
  357. if (isFunction(comp)) {
  358. let root = renderComponentRoot(instance);
  359. if (!comp.props) {
  360. for (const key in instance.attrs) {
  361. if (key.startsWith(`data-v-`)) {
  362. (root.props || (root.props = {}))[key] = ``;
  363. }
  364. }
  365. }
  366. renderVNode(push, instance.subTree = root, instance, slotScopeId);
  367. } else {
  368. if ((!instance.render || instance.render === NOOP) && !instance.ssrRender && !comp.ssrRender && isString(comp.template)) {
  369. comp.ssrRender = ssrCompile(comp.template);
  370. }
  371. const ssrRender = instance.ssrRender || comp.ssrRender;
  372. if (ssrRender) {
  373. let attrs = instance.inheritAttrs !== false ? instance.attrs : void 0;
  374. let hasCloned = false;
  375. let cur = instance;
  376. while (true) {
  377. const scopeId = cur.vnode.scopeId;
  378. if (scopeId) {
  379. if (!hasCloned) {
  380. attrs = { ...attrs };
  381. hasCloned = true;
  382. }
  383. attrs[scopeId] = "";
  384. }
  385. const parent = cur.parent;
  386. if (parent && parent.subTree && parent.subTree === cur.vnode) {
  387. cur = parent;
  388. } else {
  389. break;
  390. }
  391. }
  392. if (slotScopeId) {
  393. if (!hasCloned) attrs = { ...attrs };
  394. const slotScopeIdList = slotScopeId.trim().split(" ");
  395. for (let i = 0; i < slotScopeIdList.length; i++) {
  396. attrs[slotScopeIdList[i]] = "";
  397. }
  398. }
  399. const prev = setCurrentRenderingInstance(instance);
  400. try {
  401. ssrRender(
  402. instance.proxy,
  403. push,
  404. instance,
  405. attrs,
  406. // compiler-optimized bindings
  407. instance.props,
  408. instance.setupState,
  409. instance.data,
  410. instance.ctx
  411. );
  412. } catch (err) {
  413. handleError(err, instance, 1);
  414. } finally {
  415. setCurrentRenderingInstance(prev);
  416. }
  417. } else if (instance.render && instance.render !== NOOP) {
  418. renderVNode(
  419. push,
  420. instance.subTree = renderComponentRoot(instance),
  421. instance,
  422. slotScopeId
  423. );
  424. } else {
  425. const componentName = comp.name || comp.__file || `<Anonymous>`;
  426. warn(`Component ${componentName} is missing template or render function.`);
  427. push(`<!---->`);
  428. }
  429. }
  430. if (!!(process.env.NODE_ENV !== "production")) popWarningContext();
  431. return getBuffer();
  432. }
  433. function renderVNode(push, vnode, parentComponent, slotScopeId) {
  434. const { type, shapeFlag, children, dirs, props } = vnode;
  435. if (dirs) {
  436. vnode.props = applySSRDirectives(vnode, props, dirs);
  437. }
  438. switch (type) {
  439. case Text:
  440. push(escapeHtml(children));
  441. break;
  442. case Comment:
  443. push(
  444. children ? `<!--${escapeHtmlComment(children)}-->` : `<!---->`
  445. );
  446. break;
  447. case Static:
  448. push(children);
  449. break;
  450. case Fragment:
  451. if (vnode.slotScopeIds) {
  452. slotScopeId = (slotScopeId ? slotScopeId + " " : "") + vnode.slotScopeIds.join(" ");
  453. }
  454. push(`<!--[-->`);
  455. renderVNodeChildren(
  456. push,
  457. children,
  458. parentComponent,
  459. slotScopeId
  460. );
  461. push(`<!--]-->`);
  462. break;
  463. default:
  464. if (shapeFlag & 1) {
  465. renderElementVNode(push, vnode, parentComponent, slotScopeId);
  466. } else if (shapeFlag & 6) {
  467. push(renderComponentVNode(vnode, parentComponent, slotScopeId));
  468. } else if (shapeFlag & 64) {
  469. renderTeleportVNode(push, vnode, parentComponent, slotScopeId);
  470. } else if (shapeFlag & 128) {
  471. renderVNode(push, vnode.ssContent, parentComponent, slotScopeId);
  472. } else {
  473. warn(
  474. "[@vue/server-renderer] Invalid VNode type:",
  475. type,
  476. `(${typeof type})`
  477. );
  478. }
  479. }
  480. }
  481. function renderVNodeChildren(push, children, parentComponent, slotScopeId) {
  482. for (let i = 0; i < children.length; i++) {
  483. renderVNode(push, normalizeVNode(children[i]), parentComponent, slotScopeId);
  484. }
  485. }
  486. function renderElementVNode(push, vnode, parentComponent, slotScopeId) {
  487. const tag = vnode.type;
  488. let { props, children, shapeFlag, scopeId } = vnode;
  489. let openTag = `<${tag}`;
  490. if (props) {
  491. openTag += ssrRenderAttrs(props, tag);
  492. }
  493. const renderedScopeIds = [];
  494. const appendScopeId = (id) => {
  495. if (id && (!props || !hasOwn(props, id)) && !renderedScopeIds.includes(id)) {
  496. openTag += ` ${id}`;
  497. renderedScopeIds.push(id);
  498. }
  499. };
  500. if (scopeId) {
  501. appendScopeId(scopeId);
  502. }
  503. let curParent = parentComponent;
  504. let curVnode = vnode;
  505. while (curParent && curVnode === curParent.subTree) {
  506. curVnode = curParent.vnode;
  507. if (curVnode.scopeId) {
  508. appendScopeId(curVnode.scopeId);
  509. }
  510. curParent = curParent.parent;
  511. }
  512. if (slotScopeId) {
  513. const slotScopeIdList = slotScopeId.trim().split(" ");
  514. for (let i = 0; i < slotScopeIdList.length; i++) {
  515. appendScopeId(slotScopeIdList[i]);
  516. }
  517. }
  518. push(openTag + `>`);
  519. if (!isVoidTag(tag)) {
  520. let hasChildrenOverride = false;
  521. if (props) {
  522. if (props.innerHTML) {
  523. hasChildrenOverride = true;
  524. push(props.innerHTML);
  525. } else if (props.textContent) {
  526. hasChildrenOverride = true;
  527. push(escapeHtml(props.textContent));
  528. } else if (tag === "textarea" && props.value) {
  529. hasChildrenOverride = true;
  530. push(escapeHtml(props.value));
  531. }
  532. }
  533. if (!hasChildrenOverride) {
  534. if (shapeFlag & 8) {
  535. push(escapeHtml(children));
  536. } else if (shapeFlag & 16) {
  537. renderVNodeChildren(
  538. push,
  539. children,
  540. parentComponent,
  541. slotScopeId
  542. );
  543. }
  544. }
  545. push(`</${tag}>`);
  546. }
  547. }
  548. function applySSRDirectives(vnode, rawProps, dirs) {
  549. const toMerge = [];
  550. for (let i = 0; i < dirs.length; i++) {
  551. const binding = dirs[i];
  552. const {
  553. dir: { getSSRProps }
  554. } = binding;
  555. if (getSSRProps) {
  556. const props = getSSRProps(binding, vnode);
  557. if (props) toMerge.push(props);
  558. }
  559. }
  560. return mergeProps(rawProps || {}, ...toMerge);
  561. }
  562. function renderTeleportVNode(push, vnode, parentComponent, slotScopeId) {
  563. const target = vnode.props && vnode.props.to;
  564. const disabled = vnode.props && vnode.props.disabled;
  565. if (!target) {
  566. if (!disabled) {
  567. warn(`[@vue/server-renderer] Teleport is missing target prop.`);
  568. }
  569. return [];
  570. }
  571. if (!isString(target)) {
  572. warn(
  573. `[@vue/server-renderer] Teleport target must be a query selector string.`
  574. );
  575. return [];
  576. }
  577. ssrRenderTeleport(
  578. push,
  579. (push2) => {
  580. renderVNodeChildren(
  581. push2,
  582. vnode.children,
  583. parentComponent,
  584. slotScopeId
  585. );
  586. },
  587. target,
  588. disabled || disabled === "",
  589. parentComponent
  590. );
  591. }
  592. const { isVNode: isVNode$1 } = ssrUtils;
  593. function nestedUnrollBuffer(buffer, parentRet, startIndex) {
  594. if (!buffer.hasAsync) {
  595. return parentRet + unrollBufferSync$1(buffer);
  596. }
  597. let ret = parentRet;
  598. for (let i = startIndex; i < buffer.length; i += 1) {
  599. const item = buffer[i];
  600. if (isString(item)) {
  601. ret += item;
  602. continue;
  603. }
  604. if (isPromise(item)) {
  605. return item.then((nestedItem) => {
  606. buffer[i] = nestedItem;
  607. return nestedUnrollBuffer(buffer, ret, i);
  608. });
  609. }
  610. const result = nestedUnrollBuffer(item, ret, 0);
  611. if (isPromise(result)) {
  612. return result.then((nestedItem) => {
  613. buffer[i] = nestedItem;
  614. return nestedUnrollBuffer(buffer, "", i);
  615. });
  616. }
  617. ret = result;
  618. }
  619. return ret;
  620. }
  621. function unrollBuffer$1(buffer) {
  622. return nestedUnrollBuffer(buffer, "", 0);
  623. }
  624. function unrollBufferSync$1(buffer) {
  625. let ret = "";
  626. for (let i = 0; i < buffer.length; i++) {
  627. let item = buffer[i];
  628. if (isString(item)) {
  629. ret += item;
  630. } else {
  631. ret += unrollBufferSync$1(item);
  632. }
  633. }
  634. return ret;
  635. }
  636. async function renderToString(input, context = {}) {
  637. if (isVNode$1(input)) {
  638. return renderToString(createApp({ render: () => input }), context);
  639. }
  640. const vnode = createVNode(input._component, input._props);
  641. vnode.appContext = input._context;
  642. input.provide(ssrContextKey, context);
  643. const buffer = await renderComponentVNode(vnode);
  644. const result = await unrollBuffer$1(buffer);
  645. await resolveTeleports(context);
  646. if (context.__watcherHandles) {
  647. for (const unwatch of context.__watcherHandles) {
  648. unwatch();
  649. }
  650. }
  651. return result;
  652. }
  653. async function resolveTeleports(context) {
  654. if (context.__teleportBuffers) {
  655. context.teleports = context.teleports || {};
  656. for (const key in context.__teleportBuffers) {
  657. context.teleports[key] = await unrollBuffer$1(
  658. context.__teleportBuffers[key]
  659. );
  660. }
  661. }
  662. }
  663. const { isVNode } = ssrUtils;
  664. async function unrollBuffer(buffer, stream) {
  665. if (buffer.hasAsync) {
  666. for (let i = 0; i < buffer.length; i++) {
  667. let item = buffer[i];
  668. if (isPromise(item)) {
  669. item = await item;
  670. }
  671. if (isString(item)) {
  672. stream.push(item);
  673. } else {
  674. await unrollBuffer(item, stream);
  675. }
  676. }
  677. } else {
  678. unrollBufferSync(buffer, stream);
  679. }
  680. }
  681. function unrollBufferSync(buffer, stream) {
  682. for (let i = 0; i < buffer.length; i++) {
  683. let item = buffer[i];
  684. if (isString(item)) {
  685. stream.push(item);
  686. } else {
  687. unrollBufferSync(item, stream);
  688. }
  689. }
  690. }
  691. function renderToSimpleStream(input, context, stream) {
  692. if (isVNode(input)) {
  693. return renderToSimpleStream(
  694. createApp({ render: () => input }),
  695. context,
  696. stream
  697. );
  698. }
  699. const vnode = createVNode(input._component, input._props);
  700. vnode.appContext = input._context;
  701. input.provide(ssrContextKey, context);
  702. Promise.resolve(renderComponentVNode(vnode)).then((buffer) => unrollBuffer(buffer, stream)).then(() => resolveTeleports(context)).then(() => {
  703. if (context.__watcherHandles) {
  704. for (const unwatch of context.__watcherHandles) {
  705. unwatch();
  706. }
  707. }
  708. }).then(() => stream.push(null)).catch((error) => {
  709. stream.destroy(error);
  710. });
  711. return stream;
  712. }
  713. function renderToStream(input, context = {}) {
  714. console.warn(
  715. `[@vue/server-renderer] renderToStream is deprecated - use renderToNodeStream instead.`
  716. );
  717. return renderToNodeStream(input, context);
  718. }
  719. function renderToNodeStream(input, context = {}) {
  720. {
  721. throw new Error(
  722. `ESM build of renderToStream() does not support renderToNodeStream(). Use pipeToNodeWritable() with an existing Node.js Writable stream instance instead.`
  723. );
  724. }
  725. }
  726. function pipeToNodeWritable(input, context = {}, writable) {
  727. renderToSimpleStream(input, context, {
  728. push(content) {
  729. if (content != null) {
  730. writable.write(content);
  731. } else {
  732. writable.end();
  733. }
  734. },
  735. destroy(err) {
  736. writable.destroy(err);
  737. }
  738. });
  739. }
  740. function renderToWebStream(input, context = {}) {
  741. if (typeof ReadableStream !== "function") {
  742. throw new Error(
  743. `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.`
  744. );
  745. }
  746. const encoder = new TextEncoder();
  747. let cancelled = false;
  748. return new ReadableStream({
  749. start(controller) {
  750. renderToSimpleStream(input, context, {
  751. push(content) {
  752. if (cancelled) return;
  753. if (content != null) {
  754. controller.enqueue(encoder.encode(content));
  755. } else {
  756. controller.close();
  757. }
  758. },
  759. destroy(err) {
  760. controller.error(err);
  761. }
  762. });
  763. },
  764. cancel() {
  765. cancelled = true;
  766. }
  767. });
  768. }
  769. function pipeToWebWritable(input, context = {}, writable) {
  770. const writer = writable.getWriter();
  771. const encoder = new TextEncoder();
  772. let hasReady = false;
  773. try {
  774. hasReady = isPromise(writer.ready);
  775. } catch (e) {
  776. }
  777. renderToSimpleStream(input, context, {
  778. async push(content) {
  779. if (hasReady) {
  780. await writer.ready;
  781. }
  782. if (content != null) {
  783. return writer.write(encoder.encode(content));
  784. } else {
  785. return writer.close();
  786. }
  787. },
  788. destroy(err) {
  789. console.log(err);
  790. writer.close();
  791. }
  792. });
  793. }
  794. initDirectivesForSSR();
  795. 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 };