UNPKG

nuxt

Version:

[![Nuxt banner](./.github/assets/banner.png)](https://nuxt.com)

115 lines (114 loc) 3.21 kB
import { h } from "vue"; import { isString, isPromise, isArray, isObject } from "@vue/shared"; import destr from "destr"; export const _wrapIf = (component, props, slots) => { props = props === true ? {} : props; return { default: () => props ? h(component, props, slots) : slots.default?.() }; }; export function createBuffer() { let appendable = false; const buffer = []; return { getBuffer() { return buffer; }, push(item) { const isStringItem = isString(item); if (appendable && isStringItem) { buffer[buffer.length - 1] += item; } else { buffer.push(item); } appendable = isStringItem; if (isPromise(item) || isArray(item) && item.hasAsync) { buffer.hasAsync = true; } } }; } const TRANSLATE_RE = /&(nbsp|amp|quot|lt|gt);/g; const NUMSTR_RE = /&#(\d+);/gi; export function decodeHtmlEntities(html) { const translateDict = { nbsp: " ", amp: "&", quot: '"', lt: "<", gt: ">" }; return html.replace(TRANSLATE_RE, function(_, entity) { return translateDict[entity]; }).replace(NUMSTR_RE, function(_, numStr) { const num = parseInt(numStr, 10); return String.fromCharCode(num); }); } export function vforToArray(source) { if (isArray(source)) { return source; } else if (isString(source)) { return source.split(""); } else if (typeof source === "number") { if (process.dev && !Number.isInteger(source)) { console.warn(`The v-for range expect an integer value but got ${source}.`); } const array = []; for (let i = 0; i < source; i++) { array[i] = i; } return array; } else if (isObject(source)) { if (source[Symbol.iterator]) { return Array.from( source, (item) => item ); } else { const keys = Object.keys(source); const array = new Array(keys.length); for (let i = 0, l = keys.length; i < l; i++) { const key = keys[i]; array[i] = source[key]; } return array; } } return []; } export function getFragmentHTML(element) { if (element) { if (element.nodeName === "#comment" && element.nodeValue === "[") { return getFragmentChildren(element); } return [element.outerHTML]; } return []; } function getFragmentChildren(element, blocks = []) { if (element && element.nodeName) { if (isEndFragment(element)) { return blocks; } else if (!isStartFragment(element)) { blocks.push(element.outerHTML); } getFragmentChildren(element.nextSibling, blocks); } return blocks; } function isStartFragment(element) { return element.nodeName === "#comment" && element.nodeValue === "["; } function isEndFragment(element) { return element.nodeName === "#comment" && element.nodeValue === "]"; } const SLOT_PROPS_RE = /<div[^>]*nuxt-ssr-slot-name="([^"]*)" nuxt-ssr-slot-data="([^"]*)"[^/|>]*>/g; export function getSlotProps(html) { const slotsDivs = html.matchAll(SLOT_PROPS_RE); const data = {}; for (const slot of slotsDivs) { const [_, slotName, json] = slot; const slotData = destr(decodeHtmlEntities(json)); data[slotName] = slotData; } return data; }