@sonordev/site-kit 3.7.0 → 3.8.1
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.
- package/agent-manifest.json +1 -1
- package/dist/AnalyticsProvider-DSQNTSJZ.mjs +10 -0
- package/dist/{AnalyticsProvider-OIRXQE7O.mjs.map → AnalyticsProvider-DSQNTSJZ.mjs.map} +1 -1
- package/dist/AnalyticsProvider-MFNXZGXM.js +31 -0
- package/dist/{AnalyticsProvider-JWXDXOIR.js.map → AnalyticsProvider-MFNXZGXM.js.map} +1 -1
- package/dist/ChatWidget-PDCWVGLH.js +19 -0
- package/dist/{ChatWidget-K2BFJXGB.js.map → ChatWidget-PDCWVGLH.js.map} +1 -1
- package/dist/ChatWidget-RNJU2KCF.mjs +10 -0
- package/dist/{ChatWidget-FFCUDCT6.mjs.map → ChatWidget-RNJU2KCF.mjs.map} +1 -1
- package/dist/EngageWidget-EOGLNZ56.mjs +9 -0
- package/dist/{EngageWidget-QKRXI3NB.mjs.map → EngageWidget-EOGLNZ56.mjs.map} +1 -1
- package/dist/EngageWidget-IMKPA7YF.js +18 -0
- package/dist/{EngageWidget-XRXXVVUK.js.map → EngageWidget-IMKPA7YF.js.map} +1 -1
- package/dist/{SignalCore-BXCBV6GR.js → SignalCore-CTOFELJ7.js} +11 -11
- package/dist/{SignalCore-BXCBV6GR.js.map → SignalCore-CTOFELJ7.js.map} +1 -1
- package/dist/{SignalCore-6MUAX656.mjs → SignalCore-JTSREHTT.mjs} +5 -5
- package/dist/{SignalCore-6MUAX656.mjs.map → SignalCore-JTSREHTT.mjs.map} +1 -1
- package/dist/SitemapSync-3C32UQZB.mjs +8 -0
- package/dist/{SitemapSync-KS7KTJBK.mjs.map → SitemapSync-3C32UQZB.mjs.map} +1 -1
- package/dist/SitemapSync-J3QWNCMP.js +17 -0
- package/dist/{SitemapSync-WEZHTSFL.js.map → SitemapSync-J3QWNCMP.js.map} +1 -1
- package/dist/analytics/index.js +12 -12
- package/dist/analytics/index.mjs +5 -5
- package/dist/blog/server-ui.js +6 -6
- package/dist/blog/server-ui.js.map +1 -1
- package/dist/blog/server-ui.mjs +5 -5
- package/dist/blog/server-ui.mjs.map +1 -1
- package/dist/blog/server.d.mts +20 -1
- package/dist/blog/server.d.ts +20 -1
- package/dist/blog/server.js +43 -39
- package/dist/blog/server.mjs +1 -1
- package/dist/{chunk-HWJF7WMI.js → chunk-4WW7DHZS.js} +14 -14
- package/dist/{chunk-HWJF7WMI.js.map → chunk-4WW7DHZS.js.map} +1 -1
- package/dist/{chunk-4NUHZ24M.js → chunk-5LURTXJ3.js} +13 -13
- package/dist/{chunk-4NUHZ24M.js.map → chunk-5LURTXJ3.js.map} +1 -1
- package/dist/{chunk-2PQUCJJF.js → chunk-6UEZ6RJT.js} +5 -5
- package/dist/{chunk-2PQUCJJF.js.map → chunk-6UEZ6RJT.js.map} +1 -1
- package/dist/{chunk-LSWTMMKJ.mjs → chunk-75PY4H43.mjs} +3 -3
- package/dist/{chunk-LSWTMMKJ.mjs.map → chunk-75PY4H43.mjs.map} +1 -1
- package/dist/{chunk-3MYZS6PD.js → chunk-77CIIDE6.js} +15 -3
- package/dist/chunk-77CIIDE6.js.map +1 -0
- package/dist/{chunk-ZKAZGLHI.js → chunk-7CTKFXQ5.js} +9 -9
- package/dist/{chunk-ZKAZGLHI.js.map → chunk-7CTKFXQ5.js.map} +1 -1
- package/dist/{chunk-XOBW75J2.js → chunk-AL2O5QDB.js} +9 -9
- package/dist/{chunk-XOBW75J2.js.map → chunk-AL2O5QDB.js.map} +1 -1
- package/dist/{chunk-5Y5GCSH6.mjs → chunk-BJIJRBNA.mjs} +3 -3
- package/dist/{chunk-5Y5GCSH6.mjs.map → chunk-BJIJRBNA.mjs.map} +1 -1
- package/dist/{chunk-7UZV6JXD.js → chunk-C73RBN2O.js} +14 -14
- package/dist/{chunk-7UZV6JXD.js.map → chunk-C73RBN2O.js.map} +1 -1
- package/dist/{chunk-FP523A7G.mjs → chunk-CDW6LDLH.mjs} +3 -3
- package/dist/{chunk-FP523A7G.mjs.map → chunk-CDW6LDLH.mjs.map} +1 -1
- package/dist/{chunk-ON6WW7IE.js → chunk-CPO7FK36.js} +6 -6
- package/dist/{chunk-ON6WW7IE.js.map → chunk-CPO7FK36.js.map} +1 -1
- package/dist/{chunk-XREO3QRA.mjs → chunk-F5SDNDP6.mjs} +3 -3
- package/dist/{chunk-XREO3QRA.mjs.map → chunk-F5SDNDP6.mjs.map} +1 -1
- package/dist/{chunk-C3QMG4HS.js → chunk-GJMGQJI3.js} +15 -15
- package/dist/{chunk-C3QMG4HS.js.map → chunk-GJMGQJI3.js.map} +1 -1
- package/dist/{chunk-AKBGYQLC.js → chunk-GPXUJQFX.js} +15 -15
- package/dist/{chunk-AKBGYQLC.js.map → chunk-GPXUJQFX.js.map} +1 -1
- package/dist/{chunk-ATG4FJY6.js → chunk-H6AU3WKF.js} +35 -3
- package/dist/chunk-H6AU3WKF.js.map +1 -0
- package/dist/{chunk-NM7L2XKF.mjs → chunk-HJTAHRR3.mjs} +4 -4
- package/dist/{chunk-NM7L2XKF.mjs.map → chunk-HJTAHRR3.mjs.map} +1 -1
- package/dist/{chunk-R3CXRMP7.js → chunk-HNHZLRB6.js} +3 -3
- package/dist/{chunk-R3CXRMP7.js.map → chunk-HNHZLRB6.js.map} +1 -1
- package/dist/{chunk-AUBFDSTJ.js → chunk-ILCDV3MM.js} +8 -8
- package/dist/{chunk-AUBFDSTJ.js.map → chunk-ILCDV3MM.js.map} +1 -1
- package/dist/{chunk-TZTO5CDS.mjs → chunk-IVJLQJEP.mjs} +3 -3
- package/dist/{chunk-TZTO5CDS.mjs.map → chunk-IVJLQJEP.mjs.map} +1 -1
- package/dist/chunk-J4RBHTWC.js +8 -0
- package/dist/{chunk-SCMHZBTN.js.map → chunk-J4RBHTWC.js.map} +1 -1
- package/dist/{chunk-54ZC6LPR.mjs → chunk-J6MMNTYG.mjs} +3 -3
- package/dist/{chunk-54ZC6LPR.mjs.map → chunk-J6MMNTYG.mjs.map} +1 -1
- package/dist/{chunk-QPT5QX2W.js → chunk-KE3RJME2.js} +12 -12
- package/dist/{chunk-QPT5QX2W.js.map → chunk-KE3RJME2.js.map} +1 -1
- package/dist/{chunk-AJPPCSVW.mjs → chunk-LIFKPMXB.mjs} +3 -3
- package/dist/{chunk-AJPPCSVW.mjs.map → chunk-LIFKPMXB.mjs.map} +1 -1
- package/dist/chunk-M2SHY2FQ.mjs +6 -0
- package/dist/{chunk-2HH4VVJT.mjs.map → chunk-M2SHY2FQ.mjs.map} +1 -1
- package/dist/{chunk-LFFBDQM3.mjs → chunk-M3QFG3PA.mjs} +4 -4
- package/dist/{chunk-LFFBDQM3.mjs.map → chunk-M3QFG3PA.mjs.map} +1 -1
- package/dist/{chunk-UWL37MUR.mjs → chunk-NXFXKP7E.mjs} +3 -3
- package/dist/{chunk-UWL37MUR.mjs.map → chunk-NXFXKP7E.mjs.map} +1 -1
- package/dist/{chunk-6BIPAKL4.mjs → chunk-OVIDFJIK.mjs} +15 -4
- package/dist/chunk-OVIDFJIK.mjs.map +1 -0
- package/dist/{chunk-GUXB3QH7.mjs → chunk-PA7ENTUZ.mjs} +41 -9
- package/dist/chunk-PA7ENTUZ.mjs.map +1 -0
- package/dist/{chunk-H23ZT2I2.mjs → chunk-PENNTSJE.mjs} +35 -3
- package/dist/chunk-PENNTSJE.mjs.map +1 -0
- package/dist/{chunk-QAYCRXT4.mjs → chunk-PUZ6XJ2L.mjs} +3 -3
- package/dist/{chunk-QAYCRXT4.mjs.map → chunk-PUZ6XJ2L.mjs.map} +1 -1
- package/dist/{chunk-VZU2EHB6.js → chunk-QGNU2EDU.js} +4 -4
- package/dist/{chunk-VZU2EHB6.js.map → chunk-QGNU2EDU.js.map} +1 -1
- package/dist/{chunk-3K7WF6KB.mjs → chunk-QMBVVQSH.mjs} +8 -8
- package/dist/{chunk-3K7WF6KB.mjs.map → chunk-QMBVVQSH.mjs.map} +1 -1
- package/dist/{chunk-2CNKJMGT.mjs → chunk-SBRZLKE7.mjs} +3 -3
- package/dist/{chunk-2CNKJMGT.mjs.map → chunk-SBRZLKE7.mjs.map} +1 -1
- package/dist/{chunk-34IUDOBC.mjs → chunk-SP3MXF3A.mjs} +34 -5
- package/dist/chunk-SP3MXF3A.mjs.map +1 -0
- package/dist/{chunk-WQ64SU6E.js → chunk-SUWDZOPH.js} +4 -4
- package/dist/{chunk-WQ64SU6E.js.map → chunk-SUWDZOPH.js.map} +1 -1
- package/dist/{chunk-TQS2X5A3.js → chunk-TFU6J77X.js} +5 -5
- package/dist/{chunk-TQS2X5A3.js.map → chunk-TFU6J77X.js.map} +1 -1
- package/dist/{chunk-XAWB2HFQ.js → chunk-TMKLH6MY.js} +41 -8
- package/dist/chunk-TMKLH6MY.js.map +1 -0
- package/dist/{chunk-CDKWTLWF.mjs → chunk-TQYOQ7MH.mjs} +4 -4
- package/dist/{chunk-CDKWTLWF.mjs.map → chunk-TQYOQ7MH.mjs.map} +1 -1
- package/dist/{chunk-JFAAPREU.mjs → chunk-UGBL7GTN.mjs} +4 -4
- package/dist/{chunk-JFAAPREU.mjs.map → chunk-UGBL7GTN.mjs.map} +1 -1
- package/dist/{chunk-2EYHSGQ3.mjs → chunk-WM7U23R5.mjs} +3 -3
- package/dist/{chunk-2EYHSGQ3.mjs.map → chunk-WM7U23R5.mjs.map} +1 -1
- package/dist/{chunk-YE7KZQZ3.mjs → chunk-WXGBLUGC.mjs} +4 -4
- package/dist/{chunk-YE7KZQZ3.mjs.map → chunk-WXGBLUGC.mjs.map} +1 -1
- package/dist/{chunk-TA6KXHCY.js → chunk-X2DWUV5M.js} +7 -7
- package/dist/{chunk-TA6KXHCY.js.map → chunk-X2DWUV5M.js.map} +1 -1
- package/dist/{chunk-6T4NVCAT.js → chunk-XMBYDIV6.js} +40 -11
- package/dist/chunk-XMBYDIV6.js.map +1 -0
- package/dist/{chunk-GZHLVOW3.js → chunk-XMKZXFVX.js} +4 -4
- package/dist/{chunk-GZHLVOW3.js.map → chunk-XMKZXFVX.js.map} +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/cli/index.mjs +1 -1
- package/dist/client/index.js +4 -4
- package/dist/client/index.mjs +3 -3
- package/dist/commerce/index.js +51 -51
- package/dist/commerce/index.mjs +6 -6
- package/dist/config/index.d.mts +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.js +2 -2
- package/dist/config/index.mjs +1 -1
- package/dist/engage/index.js +9 -9
- package/dist/engage/index.mjs +6 -6
- package/dist/fleet/index.js +8 -8
- package/dist/fleet/index.mjs +4 -4
- package/dist/forms/index.js +97 -50
- package/dist/forms/index.js.map +1 -1
- package/dist/forms/index.mjs +89 -42
- package/dist/forms/index.mjs.map +1 -1
- package/dist/forms/styles.css +107 -2
- package/dist/images/index.js +11 -11
- package/dist/images/index.mjs +4 -4
- package/dist/index.js +64 -64
- package/dist/index.mjs +10 -10
- package/dist/layout/client.js +8 -8
- package/dist/layout/client.mjs +7 -7
- package/dist/layout/index.js +10 -10
- package/dist/layout/index.mjs +8 -8
- package/dist/llms/contract.js +9 -9
- package/dist/llms/contract.mjs +1 -1
- package/dist/llms/index.d.mts +131 -40
- package/dist/llms/index.d.ts +131 -40
- package/dist/llms/index.js +125 -21
- package/dist/llms/index.js.map +1 -1
- package/dist/llms/index.mjs +102 -4
- package/dist/llms/index.mjs.map +1 -1
- package/dist/maps/index.js +5 -5
- package/dist/maps/index.mjs +3 -3
- package/dist/middleware/index.d.mts +2 -1
- package/dist/middleware/index.d.ts +2 -1
- package/dist/middleware/index.js +6 -2
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/index.mjs +2 -1
- package/dist/middleware/index.mjs.map +1 -1
- package/dist/securityHeaders-CwsFdDcJ.d.mts +49 -0
- package/dist/securityHeaders-CwsFdDcJ.d.ts +49 -0
- package/dist/seo/client.js +5 -5
- package/dist/seo/client.mjs +4 -4
- package/dist/seo/index.js +7 -7
- package/dist/seo/index.mjs +5 -5
- package/dist/server/index.js +3 -3
- package/dist/server/index.mjs +2 -2
- package/dist/signal/index.js +11 -11
- package/dist/signal/index.mjs +2 -2
- package/dist/sitemap/index.d.mts +8 -1
- package/dist/sitemap/index.d.ts +8 -1
- package/dist/sitemap/index.js +5 -4
- package/dist/sitemap/index.js.map +1 -1
- package/dist/sitemap/index.mjs +4 -3
- package/dist/sitemap/index.mjs.map +1 -1
- package/dist/sync/index.js +16 -16
- package/dist/sync/index.mjs +4 -4
- package/dist/{types-xcP_owwn.d.ts → writeLLMsTxt-BFaNr4re.d.ts} +53 -1
- package/dist/{types-DhCAWUmd.d.mts → writeLLMsTxt-SpMdyHQT.d.mts} +53 -1
- package/package.json +1 -1
- package/dist/AnalyticsProvider-JWXDXOIR.js +0 -31
- package/dist/AnalyticsProvider-OIRXQE7O.mjs +0 -10
- package/dist/ChatWidget-FFCUDCT6.mjs +0 -10
- package/dist/ChatWidget-K2BFJXGB.js +0 -19
- package/dist/EngageWidget-QKRXI3NB.mjs +0 -9
- package/dist/EngageWidget-XRXXVVUK.js +0 -18
- package/dist/SitemapSync-KS7KTJBK.mjs +0 -8
- package/dist/SitemapSync-WEZHTSFL.js +0 -17
- package/dist/chunk-2HH4VVJT.mjs +0 -6
- package/dist/chunk-34IUDOBC.mjs.map +0 -1
- package/dist/chunk-3MYZS6PD.js.map +0 -1
- package/dist/chunk-6BIPAKL4.mjs.map +0 -1
- package/dist/chunk-6T4NVCAT.js.map +0 -1
- package/dist/chunk-ATG4FJY6.js.map +0 -1
- package/dist/chunk-GUXB3QH7.mjs.map +0 -1
- package/dist/chunk-H23ZT2I2.mjs.map +0 -1
- package/dist/chunk-SCMHZBTN.js +0 -8
- package/dist/chunk-XAWB2HFQ.js.map +0 -1
- package/dist/securityHeaders-nwZ6nP4g.d.mts +0 -24
- package/dist/securityHeaders-nwZ6nP4g.d.ts +0 -24
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/middleware/segment.ts","../../src/middleware/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @sonordev/site-kit/middleware — visitor segment resolution (the \"one edge pass\").\n *\n * Pure, edge-runtime-safe helpers that classify a request into a coarse visitor\n * segment (new-vs-returning + marketing source + campaign) from the URL's UTM\n * params and the referrer. The middleware writes the result to the `_sk_seg`\n * cookie so server-rendered slots / personalization can vary by segment WITHOUT\n * each one re-parsing the request. Resolved once, at the edge.\n *\n * Kept side-effect-free (no NextResponse, no cookie writes) so it is trivially\n * unit-testable and reusable.\n */\nimport type { NextRequest } from 'next/server'\n\nexport type SegmentSource = 'paid' | 'organic' | 'social' | 'referral' | 'direct'\n\nexport interface VisitorSegment {\n /** `new` on the first visit (no prior `_sk_vid` cookie), else `returning`. */\n visitorType: 'new' | 'returning'\n /** Marketing source bucket derived from UTM medium/source, then referrer. */\n source: SegmentSource\n /** `utm_campaign`, if present (sanitized when encoded). */\n campaign: string | null\n}\n\nconst PAID_MEDIUMS = ['cpc', 'ppc', 'paid', 'paidsearch', 'paid-search', 'display', 'cpm', 'banner']\nconst SOCIAL_MEDIUMS = ['social', 'social-media', 'social_media', 'sm']\nconst SOCIAL_HOSTS = [\n 'facebook.',\n 'instagram.',\n 'linkedin.',\n 't.co',\n 'twitter.',\n 'x.com',\n 'pinterest.',\n 'tiktok.',\n 'youtube.',\n 'reddit.',\n]\nconst SEARCH_HOSTS = ['google.', 'bing.', 'duckduckgo.', 'yahoo.', 'ecosia.', 'brave.', 'baidu.', 'yandex.']\n\n/**\n * Classify `request` into a {@link VisitorSegment}. UTM params win over the\n * referrer; a same-host referrer is ignored (internal navigation, not a source).\n */\nexport function resolveVisitorSegment(\n request: NextRequest,\n opts: { hadVisitorCookie: boolean },\n): VisitorSegment {\n const params = request.nextUrl.searchParams\n const medium = (params.get('utm_medium') || '').toLowerCase().trim()\n const campaign = params.get('utm_campaign')\n\n let source: SegmentSource = 'direct'\n\n if (PAID_MEDIUMS.includes(medium)) {\n source = 'paid'\n } else if (SOCIAL_MEDIUMS.includes(medium)) {\n source = 'social'\n } else if (medium === 'organic') {\n source = 'organic'\n } else if (medium === 'referral') {\n source = 'referral'\n } else if (params.get('utm_source') || params.get('gclid') || params.get('fbclid')) {\n // A tagged link with a non-standard medium: gclid => paid Google, fbclid => social.\n if (params.get('gclid')) source = 'paid'\n else if (params.get('fbclid')) source = 'social'\n else source = 'referral'\n } else {\n // No campaign tagging — fall back to the referrer host.\n const ref = request.headers.get('referer') || ''\n if (ref) {\n try {\n const host = new URL(ref).host.toLowerCase()\n const selfHost = request.nextUrl.host.toLowerCase()\n if (host && host !== selfHost) {\n if (SEARCH_HOSTS.some((h) => host.includes(h))) source = 'organic'\n else if (SOCIAL_HOSTS.some((h) => host.includes(h))) source = 'social'\n else source = 'referral'\n }\n } catch {\n /* malformed referer — stays 'direct' */\n }\n }\n }\n\n return {\n visitorType: opts.hadVisitorCookie ? 'returning' : 'new',\n source,\n campaign: campaign || null,\n }\n}\n\n/**\n * Compact, cookie-safe encoding: `\"<visitorType>|<source>|<campaign>\"`, e.g.\n * `\"new|paid|spring_sale\"`. Campaign is sanitized to `[A-Za-z0-9_-]` and capped.\n * Decode with {@link decodeSegment}.\n */\nexport function encodeSegment(seg: VisitorSegment): string {\n const campaign = (seg.campaign || '').replace(/[^a-zA-Z0-9_-]/g, '').slice(0, 40)\n return `${seg.visitorType}|${seg.source}|${campaign}`\n}\n\n/** Parse a `_sk_seg` cookie value produced by {@link encodeSegment}. */\nexport function decodeSegment(value: string | undefined | null): VisitorSegment | null {\n if (!value) return null\n const [visitorType, source, campaign] = value.split('|')\n if (visitorType !== 'new' && visitorType !== 'returning') return null\n return {\n visitorType,\n source: (['paid', 'organic', 'social', 'referral', 'direct'].includes(source) ? source : 'direct') as SegmentSource,\n campaign: campaign || null,\n }\n}\n","/**\n * @sonordev/site-kit/middleware\n *\n * Composable Next.js middleware factory. Handles:\n * - Portal-managed redirects (via existing handleManagedRedirects)\n * - Security headers (X-Frame-Options, CSP, etc.)\n * - Optional before/after hooks for custom logic\n *\n * @example\n * ```ts\n * // middleware.ts — entire file\n * import { createMiddleware, siteKitMatcher } from '@sonordev/site-kit/middleware'\n *\n * export default createMiddleware()\n * export const config = siteKitMatcher\n * ```\n *\n * @example With custom hooks:\n * ```ts\n * export default createMiddleware({\n * securityHeaders: { frameOptions: 'SAMEORIGIN' },\n * before: (req) => {\n * // Custom auth check, etc.\n * },\n * })\n * ```\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\nimport {\n handleManagedRedirects,\n type RedirectConfig,\n} from '../redirects'\nimport {\n buildSecurityHeaders,\n type SecurityHeadersConfig,\n} from './securityHeaders'\nimport { buildAiDiscoveryHeaders } from '../llms/discovery-headers'\nimport { resolveVisitorSegment, encodeSegment } from './segment'\n// Single source of truth for v4 UUIDs — Web Crypto in the edge runtime, with a\n// non-throwing fallback everywhere else. Do NOT re-fork ID generation here.\nimport { uuid } from '../shared/uuid'\n\nexport type { SecurityHeadersConfig } from './securityHeaders'\nexport {\n resolveVisitorSegment,\n encodeSegment,\n decodeSegment,\n type VisitorSegment,\n type SegmentSource,\n} from './segment'\n\nexport interface IdentityConfig {\n /**\n * Also resolve + persist a coarse visitor segment (new-vs-returning + source\n * + campaign) into the `_sk_seg` cookie, for segment-aware slots /\n * personalization. Default: true (when identity is enabled).\n */\n segment?: boolean\n /** Days the `_sk_vid` visitor cookie persists. Default: 730 (~2 years). */\n cookieMaxAgeDays?: number\n}\n\nexport interface LlmsDiscoveryConfig {\n /** Canonical site origin, e.g. `https://example.com` */\n siteUrl: string\n /** Path to llms.txt (default `/llms.txt`) */\n llmsPath?: string\n}\n\nexport interface SiteKitMiddlewareConfig {\n /** Enable Portal-managed redirects. Default: true */\n redirects?: boolean | RedirectConfig\n /** Enable security headers. Default: true */\n securityHeaders?: boolean | SecurityHeadersConfig\n /**\n * Opt-in: inject `Link: <...>; rel=\"describedby\"` header on HTML responses\n * pointing to /llms.txt for AI crawler discovery (RFC 8288).\n * Preferred over visible footer links.\n */\n llmsDiscovery?: LlmsDiscoveryConfig | false\n /**\n * Opt-in EDGE IDENTITY pass. When enabled, the middleware ensures a\n * first-party `_sk_vid` visitor cookie exists (server-authoritative id) and\n * resolves the visitor segment into `_sk_seg`, so server-rendered slots and\n * personalization can read identity + segment without re-parsing the request.\n * Purely additive — it only writes cookies, never changes the rendered HTML,\n * so it is LCP/static-safe. Default: OFF (sites opt in for 3.0 personalization).\n *\n * NOTE: to make these the SAME id the client uses, the shared identity helper\n * must read `_sk_vid` cookie-first (a follow-on change validated with a live\n * preview); until then the cookie is the server-side mirror.\n */\n identity?: boolean | IdentityConfig\n /**\n * Hook that runs BEFORE redirect check.\n * Return a NextResponse to short-circuit, or undefined to continue.\n */\n before?: (\n request: NextRequest,\n ) => NextResponse | undefined | Promise<NextResponse | undefined>\n /**\n * Hook that runs AFTER all processing.\n * Receives the response that will be sent — mutate headers, etc.\n */\n after?: (\n request: NextRequest,\n response: NextResponse,\n ) => NextResponse | Promise<NextResponse>\n}\n\n/**\n * Create a fully-featured Next.js middleware function.\n *\n * With zero config this handles redirects + security headers automatically.\n */\nexport function createMiddleware(config?: SiteKitMiddlewareConfig) {\n const securityHeaders = buildSecurityHeaders(\n config?.securityHeaders,\n )\n\n // Pre-compute discovery headers (static per middleware instance)\n const discoveryHeaders: Record<string, string> =\n config?.llmsDiscovery\n ? buildAiDiscoveryHeaders({\n siteUrl: config.llmsDiscovery.siteUrl,\n llmsPath: config.llmsDiscovery.llmsPath,\n })\n : {}\n\n return async function proxy(\n request: NextRequest,\n ): Promise<NextResponse> {\n // 1. Run user's 'before' hook\n if (config?.before) {\n const earlyResponse = await config.before(request)\n if (earlyResponse) {\n // Apply security headers even to early responses\n applyHeaders(earlyResponse, securityHeaders)\n return earlyResponse\n }\n }\n\n // 2. Check Portal-managed redirects (unless disabled)\n if (config?.redirects !== false) {\n const redirectConfig: RedirectConfig =\n typeof config?.redirects === 'object'\n ? config.redirects\n : {}\n\n const redirect = await handleManagedRedirects(\n request,\n redirectConfig,\n )\n if (redirect) {\n // Redirects get security headers too\n applyHeaders(redirect, securityHeaders)\n return redirect\n }\n }\n\n // 3. Build the pass-through response\n let response = NextResponse.next()\n\n // 4. Apply security headers\n applyHeaders(response, securityHeaders)\n\n // 5. Apply AI discovery Link header (only on HTML-like requests, not static assets)\n if (Object.keys(discoveryHeaders).length > 0) {\n const accept = request.headers.get('accept') || ''\n if (accept.includes('text/html') || accept.includes('*/*')) {\n applyHeaders(response, discoveryHeaders)\n }\n }\n\n // 5b. Edge identity pass (opt-in). Ensure a first-party `_sk_vid` visitor\n // cookie exists and resolve the visitor segment into `_sk_seg`. Additive:\n // only writes cookies, never changes the rendered HTML (LCP/static-safe).\n if (config?.identity) {\n const idCfg: IdentityConfig =\n typeof config.identity === 'object' ? config.identity : {}\n const hadVisitorCookie = !!request.cookies.get('_sk_vid')?.value\n if (!hadVisitorCookie) {\n const maxAgeDays = idCfg.cookieMaxAgeDays ?? 730\n response.cookies.set('_sk_vid', uuid(), {\n maxAge: maxAgeDays * 24 * 60 * 60,\n path: '/',\n sameSite: 'lax',\n secure: true,\n })\n }\n if (idCfg.segment !== false) {\n const segment = encodeSegment(\n resolveVisitorSegment(request, { hadVisitorCookie }),\n )\n response.cookies.set('_sk_seg', segment, {\n // Session-ish: a fresh campaign / source on a later visit re-segments.\n maxAge: 30 * 60,\n path: '/',\n sameSite: 'lax',\n secure: true,\n })\n }\n }\n\n // 6. Run user's 'after' hook\n if (config?.after) {\n response = await config.after(request, response)\n }\n\n return response\n }\n}\n\nfunction applyHeaders(\n response: NextResponse,\n headers: Record<string, string>,\n): void {\n for (const [key, value] of Object.entries(headers)) {\n response.headers.set(key, value)\n }\n}\n\n/**\n * Standard matcher config that excludes static assets and images.\n * Export alongside createProxy/createMiddleware in your proxy.ts.\n */\nexport const siteKitMatcher = {\n matcher: [\n '/((?!_next/static|_next/image|favicon\\\\.ico|.*\\\\.(?:ico|png|jpg|jpeg|gif|webp|svg|woff2?)$).*)',\n ],\n}\n\n/** Next.js 16+ alias — same as createMiddleware, named for the proxy convention. */\nexport const createProxy = createMiddleware\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/middleware/segment.ts","../../src/middleware/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @sonordev/site-kit/middleware — visitor segment resolution (the \"one edge pass\").\n *\n * Pure, edge-runtime-safe helpers that classify a request into a coarse visitor\n * segment (new-vs-returning + marketing source + campaign) from the URL's UTM\n * params and the referrer. The middleware writes the result to the `_sk_seg`\n * cookie so server-rendered slots / personalization can vary by segment WITHOUT\n * each one re-parsing the request. Resolved once, at the edge.\n *\n * Kept side-effect-free (no NextResponse, no cookie writes) so it is trivially\n * unit-testable and reusable.\n */\nimport type { NextRequest } from 'next/server'\n\nexport type SegmentSource = 'paid' | 'organic' | 'social' | 'referral' | 'direct'\n\nexport interface VisitorSegment {\n /** `new` on the first visit (no prior `_sk_vid` cookie), else `returning`. */\n visitorType: 'new' | 'returning'\n /** Marketing source bucket derived from UTM medium/source, then referrer. */\n source: SegmentSource\n /** `utm_campaign`, if present (sanitized when encoded). */\n campaign: string | null\n}\n\nconst PAID_MEDIUMS = ['cpc', 'ppc', 'paid', 'paidsearch', 'paid-search', 'display', 'cpm', 'banner']\nconst SOCIAL_MEDIUMS = ['social', 'social-media', 'social_media', 'sm']\nconst SOCIAL_HOSTS = [\n 'facebook.',\n 'instagram.',\n 'linkedin.',\n 't.co',\n 'twitter.',\n 'x.com',\n 'pinterest.',\n 'tiktok.',\n 'youtube.',\n 'reddit.',\n]\nconst SEARCH_HOSTS = ['google.', 'bing.', 'duckduckgo.', 'yahoo.', 'ecosia.', 'brave.', 'baidu.', 'yandex.']\n\n/**\n * Classify `request` into a {@link VisitorSegment}. UTM params win over the\n * referrer; a same-host referrer is ignored (internal navigation, not a source).\n */\nexport function resolveVisitorSegment(\n request: NextRequest,\n opts: { hadVisitorCookie: boolean },\n): VisitorSegment {\n const params = request.nextUrl.searchParams\n const medium = (params.get('utm_medium') || '').toLowerCase().trim()\n const campaign = params.get('utm_campaign')\n\n let source: SegmentSource = 'direct'\n\n if (PAID_MEDIUMS.includes(medium)) {\n source = 'paid'\n } else if (SOCIAL_MEDIUMS.includes(medium)) {\n source = 'social'\n } else if (medium === 'organic') {\n source = 'organic'\n } else if (medium === 'referral') {\n source = 'referral'\n } else if (params.get('utm_source') || params.get('gclid') || params.get('fbclid')) {\n // A tagged link with a non-standard medium: gclid => paid Google, fbclid => social.\n if (params.get('gclid')) source = 'paid'\n else if (params.get('fbclid')) source = 'social'\n else source = 'referral'\n } else {\n // No campaign tagging — fall back to the referrer host.\n const ref = request.headers.get('referer') || ''\n if (ref) {\n try {\n const host = new URL(ref).host.toLowerCase()\n const selfHost = request.nextUrl.host.toLowerCase()\n if (host && host !== selfHost) {\n if (SEARCH_HOSTS.some((h) => host.includes(h))) source = 'organic'\n else if (SOCIAL_HOSTS.some((h) => host.includes(h))) source = 'social'\n else source = 'referral'\n }\n } catch {\n /* malformed referer — stays 'direct' */\n }\n }\n }\n\n return {\n visitorType: opts.hadVisitorCookie ? 'returning' : 'new',\n source,\n campaign: campaign || null,\n }\n}\n\n/**\n * Compact, cookie-safe encoding: `\"<visitorType>|<source>|<campaign>\"`, e.g.\n * `\"new|paid|spring_sale\"`. Campaign is sanitized to `[A-Za-z0-9_-]` and capped.\n * Decode with {@link decodeSegment}.\n */\nexport function encodeSegment(seg: VisitorSegment): string {\n const campaign = (seg.campaign || '').replace(/[^a-zA-Z0-9_-]/g, '').slice(0, 40)\n return `${seg.visitorType}|${seg.source}|${campaign}`\n}\n\n/** Parse a `_sk_seg` cookie value produced by {@link encodeSegment}. */\nexport function decodeSegment(value: string | undefined | null): VisitorSegment | null {\n if (!value) return null\n const [visitorType, source, campaign] = value.split('|')\n if (visitorType !== 'new' && visitorType !== 'returning') return null\n return {\n visitorType,\n source: (['paid', 'organic', 'social', 'referral', 'direct'].includes(source) ? source : 'direct') as SegmentSource,\n campaign: campaign || null,\n }\n}\n","/**\n * @sonordev/site-kit/middleware\n *\n * Composable Next.js middleware factory. Handles:\n * - Portal-managed redirects (via existing handleManagedRedirects)\n * - Security headers (X-Frame-Options, CSP, etc.)\n * - Optional before/after hooks for custom logic\n *\n * @example\n * ```ts\n * // middleware.ts — entire file\n * import { createMiddleware, siteKitMatcher } from '@sonordev/site-kit/middleware'\n *\n * export default createMiddleware()\n * export const config = siteKitMatcher\n * ```\n *\n * @example With custom hooks:\n * ```ts\n * export default createMiddleware({\n * securityHeaders: { frameOptions: 'SAMEORIGIN' },\n * before: (req) => {\n * // Custom auth check, etc.\n * },\n * })\n * ```\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\nimport {\n handleManagedRedirects,\n type RedirectConfig,\n} from '../redirects'\nimport {\n buildSecurityHeaders,\n type SecurityHeadersConfig,\n} from './securityHeaders'\nimport { buildAiDiscoveryHeaders } from '../llms/discovery-headers'\nimport { resolveVisitorSegment, encodeSegment } from './segment'\n// Single source of truth for v4 UUIDs — Web Crypto in the edge runtime, with a\n// non-throwing fallback everywhere else. Do NOT re-fork ID generation here.\nimport { uuid } from '../shared/uuid'\n\nexport type { SecurityHeadersConfig } from './securityHeaders'\nexport { DEFAULT_FRAME_ANCESTORS } from './securityHeaders'\nexport {\n resolveVisitorSegment,\n encodeSegment,\n decodeSegment,\n type VisitorSegment,\n type SegmentSource,\n} from './segment'\n\nexport interface IdentityConfig {\n /**\n * Also resolve + persist a coarse visitor segment (new-vs-returning + source\n * + campaign) into the `_sk_seg` cookie, for segment-aware slots /\n * personalization. Default: true (when identity is enabled).\n */\n segment?: boolean\n /** Days the `_sk_vid` visitor cookie persists. Default: 730 (~2 years). */\n cookieMaxAgeDays?: number\n}\n\nexport interface LlmsDiscoveryConfig {\n /** Canonical site origin, e.g. `https://example.com` */\n siteUrl: string\n /** Path to llms.txt (default `/llms.txt`) */\n llmsPath?: string\n}\n\nexport interface SiteKitMiddlewareConfig {\n /** Enable Portal-managed redirects. Default: true */\n redirects?: boolean | RedirectConfig\n /** Enable security headers. Default: true */\n securityHeaders?: boolean | SecurityHeadersConfig\n /**\n * Opt-in: inject `Link: <...>; rel=\"describedby\"` header on HTML responses\n * pointing to /llms.txt for AI crawler discovery (RFC 8288).\n * Preferred over visible footer links.\n */\n llmsDiscovery?: LlmsDiscoveryConfig | false\n /**\n * Opt-in EDGE IDENTITY pass. When enabled, the middleware ensures a\n * first-party `_sk_vid` visitor cookie exists (server-authoritative id) and\n * resolves the visitor segment into `_sk_seg`, so server-rendered slots and\n * personalization can read identity + segment without re-parsing the request.\n * Purely additive — it only writes cookies, never changes the rendered HTML,\n * so it is LCP/static-safe. Default: OFF (sites opt in for 3.0 personalization).\n *\n * NOTE: to make these the SAME id the client uses, the shared identity helper\n * must read `_sk_vid` cookie-first (a follow-on change validated with a live\n * preview); until then the cookie is the server-side mirror.\n */\n identity?: boolean | IdentityConfig\n /**\n * Hook that runs BEFORE redirect check.\n * Return a NextResponse to short-circuit, or undefined to continue.\n */\n before?: (\n request: NextRequest,\n ) => NextResponse | undefined | Promise<NextResponse | undefined>\n /**\n * Hook that runs AFTER all processing.\n * Receives the response that will be sent — mutate headers, etc.\n */\n after?: (\n request: NextRequest,\n response: NextResponse,\n ) => NextResponse | Promise<NextResponse>\n}\n\n/**\n * Create a fully-featured Next.js middleware function.\n *\n * With zero config this handles redirects + security headers automatically.\n */\nexport function createMiddleware(config?: SiteKitMiddlewareConfig) {\n const securityHeaders = buildSecurityHeaders(\n config?.securityHeaders,\n )\n\n // Pre-compute discovery headers (static per middleware instance)\n const discoveryHeaders: Record<string, string> =\n config?.llmsDiscovery\n ? buildAiDiscoveryHeaders({\n siteUrl: config.llmsDiscovery.siteUrl,\n llmsPath: config.llmsDiscovery.llmsPath,\n })\n : {}\n\n return async function proxy(\n request: NextRequest,\n ): Promise<NextResponse> {\n // 1. Run user's 'before' hook\n if (config?.before) {\n const earlyResponse = await config.before(request)\n if (earlyResponse) {\n // Apply security headers even to early responses\n applyHeaders(earlyResponse, securityHeaders)\n return earlyResponse\n }\n }\n\n // 2. Check Portal-managed redirects (unless disabled)\n if (config?.redirects !== false) {\n const redirectConfig: RedirectConfig =\n typeof config?.redirects === 'object'\n ? config.redirects\n : {}\n\n const redirect = await handleManagedRedirects(\n request,\n redirectConfig,\n )\n if (redirect) {\n // Redirects get security headers too\n applyHeaders(redirect, securityHeaders)\n return redirect\n }\n }\n\n // 3. Build the pass-through response\n let response = NextResponse.next()\n\n // 4. Apply security headers\n applyHeaders(response, securityHeaders)\n\n // 5. Apply AI discovery Link header (only on HTML-like requests, not static assets)\n if (Object.keys(discoveryHeaders).length > 0) {\n const accept = request.headers.get('accept') || ''\n if (accept.includes('text/html') || accept.includes('*/*')) {\n applyHeaders(response, discoveryHeaders)\n }\n }\n\n // 5b. Edge identity pass (opt-in). Ensure a first-party `_sk_vid` visitor\n // cookie exists and resolve the visitor segment into `_sk_seg`. Additive:\n // only writes cookies, never changes the rendered HTML (LCP/static-safe).\n if (config?.identity) {\n const idCfg: IdentityConfig =\n typeof config.identity === 'object' ? config.identity : {}\n const hadVisitorCookie = !!request.cookies.get('_sk_vid')?.value\n if (!hadVisitorCookie) {\n const maxAgeDays = idCfg.cookieMaxAgeDays ?? 730\n response.cookies.set('_sk_vid', uuid(), {\n maxAge: maxAgeDays * 24 * 60 * 60,\n path: '/',\n sameSite: 'lax',\n secure: true,\n })\n }\n if (idCfg.segment !== false) {\n const segment = encodeSegment(\n resolveVisitorSegment(request, { hadVisitorCookie }),\n )\n response.cookies.set('_sk_seg', segment, {\n // Session-ish: a fresh campaign / source on a later visit re-segments.\n maxAge: 30 * 60,\n path: '/',\n sameSite: 'lax',\n secure: true,\n })\n }\n }\n\n // 6. Run user's 'after' hook\n if (config?.after) {\n response = await config.after(request, response)\n }\n\n return response\n }\n}\n\nfunction applyHeaders(\n response: NextResponse,\n headers: Record<string, string>,\n): void {\n for (const [key, value] of Object.entries(headers)) {\n response.headers.set(key, value)\n }\n}\n\n/**\n * Standard matcher config that excludes static assets and images.\n * Export alongside createProxy/createMiddleware in your proxy.ts.\n */\nexport const siteKitMatcher = {\n matcher: [\n '/((?!_next/static|_next/image|favicon\\\\.ico|.*\\\\.(?:ico|png|jpg|jpeg|gif|webp|svg|woff2?)$).*)',\n ],\n}\n\n/** Next.js 16+ alias — same as createMiddleware, named for the proxy convention. */\nexport const createProxy = createMiddleware\n"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default security headers applied by site-kit middleware.
|
|
3
|
+
*
|
|
4
|
+
* These match industry best practices and are the same headers
|
|
5
|
+
* recommended by Next.js documentation. All are opt-out.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Single source of truth for who may frame a site-kit site.
|
|
9
|
+
*
|
|
10
|
+
* Upforge showcases live client work inside iframes on its portfolio /
|
|
11
|
+
* area pages, so every managed marketing site has to be embeddable from
|
|
12
|
+
* upforge.io. `X-Frame-Options` cannot express an allowlist (`ALLOW-FROM`
|
|
13
|
+
* is dead and ignored by every current browser), so the CSP
|
|
14
|
+
* `frame-ancestors` directive is the only way to say "these origins and
|
|
15
|
+
* nobody else". Everything not listed here is still blocked.
|
|
16
|
+
*
|
|
17
|
+
* Do NOT re-fork this list into individual sites' middleware/next.config —
|
|
18
|
+
* add origins here and let the fleet inherit them.
|
|
19
|
+
*/
|
|
20
|
+
declare const DEFAULT_FRAME_ANCESTORS: string[];
|
|
21
|
+
interface SecurityHeadersConfig {
|
|
22
|
+
/** X-Frame-Options value. false to disable. Default: omitted when
|
|
23
|
+
* `frameAncestors` is active (the two conflict), otherwise 'DENY'. */
|
|
24
|
+
frameOptions?: 'DENY' | 'SAMEORIGIN' | false;
|
|
25
|
+
/**
|
|
26
|
+
* Origins allowed to frame this site, emitted as a CSP `frame-ancestors`
|
|
27
|
+
* directive. Defaults to {@link DEFAULT_FRAME_ANCESTORS} ('self' + upforge.io)
|
|
28
|
+
* so Upforge can showcase the site. Pass an array to extend/replace, or
|
|
29
|
+
* `false` to opt out entirely and fall back to X-Frame-Options.
|
|
30
|
+
*
|
|
31
|
+
* Ignored if a `Content-Security-Policy` is supplied via `customHeaders` —
|
|
32
|
+
* that CSP wins, and must carry its own frame-ancestors directive.
|
|
33
|
+
*/
|
|
34
|
+
frameAncestors?: string[] | false;
|
|
35
|
+
/** X-Content-Type-Options: nosniff. Default: true */
|
|
36
|
+
contentTypeOptions?: boolean;
|
|
37
|
+
/** X-XSS-Protection header. Default: true */
|
|
38
|
+
xssProtection?: boolean;
|
|
39
|
+
/** Referrer-Policy value. Default: 'strict-origin-when-cross-origin' */
|
|
40
|
+
referrerPolicy?: string;
|
|
41
|
+
/** Permissions-Policy value. Default restricts camera, microphone, geolocation */
|
|
42
|
+
permissionsPolicy?: string;
|
|
43
|
+
/** X-DNS-Prefetch-Control. Default: true (on) */
|
|
44
|
+
dnsPrefetchControl?: boolean;
|
|
45
|
+
/** Additional custom headers */
|
|
46
|
+
customHeaders?: Record<string, string>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export { DEFAULT_FRAME_ANCESTORS as D, type SecurityHeadersConfig as S };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default security headers applied by site-kit middleware.
|
|
3
|
+
*
|
|
4
|
+
* These match industry best practices and are the same headers
|
|
5
|
+
* recommended by Next.js documentation. All are opt-out.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Single source of truth for who may frame a site-kit site.
|
|
9
|
+
*
|
|
10
|
+
* Upforge showcases live client work inside iframes on its portfolio /
|
|
11
|
+
* area pages, so every managed marketing site has to be embeddable from
|
|
12
|
+
* upforge.io. `X-Frame-Options` cannot express an allowlist (`ALLOW-FROM`
|
|
13
|
+
* is dead and ignored by every current browser), so the CSP
|
|
14
|
+
* `frame-ancestors` directive is the only way to say "these origins and
|
|
15
|
+
* nobody else". Everything not listed here is still blocked.
|
|
16
|
+
*
|
|
17
|
+
* Do NOT re-fork this list into individual sites' middleware/next.config —
|
|
18
|
+
* add origins here and let the fleet inherit them.
|
|
19
|
+
*/
|
|
20
|
+
declare const DEFAULT_FRAME_ANCESTORS: string[];
|
|
21
|
+
interface SecurityHeadersConfig {
|
|
22
|
+
/** X-Frame-Options value. false to disable. Default: omitted when
|
|
23
|
+
* `frameAncestors` is active (the two conflict), otherwise 'DENY'. */
|
|
24
|
+
frameOptions?: 'DENY' | 'SAMEORIGIN' | false;
|
|
25
|
+
/**
|
|
26
|
+
* Origins allowed to frame this site, emitted as a CSP `frame-ancestors`
|
|
27
|
+
* directive. Defaults to {@link DEFAULT_FRAME_ANCESTORS} ('self' + upforge.io)
|
|
28
|
+
* so Upforge can showcase the site. Pass an array to extend/replace, or
|
|
29
|
+
* `false` to opt out entirely and fall back to X-Frame-Options.
|
|
30
|
+
*
|
|
31
|
+
* Ignored if a `Content-Security-Policy` is supplied via `customHeaders` —
|
|
32
|
+
* that CSP wins, and must carry its own frame-ancestors directive.
|
|
33
|
+
*/
|
|
34
|
+
frameAncestors?: string[] | false;
|
|
35
|
+
/** X-Content-Type-Options: nosniff. Default: true */
|
|
36
|
+
contentTypeOptions?: boolean;
|
|
37
|
+
/** X-XSS-Protection header. Default: true */
|
|
38
|
+
xssProtection?: boolean;
|
|
39
|
+
/** Referrer-Policy value. Default: 'strict-origin-when-cross-origin' */
|
|
40
|
+
referrerPolicy?: string;
|
|
41
|
+
/** Permissions-Policy value. Default restricts camera, microphone, geolocation */
|
|
42
|
+
permissionsPolicy?: string;
|
|
43
|
+
/** X-DNS-Prefetch-Control. Default: true (on) */
|
|
44
|
+
dnsPrefetchControl?: boolean;
|
|
45
|
+
/** Additional custom headers */
|
|
46
|
+
customHeaders?: Record<string, string>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export { DEFAULT_FRAME_ANCESTORS as D, type SecurityHeadersConfig as S };
|
package/dist/seo/client.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkTFU6J77X_js = require('../chunk-TFU6J77X.js');
|
|
5
5
|
require('../chunk-JEOKDUPQ.js');
|
|
6
|
-
require('../chunk-
|
|
7
|
-
require('../chunk-
|
|
8
|
-
require('../chunk-
|
|
6
|
+
require('../chunk-GPXUJQFX.js');
|
|
7
|
+
require('../chunk-XMKZXFVX.js');
|
|
8
|
+
require('../chunk-J4RBHTWC.js');
|
|
9
9
|
require('../chunk-ZSMWDLMK.js');
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
Object.defineProperty(exports, "SitemapSync", {
|
|
14
14
|
enumerable: true,
|
|
15
|
-
get: function () { return
|
|
15
|
+
get: function () { return chunkTFU6J77X_js.SitemapSync; }
|
|
16
16
|
});
|
|
17
17
|
//# sourceMappingURL=client.js.map
|
|
18
18
|
//# sourceMappingURL=client.js.map
|
package/dist/seo/client.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
export { SitemapSync } from '../chunk-
|
|
2
|
+
export { SitemapSync } from '../chunk-CDW6LDLH.mjs';
|
|
3
3
|
import '../chunk-QJU6HBSK.mjs';
|
|
4
|
-
import '../chunk-
|
|
5
|
-
import '../chunk-
|
|
6
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-HJTAHRR3.mjs';
|
|
5
|
+
import '../chunk-PUZ6XJ2L.mjs';
|
|
6
|
+
import '../chunk-M2SHY2FQ.mjs';
|
|
7
7
|
import '../chunk-4XPGGLVP.mjs';
|
|
8
8
|
//# sourceMappingURL=client.mjs.map
|
|
9
9
|
//# sourceMappingURL=client.mjs.map
|
package/dist/seo/index.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunkDV2LJYFD_js = require('../chunk-DV2LJYFD.js');
|
|
4
|
-
var
|
|
4
|
+
var chunkH6AU3WKF_js = require('../chunk-H6AU3WKF.js');
|
|
5
5
|
var chunkJ7QI3GDX_js = require('../chunk-J7QI3GDX.js');
|
|
6
|
-
var
|
|
6
|
+
var chunkTFU6J77X_js = require('../chunk-TFU6J77X.js');
|
|
7
7
|
var chunkVMVEL4WU_js = require('../chunk-VMVEL4WU.js');
|
|
8
8
|
var chunkQCZBXG7G_js = require('../chunk-QCZBXG7G.js');
|
|
9
9
|
require('../chunk-QPIKPWAZ.js');
|
|
10
10
|
require('../chunk-JEOKDUPQ.js');
|
|
11
|
-
require('../chunk-
|
|
12
|
-
require('../chunk-
|
|
13
|
-
require('../chunk-
|
|
11
|
+
require('../chunk-GPXUJQFX.js');
|
|
12
|
+
require('../chunk-XMKZXFVX.js');
|
|
13
|
+
require('../chunk-J4RBHTWC.js');
|
|
14
14
|
require('../chunk-ZSMWDLMK.js');
|
|
15
15
|
var react = require('react');
|
|
16
16
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -118,7 +118,7 @@ async function LLMSchemaAsync({
|
|
|
118
118
|
}) {
|
|
119
119
|
const { page: pageData, project } = await chunkQCZBXG7G_js.getSEOPageData(path);
|
|
120
120
|
const raw = pageData?.managed_llm_schema;
|
|
121
|
-
const picked =
|
|
121
|
+
const picked = chunkH6AU3WKF_js.pickManagedLlmSchemaForJsonLd(raw);
|
|
122
122
|
if (!picked) {
|
|
123
123
|
return null;
|
|
124
124
|
}
|
|
@@ -687,7 +687,7 @@ Object.defineProperty(exports, "ManagedScripts", {
|
|
|
687
687
|
});
|
|
688
688
|
Object.defineProperty(exports, "SitemapSync", {
|
|
689
689
|
enumerable: true,
|
|
690
|
-
get: function () { return
|
|
690
|
+
get: function () { return chunkTFU6J77X_js.SitemapSync; }
|
|
691
691
|
});
|
|
692
692
|
Object.defineProperty(exports, "generateSitemap", {
|
|
693
693
|
enumerable: true,
|
package/dist/seo/index.mjs
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
export { ManagedNoScripts, ManagedScripts } from '../chunk-6PJTLBRR.mjs';
|
|
2
|
-
import { pickManagedLlmSchemaForJsonLd } from '../chunk-
|
|
2
|
+
import { pickManagedLlmSchemaForJsonLd } from '../chunk-PENNTSJE.mjs';
|
|
3
3
|
import { safeJsonLd } from '../chunk-662YHKWW.mjs';
|
|
4
|
-
export { SitemapSync } from '../chunk-
|
|
4
|
+
export { SitemapSync } from '../chunk-CDW6LDLH.mjs';
|
|
5
5
|
import { getManagedMetadata } from '../chunk-QGV7FEUI.mjs';
|
|
6
6
|
export { generateSitemap, getABVariant, getManagedMetadata, getManagedMetadataWithAB, getRedirect, getRobotsDirective, isIndexable } from '../chunk-QGV7FEUI.mjs';
|
|
7
7
|
import { getContentBlock, getSchemaMarkups, getSEOPageData, getEntityEnhancedSchema, getFAQData, getInternalLinks, getEntities } from '../chunk-2CHOHLB7.mjs';
|
|
8
8
|
export { getABTest, getContentBlock, getEntities, getEntityEnhancedSchema, getFAQData, getInternalLinks, getManagedScripts, getPrimaryEntity, getRedirectData, getRobotsData, getSEOPageData, getSchemaMarkups, getSitemapEntries, getVisibilityScore, getVisibilitySummary, recordABImpression, registerSitemap } from '../chunk-2CHOHLB7.mjs';
|
|
9
9
|
import '../chunk-UDBUK5ZJ.mjs';
|
|
10
10
|
import '../chunk-QJU6HBSK.mjs';
|
|
11
|
-
import '../chunk-
|
|
12
|
-
import '../chunk-
|
|
13
|
-
import '../chunk-
|
|
11
|
+
import '../chunk-HJTAHRR3.mjs';
|
|
12
|
+
import '../chunk-PUZ6XJ2L.mjs';
|
|
13
|
+
import '../chunk-M2SHY2FQ.mjs';
|
|
14
14
|
import '../chunk-4XPGGLVP.mjs';
|
|
15
15
|
import { cache, Suspense } from 'react';
|
|
16
16
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
package/dist/server/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkSUWDZOPH_js = require('../chunk-SUWDZOPH.js');
|
|
4
4
|
var chunkQPIKPWAZ_js = require('../chunk-QPIKPWAZ.js');
|
|
5
|
-
require('../chunk-
|
|
5
|
+
require('../chunk-J4RBHTWC.js');
|
|
6
6
|
require('../chunk-ZSMWDLMK.js');
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
Object.defineProperty(exports, "resolveClientCredential", {
|
|
11
11
|
enumerable: true,
|
|
12
|
-
get: function () { return
|
|
12
|
+
get: function () { return chunkSUWDZOPH_js.resolveClientCredential; }
|
|
13
13
|
});
|
|
14
14
|
Object.defineProperty(exports, "requireServerApiConfig", {
|
|
15
15
|
enumerable: true,
|
package/dist/server/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { resolveClientCredential } from '../chunk-
|
|
1
|
+
export { resolveClientCredential } from '../chunk-J6MMNTYG.mjs';
|
|
2
2
|
export { requireServerApiConfig, resolveApiOrigin, resolveServerApiConfig, serverApiFetch } from '../chunk-UDBUK5ZJ.mjs';
|
|
3
|
-
import '../chunk-
|
|
3
|
+
import '../chunk-M2SHY2FQ.mjs';
|
|
4
4
|
import '../chunk-4XPGGLVP.mjs';
|
|
5
5
|
//# sourceMappingURL=index.mjs.map
|
|
6
6
|
//# sourceMappingURL=index.mjs.map
|
package/dist/signal/index.js
CHANGED
|
@@ -1,47 +1,47 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
5
|
-
var
|
|
4
|
+
var chunkILCDV3MM_js = require('../chunk-ILCDV3MM.js');
|
|
5
|
+
var chunkHNHZLRB6_js = require('../chunk-HNHZLRB6.js');
|
|
6
6
|
require('../chunk-ZSMWDLMK.js');
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
Object.defineProperty(exports, "ExperimentConversion", {
|
|
11
11
|
enumerable: true,
|
|
12
|
-
get: function () { return
|
|
12
|
+
get: function () { return chunkILCDV3MM_js.ExperimentConversion; }
|
|
13
13
|
});
|
|
14
14
|
Object.defineProperty(exports, "SignalExperiment", {
|
|
15
15
|
enumerable: true,
|
|
16
|
-
get: function () { return
|
|
16
|
+
get: function () { return chunkILCDV3MM_js.SignalExperiment; }
|
|
17
17
|
});
|
|
18
18
|
Object.defineProperty(exports, "useExperimentVariant", {
|
|
19
19
|
enumerable: true,
|
|
20
|
-
get: function () { return
|
|
20
|
+
get: function () { return chunkILCDV3MM_js.useExperimentVariant; }
|
|
21
21
|
});
|
|
22
22
|
Object.defineProperty(exports, "SignalBridge", {
|
|
23
23
|
enumerable: true,
|
|
24
|
-
get: function () { return
|
|
24
|
+
get: function () { return chunkHNHZLRB6_js.SignalBridge; }
|
|
25
25
|
});
|
|
26
26
|
Object.defineProperty(exports, "useSignal", {
|
|
27
27
|
enumerable: true,
|
|
28
|
-
get: function () { return
|
|
28
|
+
get: function () { return chunkHNHZLRB6_js.useSignal; }
|
|
29
29
|
});
|
|
30
30
|
Object.defineProperty(exports, "useSignalConfig", {
|
|
31
31
|
enumerable: true,
|
|
32
|
-
get: function () { return
|
|
32
|
+
get: function () { return chunkHNHZLRB6_js.useSignalConfig; }
|
|
33
33
|
});
|
|
34
34
|
Object.defineProperty(exports, "useSignalEvent", {
|
|
35
35
|
enumerable: true,
|
|
36
|
-
get: function () { return
|
|
36
|
+
get: function () { return chunkHNHZLRB6_js.useSignalEvent; }
|
|
37
37
|
});
|
|
38
38
|
Object.defineProperty(exports, "useSignalExperiment", {
|
|
39
39
|
enumerable: true,
|
|
40
|
-
get: function () { return
|
|
40
|
+
get: function () { return chunkHNHZLRB6_js.useSignalExperiment; }
|
|
41
41
|
});
|
|
42
42
|
Object.defineProperty(exports, "useSignalOutcome", {
|
|
43
43
|
enumerable: true,
|
|
44
|
-
get: function () { return
|
|
44
|
+
get: function () { return chunkHNHZLRB6_js.useSignalOutcome; }
|
|
45
45
|
});
|
|
46
46
|
//# sourceMappingURL=index.js.map
|
|
47
47
|
//# sourceMappingURL=index.js.map
|
package/dist/signal/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
export { ExperimentConversion, SignalExperiment, useExperimentVariant } from '../chunk-
|
|
3
|
-
export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome } from '../chunk-
|
|
2
|
+
export { ExperimentConversion, SignalExperiment, useExperimentVariant } from '../chunk-IVJLQJEP.mjs';
|
|
3
|
+
export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome } from '../chunk-75PY4H43.mjs';
|
|
4
4
|
import '../chunk-4XPGGLVP.mjs';
|
|
5
5
|
//# sourceMappingURL=index.mjs.map
|
|
6
6
|
//# sourceMappingURL=index.mjs.map
|
package/dist/sitemap/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { L as LLMsDataResponse } from '../
|
|
1
|
+
import { L as LLMsDataResponse, W as WriteLLMsTxtOptions } from '../writeLLMsTxt-SpMdyHQT.mjs';
|
|
2
2
|
import '../llms/contract.mjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -75,6 +75,13 @@ interface SitemapConfig {
|
|
|
75
75
|
getLocalData?: () => Promise<LLMsDataResponse | null>;
|
|
76
76
|
/** Pass-through to GET /api/public/llms/txt?publicSummaryOnly=true and local llms fallback */
|
|
77
77
|
llmsPublicSummaryOnly?: boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Site-authored sections appended to the build-time llms-full.txt (see
|
|
80
|
+
* WriteLLMsTxtOptions.customSections). Use with formatSourcedFactsSection
|
|
81
|
+
* to publish the site's verified citation registry as a "Sourced facts"
|
|
82
|
+
* section AI answer engines can quote with attribution.
|
|
83
|
+
*/
|
|
84
|
+
llmsCustomSections?: WriteLLMsTxtOptions['customSections'];
|
|
78
85
|
/** Use Signal AI visibility scores to compute page priority (40% visibility + 30% depth + 30% base) */
|
|
79
86
|
intelligentPriority?: boolean;
|
|
80
87
|
/** When true, append `/llms.txt` to sitemap (low priority). Default false. */
|
package/dist/sitemap/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { L as LLMsDataResponse } from '../
|
|
1
|
+
import { L as LLMsDataResponse, W as WriteLLMsTxtOptions } from '../writeLLMsTxt-BFaNr4re.js';
|
|
2
2
|
import '../llms/contract.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -75,6 +75,13 @@ interface SitemapConfig {
|
|
|
75
75
|
getLocalData?: () => Promise<LLMsDataResponse | null>;
|
|
76
76
|
/** Pass-through to GET /api/public/llms/txt?publicSummaryOnly=true and local llms fallback */
|
|
77
77
|
llmsPublicSummaryOnly?: boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Site-authored sections appended to the build-time llms-full.txt (see
|
|
80
|
+
* WriteLLMsTxtOptions.customSections). Use with formatSourcedFactsSection
|
|
81
|
+
* to publish the site's verified citation registry as a "Sourced facts"
|
|
82
|
+
* section AI answer engines can quote with attribution.
|
|
83
|
+
*/
|
|
84
|
+
llmsCustomSections?: WriteLLMsTxtOptions['customSections'];
|
|
78
85
|
/** Use Signal AI visibility scores to compute page priority (40% visibility + 30% depth + 30% base) */
|
|
79
86
|
intelligentPriority?: boolean;
|
|
80
87
|
/** When true, append `/llms.txt` to sitemap (low priority). Default false. */
|
package/dist/sitemap/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkXMBYDIV6_js = require('../chunk-XMBYDIV6.js');
|
|
4
4
|
var chunkJP5WGL75_js = require('../chunk-JP5WGL75.js');
|
|
5
|
-
require('../chunk-
|
|
5
|
+
require('../chunk-H6AU3WKF.js');
|
|
6
6
|
var chunkJEOKDUPQ_js = require('../chunk-JEOKDUPQ.js');
|
|
7
7
|
require('../chunk-ZSMWDLMK.js');
|
|
8
8
|
var fs = require('fs');
|
|
@@ -477,13 +477,14 @@ function createSitemap(config) {
|
|
|
477
477
|
}
|
|
478
478
|
if (config.optimizedLLMsTxt !== false) {
|
|
479
479
|
try {
|
|
480
|
-
const writeResult = await
|
|
480
|
+
const writeResult = await chunkXMBYDIV6_js.writeLLMsTxtToPublic({
|
|
481
481
|
apiUrl,
|
|
482
482
|
apiKey,
|
|
483
483
|
full: config.optimizedLLMsFullTxt ?? false,
|
|
484
484
|
fallbackToLocal: true,
|
|
485
485
|
getLocalData: config.getLocalData,
|
|
486
|
-
publicSummaryOnly: config.llmsPublicSummaryOnly
|
|
486
|
+
publicSummaryOnly: config.llmsPublicSummaryOnly,
|
|
487
|
+
customSections: config.llmsCustomSections
|
|
487
488
|
});
|
|
488
489
|
if (writeResult.success) {
|
|
489
490
|
console.log(`[site-kit] Wrote llms.txt (optimized=${writeResult.optimized})`);
|