@withl5e/l5e 0.3.2 → 0.3.3-alpha.0

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 +1 @@
1
- {"version":3,"file":"generateMetadata-DmoLxT6v.js","sources":["../src/seo/generateMetadata.tsx"],"sourcesContent":["/// <reference types=\"../core/jsx-types\" />\nimport { HEAD_PRIORITY } from '../core/head-priority';\nimport { Fragment, Head, resolveMetadata, useRequest } from '../core/jsx-runtime';\n\nimport { mergeMetadata } from './mergeMetadata';\nimport type { Metadata } from './types';\n\n/**\n * Converts Metadata object to SEO meta tags\n * This is the core function that transforms the metadata object into actual HTML tags\n *\n * If metadata is provided, it will be merged with metadata from the stack (from global/page loaders)\n * If no metadata is provided, it will use resolved metadata from the stack\n */\nexport function MetadataRenderer({ metadata }: { metadata?: Metadata }) {\n const { request } = useRequest();\n\n // Resolve metadata from stack (hierarchical metadata from loaders)\n const stackMetadata = resolveMetadata();\n\n // Merge: stack metadata (parent) + provided metadata (child)\n // If metadata is provided, it overrides stack metadata\n // If not provided, use stack metadata only\n const resolvedMetadata = metadata ? mergeMetadata(stackMetadata, metadata) : stackMetadata;\n\n if (!resolvedMetadata) return null;\n\n // Helper to normalize title\n const getTitle = () => {\n if (!resolvedMetadata.title) return null;\n if (typeof resolvedMetadata.title === 'string') return resolvedMetadata.title;\n // Handle TemplateString\n return resolvedMetadata.title.default;\n };\n\n // Helper to normalize robots\n const getRobots = () => {\n // tránh tiêm query\n const queryNames = Object.keys(request.query || {});\n // mặc định nếu có query sẽ ép robots về noindex\n // tuy nhiên 1 số trường hợp đặc biệt ví dụ như page=1 có chủ đích `allowQueryNames` sẽ bỏ qua nguyên tắc này\n\n const noindex =\n queryNames.filter((name) => {\n if (typeof resolvedMetadata.robots === 'string') return false;\n if (Array.isArray(resolvedMetadata.robots?.allowQueryNames))\n return !resolvedMetadata.robots.allowQueryNames.includes(name);\n return name !== resolvedMetadata.robots?.allowQueryNames;\n }).length > 0;\n\n if (noindex) return 'noindex, follow';\n\n if (!resolvedMetadata.robots) return null;\n if (typeof resolvedMetadata.robots === 'string') return resolvedMetadata.robots;\n\n const parts: string[] = [];\n if (resolvedMetadata.robots.index === false) parts.push('noindex');\n else if (resolvedMetadata.robots.index === true) parts.push('index');\n\n if (resolvedMetadata.robots.follow === false) parts.push('nofollow');\n else if (resolvedMetadata.robots.follow === true) parts.push('follow');\n\n if (resolvedMetadata.robots.noarchive) parts.push('noarchive');\n if (resolvedMetadata.robots.nosnippet) parts.push('nosnippet');\n if (resolvedMetadata.robots.noimageindex) parts.push('noimageindex');\n if (resolvedMetadata.robots.nocache) parts.push('nocache');\n\n return parts.length > 0 ? parts.join(', ') : null;\n };\n\n // Helper to normalize viewport\n const getViewport = () => {\n if (!resolvedMetadata.viewport) return null;\n if (typeof resolvedMetadata.viewport === 'string') return resolvedMetadata.viewport;\n\n const parts: string[] = [];\n if (resolvedMetadata.viewport.width) parts.push(`width=${resolvedMetadata.viewport.width}`);\n if (resolvedMetadata.viewport.height) parts.push(`height=${resolvedMetadata.viewport.height}`);\n if (resolvedMetadata.viewport.initialScale)\n parts.push(`initial-scale=${resolvedMetadata.viewport.initialScale}`);\n if (resolvedMetadata.viewport.maximumScale)\n parts.push(`maximum-scale=${resolvedMetadata.viewport.maximumScale}`);\n if (resolvedMetadata.viewport.minimumScale)\n parts.push(`minimum-scale=${resolvedMetadata.viewport.minimumScale}`);\n if (resolvedMetadata.viewport.userScalable !== undefined) {\n parts.push(`user-scalable=${resolvedMetadata.viewport.userScalable ? 'yes' : 'no'}`);\n }\n\n return parts.length > 0 ? parts.join(', ') : null;\n };\n\n // Helper to normalize keywords\n const getKeywords = () => {\n if (!resolvedMetadata.keywords) return null;\n if (Array.isArray(resolvedMetadata.keywords)) return resolvedMetadata.keywords.join(', ');\n return resolvedMetadata.keywords;\n };\n\n // Helper to normalize authors\n const getAuthors = () => {\n if (!resolvedMetadata.author) return [];\n if (typeof resolvedMetadata.author === 'string') return [{ name: resolvedMetadata.author }];\n if (Array.isArray(resolvedMetadata.author)) return resolvedMetadata.author;\n return [resolvedMetadata.author];\n };\n\n // Helper to normalize format detection\n const getFormatDetection = () => {\n if (!resolvedMetadata.formatDetection) return null;\n\n const parts: string[] = [];\n if (resolvedMetadata.formatDetection.telephone === false) parts.push('telephone=no');\n if (resolvedMetadata.formatDetection.date === false) parts.push('date=no');\n if (resolvedMetadata.formatDetection.address === false) parts.push('address=no');\n if (resolvedMetadata.formatDetection.email === false) parts.push('email=no');\n\n return parts.length > 0 ? parts.join(', ') : null;\n };\n\n // Helper to normalize Open Graph images\n const getOgImages = () => {\n if (!resolvedMetadata.openGraph?.images) return [];\n\n const images = Array.isArray(resolvedMetadata.openGraph.images)\n ? resolvedMetadata.openGraph.images\n : [resolvedMetadata.openGraph.images];\n\n return images.map((img) => {\n if (typeof img === 'string') return { url: img };\n return img;\n });\n };\n\n // Helper to normalize Twitter images\n const getTwitterImages = () => {\n if (!resolvedMetadata.twitter?.images) return [];\n\n const images = Array.isArray(resolvedMetadata.twitter.images)\n ? resolvedMetadata.twitter.images\n : [resolvedMetadata.twitter.images];\n\n return images.map((img) => {\n if (typeof img === 'string') return { url: img };\n return img;\n });\n };\n\n // Helper to get icon URLs\n const getIcons = () => {\n if (!resolvedMetadata.icons) return { icon: [], apple: [], shortcut: null, other: [] };\n\n const iconUrls = resolvedMetadata.icons.icon\n ? Array.isArray(resolvedMetadata.icons.icon)\n ? resolvedMetadata.icons.icon\n : [resolvedMetadata.icons.icon]\n : [];\n\n const appleUrls = resolvedMetadata.icons.apple\n ? Array.isArray(resolvedMetadata.icons.apple)\n ? resolvedMetadata.icons.apple\n : [resolvedMetadata.icons.apple]\n : [];\n\n return {\n icon: iconUrls,\n apple: appleUrls,\n shortcut: resolvedMetadata.icons.shortcut || null,\n other: resolvedMetadata.icons.other || [],\n };\n };\n\n const title = getTitle();\n const robots = getRobots();\n const viewport = getViewport();\n const keywords = getKeywords();\n const authors = getAuthors();\n const formatDetection = getFormatDetection();\n const ogImages = getOgImages();\n const twitterImages = getTwitterImages();\n const icons = getIcons();\n const themeColors = Array.isArray(resolvedMetadata.themeColor)\n ? resolvedMetadata.themeColor\n : resolvedMetadata.themeColor\n ? [resolvedMetadata.themeColor]\n : [];\n\n return (\n <>\n {/* Critical: charset, viewport - must be first */}\n {(resolvedMetadata.charset || viewport) && (\n <Head priority={HEAD_PRIORITY.CRITICAL}>\n {resolvedMetadata.charset && <meta charset={resolvedMetadata.charset} />}\n {viewport && <meta name=\"viewport\" content={viewport} />}\n </Head>\n )}\n\n {/* High priority: title, description, canonical, prev/next, hreflang alternates */}\n {(title ||\n resolvedMetadata.description ||\n resolvedMetadata.canonical ||\n resolvedMetadata.prev ||\n resolvedMetadata.next ||\n resolvedMetadata.alternateLocales) && (\n <Head priority={HEAD_PRIORITY.HIGH}>\n {title && <title>{title}</title>}\n {resolvedMetadata.description && (\n <meta name=\"description\" content={resolvedMetadata.description} />\n )}\n {resolvedMetadata.canonical && <link rel=\"canonical\" href={resolvedMetadata.canonical} />}\n {resolvedMetadata.prev && <link rel=\"prev\" href={resolvedMetadata.prev} />}\n {resolvedMetadata.next && <link rel=\"next\" href={resolvedMetadata.next} />}\n {resolvedMetadata.alternateLocales &&\n Object.entries(resolvedMetadata.alternateLocales).map(([hreflang, href]) => (\n <link rel=\"alternate\" hreflang={hreflang} href={href} />\n ))}\n </Head>\n )}\n\n {/* Medium priority: meta tags, robots */}\n <Head priority={HEAD_PRIORITY.MEDIUM}>\n {keywords && <meta name=\"keywords\" content={keywords} />}\n {robots && <meta name=\"robots\" content={robots} />}\n {resolvedMetadata.colorScheme && (\n <meta name=\"color-scheme\" content={resolvedMetadata.colorScheme} />\n )}\n\n {/* Theme colors */}\n {themeColors.map((color, index) => (\n <meta name=\"theme-color\" content={color} />\n ))}\n\n {resolvedMetadata.generator && (\n <meta name=\"generator\" content={resolvedMetadata.generator} />\n )}\n {resolvedMetadata.creator && <meta name=\"creator\" content={resolvedMetadata.creator} />}\n {resolvedMetadata.publisher && (\n <meta name=\"publisher\" content={resolvedMetadata.publisher} />\n )}\n {resolvedMetadata.referrer && <meta name=\"referrer\" content={resolvedMetadata.referrer} />}\n {resolvedMetadata.category && <meta name=\"category\" content={resolvedMetadata.category} />}\n {resolvedMetadata.classification && (\n <meta name=\"classification\" content={resolvedMetadata.classification} />\n )}\n {formatDetection && <meta name=\"format-detection\" content={formatDetection} />}\n\n {/* Authors */}\n {authors.map((author, index) => (\n <Fragment>\n <meta name=\"author\" content={author.name} />\n {author.url && <link rel=\"author\" href={author.url} />}\n </Fragment>\n ))}\n\n {/* Icons */}\n {icons.icon.map((url, index) => (\n <link rel=\"icon\" href={url} />\n ))}\n {icons.shortcut && <link rel=\"shortcut icon\" href={icons.shortcut} />}\n {icons.apple.map((url, index) => (\n <link rel=\"apple-touch-icon\" href={url} />\n ))}\n {icons.other.map((icon, index) => (\n <link\n rel={icon.rel || 'icon'}\n href={icon.url}\n {...(icon.sizes && { sizes: icon.sizes })}\n {...(icon.type && { type: icon.type })}\n />\n ))}\n\n {/* Manifest */}\n {resolvedMetadata.manifest && <link rel=\"manifest\" href={resolvedMetadata.manifest} />}\n\n {/* Feeds */}\n {resolvedMetadata.feed && (\n <link rel=\"alternate\" type=\"application/rss+xml\" href={resolvedMetadata.feed} />\n )}\n\n {/* Verification */}\n {resolvedMetadata.verification?.google && (\n <meta name=\"google-site-verification\" content={resolvedMetadata.verification.google} />\n )}\n {resolvedMetadata.verification?.yahoo && (\n <meta name=\"y_key\" content={resolvedMetadata.verification.yahoo} />\n )}\n {resolvedMetadata.verification?.yandex && (\n <meta name=\"yandex-verification\" content={resolvedMetadata.verification.yandex} />\n )}\n {resolvedMetadata.verification?.me &&\n (Array.isArray(resolvedMetadata.verification.me) ? (\n resolvedMetadata.verification.me.map((url, index) => <link rel=\"me\" href={url} />)\n ) : (\n <link rel=\"me\" href={resolvedMetadata.verification.me} />\n ))}\n {resolvedMetadata.verification?.other &&\n Object.entries(resolvedMetadata.verification.other).map(([key, value]) =>\n Array.isArray(value) ? (\n value.map((v, index) => <meta name={key} content={v} />)\n ) : (\n <meta name={key} content={value} />\n ),\n )}\n\n {/* App Links */}\n {resolvedMetadata.appLinks && (\n <Fragment>\n {resolvedMetadata.appLinks.ios?.url && (\n <meta property=\"al:ios:url\" content={resolvedMetadata.appLinks.ios.url} />\n )}\n {resolvedMetadata.appLinks.ios?.app_store_id && (\n <meta\n property=\"al:ios:app_store_id\"\n content={resolvedMetadata.appLinks.ios.app_store_id}\n />\n )}\n {resolvedMetadata.appLinks.ios?.app_name && (\n <meta property=\"al:ios:app_name\" content={resolvedMetadata.appLinks.ios.app_name} />\n )}\n {resolvedMetadata.appLinks.android?.package && (\n <meta\n property=\"al:android:package\"\n content={resolvedMetadata.appLinks.android.package}\n />\n )}\n {resolvedMetadata.appLinks.android?.app_name && (\n <meta\n property=\"al:android:app_name\"\n content={resolvedMetadata.appLinks.android.app_name}\n />\n )}\n {resolvedMetadata.appLinks.android?.url && (\n <meta property=\"al:android:url\" content={resolvedMetadata.appLinks.android.url} />\n )}\n {resolvedMetadata.appLinks.web?.url && (\n <meta property=\"al:web:url\" content={resolvedMetadata.appLinks.web.url} />\n )}\n {resolvedMetadata.appLinks.web?.should_fallback !== undefined && (\n <meta\n property=\"al:web:should_fallback\"\n content={String(resolvedMetadata.appLinks.web.should_fallback)}\n />\n )}\n </Fragment>\n )}\n\n {/* Additional meta tags */}\n {resolvedMetadata.other &&\n Object.entries(resolvedMetadata.other).map(([key, value]) =>\n Array.isArray(value) ? (\n value.map((v, index) => <meta name={key} content={String(v)} />)\n ) : (\n <meta name={key} content={String(value)} />\n ),\n )}\n </Head>\n\n {/* SEO: OpenGraph, Twitter - lower priority */}\n {(resolvedMetadata.openGraph || resolvedMetadata.twitter) && (\n <Head priority={HEAD_PRIORITY.SEO}>\n {/* Open Graph */}\n {resolvedMetadata.openGraph && (\n <Fragment>\n {resolvedMetadata.openGraph.title && (\n <meta property=\"og:title\" content={resolvedMetadata.openGraph.title} />\n )}\n {resolvedMetadata.openGraph.description && (\n <meta property=\"og:description\" content={resolvedMetadata.openGraph.description} />\n )}\n {resolvedMetadata.openGraph.type && (\n <meta property=\"og:type\" content={resolvedMetadata.openGraph.type} />\n )}\n {resolvedMetadata.openGraph.url && (\n <meta property=\"og:url\" content={resolvedMetadata.openGraph.url} />\n )}\n {resolvedMetadata.openGraph.siteName && (\n <meta property=\"og:site_name\" content={resolvedMetadata.openGraph.siteName} />\n )}\n {resolvedMetadata.openGraph.locale && (\n <meta property=\"og:locale\" content={resolvedMetadata.openGraph.locale} />\n )}\n {resolvedMetadata.openGraph.alternateLocale &&\n (Array.isArray(resolvedMetadata.openGraph.alternateLocale) ? (\n resolvedMetadata.openGraph.alternateLocale.map((locale, index) => (\n <meta property=\"og:locale:alternate\" content={locale} />\n ))\n ) : (\n <meta\n property=\"og:locale:alternate\"\n content={resolvedMetadata.openGraph.alternateLocale}\n />\n ))}\n {resolvedMetadata.openGraph.determiner && (\n <meta property=\"og:determiner\" content={resolvedMetadata.openGraph.determiner} />\n )}\n\n {/* OG Images */}\n {ogImages.map((image, index) => (\n <Fragment>\n <meta property=\"og:image\" content={image.url} />\n {image.secureUrl && (\n <meta property=\"og:image:secure_url\" content={image.secureUrl} />\n )}\n {image.alt && <meta property=\"og:image:alt\" content={image.alt} />}\n {image.type && <meta property=\"og:image:type\" content={image.type} />}\n {image.width && <meta property=\"og:image:width\" content={String(image.width)} />}\n {image.height && (\n <meta property=\"og:image:height\" content={String(image.height)} />\n )}\n </Fragment>\n ))}\n\n {/* Article specific */}\n {resolvedMetadata.openGraph.publishedTime && (\n <meta\n property=\"article:published_time\"\n content={resolvedMetadata.openGraph.publishedTime}\n />\n )}\n {resolvedMetadata.openGraph.modifiedTime && (\n <meta\n property=\"article:modified_time\"\n content={resolvedMetadata.openGraph.modifiedTime}\n />\n )}\n {resolvedMetadata.openGraph.expirationTime && (\n <meta\n property=\"article:expiration_time\"\n content={resolvedMetadata.openGraph.expirationTime}\n />\n )}\n {resolvedMetadata.openGraph.authors &&\n (Array.isArray(resolvedMetadata.openGraph.authors) ? (\n resolvedMetadata.openGraph.authors.map((author, index) => (\n <meta property=\"article:author\" content={author} />\n ))\n ) : (\n <meta property=\"article:author\" content={resolvedMetadata.openGraph.authors} />\n ))}\n {resolvedMetadata.openGraph.section && (\n <meta property=\"article:section\" content={resolvedMetadata.openGraph.section} />\n )}\n {resolvedMetadata.openGraph.tags &&\n (Array.isArray(resolvedMetadata.openGraph.tags) ? (\n resolvedMetadata.openGraph.tags.map((tag, index) => (\n <meta property=\"article:tag\" content={tag} />\n ))\n ) : (\n <meta property=\"article:tag\" content={resolvedMetadata.openGraph.tags} />\n ))}\n\n {/* Book specific */}\n {resolvedMetadata.openGraph.isbn && (\n <meta property=\"book:isbn\" content={resolvedMetadata.openGraph.isbn} />\n )}\n {resolvedMetadata.openGraph.releaseDate && (\n <meta\n property=\"book:release_date\"\n content={resolvedMetadata.openGraph.releaseDate}\n />\n )}\n\n {/* Profile specific */}\n {resolvedMetadata.openGraph.firstName && (\n <meta\n property=\"profile:first_name\"\n content={resolvedMetadata.openGraph.firstName}\n />\n )}\n {resolvedMetadata.openGraph.lastName && (\n <meta property=\"profile:last_name\" content={resolvedMetadata.openGraph.lastName} />\n )}\n {resolvedMetadata.openGraph.username && (\n <meta property=\"profile:username\" content={resolvedMetadata.openGraph.username} />\n )}\n {resolvedMetadata.openGraph.gender && (\n <meta property=\"profile:gender\" content={resolvedMetadata.openGraph.gender} />\n )}\n </Fragment>\n )}\n\n {/* Twitter Card */}\n {resolvedMetadata.twitter && (\n <Fragment>\n {resolvedMetadata.twitter.card && (\n <meta name=\"twitter:card\" content={resolvedMetadata.twitter.card} />\n )}\n {resolvedMetadata.twitter.site && (\n <meta name=\"twitter:site\" content={resolvedMetadata.twitter.site} />\n )}\n {resolvedMetadata.twitter.siteId && (\n <meta name=\"twitter:site:id\" content={resolvedMetadata.twitter.siteId} />\n )}\n {resolvedMetadata.twitter.creator && (\n <meta name=\"twitter:creator\" content={resolvedMetadata.twitter.creator} />\n )}\n {resolvedMetadata.twitter.creatorId && (\n <meta name=\"twitter:creator:id\" content={resolvedMetadata.twitter.creatorId} />\n )}\n {resolvedMetadata.twitter.title && (\n <meta name=\"twitter:title\" content={resolvedMetadata.twitter.title} />\n )}\n {resolvedMetadata.twitter.description && (\n <meta name=\"twitter:description\" content={resolvedMetadata.twitter.description} />\n )}\n\n {/* Twitter Images */}\n {twitterImages.map((image, index) => (\n <Fragment>\n <meta name=\"twitter:image\" content={image.url} />\n {image.alt && <meta name=\"twitter:image:alt\" content={image.alt} />}\n </Fragment>\n ))}\n\n {/* Twitter App */}\n {resolvedMetadata.twitter.app && (\n <Fragment>\n {resolvedMetadata.twitter.app.name && (\n <meta name=\"twitter:app:name\" content={resolvedMetadata.twitter.app.name} />\n )}\n {resolvedMetadata.twitter.app.id.iphone && (\n <meta\n name=\"twitter:app:id:iphone\"\n content={resolvedMetadata.twitter.app.id.iphone}\n />\n )}\n {resolvedMetadata.twitter.app.id.ipad && (\n <meta\n name=\"twitter:app:id:ipad\"\n content={resolvedMetadata.twitter.app.id.ipad}\n />\n )}\n {resolvedMetadata.twitter.app.id.googleplay && (\n <meta\n name=\"twitter:app:id:googleplay\"\n content={resolvedMetadata.twitter.app.id.googleplay}\n />\n )}\n {resolvedMetadata.twitter.app.url?.iphone && (\n <meta\n name=\"twitter:app:url:iphone\"\n content={resolvedMetadata.twitter.app.url.iphone}\n />\n )}\n {resolvedMetadata.twitter.app.url?.ipad && (\n <meta\n name=\"twitter:app:url:ipad\"\n content={resolvedMetadata.twitter.app.url.ipad}\n />\n )}\n {resolvedMetadata.twitter.app.url?.googleplay && (\n <meta\n name=\"twitter:app:url:googleplay\"\n content={resolvedMetadata.twitter.app.url.googleplay}\n />\n )}\n </Fragment>\n )}\n </Fragment>\n )}\n </Head>\n )}\n </>\n );\n}\n"],"names":["MetadataRenderer","metadata","request","useRequest","stackMetadata","resolveMetadata","resolvedMetadata","mergeMetadata","getTitle","getRobots","name","parts","getViewport","getKeywords","getAuthors","getFormatDetection","getOgImages","img","getTwitterImages","getIcons","iconUrls","appleUrls","title","robots","viewport","keywords","authors","formatDetection","ogImages","twitterImages","icons","themeColors","jsxFactory","__Fragment","Head","HEAD_PRIORITY","hreflang","href","color","index","author","Fragment","url","icon","key","value","v","locale","image","tag"],"mappings":";;AAcO,SAASA,EAAiB,EAAE,UAAAC,KAAqC;AACtE,QAAM,EAAE,SAAAC,EAAA,IAAYC,EAAA,GAGdC,IAAgBC,EAAA,GAKhBC,IAAmBL,IAAWM,EAAcH,GAAeH,CAAQ,IAAIG;AAE7E,MAAI,CAACE,EAAkB,QAAO;AAG9B,QAAME,IAAW,MACVF,EAAiB,QAClB,OAAOA,EAAiB,SAAU,WAAiBA,EAAiB,QAEjEA,EAAiB,MAAM,UAHM,MAOhCG,IAAY,MAAM;AActB,QAZmB,OAAO,KAAKP,EAAQ,SAAS,CAAA,CAAE,EAKrC,OAAO,CAACQ,MACb,OAAOJ,EAAiB,UAAW,WAAiB,KACpD,MAAM,QAAQA,EAAiB,QAAQ,eAAe,IACjD,CAACA,EAAiB,OAAO,gBAAgB,SAASI,CAAI,IACxDA,MAASJ,EAAiB,QAAQ,eAC1C,EAAE,SAAS,EAED,QAAO;AAEpB,QAAI,CAACA,EAAiB,OAAQ,QAAO;AACrC,QAAI,OAAOA,EAAiB,UAAW,iBAAiBA,EAAiB;AAEzE,UAAMK,IAAkB,CAAA;AACxB,WAAIL,EAAiB,OAAO,UAAU,KAAOK,EAAM,KAAK,SAAS,IACxDL,EAAiB,OAAO,UAAU,MAAMK,EAAM,KAAK,OAAO,GAE/DL,EAAiB,OAAO,WAAW,KAAOK,EAAM,KAAK,UAAU,IAC1DL,EAAiB,OAAO,WAAW,MAAMK,EAAM,KAAK,QAAQ,GAEjEL,EAAiB,OAAO,aAAWK,EAAM,KAAK,WAAW,GACzDL,EAAiB,OAAO,aAAWK,EAAM,KAAK,WAAW,GACzDL,EAAiB,OAAO,gBAAcK,EAAM,KAAK,cAAc,GAC/DL,EAAiB,OAAO,WAASK,EAAM,KAAK,SAAS,GAElDA,EAAM,SAAS,IAAIA,EAAM,KAAK,IAAI,IAAI;AAAA,EAC/C,GAGMC,IAAc,MAAM;AACxB,QAAI,CAACN,EAAiB,SAAU,QAAO;AACvC,QAAI,OAAOA,EAAiB,YAAa,iBAAiBA,EAAiB;AAE3E,UAAMK,IAAkB,CAAA;AACxB,WAAIL,EAAiB,SAAS,SAAOK,EAAM,KAAK,SAASL,EAAiB,SAAS,KAAK,EAAE,GACtFA,EAAiB,SAAS,UAAQK,EAAM,KAAK,UAAUL,EAAiB,SAAS,MAAM,EAAE,GACzFA,EAAiB,SAAS,gBAC5BK,EAAM,KAAK,iBAAiBL,EAAiB,SAAS,YAAY,EAAE,GAClEA,EAAiB,SAAS,gBAC5BK,EAAM,KAAK,iBAAiBL,EAAiB,SAAS,YAAY,EAAE,GAClEA,EAAiB,SAAS,gBAC5BK,EAAM,KAAK,iBAAiBL,EAAiB,SAAS,YAAY,EAAE,GAClEA,EAAiB,SAAS,iBAAiB,UAC7CK,EAAM,KAAK,iBAAiBL,EAAiB,SAAS,eAAe,QAAQ,IAAI,EAAE,GAG9EK,EAAM,SAAS,IAAIA,EAAM,KAAK,IAAI,IAAI;AAAA,EAC/C,GAGME,IAAc,MACbP,EAAiB,WAClB,MAAM,QAAQA,EAAiB,QAAQ,IAAUA,EAAiB,SAAS,KAAK,IAAI,IACjFA,EAAiB,WAFe,MAMnCQ,IAAa,MACZR,EAAiB,SAClB,OAAOA,EAAiB,UAAW,WAAiB,CAAC,EAAE,MAAMA,EAAiB,QAAQ,IACtF,MAAM,QAAQA,EAAiB,MAAM,IAAUA,EAAiB,SAC7D,CAACA,EAAiB,MAAM,IAHM,CAAA,GAOjCS,IAAqB,MAAM;AAC/B,QAAI,CAACT,EAAiB,gBAAiB,QAAO;AAE9C,UAAMK,IAAkB,CAAA;AACxB,WAAIL,EAAiB,gBAAgB,cAAc,MAAOK,EAAM,KAAK,cAAc,GAC/EL,EAAiB,gBAAgB,SAAS,MAAOK,EAAM,KAAK,SAAS,GACrEL,EAAiB,gBAAgB,YAAY,MAAOK,EAAM,KAAK,YAAY,GAC3EL,EAAiB,gBAAgB,UAAU,MAAOK,EAAM,KAAK,UAAU,GAEpEA,EAAM,SAAS,IAAIA,EAAM,KAAK,IAAI,IAAI;AAAA,EAC/C,GAGMK,IAAc,MACbV,EAAiB,WAAW,UAElB,MAAM,QAAQA,EAAiB,UAAU,MAAM,IAC1DA,EAAiB,UAAU,SAC3B,CAACA,EAAiB,UAAU,MAAM,GAExB,IAAI,CAACW,MACb,OAAOA,KAAQ,WAAiB,EAAE,KAAKA,EAAA,IACpCA,CACR,IAT+C,CAAA,GAa5CC,IAAmB,MAClBZ,EAAiB,SAAS,UAEhB,MAAM,QAAQA,EAAiB,QAAQ,MAAM,IACxDA,EAAiB,QAAQ,SACzB,CAACA,EAAiB,QAAQ,MAAM,GAEtB,IAAI,CAACW,MACb,OAAOA,KAAQ,WAAiB,EAAE,KAAKA,EAAA,IACpCA,CACR,IAT6C,CAAA,GAa1CE,IAAW,MAAM;AACrB,QAAI,CAACb,EAAiB,MAAO,QAAO,EAAE,MAAM,CAAA,GAAI,OAAO,CAAA,GAAI,UAAU,MAAM,OAAO,CAAA,EAAC;AAEnF,UAAMc,IAAWd,EAAiB,MAAM,OACpC,MAAM,QAAQA,EAAiB,MAAM,IAAI,IACvCA,EAAiB,MAAM,OACvB,CAACA,EAAiB,MAAM,IAAI,IAC9B,CAAA,GAEEe,IAAYf,EAAiB,MAAM,QACrC,MAAM,QAAQA,EAAiB,MAAM,KAAK,IACxCA,EAAiB,MAAM,QACvB,CAACA,EAAiB,MAAM,KAAK,IAC/B,CAAA;AAEJ,WAAO;AAAA,MACL,MAAMc;AAAA,MACN,OAAOC;AAAA,MACP,UAAUf,EAAiB,MAAM,YAAY;AAAA,MAC7C,OAAOA,EAAiB,MAAM,SAAS,CAAA;AAAA,IAAC;AAAA,EAE5C,GAEMgB,IAAQd,EAAA,GACRe,IAASd,EAAA,GACTe,IAAWZ,EAAA,GACXa,IAAWZ,EAAA,GACXa,IAAUZ,EAAA,GACVa,IAAkBZ,EAAA,GAClBa,IAAWZ,EAAA,GACXa,IAAgBX,EAAA,GAChBY,IAAQX,EAAA,GACRY,IAAc,MAAM,QAAQzB,EAAiB,UAAU,IACzDA,EAAiB,aACjBA,EAAiB,aACf,CAACA,EAAiB,UAAU,IAC5B,CAAA;AAEN,SACE,gBAAA0B,EAAAC,GAAA,OAEI3B,EAAiB,WAAWkB,wBAC3BU,GAAA,EAAK,UAAUC,EAAc,SAAA,GAC3B7B,EAAiB,WAAW,gBAAA0B,EAAC,QAAA,EAAK,SAAS1B,EAAiB,QAAA,CAAS,GACrEkB,KAAY,gBAAAQ,EAAC,QAAA,EAAK,MAAK,YAAW,SAASR,EAAA,CAAU,CACxD,IAIAF,KACAhB,EAAiB,eACjBA,EAAiB,aACjBA,EAAiB,QACjBA,EAAiB,QACjBA,EAAiB,qBACjB,gBAAA0B,EAACE,GAAA,EAAK,UAAUC,EAAc,KAAA,GAC3Bb,KAAS,gBAAAU,EAAC,SAAA,MAAOV,CAAM,GACvBhB,EAAiB,iCACf,QAAA,EAAK,MAAK,eAAc,SAASA,EAAiB,YAAA,CAAa,GAEjEA,EAAiB,aAAa,gBAAA0B,EAAC,QAAA,EAAK,KAAI,aAAY,MAAM1B,EAAiB,UAAA,CAAW,GACtFA,EAAiB,QAAQ,gBAAA0B,EAAC,QAAA,EAAK,KAAI,QAAO,MAAM1B,EAAiB,KAAA,CAAM,GACvEA,EAAiB,QAAQ,gBAAA0B,EAAC,QAAA,EAAK,KAAI,QAAO,MAAM1B,EAAiB,KAAA,CAAM,GACvEA,EAAiB,oBAChB,OAAO,QAAQA,EAAiB,gBAAgB,EAAE,IAAI,CAAC,CAAC8B,GAAUC,CAAI,wBACnE,QAAA,EAAK,KAAI,aAAY,UAAAD,GAAoB,MAAAC,GAAY,CACvD,CACL,GAIF,gBAAAL,EAACE,GAAA,EAAK,UAAUC,EAAc,OAAA,GAC3BV,KAAY,gBAAAO,EAAC,QAAA,EAAK,MAAK,YAAW,SAASP,GAAU,GACrDF,uBAAW,QAAA,EAAK,MAAK,UAAS,SAASA,EAAA,CAAQ,GAC/CjB,EAAiB,iCACf,QAAA,EAAK,MAAK,gBAAe,SAASA,EAAiB,YAAA,CAAa,GAIlEyB,EAAY,IAAI,CAACO,GAAOC,MACvB,gBAAAP,EAAC,QAAA,EAAK,MAAK,eAAc,SAASM,EAAA,CAAO,CAC1C,GAEAhC,EAAiB,aAChB,gBAAA0B,EAAC,QAAA,EAAK,MAAK,aAAY,SAAS1B,EAAiB,UAAA,CAAW,GAE7DA,EAAiB,WAAW,gBAAA0B,EAAC,QAAA,EAAK,MAAK,WAAU,SAAS1B,EAAiB,QAAA,CAAS,GACpFA,EAAiB,aAChB,gBAAA0B,EAAC,QAAA,EAAK,MAAK,aAAY,SAAS1B,EAAiB,UAAA,CAAW,GAE7DA,EAAiB,YAAY,gBAAA0B,EAAC,QAAA,EAAK,MAAK,YAAW,SAAS1B,EAAiB,SAAA,CAAU,GACvFA,EAAiB,YAAY,gBAAA0B,EAAC,QAAA,EAAK,MAAK,YAAW,SAAS1B,EAAiB,SAAA,CAAU,GACvFA,EAAiB,kBAChB,gBAAA0B,EAAC,UAAK,MAAK,kBAAiB,SAAS1B,EAAiB,gBAAgB,GAEvEqB,KAAmB,gBAAAK,EAAC,QAAA,EAAK,MAAK,oBAAmB,SAASL,EAAA,CAAiB,GAG3ED,EAAQ,IAAI,CAACc,GAAQD,MACpB,gBAAAP,EAACS,GAAA,MACC,gBAAAT,EAAC,QAAA,EAAK,MAAK,UAAS,SAASQ,EAAO,MAAM,GACzCA,EAAO,OAAO,gBAAAR,EAAC,QAAA,EAAK,KAAI,UAAS,MAAMQ,EAAO,IAAA,CAAK,CACtD,CACD,GAGAV,EAAM,KAAK,IAAI,CAACY,GAAKH,MACpB,gBAAAP,EAAC,QAAA,EAAK,KAAI,QAAO,MAAMU,EAAA,CAAK,CAC7B,GACAZ,EAAM,YAAY,gBAAAE,EAAC,QAAA,EAAK,KAAI,iBAAgB,MAAMF,EAAM,SAAA,CAAU,GAClEA,EAAM,MAAM,IAAI,CAACY,GAAKH,MACrB,gBAAAP,EAAC,QAAA,EAAK,KAAI,oBAAmB,MAAMU,EAAA,CAAK,CACzC,GACAZ,EAAM,MAAM,IAAI,CAACa,GAAMJ,MACtB,gBAAAP;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKW,EAAK,OAAO;AAAA,MACjB,MAAMA,EAAK;AAAA,MACV,GAAIA,EAAK,SAAS,EAAE,OAAOA,EAAK,MAAA;AAAA,MAChC,GAAIA,EAAK,QAAQ,EAAE,MAAMA,EAAK,KAAA;AAAA,IAAK;AAAA,EAAA,CAEvC,GAGArC,EAAiB,8BAAa,QAAA,EAAK,KAAI,YAAW,MAAMA,EAAiB,SAAA,CAAU,GAGnFA,EAAiB,0BACf,QAAA,EAAK,KAAI,aAAY,MAAK,uBAAsB,MAAMA,EAAiB,KAAA,CAAM,GAI/EA,EAAiB,cAAc,4BAC7B,QAAA,EAAK,MAAK,4BAA2B,SAASA,EAAiB,aAAa,OAAA,CAAQ,GAEtFA,EAAiB,cAAc,SAC9B,gBAAA0B,EAAC,UAAK,MAAK,SAAQ,SAAS1B,EAAiB,aAAa,MAAA,CAAO,GAElEA,EAAiB,cAAc,UAC9B,gBAAA0B,EAAC,QAAA,EAAK,MAAK,uBAAsB,SAAS1B,EAAiB,aAAa,OAAA,CAAQ,GAEjFA,EAAiB,cAAc,OAC7B,MAAM,QAAQA,EAAiB,aAAa,EAAE,IAC7CA,EAAiB,aAAa,GAAG,IAAI,CAACoC,GAAKH,wBAAW,QAAA,EAAK,KAAI,MAAK,MAAMG,EAAA,CAAK,CAAE,IAEjF,gBAAAV,EAAC,QAAA,EAAK,KAAI,MAAK,MAAM1B,EAAiB,aAAa,GAAA,CAAI,IAE1DA,EAAiB,cAAc,SAC9B,OAAO,QAAQA,EAAiB,aAAa,KAAK,EAAE;AAAA,IAAI,CAAC,CAACsC,GAAKC,CAAK,MAClE,MAAM,QAAQA,CAAK,IACjBA,EAAM,IAAI,CAACC,GAAGP,MAAU,gBAAAP,EAAC,QAAA,EAAK,MAAMY,GAAK,SAASE,EAAA,CAAG,CAAE,IAEvD,gBAAAd,EAAC,QAAA,EAAK,MAAMY,GAAK,SAASC,EAAA,CAAO;AAAA,EAAA,GAKtCvC,EAAiB,YAChB,gBAAA0B,EAACS,SACEnC,EAAiB,SAAS,KAAK,OAC9B,gBAAA0B,EAAC,QAAA,EAAK,UAAS,cAAa,SAAS1B,EAAiB,SAAS,IAAI,KAAK,GAEzEA,EAAiB,SAAS,KAAK,gBAC9B,gBAAA0B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAS;AAAA,MACT,SAAS1B,EAAiB,SAAS,IAAI;AAAA,IAAA;AAAA,EAAA,GAG1CA,EAAiB,SAAS,KAAK,YAC9B,gBAAA0B,EAAC,UAAK,UAAS,mBAAkB,SAAS1B,EAAiB,SAAS,IAAI,SAAA,CAAU,GAEnFA,EAAiB,SAAS,SAAS,WAClC,gBAAA0B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAS;AAAA,MACT,SAAS1B,EAAiB,SAAS,QAAQ;AAAA,IAAA;AAAA,EAAA,GAG9CA,EAAiB,SAAS,SAAS,YAClC,gBAAA0B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAS;AAAA,MACT,SAAS1B,EAAiB,SAAS,QAAQ;AAAA,IAAA;AAAA,EAAA,GAG9CA,EAAiB,SAAS,SAAS,OAClC,gBAAA0B,EAAC,QAAA,EAAK,UAAS,kBAAiB,SAAS1B,EAAiB,SAAS,QAAQ,KAAK,GAEjFA,EAAiB,SAAS,KAAK,OAC9B,gBAAA0B,EAAC,QAAA,EAAK,UAAS,cAAa,SAAS1B,EAAiB,SAAS,IAAI,KAAK,GAEzEA,EAAiB,SAAS,KAAK,oBAAoB,UAClD,gBAAA0B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAS;AAAA,MACT,SAAS,OAAO1B,EAAiB,SAAS,IAAI,eAAe;AAAA,IAAA;AAAA,EAAA,CAGnE,GAIDA,EAAiB,SAChB,OAAO,QAAQA,EAAiB,KAAK,EAAE;AAAA,IAAI,CAAC,CAACsC,GAAKC,CAAK,MACrD,MAAM,QAAQA,CAAK,IACjBA,EAAM,IAAI,CAACC,GAAGP,MAAU,gBAAAP,EAAC,QAAA,EAAK,MAAMY,GAAK,SAAS,OAAOE,CAAC,GAAG,CAAE,IAE/D,gBAAAd,EAAC,QAAA,EAAK,MAAMY,GAAK,SAAS,OAAOC,CAAK,EAAA,CAAG;AAAA,EAAA,CAGjD,IAGEvC,EAAiB,aAAaA,EAAiB,YAC/C,gBAAA0B,EAACE,GAAA,EAAK,UAAUC,EAAc,IAAA,GAE3B7B,EAAiB,aAChB,gBAAA0B,EAACS,GAAA,MACEnC,EAAiB,UAAU,SAC1B,gBAAA0B,EAAC,UAAK,UAAS,YAAW,SAAS1B,EAAiB,UAAU,MAAA,CAAO,GAEtEA,EAAiB,UAAU,eAC1B,gBAAA0B,EAAC,QAAA,EAAK,UAAS,kBAAiB,SAAS1B,EAAiB,UAAU,YAAA,CAAa,GAElFA,EAAiB,UAAU,QAC1B,gBAAA0B,EAAC,QAAA,EAAK,UAAS,WAAU,SAAS1B,EAAiB,UAAU,KAAA,CAAM,GAEpEA,EAAiB,UAAU,OAC1B,gBAAA0B,EAAC,UAAK,UAAS,UAAS,SAAS1B,EAAiB,UAAU,IAAA,CAAK,GAElEA,EAAiB,UAAU,YAC1B,gBAAA0B,EAAC,QAAA,EAAK,UAAS,gBAAe,SAAS1B,EAAiB,UAAU,SAAA,CAAU,GAE7EA,EAAiB,UAAU,UAC1B,gBAAA0B,EAAC,QAAA,EAAK,UAAS,aAAY,SAAS1B,EAAiB,UAAU,OAAA,CAAQ,GAExEA,EAAiB,UAAU,oBACzB,MAAM,QAAQA,EAAiB,UAAU,eAAe,IACvDA,EAAiB,UAAU,gBAAgB,IAAI,CAACyC,GAAQR,MACtD,gBAAAP,EAAC,QAAA,EAAK,UAAS,uBAAsB,SAASe,EAAA,CAAQ,CACvD,IAED,gBAAAf;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAS;AAAA,MACT,SAAS1B,EAAiB,UAAU;AAAA,IAAA;AAAA,EAAA,IAGzCA,EAAiB,UAAU,cAC1B,gBAAA0B,EAAC,QAAA,EAAK,UAAS,iBAAgB,SAAS1B,EAAiB,UAAU,YAAY,GAIhFsB,EAAS,IAAI,CAACoB,GAAOT,MACpB,gBAAAP,EAACS,GAAA,MACC,gBAAAT,EAAC,QAAA,EAAK,UAAS,YAAW,SAASgB,EAAM,IAAA,CAAK,GAC7CA,EAAM,aACL,gBAAAhB,EAAC,UAAK,UAAS,uBAAsB,SAASgB,EAAM,WAAW,GAEhEA,EAAM,yBAAQ,QAAA,EAAK,UAAS,gBAAe,SAASA,EAAM,IAAA,CAAK,GAC/DA,EAAM,QAAQ,gBAAAhB,EAAC,UAAK,UAAS,iBAAgB,SAASgB,EAAM,MAAM,GAClEA,EAAM,SAAS,gBAAAhB,EAAC,QAAA,EAAK,UAAS,kBAAiB,SAAS,OAAOgB,EAAM,KAAK,EAAA,CAAG,GAC7EA,EAAM,UACL,gBAAAhB,EAAC,UAAK,UAAS,mBAAkB,SAAS,OAAOgB,EAAM,MAAM,EAAA,CAAG,CAEpE,CACD,GAGA1C,EAAiB,UAAU,iBAC1B,gBAAA0B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAS;AAAA,MACT,SAAS1B,EAAiB,UAAU;AAAA,IAAA;AAAA,EAAA,GAGvCA,EAAiB,UAAU,gBAC1B,gBAAA0B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAS;AAAA,MACT,SAAS1B,EAAiB,UAAU;AAAA,IAAA;AAAA,EAAA,GAGvCA,EAAiB,UAAU,kBAC1B,gBAAA0B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAS;AAAA,MACT,SAAS1B,EAAiB,UAAU;AAAA,IAAA;AAAA,EAAA,GAGvCA,EAAiB,UAAU,YACzB,MAAM,QAAQA,EAAiB,UAAU,OAAO,IAC/CA,EAAiB,UAAU,QAAQ,IAAI,CAACkC,GAAQD,MAC9C,gBAAAP,EAAC,QAAA,EAAK,UAAS,kBAAiB,SAASQ,GAAQ,CAClD,sBAEA,QAAA,EAAK,UAAS,kBAAiB,SAASlC,EAAiB,UAAU,QAAA,CAAS,IAEhFA,EAAiB,UAAU,6BACzB,QAAA,EAAK,UAAS,mBAAkB,SAASA,EAAiB,UAAU,QAAA,CAAS,GAE/EA,EAAiB,UAAU,SACzB,MAAM,QAAQA,EAAiB,UAAU,IAAI,IAC5CA,EAAiB,UAAU,KAAK,IAAI,CAAC2C,GAAKV,MACxC,gBAAAP,EAAC,QAAA,EAAK,UAAS,eAAc,SAASiB,GAAK,CAC5C,sBAEA,QAAA,EAAK,UAAS,eAAc,SAAS3C,EAAiB,UAAU,MAAM,IAI1EA,EAAiB,UAAU,0BACzB,QAAA,EAAK,UAAS,aAAY,SAASA,EAAiB,UAAU,KAAA,CAAM,GAEtEA,EAAiB,UAAU,eAC1B,gBAAA0B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAS;AAAA,MACT,SAAS1B,EAAiB,UAAU;AAAA,IAAA;AAAA,EAAA,GAKvCA,EAAiB,UAAU,aAC1B,gBAAA0B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAS;AAAA,MACT,SAAS1B,EAAiB,UAAU;AAAA,IAAA;AAAA,EAAA,GAGvCA,EAAiB,UAAU,YAC1B,gBAAA0B,EAAC,QAAA,EAAK,UAAS,qBAAoB,SAAS1B,EAAiB,UAAU,UAAU,GAElFA,EAAiB,UAAU,YAC1B,gBAAA0B,EAAC,UAAK,UAAS,oBAAmB,SAAS1B,EAAiB,UAAU,SAAA,CAAU,GAEjFA,EAAiB,UAAU,4BACzB,QAAA,EAAK,UAAS,kBAAiB,SAASA,EAAiB,UAAU,QAAQ,CAEhF,GAIDA,EAAiB,6BACfmC,GAAA,MACEnC,EAAiB,QAAQ,0BACvB,QAAA,EAAK,MAAK,gBAAe,SAASA,EAAiB,QAAQ,KAAA,CAAM,GAEnEA,EAAiB,QAAQ,QACxB,gBAAA0B,EAAC,QAAA,EAAK,MAAK,gBAAe,SAAS1B,EAAiB,QAAQ,MAAM,GAEnEA,EAAiB,QAAQ,UACxB,gBAAA0B,EAAC,UAAK,MAAK,mBAAkB,SAAS1B,EAAiB,QAAQ,QAAQ,GAExEA,EAAiB,QAAQ,WACxB,gBAAA0B,EAAC,UAAK,MAAK,mBAAkB,SAAS1B,EAAiB,QAAQ,QAAA,CAAS,GAEzEA,EAAiB,QAAQ,+BACvB,QAAA,EAAK,MAAK,sBAAqB,SAASA,EAAiB,QAAQ,WAAW,GAE9EA,EAAiB,QAAQ,SACxB,gBAAA0B,EAAC,QAAA,EAAK,MAAK,iBAAgB,SAAS1B,EAAiB,QAAQ,OAAO,GAErEA,EAAiB,QAAQ,eACxB,gBAAA0B,EAAC,UAAK,MAAK,uBAAsB,SAAS1B,EAAiB,QAAQ,aAAa,GAIjFuB,EAAc,IAAI,CAACmB,GAAOT,MACzB,gBAAAP,EAACS,GAAA,MACC,gBAAAT,EAAC,QAAA,EAAK,MAAK,iBAAgB,SAASgB,EAAM,KAAK,GAC9CA,EAAM,OAAO,gBAAAhB,EAAC,QAAA,EAAK,MAAK,qBAAoB,SAASgB,EAAM,KAAK,CACnE,CACD,GAGA1C,EAAiB,QAAQ,OACxB,gBAAA0B,EAACS,SACEnC,EAAiB,QAAQ,IAAI,QAC5B,gBAAA0B,EAAC,UAAK,MAAK,oBAAmB,SAAS1B,EAAiB,QAAQ,IAAI,MAAM,GAE3EA,EAAiB,QAAQ,IAAI,GAAG,UAC/B,gBAAA0B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS1B,EAAiB,QAAQ,IAAI,GAAG;AAAA,IAAA;AAAA,EAAA,GAG5CA,EAAiB,QAAQ,IAAI,GAAG,QAC/B,gBAAA0B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS1B,EAAiB,QAAQ,IAAI,GAAG;AAAA,IAAA;AAAA,EAAA,GAG5CA,EAAiB,QAAQ,IAAI,GAAG,cAC/B,gBAAA0B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS1B,EAAiB,QAAQ,IAAI,GAAG;AAAA,IAAA;AAAA,EAAA,GAG5CA,EAAiB,QAAQ,IAAI,KAAK,UACjC,gBAAA0B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS1B,EAAiB,QAAQ,IAAI,IAAI;AAAA,IAAA;AAAA,EAAA,GAG7CA,EAAiB,QAAQ,IAAI,KAAK,QACjC,gBAAA0B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS1B,EAAiB,QAAQ,IAAI,IAAI;AAAA,IAAA;AAAA,EAAA,GAG7CA,EAAiB,QAAQ,IAAI,KAAK,cACjC,gBAAA0B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS1B,EAAiB,QAAQ,IAAI,IAAI;AAAA,IAAA;AAAA,EAAA,CAGhD,CAEJ,CAEJ,CAEJ;AAEJ;"}
1
+ {"version":3,"file":"generateMetadata-Cn8BIxq6.js","sources":["../src/seo/generateMetadata.tsx"],"sourcesContent":["/// <reference types=\"../core/jsx-types\" />\nimport { HEAD_PRIORITY } from '../core/head-priority';\nimport { Fragment, Head, resolveMetadata, useRequest } from '../core/jsx-runtime';\n\nimport { mergeMetadata } from './mergeMetadata';\nimport type { Metadata } from './types';\n\n/**\n * Converts Metadata object to SEO meta tags\n * This is the core function that transforms the metadata object into actual HTML tags\n *\n * If metadata is provided, it will be merged with metadata from the stack (from global/page loaders)\n * If no metadata is provided, it will use resolved metadata from the stack\n */\nexport function MetadataRenderer({ metadata }: { metadata?: Metadata }) {\n const { request } = useRequest();\n\n // Resolve metadata from stack (hierarchical metadata from loaders)\n const stackMetadata = resolveMetadata();\n\n // Merge: stack metadata (parent) + provided metadata (child)\n // If metadata is provided, it overrides stack metadata\n // If not provided, use stack metadata only\n const resolvedMetadata = metadata ? mergeMetadata(stackMetadata, metadata) : stackMetadata;\n\n if (!resolvedMetadata) return null;\n\n // Helper to normalize title\n const getTitle = () => {\n if (!resolvedMetadata.title) return null;\n if (typeof resolvedMetadata.title === 'string') return resolvedMetadata.title;\n // Handle TemplateString\n return resolvedMetadata.title.default;\n };\n\n // Helper to normalize robots\n const getRobots = () => {\n // tránh tiêm query\n const queryNames = Object.keys(request.query || {});\n // mặc định nếu có query sẽ ép robots về noindex\n // tuy nhiên 1 số trường hợp đặc biệt ví dụ như page=1 có chủ đích `allowQueryNames` sẽ bỏ qua nguyên tắc này\n\n const noindex =\n queryNames.filter((name) => {\n if (typeof resolvedMetadata.robots === 'string') return false;\n if (Array.isArray(resolvedMetadata.robots?.allowQueryNames))\n return !resolvedMetadata.robots.allowQueryNames.includes(name);\n return name !== resolvedMetadata.robots?.allowQueryNames;\n }).length > 0;\n\n if (noindex) return 'noindex, follow';\n\n if (!resolvedMetadata.robots) return null;\n if (typeof resolvedMetadata.robots === 'string') return resolvedMetadata.robots;\n\n const parts: string[] = [];\n if (resolvedMetadata.robots.index === false) parts.push('noindex');\n else if (resolvedMetadata.robots.index === true) parts.push('index');\n\n if (resolvedMetadata.robots.follow === false) parts.push('nofollow');\n else if (resolvedMetadata.robots.follow === true) parts.push('follow');\n\n if (resolvedMetadata.robots.noarchive) parts.push('noarchive');\n if (resolvedMetadata.robots.nosnippet) parts.push('nosnippet');\n if (resolvedMetadata.robots.noimageindex) parts.push('noimageindex');\n if (resolvedMetadata.robots.nocache) parts.push('nocache');\n\n return parts.length > 0 ? parts.join(', ') : null;\n };\n\n // Helper to normalize viewport\n const getViewport = () => {\n if (!resolvedMetadata.viewport) return null;\n if (typeof resolvedMetadata.viewport === 'string') return resolvedMetadata.viewport;\n\n const parts: string[] = [];\n if (resolvedMetadata.viewport.width) parts.push(`width=${resolvedMetadata.viewport.width}`);\n if (resolvedMetadata.viewport.height) parts.push(`height=${resolvedMetadata.viewport.height}`);\n if (resolvedMetadata.viewport.initialScale)\n parts.push(`initial-scale=${resolvedMetadata.viewport.initialScale}`);\n if (resolvedMetadata.viewport.maximumScale)\n parts.push(`maximum-scale=${resolvedMetadata.viewport.maximumScale}`);\n if (resolvedMetadata.viewport.minimumScale)\n parts.push(`minimum-scale=${resolvedMetadata.viewport.minimumScale}`);\n if (resolvedMetadata.viewport.userScalable !== undefined) {\n parts.push(`user-scalable=${resolvedMetadata.viewport.userScalable ? 'yes' : 'no'}`);\n }\n\n return parts.length > 0 ? parts.join(', ') : null;\n };\n\n // Helper to normalize keywords\n const getKeywords = () => {\n if (!resolvedMetadata.keywords) return null;\n if (Array.isArray(resolvedMetadata.keywords)) return resolvedMetadata.keywords.join(', ');\n return resolvedMetadata.keywords;\n };\n\n // Helper to normalize authors\n const getAuthors = () => {\n if (!resolvedMetadata.author) return [];\n if (typeof resolvedMetadata.author === 'string') return [{ name: resolvedMetadata.author }];\n if (Array.isArray(resolvedMetadata.author)) return resolvedMetadata.author;\n return [resolvedMetadata.author];\n };\n\n // Helper to normalize format detection\n const getFormatDetection = () => {\n if (!resolvedMetadata.formatDetection) return null;\n\n const parts: string[] = [];\n if (resolvedMetadata.formatDetection.telephone === false) parts.push('telephone=no');\n if (resolvedMetadata.formatDetection.date === false) parts.push('date=no');\n if (resolvedMetadata.formatDetection.address === false) parts.push('address=no');\n if (resolvedMetadata.formatDetection.email === false) parts.push('email=no');\n\n return parts.length > 0 ? parts.join(', ') : null;\n };\n\n // Helper to normalize Open Graph images\n const getOgImages = () => {\n if (!resolvedMetadata.openGraph?.images) return [];\n\n const images = Array.isArray(resolvedMetadata.openGraph.images)\n ? resolvedMetadata.openGraph.images\n : [resolvedMetadata.openGraph.images];\n\n return images.map((img) => {\n if (typeof img === 'string') return { url: img };\n return img;\n });\n };\n\n // Helper to normalize Twitter images\n const getTwitterImages = () => {\n if (!resolvedMetadata.twitter?.images) return [];\n\n const images = Array.isArray(resolvedMetadata.twitter.images)\n ? resolvedMetadata.twitter.images\n : [resolvedMetadata.twitter.images];\n\n return images.map((img) => {\n if (typeof img === 'string') return { url: img };\n return img;\n });\n };\n\n // Helper to get icon URLs\n const getIcons = () => {\n if (!resolvedMetadata.icons) return { icon: [], apple: [], shortcut: null, other: [] };\n\n const iconUrls = resolvedMetadata.icons.icon\n ? Array.isArray(resolvedMetadata.icons.icon)\n ? resolvedMetadata.icons.icon\n : [resolvedMetadata.icons.icon]\n : [];\n\n const appleUrls = resolvedMetadata.icons.apple\n ? Array.isArray(resolvedMetadata.icons.apple)\n ? resolvedMetadata.icons.apple\n : [resolvedMetadata.icons.apple]\n : [];\n\n return {\n icon: iconUrls,\n apple: appleUrls,\n shortcut: resolvedMetadata.icons.shortcut || null,\n other: resolvedMetadata.icons.other || [],\n };\n };\n\n const title = getTitle();\n const robots = getRobots();\n const viewport = getViewport();\n const keywords = getKeywords();\n const authors = getAuthors();\n const formatDetection = getFormatDetection();\n const ogImages = getOgImages();\n const twitterImages = getTwitterImages();\n const icons = getIcons();\n const themeColors = Array.isArray(resolvedMetadata.themeColor)\n ? resolvedMetadata.themeColor\n : resolvedMetadata.themeColor\n ? [resolvedMetadata.themeColor]\n : [];\n\n return (\n <>\n {/* Critical: charset, viewport - must be first */}\n {(resolvedMetadata.charset || viewport) && (\n <Head priority={HEAD_PRIORITY.CRITICAL}>\n {resolvedMetadata.charset && <meta charset={resolvedMetadata.charset} />}\n {viewport && <meta name=\"viewport\" content={viewport} />}\n </Head>\n )}\n\n {/* High priority: title, description, canonical, prev/next, hreflang alternates */}\n {(title ||\n resolvedMetadata.description ||\n resolvedMetadata.canonical ||\n resolvedMetadata.prev ||\n resolvedMetadata.next ||\n resolvedMetadata.alternateLocales) && (\n <Head priority={HEAD_PRIORITY.HIGH}>\n {title && <title>{title}</title>}\n {resolvedMetadata.description && (\n <meta name=\"description\" content={resolvedMetadata.description} />\n )}\n {resolvedMetadata.canonical && <link rel=\"canonical\" href={resolvedMetadata.canonical} />}\n {resolvedMetadata.prev && <link rel=\"prev\" href={resolvedMetadata.prev} />}\n {resolvedMetadata.next && <link rel=\"next\" href={resolvedMetadata.next} />}\n {resolvedMetadata.alternateLocales &&\n Object.entries(resolvedMetadata.alternateLocales).map(([hreflang, href]) => (\n <link rel=\"alternate\" hreflang={hreflang} href={href} />\n ))}\n </Head>\n )}\n\n {/* Medium priority: meta tags, robots */}\n <Head priority={HEAD_PRIORITY.MEDIUM}>\n {keywords && <meta name=\"keywords\" content={keywords} />}\n {robots && <meta name=\"robots\" content={robots} />}\n {resolvedMetadata.colorScheme && (\n <meta name=\"color-scheme\" content={resolvedMetadata.colorScheme} />\n )}\n\n {/* Theme colors */}\n {themeColors.map((color, index) => (\n <meta name=\"theme-color\" content={color} />\n ))}\n\n {resolvedMetadata.generator && (\n <meta name=\"generator\" content={resolvedMetadata.generator} />\n )}\n {resolvedMetadata.creator && <meta name=\"creator\" content={resolvedMetadata.creator} />}\n {resolvedMetadata.publisher && (\n <meta name=\"publisher\" content={resolvedMetadata.publisher} />\n )}\n {resolvedMetadata.referrer && <meta name=\"referrer\" content={resolvedMetadata.referrer} />}\n {resolvedMetadata.category && <meta name=\"category\" content={resolvedMetadata.category} />}\n {resolvedMetadata.classification && (\n <meta name=\"classification\" content={resolvedMetadata.classification} />\n )}\n {formatDetection && <meta name=\"format-detection\" content={formatDetection} />}\n\n {/* Authors */}\n {authors.map((author, index) => (\n <Fragment>\n <meta name=\"author\" content={author.name} />\n {author.url && <link rel=\"author\" href={author.url} />}\n </Fragment>\n ))}\n\n {/* Icons */}\n {icons.icon.map((url, index) => (\n <link rel=\"icon\" href={url} />\n ))}\n {icons.shortcut && <link rel=\"shortcut icon\" href={icons.shortcut} />}\n {icons.apple.map((url, index) => (\n <link rel=\"apple-touch-icon\" href={url} />\n ))}\n {icons.other.map((icon, index) => (\n <link\n rel={icon.rel || 'icon'}\n href={icon.url}\n {...(icon.sizes && { sizes: icon.sizes })}\n {...(icon.type && { type: icon.type })}\n />\n ))}\n\n {/* Manifest */}\n {resolvedMetadata.manifest && <link rel=\"manifest\" href={resolvedMetadata.manifest} />}\n\n {/* Feeds */}\n {resolvedMetadata.feed && (\n <link rel=\"alternate\" type=\"application/rss+xml\" href={resolvedMetadata.feed} />\n )}\n\n {/* Verification */}\n {resolvedMetadata.verification?.google && (\n <meta name=\"google-site-verification\" content={resolvedMetadata.verification.google} />\n )}\n {resolvedMetadata.verification?.yahoo && (\n <meta name=\"y_key\" content={resolvedMetadata.verification.yahoo} />\n )}\n {resolvedMetadata.verification?.yandex && (\n <meta name=\"yandex-verification\" content={resolvedMetadata.verification.yandex} />\n )}\n {resolvedMetadata.verification?.me &&\n (Array.isArray(resolvedMetadata.verification.me) ? (\n resolvedMetadata.verification.me.map((url, index) => <link rel=\"me\" href={url} />)\n ) : (\n <link rel=\"me\" href={resolvedMetadata.verification.me} />\n ))}\n {resolvedMetadata.verification?.other &&\n Object.entries(resolvedMetadata.verification.other).map(([key, value]) =>\n Array.isArray(value) ? (\n value.map((v, index) => <meta name={key} content={v} />)\n ) : (\n <meta name={key} content={value} />\n ),\n )}\n\n {/* App Links */}\n {resolvedMetadata.appLinks && (\n <Fragment>\n {resolvedMetadata.appLinks.ios?.url && (\n <meta property=\"al:ios:url\" content={resolvedMetadata.appLinks.ios.url} />\n )}\n {resolvedMetadata.appLinks.ios?.app_store_id && (\n <meta\n property=\"al:ios:app_store_id\"\n content={resolvedMetadata.appLinks.ios.app_store_id}\n />\n )}\n {resolvedMetadata.appLinks.ios?.app_name && (\n <meta property=\"al:ios:app_name\" content={resolvedMetadata.appLinks.ios.app_name} />\n )}\n {resolvedMetadata.appLinks.android?.package && (\n <meta\n property=\"al:android:package\"\n content={resolvedMetadata.appLinks.android.package}\n />\n )}\n {resolvedMetadata.appLinks.android?.app_name && (\n <meta\n property=\"al:android:app_name\"\n content={resolvedMetadata.appLinks.android.app_name}\n />\n )}\n {resolvedMetadata.appLinks.android?.url && (\n <meta property=\"al:android:url\" content={resolvedMetadata.appLinks.android.url} />\n )}\n {resolvedMetadata.appLinks.web?.url && (\n <meta property=\"al:web:url\" content={resolvedMetadata.appLinks.web.url} />\n )}\n {resolvedMetadata.appLinks.web?.should_fallback !== undefined && (\n <meta\n property=\"al:web:should_fallback\"\n content={String(resolvedMetadata.appLinks.web.should_fallback)}\n />\n )}\n </Fragment>\n )}\n\n {/* Additional meta tags */}\n {resolvedMetadata.other &&\n Object.entries(resolvedMetadata.other).map(([key, value]) =>\n Array.isArray(value) ? (\n value.map((v, index) => <meta name={key} content={String(v)} />)\n ) : (\n <meta name={key} content={String(value)} />\n ),\n )}\n </Head>\n\n {/* SEO: OpenGraph, Twitter - lower priority */}\n {(resolvedMetadata.openGraph || resolvedMetadata.twitter) && (\n <Head priority={HEAD_PRIORITY.SEO}>\n {/* Open Graph */}\n {resolvedMetadata.openGraph && (\n <Fragment>\n {resolvedMetadata.openGraph.title && (\n <meta property=\"og:title\" content={resolvedMetadata.openGraph.title} />\n )}\n {resolvedMetadata.openGraph.description && (\n <meta property=\"og:description\" content={resolvedMetadata.openGraph.description} />\n )}\n {resolvedMetadata.openGraph.type && (\n <meta property=\"og:type\" content={resolvedMetadata.openGraph.type} />\n )}\n {resolvedMetadata.openGraph.url && (\n <meta property=\"og:url\" content={resolvedMetadata.openGraph.url} />\n )}\n {resolvedMetadata.openGraph.siteName && (\n <meta property=\"og:site_name\" content={resolvedMetadata.openGraph.siteName} />\n )}\n {resolvedMetadata.openGraph.locale && (\n <meta property=\"og:locale\" content={resolvedMetadata.openGraph.locale} />\n )}\n {resolvedMetadata.openGraph.alternateLocale &&\n (Array.isArray(resolvedMetadata.openGraph.alternateLocale) ? (\n resolvedMetadata.openGraph.alternateLocale.map((locale, index) => (\n <meta property=\"og:locale:alternate\" content={locale} />\n ))\n ) : (\n <meta\n property=\"og:locale:alternate\"\n content={resolvedMetadata.openGraph.alternateLocale}\n />\n ))}\n {resolvedMetadata.openGraph.determiner && (\n <meta property=\"og:determiner\" content={resolvedMetadata.openGraph.determiner} />\n )}\n\n {/* OG Images */}\n {ogImages.map((image, index) => (\n <Fragment>\n <meta property=\"og:image\" content={image.url} />\n {image.secureUrl && (\n <meta property=\"og:image:secure_url\" content={image.secureUrl} />\n )}\n {image.alt && <meta property=\"og:image:alt\" content={image.alt} />}\n {image.type && <meta property=\"og:image:type\" content={image.type} />}\n {image.width && <meta property=\"og:image:width\" content={String(image.width)} />}\n {image.height && (\n <meta property=\"og:image:height\" content={String(image.height)} />\n )}\n </Fragment>\n ))}\n\n {/* Article specific */}\n {resolvedMetadata.openGraph.publishedTime && (\n <meta\n property=\"article:published_time\"\n content={resolvedMetadata.openGraph.publishedTime}\n />\n )}\n {resolvedMetadata.openGraph.modifiedTime && (\n <meta\n property=\"article:modified_time\"\n content={resolvedMetadata.openGraph.modifiedTime}\n />\n )}\n {resolvedMetadata.openGraph.expirationTime && (\n <meta\n property=\"article:expiration_time\"\n content={resolvedMetadata.openGraph.expirationTime}\n />\n )}\n {resolvedMetadata.openGraph.authors &&\n (Array.isArray(resolvedMetadata.openGraph.authors) ? (\n resolvedMetadata.openGraph.authors.map((author, index) => (\n <meta property=\"article:author\" content={author} />\n ))\n ) : (\n <meta property=\"article:author\" content={resolvedMetadata.openGraph.authors} />\n ))}\n {resolvedMetadata.openGraph.section && (\n <meta property=\"article:section\" content={resolvedMetadata.openGraph.section} />\n )}\n {resolvedMetadata.openGraph.tags &&\n (Array.isArray(resolvedMetadata.openGraph.tags) ? (\n resolvedMetadata.openGraph.tags.map((tag, index) => (\n <meta property=\"article:tag\" content={tag} />\n ))\n ) : (\n <meta property=\"article:tag\" content={resolvedMetadata.openGraph.tags} />\n ))}\n\n {/* Book specific */}\n {resolvedMetadata.openGraph.isbn && (\n <meta property=\"book:isbn\" content={resolvedMetadata.openGraph.isbn} />\n )}\n {resolvedMetadata.openGraph.releaseDate && (\n <meta\n property=\"book:release_date\"\n content={resolvedMetadata.openGraph.releaseDate}\n />\n )}\n\n {/* Profile specific */}\n {resolvedMetadata.openGraph.firstName && (\n <meta\n property=\"profile:first_name\"\n content={resolvedMetadata.openGraph.firstName}\n />\n )}\n {resolvedMetadata.openGraph.lastName && (\n <meta property=\"profile:last_name\" content={resolvedMetadata.openGraph.lastName} />\n )}\n {resolvedMetadata.openGraph.username && (\n <meta property=\"profile:username\" content={resolvedMetadata.openGraph.username} />\n )}\n {resolvedMetadata.openGraph.gender && (\n <meta property=\"profile:gender\" content={resolvedMetadata.openGraph.gender} />\n )}\n </Fragment>\n )}\n\n {/* Twitter Card */}\n {resolvedMetadata.twitter && (\n <Fragment>\n {resolvedMetadata.twitter.card && (\n <meta name=\"twitter:card\" content={resolvedMetadata.twitter.card} />\n )}\n {resolvedMetadata.twitter.site && (\n <meta name=\"twitter:site\" content={resolvedMetadata.twitter.site} />\n )}\n {resolvedMetadata.twitter.siteId && (\n <meta name=\"twitter:site:id\" content={resolvedMetadata.twitter.siteId} />\n )}\n {resolvedMetadata.twitter.creator && (\n <meta name=\"twitter:creator\" content={resolvedMetadata.twitter.creator} />\n )}\n {resolvedMetadata.twitter.creatorId && (\n <meta name=\"twitter:creator:id\" content={resolvedMetadata.twitter.creatorId} />\n )}\n {resolvedMetadata.twitter.title && (\n <meta name=\"twitter:title\" content={resolvedMetadata.twitter.title} />\n )}\n {resolvedMetadata.twitter.description && (\n <meta name=\"twitter:description\" content={resolvedMetadata.twitter.description} />\n )}\n\n {/* Twitter Images */}\n {twitterImages.map((image, index) => (\n <Fragment>\n <meta name=\"twitter:image\" content={image.url} />\n {image.alt && <meta name=\"twitter:image:alt\" content={image.alt} />}\n </Fragment>\n ))}\n\n {/* Twitter App */}\n {resolvedMetadata.twitter.app && (\n <Fragment>\n {resolvedMetadata.twitter.app.name && (\n <meta name=\"twitter:app:name\" content={resolvedMetadata.twitter.app.name} />\n )}\n {resolvedMetadata.twitter.app.id.iphone && (\n <meta\n name=\"twitter:app:id:iphone\"\n content={resolvedMetadata.twitter.app.id.iphone}\n />\n )}\n {resolvedMetadata.twitter.app.id.ipad && (\n <meta\n name=\"twitter:app:id:ipad\"\n content={resolvedMetadata.twitter.app.id.ipad}\n />\n )}\n {resolvedMetadata.twitter.app.id.googleplay && (\n <meta\n name=\"twitter:app:id:googleplay\"\n content={resolvedMetadata.twitter.app.id.googleplay}\n />\n )}\n {resolvedMetadata.twitter.app.url?.iphone && (\n <meta\n name=\"twitter:app:url:iphone\"\n content={resolvedMetadata.twitter.app.url.iphone}\n />\n )}\n {resolvedMetadata.twitter.app.url?.ipad && (\n <meta\n name=\"twitter:app:url:ipad\"\n content={resolvedMetadata.twitter.app.url.ipad}\n />\n )}\n {resolvedMetadata.twitter.app.url?.googleplay && (\n <meta\n name=\"twitter:app:url:googleplay\"\n content={resolvedMetadata.twitter.app.url.googleplay}\n />\n )}\n </Fragment>\n )}\n </Fragment>\n )}\n </Head>\n )}\n </>\n );\n}\n"],"names":["MetadataRenderer","metadata","request","useRequest","stackMetadata","resolveMetadata","resolvedMetadata","mergeMetadata","getTitle","getRobots","name","parts","getViewport","getKeywords","getAuthors","getFormatDetection","getOgImages","img","getTwitterImages","getIcons","iconUrls","appleUrls","title","robots","viewport","keywords","authors","formatDetection","ogImages","twitterImages","icons","themeColors","jsxFactory","__Fragment","Head","HEAD_PRIORITY","hreflang","href","color","index","author","Fragment","url","icon","key","value","v","locale","image","tag"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,52 +1,55 @@
1
1
  import { B as a, H as r, I as t, N as n, R as o, S as d } from "./exceptions-CHPz01DJ.js";
2
- import { F as c, H as p, a as x, b as l, c as m, g, d as E, e as u, f, h as S, i as C, j as I, k as H, l as R, p as h, n as v, r as T, o as q, q as F, s as M, t as N, u as b, v as w, w as J } from "./jsx-runtime-5m2ZiNtU.js";
3
- import { coreVite as j } from "./vite-plugin.js";
4
- import { c as P, s as k } from "./index-CybB8Tdk.js";
5
- import { createServer as A, startServer as D } from "./server.js";
6
- import { d as O } from "./defineMiddleware-VdHQuiUc.js";
7
- import { e as Y, a as _, r as z, b as G } from "./render-BaTAJ4Ha.js";
8
- import { render as Q } from "./entry-server.js";
2
+ import { F as p, H as c, a as l, b as x, c as m, g, d as E, e as u, f as I, h as f, i as S, j as C, k as h, l as H, m as R, n as v, p as T, q as P, r as q, s as F, t as M, u as N, v as b, w, x as J, y as V, z as j } from "./jsx-runtime-DqAp8xlt.js";
3
+ import { coreVite as z } from "./vite-plugin.js";
4
+ import { c as k, s as A } from "./index-CybB8Tdk.js";
5
+ import { createServer as L, startServer as O } from "./server.js";
6
+ import { d as Y } from "./defineMiddleware-VdHQuiUc.js";
7
+ import { e as G, a as K, r as Q, b as W } from "./render-CRag-5V7.js";
8
+ import { render as Z } from "./entry-server.js";
9
9
  export {
10
10
  a as BadRequestException,
11
- c as Fragment,
12
- p as HEAD_PRIORITY,
13
- x as Head,
11
+ p as Fragment,
12
+ c as HEAD_PRIORITY,
13
+ l as Head,
14
14
  r as HttpException,
15
15
  t as InternalServerErrorException,
16
16
  n as NotFoundException,
17
17
  o as RedirectException,
18
18
  d as ServiceUnavailableException,
19
- l as addCacheTag,
19
+ x as addCacheTag,
20
20
  m as cloneElement,
21
- j as coreVite,
22
- P as createContext,
23
- A as createServer,
24
- O as defineMiddleware,
25
- Y as escapeHTML,
26
- _ as escapeProp,
21
+ z as coreVite,
22
+ k as createContext,
23
+ L as createServer,
24
+ Y as defineMiddleware,
25
+ G as escapeHTML,
26
+ K as escapeProp,
27
27
  g as getCacheTags,
28
28
  E as getClientJsEntries,
29
29
  u as getCssEntries,
30
- f as getHeadContent,
31
- S as getIslandEntries,
30
+ I as getHeadContent,
31
+ f as getIslandEntries,
32
+ S as getIslandProps,
32
33
  C as getSchemas,
33
- I as getSsrIslands,
34
- H as isValidElement,
35
- R as jsxFactory,
36
- h as pushMetadata,
37
- v as pushSchema,
38
- T as registerIsland,
39
- q as registerSsrIsland,
40
- Q as render,
41
- z as renderJsxToHtmlString,
42
- G as renderToRenderedNode,
43
- F as resolveMetadata,
44
- M as runInRenderContext,
45
- k as sequence,
46
- N as setViewName,
47
- D as startServer,
48
- b as useClientJs,
49
- w as useCss,
50
- J as useRequest
34
+ h as getSsrIslands,
35
+ H as isIslandPropsExternalized,
36
+ R as isValidElement,
37
+ v as jsxFactory,
38
+ T as pushIslandProps,
39
+ P as pushMetadata,
40
+ q as pushSchema,
41
+ F as registerIsland,
42
+ M as registerSsrIsland,
43
+ Z as render,
44
+ Q as renderJsxToHtmlString,
45
+ W as renderToRenderedNode,
46
+ N as resolveMetadata,
47
+ b as runInRenderContext,
48
+ A as sequence,
49
+ w as setViewName,
50
+ O as startServer,
51
+ J as useClientJs,
52
+ V as useCss,
53
+ j as useRequest
51
54
  };
52
55
  //# sourceMappingURL=index.js.map
@@ -1,15 +1,15 @@
1
- import { r as a, s as c } from "../client-D67hK4Yy.js";
1
+ import { r as i, s as u } from "../client-D67hK4Yy.js";
2
2
  import "virtual:l5e-island-strategies";
3
- a("load", (e) => {
3
+ i("load", (e) => {
4
4
  e();
5
5
  });
6
- a("idle", (e) => {
6
+ i("idle", (e) => {
7
7
  "requestIdleCallback" in window ? requestIdleCallback(() => e()) : setTimeout(() => e(), 200);
8
8
  });
9
- a("visible", (e, t, r) => {
9
+ i("visible", (e, t, r) => {
10
10
  const o = t || "200px", n = new IntersectionObserver(
11
- (i) => {
12
- i.forEach((s) => {
11
+ (d) => {
12
+ d.forEach((s) => {
13
13
  s.isIntersecting && (n.disconnect(), e());
14
14
  });
15
15
  },
@@ -17,7 +17,7 @@ a("visible", (e, t, r) => {
17
17
  );
18
18
  return n.observe(r), () => n.disconnect();
19
19
  });
20
- a("media", (e, t) => {
20
+ i("media", (e, t) => {
21
21
  if (!t) {
22
22
  console.error('[l5e-island] Strategy "media" requires mountOpts (media query)');
23
23
  return;
@@ -32,42 +32,59 @@ a("media", (e, t) => {
32
32
  return r.addEventListener("change", o, { once: !0 }), () => r.removeEventListener("change", o);
33
33
  }
34
34
  });
35
- a("none", () => {
35
+ i("none", () => {
36
36
  });
37
- const u = window.__L5E_ISLANDS__ || {};
38
- function l() {
37
+ const c = window.__L5E_ISLANDS__ || {};
38
+ let a = null;
39
+ function m() {
40
+ if (a) return a;
41
+ const e = document.getElementById("_l5e_data_");
42
+ if (!e || !e.textContent) return a = [];
43
+ try {
44
+ const t = JSON.parse(e.textContent);
45
+ a = Array.isArray(t) ? t : [];
46
+ } catch (t) {
47
+ console.error("[l5e-island] Failed to parse _l5e_data_ props store:", t), a = [];
48
+ }
49
+ return a;
50
+ }
51
+ function p(e) {
52
+ const t = e.getAttribute("data-island-idx");
53
+ return t !== null ? m()[Number(t)] || {} : JSON.parse(e.getAttribute("data-island-props") || "{}");
54
+ }
55
+ function f() {
39
56
  return Array.from(document.querySelectorAll("[data-island]")).map((e) => ({
40
57
  element: e,
41
58
  registryKey: e.getAttribute("data-island"),
42
59
  exportName: e.getAttribute("data-island-name"),
43
- props: JSON.parse(e.getAttribute("data-island-props") || "{}"),
60
+ props: p(e),
44
61
  mount: e.getAttribute("data-island-mount") || "load",
45
62
  mountOpts: e.getAttribute("data-island-opts") || void 0,
46
63
  ssr: e.hasAttribute("data-island-ssr")
47
64
  }));
48
65
  }
49
- function m(e) {
66
+ function g(e) {
50
67
  let t = !1;
51
68
  return async () => {
52
69
  if (t) return;
53
70
  t = !0;
54
- const r = u[e.registryKey];
71
+ const r = c[e.registryKey];
55
72
  if (!r) {
56
73
  console.error(
57
74
  `[l5e-island] Component "${e.registryKey}" not found in page registry.`,
58
- `Available: ${Object.keys(u).join(", ")}`
75
+ `Available: ${Object.keys(c).join(", ")}`
59
76
  );
60
77
  return;
61
78
  }
62
79
  try {
63
- const [o, { createElement: n }, i] = await Promise.all([
80
+ const [o, { createElement: n }, d] = await Promise.all([
64
81
  import("react-dom/client"),
65
82
  import("react"),
66
83
  import(
67
84
  /* @vite-ignore */
68
85
  r
69
86
  )
70
- ]), s = i.default || i[e.exportName];
87
+ ]), s = d.default || d[e.exportName];
71
88
  if (!s) {
72
89
  console.error(`[l5e-island] No export "default" or "${e.exportName}" in module`);
73
90
  return;
@@ -78,22 +95,22 @@ function m(e) {
78
95
  }
79
96
  };
80
97
  }
81
- function g(e) {
82
- const t = c.get(e.mount);
98
+ function y(e) {
99
+ const t = u.get(e.mount);
83
100
  if (!t) {
84
101
  console.error(
85
102
  `[l5e-island] Strategy "${e.mount}" not found.`,
86
- `Available: ${[...c.keys()].join(", ")}`,
103
+ `Available: ${[...u.keys()].join(", ")}`,
87
104
  `
88
105
  Did you forget to registerMountStrategy("${e.mount}", ...)?`
89
106
  );
90
107
  return;
91
108
  }
92
- const r = m(e);
109
+ const r = g(e);
93
110
  t(r, e.mountOpts, e.element);
94
111
  }
95
- function d() {
96
- l().forEach(g);
112
+ function l() {
113
+ f().forEach(y);
97
114
  }
98
- document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", d) : d();
115
+ document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", l) : l();
99
116
  //# sourceMappingURL=runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sources":["../../src/island/runtime.ts"],"sourcesContent":["import type { IslandMeta } from './types';\nimport { strategies, registerMountStrategy } from './strategy-registry';\n\n// ============================================================\n// PART 1: Built-in strategies\n// ============================================================\n\nregisterMountStrategy('load', (mount) => {\n mount();\n});\n\nregisterMountStrategy('idle', (mount) => {\n if ('requestIdleCallback' in window) {\n requestIdleCallback(() => mount());\n } else {\n setTimeout(() => mount(), 200);\n }\n});\n\nregisterMountStrategy('visible', (mount, opts, el) => {\n const rootMargin = opts || '200px';\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n observer.disconnect();\n mount();\n }\n });\n },\n { rootMargin },\n );\n observer.observe(el);\n return () => observer.disconnect();\n});\n\nregisterMountStrategy('media', (mount, opts) => {\n if (!opts) {\n console.error('[l5e-island] Strategy \"media\" requires mountOpts (media query)');\n return;\n }\n const mql = window.matchMedia(opts);\n if (mql.matches) {\n mount();\n } else {\n const handler = (e: MediaQueryListEvent) => {\n if (e.matches) mount();\n };\n mql.addEventListener('change', handler, { once: true });\n return () => mql.removeEventListener('change', handler);\n }\n});\n\nregisterMountStrategy('none', () => {\n // Don't mount - keep placeholder as-is\n});\n\n// ============================================================\n// PART 2: Import custom strategies (if any)\n// ============================================================\n\nimport 'virtual:l5e-island-strategies';\n\n// ============================================================\n// PART 3: Island discovery + mount logic\n// ============================================================\n\n// Per-page island registry injected by server.ts as inline script\n// Format: { \"Counter_a3f2\": \"/assets/Counter-Abc123.js\" }\nconst islandRegistry: Record<string, string> = (window as any).__L5E_ISLANDS__ || {};\n\nfunction discoverIslands(): IslandMeta[] {\n return Array.from(document.querySelectorAll('[data-island]')).map((el) => ({\n element: el as HTMLElement,\n registryKey: el.getAttribute('data-island')!,\n exportName: el.getAttribute('data-island-name')!,\n props: JSON.parse(el.getAttribute('data-island-props') || '{}'),\n mount: el.getAttribute('data-island-mount') || 'load',\n mountOpts: el.getAttribute('data-island-opts') || undefined,\n ssr: el.hasAttribute('data-island-ssr'),\n }));\n}\n\nfunction createMountFn(island: IslandMeta): () => Promise<void> {\n let mounted = false;\n return async () => {\n if (mounted) return;\n mounted = true;\n\n // Look up component URL from per-page registry\n const url = islandRegistry[island.registryKey];\n if (!url) {\n console.error(\n `[l5e-island] Component \"${island.registryKey}\" not found in page registry.`,\n `Available: ${Object.keys(islandRegistry).join(', ')}`,\n );\n return;\n }\n\n try {\n const [reactDomClient, { createElement }, mod] = await Promise.all([\n import('react-dom/client'),\n import('react'),\n import(/* @vite-ignore */ url),\n ]);\n\n const Component = mod.default || mod[island.exportName];\n if (!Component) {\n console.error(`[l5e-island] No export \"default\" or \"${island.exportName}\" in module`);\n return;\n }\n\n if (island.ssr) {\n // Server already rendered this component into the element → hydrate it.\n reactDomClient.hydrateRoot(island.element, createElement(Component, island.props));\n } else {\n // Client-only mount (default): fresh render into an empty placeholder.\n const root = reactDomClient.createRoot(island.element);\n root.render(createElement(Component, island.props));\n }\n } catch (error) {\n console.error(`[l5e-island] Failed to mount \"${island.registryKey}\":`, error);\n }\n };\n}\n\nfunction scheduleMount(island: IslandMeta) {\n const strategy = strategies.get(island.mount);\n\n if (!strategy) {\n console.error(\n `[l5e-island] Strategy \"${island.mount}\" not found.`,\n `Available: ${[...strategies.keys()].join(', ')}`,\n `\\nDid you forget to registerMountStrategy(\"${island.mount}\", ...)?`,\n );\n return;\n }\n\n const mountFn = createMountFn(island);\n strategy(mountFn, island.mountOpts, island.element);\n}\n\n// ============================================================\n// PART 4: Boot\n// ============================================================\n\nfunction boot() {\n const islands = discoverIslands();\n islands.forEach(scheduleMount);\n}\n\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', boot);\n} else {\n boot();\n}\n"],"names":["registerMountStrategy","mount","opts","el","rootMargin","observer","entries","entry","mql","handler","e","islandRegistry","discoverIslands","createMountFn","island","mounted","url","reactDomClient","createElement","mod","Component","error","scheduleMount","strategy","strategies","mountFn","boot"],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","sources":["../../src/island/runtime.ts"],"sourcesContent":["import type { IslandMeta } from './types';\nimport { strategies, registerMountStrategy } from './strategy-registry';\n\n// ============================================================\n// PART 1: Built-in strategies\n// ============================================================\n\nregisterMountStrategy('load', (mount) => {\n mount();\n});\n\nregisterMountStrategy('idle', (mount) => {\n if ('requestIdleCallback' in window) {\n requestIdleCallback(() => mount());\n } else {\n setTimeout(() => mount(), 200);\n }\n});\n\nregisterMountStrategy('visible', (mount, opts, el) => {\n const rootMargin = opts || '200px';\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n observer.disconnect();\n mount();\n }\n });\n },\n { rootMargin },\n );\n observer.observe(el);\n return () => observer.disconnect();\n});\n\nregisterMountStrategy('media', (mount, opts) => {\n if (!opts) {\n console.error('[l5e-island] Strategy \"media\" requires mountOpts (media query)');\n return;\n }\n const mql = window.matchMedia(opts);\n if (mql.matches) {\n mount();\n } else {\n const handler = (e: MediaQueryListEvent) => {\n if (e.matches) mount();\n };\n mql.addEventListener('change', handler, { once: true });\n return () => mql.removeEventListener('change', handler);\n }\n});\n\nregisterMountStrategy('none', () => {\n // Don't mount - keep placeholder as-is\n});\n\n// ============================================================\n// PART 2: Import custom strategies (if any)\n// ============================================================\n\nimport 'virtual:l5e-island-strategies';\n\n// ============================================================\n// PART 3: Island discovery + mount logic\n// ============================================================\n\n// Per-page island registry injected by server.ts as inline script\n// Format: { \"Counter_a3f2\": \"/assets/Counter-Abc123.js\" }\nconst islandRegistry: Record<string, string> = (window as any).__L5E_ISLANDS__ || {};\n\n// Props for islands rendered in externalized mode live in a single\n// `<script type=\"application/json\" id=\"_l5e_data_\">` at the end of the document\n// (keeps the SSR body lean for crawlers). Parsed once, lazily.\nlet islandDataCache: unknown[] | null = null;\nfunction getIslandData(): unknown[] {\n if (islandDataCache) return islandDataCache;\n const el = document.getElementById('_l5e_data_');\n if (!el || !el.textContent) return (islandDataCache = []);\n try {\n const parsed = JSON.parse(el.textContent);\n islandDataCache = Array.isArray(parsed) ? parsed : [];\n } catch (err) {\n console.error('[l5e-island] Failed to parse _l5e_data_ props store:', err);\n islandDataCache = [];\n }\n return islandDataCache;\n}\n\nfunction readProps(el: Element): Record<string, unknown> {\n const idx = el.getAttribute('data-island-idx');\n if (idx !== null) {\n return (getIslandData()[Number(idx)] as Record<string, unknown>) || {};\n }\n return JSON.parse(el.getAttribute('data-island-props') || '{}');\n}\n\nfunction discoverIslands(): IslandMeta[] {\n return Array.from(document.querySelectorAll('[data-island]')).map((el) => ({\n element: el as HTMLElement,\n registryKey: el.getAttribute('data-island')!,\n exportName: el.getAttribute('data-island-name')!,\n props: readProps(el),\n mount: el.getAttribute('data-island-mount') || 'load',\n mountOpts: el.getAttribute('data-island-opts') || undefined,\n ssr: el.hasAttribute('data-island-ssr'),\n }));\n}\n\nfunction createMountFn(island: IslandMeta): () => Promise<void> {\n let mounted = false;\n return async () => {\n if (mounted) return;\n mounted = true;\n\n // Look up component URL from per-page registry\n const url = islandRegistry[island.registryKey];\n if (!url) {\n console.error(\n `[l5e-island] Component \"${island.registryKey}\" not found in page registry.`,\n `Available: ${Object.keys(islandRegistry).join(', ')}`,\n );\n return;\n }\n\n try {\n const [reactDomClient, { createElement }, mod] = await Promise.all([\n import('react-dom/client'),\n import('react'),\n import(/* @vite-ignore */ url),\n ]);\n\n const Component = mod.default || mod[island.exportName];\n if (!Component) {\n console.error(`[l5e-island] No export \"default\" or \"${island.exportName}\" in module`);\n return;\n }\n\n if (island.ssr) {\n // Server already rendered this component into the element → hydrate it.\n reactDomClient.hydrateRoot(island.element, createElement(Component, island.props));\n } else {\n // Client-only mount (default): fresh render into an empty placeholder.\n const root = reactDomClient.createRoot(island.element);\n root.render(createElement(Component, island.props));\n }\n } catch (error) {\n console.error(`[l5e-island] Failed to mount \"${island.registryKey}\":`, error);\n }\n };\n}\n\nfunction scheduleMount(island: IslandMeta) {\n const strategy = strategies.get(island.mount);\n\n if (!strategy) {\n console.error(\n `[l5e-island] Strategy \"${island.mount}\" not found.`,\n `Available: ${[...strategies.keys()].join(', ')}`,\n `\\nDid you forget to registerMountStrategy(\"${island.mount}\", ...)?`,\n );\n return;\n }\n\n const mountFn = createMountFn(island);\n strategy(mountFn, island.mountOpts, island.element);\n}\n\n// ============================================================\n// PART 4: Boot\n// ============================================================\n\nfunction boot() {\n const islands = discoverIslands();\n islands.forEach(scheduleMount);\n}\n\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', boot);\n} else {\n boot();\n}\n"],"names":["registerMountStrategy","mount","opts","el","rootMargin","observer","entries","entry","mql","handler","e","islandRegistry","islandDataCache","getIslandData","parsed","err","readProps","idx","discoverIslands","createMountFn","island","mounted","url","reactDomClient","createElement","mod","Component","error","scheduleMount","strategy","strategies","mountFn","boot"],"mappings":"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"}
package/dist/island.js CHANGED
@@ -1,52 +1,58 @@
1
- import { r as g, o as v, l as m } from "./jsx-runtime-5m2ZiNtU.js";
2
- function x(l) {
3
- const a = l.split("/");
4
- let s = a[a.length - 1];
1
+ import { s as g, l as x, p as I, t as N, n as m } from "./jsx-runtime-DqAp8xlt.js";
2
+ function v(d) {
3
+ const t = d.split("/");
4
+ let s = t[t.length - 1];
5
5
  return s = s.replace(/\.(tsx?|jsx?)$/, ""), s;
6
6
  }
7
- function _(l) {
7
+ function S(d) {
8
8
  const {
9
- from: a,
9
+ from: t,
10
10
  props: s = {},
11
11
  mount: p = "load",
12
12
  mountOpts: c,
13
- class: n,
14
- id: t,
13
+ class: e,
14
+ id: i,
15
15
  children: f,
16
16
  ssr: u,
17
- __key: i,
18
- __src: e
19
- } = l, r = x(a);
20
- i && e && g(i, e, r);
21
- const d = {
22
- "data-island": i || "unresolved",
23
- "data-island-name": r,
24
- "data-island-props": JSON.stringify(s),
17
+ __key: r,
18
+ __src: l
19
+ } = d, o = v(t);
20
+ r && l && g(r, l, o);
21
+ const a = {
22
+ "data-island": r || "unresolved",
23
+ "data-island-name": o,
25
24
  "data-island-mount": p
26
25
  };
27
- if (c && (d["data-island-opts"] = c), u && e) {
28
- const o = v(e, r, s);
29
- if (o)
26
+ if (x()) {
27
+ if (p !== "none") {
28
+ const n = I(s);
29
+ n >= 0 ? a["data-island-idx"] = String(n) : a["data-island-props"] = JSON.stringify(s);
30
+ }
31
+ } else
32
+ a["data-island-props"] = JSON.stringify(s);
33
+ if (c && (a["data-island-opts"] = c), u && l) {
34
+ const n = N(l, o, s);
35
+ if (n)
30
36
  return m("div", {
31
- ...d,
32
- "data-island-ssr": o,
33
- ...t ? { id: t } : {},
34
- class: n ? `l5e-island ${n}` : "l5e-island",
37
+ ...a,
38
+ "data-island-ssr": n,
39
+ ...i ? { id: i } : {},
40
+ class: e ? `l5e-island ${e}` : "l5e-island",
35
41
  // Raw token comment as body; replaced with SSR HTML in entry-server.
36
- setHtml: `<!--${o}-->`
42
+ setHtml: `<!--${n}-->`
37
43
  });
38
44
  }
39
45
  return m(
40
46
  "div",
41
47
  {
42
- ...d,
43
- ...t ? { id: t } : {},
44
- class: n ? `l5e-island ${n}` : "l5e-island"
48
+ ...a,
49
+ ...i ? { id: i } : {},
50
+ class: e ? `l5e-island ${e}` : "l5e-island"
45
51
  },
46
52
  f
47
53
  );
48
54
  }
49
55
  export {
50
- _ as ClientIsland
56
+ S as ClientIsland
51
57
  };
52
58
  //# sourceMappingURL=island.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"island.js","sources":["../src/island/ClientIsland.ts"],"sourcesContent":["import {\n jsxFactory,\n registerIsland,\n registerSsrIsland,\n type JSXChild,\n type JSXNode,\n} from '../core/jsx-runtime';\n\n/**\n * Derive component name from `from` path.\n * \"./react/Counter\" → \"Counter\"\n * \"~/features/newsfeed/react/NewsfeedApp\" → \"NewsfeedApp\"\n */\nfunction deriveComponentName(from: string): string {\n const segments = from.split('/');\n let filename = segments[segments.length - 1];\n filename = filename.replace(/\\.(tsx?|jsx?)$/, '');\n return filename;\n}\nexport type MountStrategy = 'load' | 'idle' | 'visible' | 'media' | 'none';\nexport interface ClientIslandProps {\n from: string;\n props?: Record<string, any>;\n mount?: MountStrategy | string;\n mountOpts?: string;\n class?: string;\n id?: string;\n children?: JSXChild | JSXChild[];\n\n /**\n * Opt-in: server-render the component into the placeholder and hydrate on the\n * client (instead of the default client-only mount). Component must be\n * SSR-safe (no top-level browser access) and props must be JSON-serializable.\n */\n ssr?: boolean;\n\n /** INTERNAL — injected by vite-plugin. Format: \"[name]_[hash]\" */\n __key?: string;\n /** INTERNAL — injected by vite-plugin. Manifest-compatible source path with extension */\n __src?: string;\n}\n\nexport function ClientIsland(attrs: ClientIslandProps): JSXNode {\n const {\n from,\n props = {},\n mount = 'load',\n mountOpts,\n class: className,\n id,\n children,\n ssr,\n __key,\n __src,\n } = attrs;\n\n const componentName = deriveComponentName(from);\n\n // Register island in render context (like useClientJs)\n // server.ts will use this to generate per-page window.__L5E_ISLANDS__\n // (needed for BOTH client-only mount AND ssr hydration — the client still\n // loads the component chunk via this registry).\n if (__key && __src) {\n registerIsland(__key, __src, componentName);\n }\n\n const dataAttrs: Record<string, string> = {\n 'data-island': __key || 'unresolved',\n 'data-island-name': componentName,\n 'data-island-props': JSON.stringify(props),\n 'data-island-mount': mount,\n };\n\n if (mountOpts) {\n dataAttrs['data-island-opts'] = mountOpts;\n }\n\n // SSR opt-in: register a pending server render and embed a unique token as the\n // placeholder body. entry-server replaces the token with renderToString() output\n // after the synchronous render pass, then normalizes data-island-ssr to \"1\".\n // The attribute value holds the token so the post-pass can target this exact\n // island (and strip the attribute on render failure → clean client-only fallback).\n if (ssr && __src) {\n const token = registerSsrIsland(__src, componentName, props);\n if (token) {\n return jsxFactory('div', {\n ...dataAttrs,\n 'data-island-ssr': token,\n ...(id ? { id } : {}),\n class: className ? `l5e-island ${className}` : 'l5e-island',\n // Raw token comment as body; replaced with SSR HTML in entry-server.\n setHtml: `<!--${token}-->`,\n });\n }\n }\n\n return jsxFactory(\n 'div',\n {\n ...dataAttrs,\n ...(id ? { id } : {}),\n class: className ? `l5e-island ${className}` : 'l5e-island',\n },\n children,\n );\n}\n"],"names":["deriveComponentName","from","segments","filename","ClientIsland","attrs","props","mount","mountOpts","className","id","children","ssr","__key","__src","componentName","registerIsland","dataAttrs","token","registerSsrIsland","jsxFactory"],"mappings":";AAaA,SAASA,EAAoBC,GAAsB;AACjD,QAAMC,IAAWD,EAAK,MAAM,GAAG;AAC/B,MAAIE,IAAWD,EAASA,EAAS,SAAS,CAAC;AAC3C,SAAAC,IAAWA,EAAS,QAAQ,kBAAkB,EAAE,GACzCA;AACT;AAwBO,SAASC,EAAaC,GAAmC;AAC9D,QAAM;AAAA,IACJ,MAAAJ;AAAA,IACA,OAAAK,IAAQ,CAAA;AAAA,IACR,OAAAC,IAAQ;AAAA,IACR,WAAAC;AAAA,IACA,OAAOC;AAAA,IACP,IAAAC;AAAA,IACA,UAAAC;AAAA,IACA,KAAAC;AAAA,IACA,OAAAC;AAAA,IACA,OAAAC;AAAA,EAAA,IACET,GAEEU,IAAgBf,EAAoBC,CAAI;AAM9C,EAAIY,KAASC,KACXE,EAAeH,GAAOC,GAAOC,CAAa;AAG5C,QAAME,IAAoC;AAAA,IACxC,eAAeJ,KAAS;AAAA,IACxB,oBAAoBE;AAAA,IACpB,qBAAqB,KAAK,UAAUT,CAAK;AAAA,IACzC,qBAAqBC;AAAA,EAAA;AAYvB,MATIC,MACFS,EAAU,kBAAkB,IAAIT,IAQ9BI,KAAOE,GAAO;AAChB,UAAMI,IAAQC,EAAkBL,GAAOC,GAAeT,CAAK;AAC3D,QAAIY;AACF,aAAOE,EAAW,OAAO;AAAA,QACvB,GAAGH;AAAA,QACH,mBAAmBC;AAAA,QACnB,GAAIR,IAAK,EAAE,IAAAA,EAAA,IAAO,CAAA;AAAA,QAClB,OAAOD,IAAY,cAAcA,CAAS,KAAK;AAAA;AAAA,QAE/C,SAAS,OAAOS,CAAK;AAAA,MAAA,CACtB;AAAA,EAEL;AAEA,SAAOE;AAAA,IACL;AAAA,IACA;AAAA,MACE,GAAGH;AAAA,MACH,GAAIP,IAAK,EAAE,IAAAA,EAAA,IAAO,CAAA;AAAA,MAClB,OAAOD,IAAY,cAAcA,CAAS,KAAK;AAAA,IAAA;AAAA,IAEjDE;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"island.js","sources":["../src/island/ClientIsland.ts"],"sourcesContent":["import {\n jsxFactory,\n isIslandPropsExternalized,\n pushIslandProps,\n registerIsland,\n registerSsrIsland,\n type JSXChild,\n type JSXNode,\n} from '../core/jsx-runtime';\n\n/**\n * Derive component name from `from` path.\n * \"./react/Counter\" → \"Counter\"\n * \"~/features/newsfeed/react/NewsfeedApp\" → \"NewsfeedApp\"\n */\nfunction deriveComponentName(from: string): string {\n const segments = from.split('/');\n let filename = segments[segments.length - 1];\n filename = filename.replace(/\\.(tsx?|jsx?)$/, '');\n return filename;\n}\nexport type MountStrategy = 'load' | 'idle' | 'visible' | 'media' | 'none';\nexport interface ClientIslandProps {\n from: string;\n props?: Record<string, any>;\n mount?: MountStrategy | string;\n mountOpts?: string;\n class?: string;\n id?: string;\n children?: JSXChild | JSXChild[];\n\n /**\n * Opt-in: server-render the component into the placeholder and hydrate on the\n * client (instead of the default client-only mount). Component must be\n * SSR-safe (no top-level browser access) and props must be JSON-serializable.\n */\n ssr?: boolean;\n\n /** INTERNAL — injected by vite-plugin. Format: \"[name]_[hash]\" */\n __key?: string;\n /** INTERNAL — injected by vite-plugin. Manifest-compatible source path with extension */\n __src?: string;\n}\n\nexport function ClientIsland(attrs: ClientIslandProps): JSXNode {\n const {\n from,\n props = {},\n mount = 'load',\n mountOpts,\n class: className,\n id,\n children,\n ssr,\n __key,\n __src,\n } = attrs;\n\n const componentName = deriveComponentName(from);\n\n // Register island in render context (like useClientJs)\n // server.ts will use this to generate per-page window.__L5E_ISLANDS__\n // (needed for BOTH client-only mount AND ssr hydration — the client still\n // loads the component chunk via this registry).\n if (__key && __src) {\n registerIsland(__key, __src, componentName);\n }\n\n const dataAttrs: Record<string, string> = {\n 'data-island': __key || 'unresolved',\n 'data-island-name': componentName,\n 'data-island-mount': mount,\n };\n\n // Props delivery. `mount=\"none\"` never mounts/hydrates on the client, so its\n // props are dead weight → omit them entirely in the externalized mode.\n //\n // Externalized (default): props go into the per-request store and the element\n // just carries a `data-island-idx` pointer; a single `_l5e_data_` script at the\n // end of the document holds every island's props, keeping the SSR body lean.\n // Falls back to inlining when there's no render context (idx === -1).\n //\n // Legacy inline mode is kept byte-for-byte (props inlined even for mount=\"none\").\n if (isIslandPropsExternalized()) {\n if (mount !== 'none') {\n const idx = pushIslandProps(props);\n if (idx >= 0) {\n dataAttrs['data-island-idx'] = String(idx);\n } else {\n dataAttrs['data-island-props'] = JSON.stringify(props);\n }\n }\n } else {\n dataAttrs['data-island-props'] = JSON.stringify(props);\n }\n\n if (mountOpts) {\n dataAttrs['data-island-opts'] = mountOpts;\n }\n\n // SSR opt-in: register a pending server render and embed a unique token as the\n // placeholder body. entry-server replaces the token with renderToString() output\n // after the synchronous render pass, then normalizes data-island-ssr to \"1\".\n // The attribute value holds the token so the post-pass can target this exact\n // island (and strip the attribute on render failure → clean client-only fallback).\n if (ssr && __src) {\n const token = registerSsrIsland(__src, componentName, props);\n if (token) {\n return jsxFactory('div', {\n ...dataAttrs,\n 'data-island-ssr': token,\n ...(id ? { id } : {}),\n class: className ? `l5e-island ${className}` : 'l5e-island',\n // Raw token comment as body; replaced with SSR HTML in entry-server.\n setHtml: `<!--${token}-->`,\n });\n }\n }\n\n return jsxFactory(\n 'div',\n {\n ...dataAttrs,\n ...(id ? { id } : {}),\n class: className ? `l5e-island ${className}` : 'l5e-island',\n },\n children,\n );\n}\n"],"names":["deriveComponentName","from","segments","filename","ClientIsland","attrs","props","mount","mountOpts","className","id","children","ssr","__key","__src","componentName","registerIsland","dataAttrs","isIslandPropsExternalized","idx","pushIslandProps","token","registerSsrIsland","jsxFactory"],"mappings":";AAeA,SAASA,EAAoBC,GAAsB;AACjD,QAAMC,IAAWD,EAAK,MAAM,GAAG;AAC/B,MAAIE,IAAWD,EAASA,EAAS,SAAS,CAAC;AAC3C,SAAAC,IAAWA,EAAS,QAAQ,kBAAkB,EAAE,GACzCA;AACT;AAwBO,SAASC,EAAaC,GAAmC;AAC9D,QAAM;AAAA,IACJ,MAAAJ;AAAA,IACA,OAAAK,IAAQ,CAAA;AAAA,IACR,OAAAC,IAAQ;AAAA,IACR,WAAAC;AAAA,IACA,OAAOC;AAAA,IACP,IAAAC;AAAA,IACA,UAAAC;AAAA,IACA,KAAAC;AAAA,IACA,OAAAC;AAAA,IACA,OAAAC;AAAA,EAAA,IACET,GAEEU,IAAgBf,EAAoBC,CAAI;AAM9C,EAAIY,KAASC,KACXE,EAAeH,GAAOC,GAAOC,CAAa;AAG5C,QAAME,IAAoC;AAAA,IACxC,eAAeJ,KAAS;AAAA,IACxB,oBAAoBE;AAAA,IACpB,qBAAqBR;AAAA,EAAA;AAYvB,MAAIW;AACF,QAAIX,MAAU,QAAQ;AACpB,YAAMY,IAAMC,EAAgBd,CAAK;AACjC,MAAIa,KAAO,IACTF,EAAU,iBAAiB,IAAI,OAAOE,CAAG,IAEzCF,EAAU,mBAAmB,IAAI,KAAK,UAAUX,CAAK;AAAA,IAEzD;AAAA;AAEA,IAAAW,EAAU,mBAAmB,IAAI,KAAK,UAAUX,CAAK;AAYvD,MATIE,MACFS,EAAU,kBAAkB,IAAIT,IAQ9BI,KAAOE,GAAO;AAChB,UAAMO,IAAQC,EAAkBR,GAAOC,GAAeT,CAAK;AAC3D,QAAIe;AACF,aAAOE,EAAW,OAAO;AAAA,QACvB,GAAGN;AAAA,QACH,mBAAmBI;AAAA,QACnB,GAAIX,IAAK,EAAE,IAAAA,EAAA,IAAO,CAAA;AAAA,QAClB,OAAOD,IAAY,cAAcA,CAAS,KAAK;AAAA;AAAA,QAE/C,SAAS,OAAOY,CAAK;AAAA,MAAA,CACtB;AAAA,EAEL;AAEA,SAAOE;AAAA,IACL;AAAA,IACA;AAAA,MACE,GAAGN;AAAA,MACH,GAAIP,IAAK,EAAE,IAAAA,EAAA,IAAO,CAAA;AAAA,MAClB,OAAOD,IAAY,cAAcA,CAAS,KAAK;AAAA,IAAA;AAAA,IAEjDE;AAAA,EAAA;AAEJ;"}