@uptrademedia/site-kit 1.0.5 → 1.0.7
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/dist/analytics/index.js +7 -7
- package/dist/analytics/index.mjs +3 -3
- package/dist/api-QUIPJJCX.js +77 -0
- package/dist/api-QUIPJJCX.js.map +1 -0
- package/dist/api-V3BA5PMX.mjs +4 -0
- package/dist/api-V3BA5PMX.mjs.map +1 -0
- package/dist/blog/index.d.mts +2 -2
- package/dist/blog/index.d.ts +2 -2
- package/dist/blog/index.js +40 -6
- package/dist/blog/index.js.map +1 -1
- package/dist/blog/index.mjs +40 -6
- package/dist/blog/index.mjs.map +1 -1
- package/dist/blog/server.d.mts +3 -2
- package/dist/blog/server.d.ts +3 -2
- package/dist/blog/server.js +13 -6
- package/dist/blog/server.js.map +1 -1
- package/dist/blog/server.mjs +13 -6
- package/dist/blog/server.mjs.map +1 -1
- package/dist/{chunk-FKVJOT2F.mjs → chunk-42EXHJTC.mjs} +196 -7
- package/dist/chunk-42EXHJTC.mjs.map +1 -0
- package/dist/{scanner-AZV5I6US.mjs → chunk-44OMJFCG.mjs} +354 -14
- package/dist/chunk-44OMJFCG.mjs.map +1 -0
- package/dist/chunk-4TGJYNHV.js +981 -0
- package/dist/chunk-4TGJYNHV.js.map +1 -0
- package/dist/chunk-4XPGGLVP.mjs +53 -0
- package/dist/{chunk-NYKRE2FL.mjs.map → chunk-4XPGGLVP.mjs.map} +1 -1
- package/dist/{generators-TO2FKJR6.mjs → chunk-6ONUXZDO.mjs} +26 -9
- package/dist/chunk-6ONUXZDO.mjs.map +1 -0
- package/dist/chunk-CG53ASWX.mjs +729 -0
- package/dist/chunk-CG53ASWX.mjs.map +1 -0
- package/dist/{scanner-ETJAMIT7.js → chunk-DERI27QC.js} +448 -102
- package/dist/chunk-DERI27QC.js.map +1 -0
- package/dist/chunk-DYM5ML2V.mjs +1518 -0
- package/dist/chunk-DYM5ML2V.mjs.map +1 -0
- package/dist/chunk-FLZZOX44.js +1526 -0
- package/dist/chunk-FLZZOX44.js.map +1 -0
- package/dist/{chunk-7H6I3ECV.mjs → chunk-FQVGK746.mjs} +63 -3
- package/dist/chunk-FQVGK746.mjs.map +1 -0
- package/dist/{chunk-GQ6ZOU2N.mjs → chunk-JGQPAXTL.mjs} +4 -4
- package/dist/{chunk-GQ6ZOU2N.mjs.map → chunk-JGQPAXTL.mjs.map} +1 -1
- package/dist/{chunk-V3F5J6CV.js → chunk-JUEVN4Q4.js} +196 -7
- package/dist/chunk-JUEVN4Q4.js.map +1 -0
- package/dist/chunk-KKMGTT7F.mjs +968 -0
- package/dist/chunk-KKMGTT7F.mjs.map +1 -0
- package/dist/{chunk-XQJX252G.mjs → chunk-MB3WR5KJ.mjs} +28 -18
- package/dist/chunk-MB3WR5KJ.mjs.map +1 -0
- package/dist/{chunk-2IHTEKHU.mjs → chunk-QD5CN2OI.mjs} +16 -7
- package/dist/chunk-QD5CN2OI.mjs.map +1 -0
- package/dist/{chunk-SBVEYCSV.js → chunk-QQB4FO4Q.js} +7 -7
- package/dist/{chunk-SBVEYCSV.js.map → chunk-QQB4FO4Q.js.map} +1 -1
- package/dist/{generators-YZWIGHCO.js → chunk-S2GXR5HY.js} +26 -9
- package/dist/chunk-S2GXR5HY.js.map +1 -0
- package/dist/{chunk-O2OHHBUD.js → chunk-TDK7DLCH.js} +30 -20
- package/dist/chunk-TDK7DLCH.js.map +1 -0
- package/dist/{chunk-QP5NCO2E.js → chunk-VDI7KYME.js} +67 -2
- package/dist/chunk-VDI7KYME.js.map +1 -0
- package/dist/chunk-VOR53RUR.js +753 -0
- package/dist/chunk-VOR53RUR.js.map +1 -0
- package/dist/{chunk-GAJLEDRD.js → chunk-ZKJ7JKFV.js} +16 -7
- package/dist/chunk-ZKJ7JKFV.js.map +1 -0
- package/dist/chunk-ZSMWDLMK.js +63 -0
- package/dist/{chunk-EQCVQC35.js.map → chunk-ZSMWDLMK.js.map} +1 -1
- package/dist/cli/index.js +37269 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/index.mjs +37233 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/commerce/index.js +1 -1
- package/dist/commerce/index.mjs +1 -1
- package/dist/commerce/server.d.mts +12 -3
- package/dist/commerce/server.d.ts +12 -3
- package/dist/commerce/server.js +71 -70
- package/dist/commerce/server.js.map +1 -1
- package/dist/commerce/server.mjs +71 -70
- package/dist/commerce/server.mjs.map +1 -1
- package/dist/engage/index.d.mts +6 -4
- package/dist/engage/index.d.ts +6 -4
- package/dist/engage/index.js +8 -4
- package/dist/engage/index.mjs +2 -2
- package/dist/forms/index.js +1 -1
- package/dist/forms/index.mjs +1 -1
- package/dist/generators-5EU4PTVF.js +33 -0
- package/dist/generators-5EU4PTVF.js.map +1 -0
- package/dist/generators-TYPILCWD.mjs +4 -0
- package/dist/generators-TYPILCWD.mjs.map +1 -0
- package/dist/images/index.js +11 -11
- package/dist/images/index.mjs +4 -4
- package/dist/index.d.mts +154 -5
- package/dist/index.d.ts +154 -5
- package/dist/index.js +940 -24
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +819 -7
- package/dist/index.mjs.map +1 -1
- package/dist/llms/index.d.mts +657 -0
- package/dist/llms/index.d.ts +657 -0
- package/dist/llms/index.js +101 -0
- package/dist/llms/index.js.map +1 -0
- package/dist/llms/index.mjs +4 -0
- package/dist/llms/index.mjs.map +1 -0
- package/dist/migrator-ARLHUNB3.mjs +4 -0
- package/dist/migrator-ARLHUNB3.mjs.map +1 -0
- package/dist/migrator-VZLBH3VY.js +37 -0
- package/dist/migrator-VZLBH3VY.js.map +1 -0
- package/dist/redirects/index.js +1 -1
- package/dist/redirects/index.mjs +1 -1
- package/dist/reputation/index.js +1 -1
- package/dist/reputation/index.mjs +1 -1
- package/dist/{routing-BWjUF7lp.d.ts → routing-CF91y6NO.d.ts} +1 -1
- package/dist/{routing-CgmRi9tD.d.mts → routing-CIOFpFCB.d.mts} +1 -1
- package/dist/scanner-7ZMUM2P5.mjs +4 -0
- package/dist/scanner-7ZMUM2P5.mjs.map +1 -0
- package/dist/scanner-OY7UF3WA.js +53 -0
- package/dist/scanner-OY7UF3WA.js.map +1 -0
- package/dist/seo/index.d.mts +267 -7
- package/dist/seo/index.d.ts +267 -7
- package/dist/seo/index.js +432 -24
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/index.mjs +400 -11
- package/dist/seo/index.mjs.map +1 -1
- package/dist/seo/server.d.mts +11 -4
- package/dist/seo/server.d.ts +11 -4
- package/dist/seo/server.js +17 -17
- package/dist/seo/server.mjs +3 -3
- package/dist/setup/client.js +1 -1
- package/dist/setup/client.mjs +1 -1
- package/dist/setup/index.js +3 -3
- package/dist/setup/index.mjs +2 -2
- package/dist/setup/server.js +3 -3
- package/dist/setup/server.mjs +2 -2
- package/dist/sitemap/index.js +2 -2
- package/dist/sitemap/index.js.map +1 -1
- package/dist/sitemap/index.mjs +2 -2
- package/dist/sitemap/index.mjs.map +1 -1
- package/dist/{types-C0pJGfbH.d.mts → types-D6FHAVWX.d.mts} +99 -3
- package/dist/{types-C0pJGfbH.d.ts → types-D6FHAVWX.d.ts} +99 -3
- package/dist/{types-BN4OwtCO.d.mts → types-DI0jnhjJ.d.mts} +2 -0
- package/dist/{types-BN4OwtCO.d.ts → types-DI0jnhjJ.d.ts} +2 -0
- package/dist/{types-BmzutFwy.d.ts → types-j8X4vUhB.d.mts} +19 -2
- package/dist/{types-BmzutFwy.d.mts → types-j8X4vUhB.d.ts} +19 -2
- package/dist/{web-vitals-BH55V7EJ.js → web-vitals-444RLW3B.js} +11 -11
- package/dist/{web-vitals-BH55V7EJ.js.map → web-vitals-444RLW3B.js.map} +1 -1
- package/dist/{web-vitals-RJYPWAR3.mjs → web-vitals-KPICZIEF.mjs} +3 -3
- package/dist/{web-vitals-RJYPWAR3.mjs.map → web-vitals-KPICZIEF.mjs.map} +1 -1
- package/package.json +9 -2
- package/dist/api-N35S3EES.js +0 -57
- package/dist/api-N35S3EES.js.map +0 -1
- package/dist/api-SYBTK7Z7.mjs +0 -4
- package/dist/api-SYBTK7Z7.mjs.map +0 -1
- package/dist/chunk-2IHTEKHU.mjs.map +0 -1
- package/dist/chunk-7H6I3ECV.mjs.map +0 -1
- package/dist/chunk-BGJLOJ7T.mjs +0 -605
- package/dist/chunk-BGJLOJ7T.mjs.map +0 -1
- package/dist/chunk-EQCVQC35.js +0 -35
- package/dist/chunk-FKVJOT2F.mjs.map +0 -1
- package/dist/chunk-GAJLEDRD.js.map +0 -1
- package/dist/chunk-NYKRE2FL.mjs +0 -31
- package/dist/chunk-O2OHHBUD.js.map +0 -1
- package/dist/chunk-QAYJV4KK.js +0 -608
- package/dist/chunk-QAYJV4KK.js.map +0 -1
- package/dist/chunk-QP5NCO2E.js.map +0 -1
- package/dist/chunk-V3F5J6CV.js.map +0 -1
- package/dist/chunk-XQJX252G.mjs.map +0 -1
- package/dist/generators-TO2FKJR6.mjs.map +0 -1
- package/dist/generators-YZWIGHCO.js.map +0 -1
- package/dist/migrator-V6KS75EA.mjs +0 -265
- package/dist/migrator-V6KS75EA.mjs.map +0 -1
- package/dist/migrator-XKM7YQCY.js +0 -272
- package/dist/migrator-XKM7YQCY.js.map +0 -1
- package/dist/scanner-AZV5I6US.mjs.map +0 -1
- package/dist/scanner-ETJAMIT7.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/sitemap/index.ts"],"names":["join","existsSync","readdirSync","statSync"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @uptrade/site-kit - Sitemap Generator\n * \n * Automatically generates sitemap.xml from Next.js app directory structure.\n * Works at build time to discover all pages and sync them to Portal API.\n * \n * @example\n * ```ts\n * // app/sitemap.ts\n * import { createSitemap } from '@uptrade/site-kit/sitemap'\n * \n * export default createSitemap({\n * baseUrl: 'https://example.com',\n * // Optional: exclude patterns\n * exclude: ['/admin/*', '/api/*'],\n * // Optional: additional dynamic routes\n * additionalPaths: async () => [\n * { path: '/blog/post-1', priority: 0.7 },\n * ]\n * })\n * ```\n */\n\nimport { readdirSync, statSync, existsSync } from 'fs'\nimport { join, relative } from 'path'\n\nexport interface SitemapEntry {\n url: string\n lastModified?: Date | string\n changeFrequency?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n priority?: number\n}\n\nexport interface SitemapConfig {\n /** Base URL for the site (required) */\n baseUrl: string\n /** Glob patterns to exclude (e.g., ['/admin/*', '/api/*']) */\n exclude?: string[]\n /** Default priority for pages */\n defaultPriority?: number\n /** Default change frequency */\n defaultChangeFrequency?: SitemapEntry['changeFrequency']\n /** Additional paths to include (for dynamic routes) */\n additionalPaths?: () => Promise<Array<{ path: string; priority?: number; changeFrequency?: SitemapEntry['changeFrequency'] }>>\n /** Priority overrides by path pattern */\n priorities?: Record<string, number>\n /** Portal API URL for syncing (defaults to NEXT_PUBLIC_UPTRADE_API_URL or https://api.uptrademedia.com) */\n apiUrl?: string\n /** Portal API key for syncing (defaults to NEXT_PUBLIC_UPTRADE_API_KEY) */\n apiKey?: string\n /** Disable auto-sync to Portal API */\n disableSync?: boolean\n}\n\n// Route groups and special folders to ignore\nconst IGNORED_FOLDERS = [\n 'api',\n 'admin',\n '_uptrade',\n '%5Fuptrade', // URL-encoded _uptrade\n 'uptrade-setup',\n 'offline',\n]\n\n// File patterns that indicate a page\nconst PAGE_FILES = ['page.tsx', 'page.jsx', 'page.js', 'page.ts']\n\n/**\n * Check if a path matches any exclude pattern\n */\nfunction isExcluded(path: string, patterns: string[]): boolean {\n return patterns.some(pattern => {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n return path.startsWith(prefix)\n }\n if (pattern.endsWith('*')) {\n const prefix = pattern.slice(0, -1)\n return path.startsWith(prefix)\n }\n return path === pattern\n })\n}\n\n/**\n * Recursively discover pages from the app directory\n */\nfunction discoverPages(\n appDir: string,\n currentPath: string = '',\n pages: string[] = []\n): string[] {\n const fullPath = join(appDir, currentPath)\n \n if (!existsSync(fullPath)) {\n return pages\n }\n\n const entries = readdirSync(fullPath)\n \n // Check if this directory has a page file\n const hasPage = entries.some(entry => PAGE_FILES.includes(entry))\n \n if (hasPage) {\n // Convert directory path to URL path\n let urlPath = '/' + currentPath\n \n // Handle route groups (parentheses) - remove them from URL\n urlPath = urlPath.replace(/\\/\\([^)]+\\)/g, '')\n \n // Clean up path\n urlPath = urlPath.replace(/\\/+/g, '/') // Remove double slashes\n if (urlPath !== '/' && urlPath.endsWith('/')) {\n urlPath = urlPath.slice(0, -1) // Remove trailing slash\n }\n \n pages.push(urlPath)\n }\n \n // Recurse into subdirectories\n for (const entry of entries) {\n const entryPath = join(fullPath, entry)\n const stat = statSync(entryPath)\n \n if (stat.isDirectory()) {\n // Skip ignored folders\n const folderName = entry.toLowerCase()\n if (IGNORED_FOLDERS.some(ignored => folderName.includes(ignored))) {\n continue\n }\n \n // Skip dynamic route segments for now (would need runtime data)\n if (entry.startsWith('[') && entry.endsWith(']')) {\n continue\n }\n \n // Skip private folders\n if (entry.startsWith('_')) {\n continue\n }\n \n discoverPages(appDir, join(currentPath, entry), pages)\n }\n }\n \n return pages\n}\n\n/**\n * Find the app directory from the current working directory\n */\nfunction findAppDir(): string {\n const cwd = process.cwd()\n \n // Try common locations\n const candidates = [\n join(cwd, 'app'),\n join(cwd, 'src', 'app'),\n ]\n \n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate\n }\n }\n \n throw new Error(\n '[site-kit] Could not find app directory. Ensure you have an \"app\" or \"src/app\" folder.'\n )\n}\n\n/**\n * Get priority for a path based on config\n */\nfunction getPriority(path: string, config: SitemapConfig): number {\n // Check priority overrides\n if (config.priorities) {\n for (const [pattern, priority] of Object.entries(config.priorities)) {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n if (path.startsWith(prefix)) return priority\n } else if (path === pattern) {\n return priority\n }\n }\n }\n \n // Home page gets highest priority\n if (path === '/') return 1.0\n \n // Shallow pages get higher priority\n const depth = path.split('/').filter(Boolean).length\n if (depth === 1) return 0.8\n if (depth === 2) return 0.6\n \n return config.defaultPriority ?? 0.5\n}\n\n/**\n * Sync sitemap entries to Portal API\n * Called automatically by createSitemap at build time\n */\nexport async function syncSitemapToPortal(\n entries: SitemapEntry[],\n apiUrl: string,\n apiKey: string\n): Promise<{ success: boolean; created: number; updated: number }> {\n if (!apiKey) {\n console.warn('[site-kit] No API key provided, skipping sitemap sync')\n return { success: false, created: 0, updated: 0 }\n }\n \n const normalizedEntries = entries.map(entry => {\n let path: string\n try {\n const url = new URL(entry.url)\n path = url.pathname\n } catch {\n path = entry.url.startsWith('/') ? entry.url : `/${entry.url}`\n }\n \n return {\n path,\n priority: entry.priority,\n changefreq: entry.changeFrequency,\n }\n })\n \n try {\n const response = await fetch(`${apiUrl}/api/public/seo/register-sitemap`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ entries: normalizedEntries }),\n })\n \n if (!response.ok) {\n console.error('[site-kit] Sitemap sync failed:', response.status, await response.text())\n return { success: false, created: 0, updated: 0 }\n }\n \n const result = await response.json()\n \n return {\n success: true,\n created: result.created || 0,\n updated: result.updated || 0,\n }\n } catch (error) {\n console.error('[site-kit] Sitemap sync error:', error)\n return { success: false, created: 0, updated: 0 }\n }\n}\n\n/**\n * Create a sitemap generator function for Next.js\n * Automatically syncs to Portal API at build time.\n * \n * @example\n * ```ts\n * // app/sitemap.ts\n * import { createSitemap } from '@uptrade/site-kit/sitemap'\n * \n * export default createSitemap({\n * baseUrl: 'https://example.com'\n * })\n * ```\n */\nexport function createSitemap(config: SitemapConfig): () => SitemapEntry[] | Promise<SitemapEntry[]> {\n return async () => {\n const { baseUrl, exclude = [], defaultChangeFrequency = 'weekly' } = config\n \n // Normalize base URL\n const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl\n \n // Default exclusions\n const allExclusions = [\n '/api/*',\n '/admin/*',\n '/_uptrade/*',\n '/uptrade-setup/*',\n '/offline/*',\n ...exclude,\n ]\n \n // Discover pages from app directory\n let pages: string[] = []\n try {\n const appDir = findAppDir()\n pages = discoverPages(appDir)\n } catch (error) {\n console.warn('[site-kit] Failed to discover pages:', error)\n // Fall back to just the home page\n pages = ['/']\n }\n \n // Filter out excluded pages\n pages = pages.filter(page => !isExcluded(page, allExclusions))\n \n // Build sitemap entries\n const entries: SitemapEntry[] = pages.map(path => ({\n url: `${normalizedBaseUrl}${path}`,\n lastModified: new Date(),\n changeFrequency: defaultChangeFrequency,\n priority: getPriority(path, config),\n }))\n \n // Add additional dynamic paths if provided\n if (config.additionalPaths) {\n try {\n const additional = await config.additionalPaths()\n for (const item of additional) {\n if (!isExcluded(item.path, allExclusions)) {\n entries.push({\n url: `${normalizedBaseUrl}${item.path}`,\n lastModified: new Date(),\n changeFrequency: item.changeFrequency ?? defaultChangeFrequency,\n priority: item.priority ?? getPriority(item.path, config),\n })\n }\n }\n } catch (error) {\n console.warn('[site-kit] Failed to get additional paths:', error)\n }\n }\n \n // Sort by priority descending\n entries.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n \n console.log(`[site-kit] Generated sitemap with ${entries.length} pages`)\n \n // Auto-sync to Portal API at build time (unless disabled)\n if (!config.disableSync) {\n const apiUrl = config.apiUrl || process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.uptrademedia.com'\n const apiKey = config.apiKey || process.env.NEXT_PUBLIC_UPTRADE_API_KEY\n \n if (apiKey) {\n // Fire and forget - don't block sitemap generation\n syncSitemapToPortal(entries, apiUrl, apiKey)\n .then(result => {\n if (result.success) {\n console.log(`[site-kit] Synced to Portal API: ${result.created} created, ${result.updated} updated`)\n }\n })\n .catch(err => {\n console.warn('[site-kit] Failed to sync sitemap to Portal API:', err.message)\n })\n } else {\n console.log('[site-kit] No API key found, skipping Portal API sync')\n }\n }\n \n return entries\n }\n}\n\nexport default createSitemap\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/sitemap/index.ts"],"names":["join","existsSync","readdirSync","statSync"],"mappings":";;;;;;;;AAuDA,IAAM,eAAA,GAAkB;AAAA,EACtB,KAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA;AAGA,IAAM,UAAA,GAAa,CAAC,UAAA,EAAY,UAAA,EAAY,WAAW,SAAS,CAAA;AAKhE,SAAS,UAAA,CAAW,MAAc,QAAA,EAA6B;AAC7D,EAAA,OAAO,QAAA,CAAS,KAAK,CAAA,OAAA,KAAW;AAC9B,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1B,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAClC,MAAA,OAAO,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AACzB,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAClC,MAAA,OAAO,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,IAC/B;AACA,IAAA,OAAO,IAAA,KAAS,OAAA;AAAA,EAClB,CAAC,CAAA;AACH;AAKA,SAAS,cACP,MAAA,EACA,WAAA,GAAsB,EAAA,EACtB,KAAA,GAAkB,EAAC,EACT;AACV,EAAA,MAAM,QAAA,GAAWA,SAAA,CAAK,MAAA,EAAQ,WAAW,CAAA;AAEzC,EAAA,IAAI,CAACC,aAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAUC,eAAY,QAAQ,CAAA;AAGpC,EAAA,MAAM,UAAU,OAAA,CAAQ,IAAA,CAAK,WAAS,UAAA,CAAW,QAAA,CAAS,KAAK,CAAC,CAAA;AAEhE,EAAA,IAAI,OAAA,EAAS;AAEX,IAAA,IAAI,UAAU,GAAA,GAAM,WAAA;AAGpB,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA;AAG5C,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AACrC,IAAA,IAAI,OAAA,KAAY,GAAA,IAAO,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAC5C,MAAA,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,IAC/B;AAEA,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,EACpB;AAGA,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,SAAA,GAAYF,SAAA,CAAK,QAAA,EAAU,KAAK,CAAA;AACtC,IAAA,MAAM,IAAA,GAAOG,YAAS,SAAS,CAAA;AAE/B,IAAA,IAAI,IAAA,CAAK,aAAY,EAAG;AAEtB,MAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AACrC,MAAA,IAAI,gBAAgB,IAAA,CAAK,CAAA,OAAA,KAAW,WAAW,QAAA,CAAS,OAAO,CAAC,CAAA,EAAG;AACjE,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,MAAM,UAAA,CAAW,GAAG,KAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAChD,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,QAAA;AAAA,MACF;AAEA,MAAA,aAAA,CAAc,MAAA,EAAQH,SAAA,CAAK,WAAA,EAAa,KAAK,GAAG,KAAK,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,UAAA,GAAqB;AAC5B,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AAGxB,EAAA,MAAM,UAAA,GAAa;AAAA,IACjBA,SAAA,CAAK,KAAK,KAAK,CAAA;AAAA,IACfA,SAAA,CAAK,GAAA,EAAK,KAAA,EAAO,KAAK;AAAA,GACxB;AAEA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,IAAIC,aAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GACF;AACF;AAKA,SAAS,WAAA,CAAY,MAAc,MAAA,EAA+B;AAEhE,EAAA,IAAI,OAAO,UAAA,EAAY;AACrB,IAAA,KAAA,MAAW,CAAC,SAAS,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AACnE,MAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1B,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAClC,QAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG,OAAO,QAAA;AAAA,MACtC,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,KAAS,KAAK,OAAO,CAAA;AAGzB,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA;AAC9C,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,GAAA;AACxB,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,GAAA;AAExB,EAAA,OAAO,OAAO,eAAA,IAAmB,GAAA;AACnC;AAMA,eAAsB,mBAAA,CACpB,OAAA,EACA,MAAA,EACA,MAAA,EACiE;AACjE,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAA,CAAQ,KAAK,uDAAuD,CAAA;AACpE,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,EAClD;AAEA,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,GAAA,CAAI,CAAA,KAAA,KAAS;AAC7C,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,IAAA,GAAO,GAAA,CAAI,QAAA;AAAA,IACb,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,GAAO,KAAA,CAAM,IAAI,UAAA,CAAW,GAAG,IAAI,KAAA,CAAM,GAAA,GAAM,CAAA,CAAA,EAAI,KAAA,CAAM,GAAG,CAAA,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,YAAY,KAAA,CAAM;AAAA,KACpB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,gCAAA,CAAA,EAAoC;AAAA,MACxE,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,WAAA,EAAa;AAAA,OACf;AAAA,MACA,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,mBAAmB;AAAA,KACpD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,OAAA,CAAQ,MAAM,iCAAA,EAAmC,QAAA,CAAS,QAAQ,MAAM,QAAA,CAAS,MAAM,CAAA;AACvF,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,IAClD;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AAEnC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,OAAO,OAAA,IAAW,CAAA;AAAA,MAC3B,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,KAC7B;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,EAClD;AACF;AAgBO,SAAS,cAAc,MAAA,EAAuE;AACnG,EAAA,OAAO,YAAY;AACjB,IAAA,MAAM,EAAE,OAAA,EAAS,OAAA,GAAU,EAAC,EAAG,sBAAA,GAAyB,UAAS,GAAI,MAAA;AAGrE,IAAA,MAAM,iBAAA,GAAoB,QAAQ,QAAA,CAAS,GAAG,IAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,OAAA;AAGzE,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,QAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA,kBAAA;AAAA,MACA,YAAA;AAAA,MACA,GAAG;AAAA,KACL;AAGA,IAAA,IAAI,QAAkB,EAAC;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,MAAA,KAAA,GAAQ,cAAc,MAAM,CAAA;AAAA,IAC9B,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,wCAAwC,KAAK,CAAA;AAE1D,MAAA,KAAA,GAAQ,CAAC,GAAG,CAAA;AAAA,IACd;AAGA,IAAA,KAAA,GAAQ,MAAM,MAAA,CAAO,CAAA,IAAA,KAAQ,CAAC,UAAA,CAAW,IAAA,EAAM,aAAa,CAAC,CAAA;AAG7D,IAAA,MAAM,OAAA,GAA0B,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,MAAS;AAAA,MACjD,GAAA,EAAK,CAAA,EAAG,iBAAiB,CAAA,EAAG,IAAI,CAAA,CAAA;AAAA,MAChC,YAAA,sBAAkB,IAAA,EAAK;AAAA,MACvB,eAAA,EAAiB,sBAAA;AAAA,MACjB,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,MAAM;AAAA,KACpC,CAAE,CAAA;AAGF,IAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,eAAA,EAAgB;AAChD,QAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,UAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,IAAA,EAAM,aAAa,CAAA,EAAG;AACzC,YAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,cACX,GAAA,EAAK,CAAA,EAAG,iBAAiB,CAAA,EAAG,KAAK,IAAI,CAAA,CAAA;AAAA,cACrC,YAAA,sBAAkB,IAAA,EAAK;AAAA,cACvB,eAAA,EAAiB,KAAK,eAAA,IAAmB,sBAAA;AAAA,cACzC,UAAU,IAAA,CAAK,QAAA,IAAY,WAAA,CAAY,IAAA,CAAK,MAAM,MAAM;AAAA,aACzD,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,8CAA8C,KAAK,CAAA;AAAA,MAClE;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,EAAE,QAAA,IAAY,CAAA,KAAM,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,CAAA;AAE5D,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kCAAA,EAAqC,OAAA,CAAQ,MAAM,CAAA,MAAA,CAAQ,CAAA;AAGvE,IAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AACvB,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,OAAA,CAAQ,IAAI,2BAAA,IAA+B,8BAAA;AAE3E,MAAA,MAAM,SAAS,MAAA,CAAO,MAAA,IAAU,QAAQ,GAAA,CAAI,eAAA,IAAmB,QAAQ,GAAA,CAAI,2BAAA;AAE3E,MAAA,IAAI,MAAA,EAAQ;AAEV,QAAA,mBAAA,CAAoB,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAA,CACxC,KAAK,CAAA,MAAA,KAAU;AACd,UAAA,IAAI,OAAO,OAAA,EAAS;AAClB,YAAA,OAAA,CAAQ,IAAI,CAAA,iCAAA,EAAoC,MAAA,CAAO,OAAO,CAAA,UAAA,EAAa,MAAA,CAAO,OAAO,CAAA,QAAA,CAAU,CAAA;AAAA,UACrG;AAAA,QACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAA,GAAA,KAAO;AACZ,UAAA,OAAA,CAAQ,IAAA,CAAK,kDAAA,EAAoD,GAAA,CAAI,OAAO,CAAA;AAAA,QAC9E,CAAC,CAAA;AAAA,MACL,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAI,uDAAuD,CAAA;AAAA,MACrE;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AACF;AAEA,IAAO,eAAA,GAAQ","file":"index.js","sourcesContent":["/**\n * @uptrade/site-kit - Sitemap Generator\n * \n * Automatically generates sitemap.xml from Next.js app directory structure.\n * Works at build time to discover all pages and sync them to Portal API.\n * \n * @example\n * ```ts\n * // app/sitemap.ts\n * import { createSitemap } from '@uptrade/site-kit/sitemap'\n * \n * export default createSitemap({\n * baseUrl: 'https://example.com',\n * // Optional: exclude patterns\n * exclude: ['/admin/*', '/api/*'],\n * // Optional: additional dynamic routes\n * additionalPaths: async () => [\n * { path: '/blog/post-1', priority: 0.7 },\n * ]\n * })\n * ```\n */\n\nimport { readdirSync, statSync, existsSync } from 'fs'\nimport { join, relative } from 'path'\n\nexport interface SitemapEntry {\n url: string\n lastModified?: Date | string\n changeFrequency?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n priority?: number\n}\n\nexport interface SitemapConfig {\n /** Base URL for the site (required) */\n baseUrl: string\n /** Glob patterns to exclude (e.g., ['/admin/*', '/api/*']) */\n exclude?: string[]\n /** Default priority for pages */\n defaultPriority?: number\n /** Default change frequency */\n defaultChangeFrequency?: SitemapEntry['changeFrequency']\n /** Additional paths to include (for dynamic routes) */\n additionalPaths?: () => Promise<Array<{ path: string; priority?: number; changeFrequency?: SitemapEntry['changeFrequency'] }>>\n /** Priority overrides by path pattern */\n priorities?: Record<string, number>\n /** Portal API URL for syncing (defaults to NEXT_PUBLIC_UPTRADE_API_URL or https://api.uptrademedia.com) */\n apiUrl?: string\n /** Portal API key for syncing (defaults to NEXT_PUBLIC_UPTRADE_API_KEY) */\n apiKey?: string\n /** Disable auto-sync to Portal API */\n disableSync?: boolean\n}\n\n// Route groups and special folders to ignore\nconst IGNORED_FOLDERS = [\n 'api',\n 'admin',\n '_uptrade',\n '%5Fuptrade', // URL-encoded _uptrade\n 'uptrade-setup',\n 'offline',\n]\n\n// File patterns that indicate a page\nconst PAGE_FILES = ['page.tsx', 'page.jsx', 'page.js', 'page.ts']\n\n/**\n * Check if a path matches any exclude pattern\n */\nfunction isExcluded(path: string, patterns: string[]): boolean {\n return patterns.some(pattern => {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n return path.startsWith(prefix)\n }\n if (pattern.endsWith('*')) {\n const prefix = pattern.slice(0, -1)\n return path.startsWith(prefix)\n }\n return path === pattern\n })\n}\n\n/**\n * Recursively discover pages from the app directory\n */\nfunction discoverPages(\n appDir: string,\n currentPath: string = '',\n pages: string[] = []\n): string[] {\n const fullPath = join(appDir, currentPath)\n \n if (!existsSync(fullPath)) {\n return pages\n }\n\n const entries = readdirSync(fullPath)\n \n // Check if this directory has a page file\n const hasPage = entries.some(entry => PAGE_FILES.includes(entry))\n \n if (hasPage) {\n // Convert directory path to URL path\n let urlPath = '/' + currentPath\n \n // Handle route groups (parentheses) - remove them from URL\n urlPath = urlPath.replace(/\\/\\([^)]+\\)/g, '')\n \n // Clean up path\n urlPath = urlPath.replace(/\\/+/g, '/') // Remove double slashes\n if (urlPath !== '/' && urlPath.endsWith('/')) {\n urlPath = urlPath.slice(0, -1) // Remove trailing slash\n }\n \n pages.push(urlPath)\n }\n \n // Recurse into subdirectories\n for (const entry of entries) {\n const entryPath = join(fullPath, entry)\n const stat = statSync(entryPath)\n \n if (stat.isDirectory()) {\n // Skip ignored folders\n const folderName = entry.toLowerCase()\n if (IGNORED_FOLDERS.some(ignored => folderName.includes(ignored))) {\n continue\n }\n \n // Skip dynamic route segments for now (would need runtime data)\n if (entry.startsWith('[') && entry.endsWith(']')) {\n continue\n }\n \n // Skip private folders\n if (entry.startsWith('_')) {\n continue\n }\n \n discoverPages(appDir, join(currentPath, entry), pages)\n }\n }\n \n return pages\n}\n\n/**\n * Find the app directory from the current working directory\n */\nfunction findAppDir(): string {\n const cwd = process.cwd()\n \n // Try common locations\n const candidates = [\n join(cwd, 'app'),\n join(cwd, 'src', 'app'),\n ]\n \n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate\n }\n }\n \n throw new Error(\n '[site-kit] Could not find app directory. Ensure you have an \"app\" or \"src/app\" folder.'\n )\n}\n\n/**\n * Get priority for a path based on config\n */\nfunction getPriority(path: string, config: SitemapConfig): number {\n // Check priority overrides\n if (config.priorities) {\n for (const [pattern, priority] of Object.entries(config.priorities)) {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n if (path.startsWith(prefix)) return priority\n } else if (path === pattern) {\n return priority\n }\n }\n }\n \n // Home page gets highest priority\n if (path === '/') return 1.0\n \n // Shallow pages get higher priority\n const depth = path.split('/').filter(Boolean).length\n if (depth === 1) return 0.8\n if (depth === 2) return 0.6\n \n return config.defaultPriority ?? 0.5\n}\n\n/**\n * Sync sitemap entries to Portal API\n * Called automatically by createSitemap at build time\n */\nexport async function syncSitemapToPortal(\n entries: SitemapEntry[],\n apiUrl: string,\n apiKey: string\n): Promise<{ success: boolean; created: number; updated: number }> {\n if (!apiKey) {\n console.warn('[site-kit] No API key provided, skipping sitemap sync')\n return { success: false, created: 0, updated: 0 }\n }\n \n const normalizedEntries = entries.map(entry => {\n let path: string\n try {\n const url = new URL(entry.url)\n path = url.pathname\n } catch {\n path = entry.url.startsWith('/') ? entry.url : `/${entry.url}`\n }\n \n return {\n path,\n priority: entry.priority,\n changefreq: entry.changeFrequency,\n }\n })\n \n try {\n const response = await fetch(`${apiUrl}/api/public/seo/register-sitemap`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ entries: normalizedEntries }),\n })\n \n if (!response.ok) {\n console.error('[site-kit] Sitemap sync failed:', response.status, await response.text())\n return { success: false, created: 0, updated: 0 }\n }\n \n const result = await response.json()\n \n return {\n success: true,\n created: result.created || 0,\n updated: result.updated || 0,\n }\n } catch (error) {\n console.error('[site-kit] Sitemap sync error:', error)\n return { success: false, created: 0, updated: 0 }\n }\n}\n\n/**\n * Create a sitemap generator function for Next.js\n * Automatically syncs to Portal API at build time.\n * \n * @example\n * ```ts\n * // app/sitemap.ts\n * import { createSitemap } from '@uptrade/site-kit/sitemap'\n * \n * export default createSitemap({\n * baseUrl: 'https://example.com'\n * })\n * ```\n */\nexport function createSitemap(config: SitemapConfig): () => SitemapEntry[] | Promise<SitemapEntry[]> {\n return async () => {\n const { baseUrl, exclude = [], defaultChangeFrequency = 'weekly' } = config\n \n // Normalize base URL\n const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl\n \n // Default exclusions\n const allExclusions = [\n '/api/*',\n '/admin/*',\n '/_uptrade/*',\n '/uptrade-setup/*',\n '/offline/*',\n ...exclude,\n ]\n \n // Discover pages from app directory\n let pages: string[] = []\n try {\n const appDir = findAppDir()\n pages = discoverPages(appDir)\n } catch (error) {\n console.warn('[site-kit] Failed to discover pages:', error)\n // Fall back to just the home page\n pages = ['/']\n }\n \n // Filter out excluded pages\n pages = pages.filter(page => !isExcluded(page, allExclusions))\n \n // Build sitemap entries\n const entries: SitemapEntry[] = pages.map(path => ({\n url: `${normalizedBaseUrl}${path}`,\n lastModified: new Date(),\n changeFrequency: defaultChangeFrequency,\n priority: getPriority(path, config),\n }))\n \n // Add additional dynamic paths if provided\n if (config.additionalPaths) {\n try {\n const additional = await config.additionalPaths()\n for (const item of additional) {\n if (!isExcluded(item.path, allExclusions)) {\n entries.push({\n url: `${normalizedBaseUrl}${item.path}`,\n lastModified: new Date(),\n changeFrequency: item.changeFrequency ?? defaultChangeFrequency,\n priority: item.priority ?? getPriority(item.path, config),\n })\n }\n }\n } catch (error) {\n console.warn('[site-kit] Failed to get additional paths:', error)\n }\n }\n \n // Sort by priority descending\n entries.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n \n console.log(`[site-kit] Generated sitemap with ${entries.length} pages`)\n \n // Auto-sync to Portal API at build time (unless disabled)\n if (!config.disableSync) {\n const apiUrl = config.apiUrl || process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.uptrademedia.com'\n // Server-side operations use UPTRADE_API_KEY, not NEXT_PUBLIC_\n const apiKey = config.apiKey || process.env.UPTRADE_API_KEY || process.env.NEXT_PUBLIC_UPTRADE_API_KEY\n \n if (apiKey) {\n // Fire and forget - don't block sitemap generation\n syncSitemapToPortal(entries, apiUrl, apiKey)\n .then(result => {\n if (result.success) {\n console.log(`[site-kit] Synced to Portal API: ${result.created} created, ${result.updated} updated`)\n }\n })\n .catch(err => {\n console.warn('[site-kit] Failed to sync sitemap to Portal API:', err.message)\n })\n } else {\n console.log('[site-kit] No API key found, skipping Portal API sync')\n }\n }\n \n return entries\n }\n}\n\nexport default createSitemap\n"]}
|
package/dist/sitemap/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import '../chunk-
|
|
1
|
+
import '../chunk-4XPGGLVP.mjs';
|
|
2
2
|
import { existsSync, readdirSync, statSync } from 'fs';
|
|
3
3
|
import { join } from 'path';
|
|
4
4
|
|
|
@@ -183,7 +183,7 @@ function createSitemap(config) {
|
|
|
183
183
|
console.log(`[site-kit] Generated sitemap with ${entries.length} pages`);
|
|
184
184
|
if (!config.disableSync) {
|
|
185
185
|
const apiUrl = config.apiUrl || process.env.NEXT_PUBLIC_UPTRADE_API_URL || "https://api.uptrademedia.com";
|
|
186
|
-
const apiKey = config.apiKey || process.env.NEXT_PUBLIC_UPTRADE_API_KEY;
|
|
186
|
+
const apiKey = config.apiKey || process.env.UPTRADE_API_KEY || process.env.NEXT_PUBLIC_UPTRADE_API_KEY;
|
|
187
187
|
if (apiKey) {
|
|
188
188
|
syncSitemapToPortal(entries, apiUrl, apiKey).then((result) => {
|
|
189
189
|
if (result.success) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/sitemap/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @uptrade/site-kit - Sitemap Generator\n * \n * Automatically generates sitemap.xml from Next.js app directory structure.\n * Works at build time to discover all pages and sync them to Portal API.\n * \n * @example\n * ```ts\n * // app/sitemap.ts\n * import { createSitemap } from '@uptrade/site-kit/sitemap'\n * \n * export default createSitemap({\n * baseUrl: 'https://example.com',\n * // Optional: exclude patterns\n * exclude: ['/admin/*', '/api/*'],\n * // Optional: additional dynamic routes\n * additionalPaths: async () => [\n * { path: '/blog/post-1', priority: 0.7 },\n * ]\n * })\n * ```\n */\n\nimport { readdirSync, statSync, existsSync } from 'fs'\nimport { join, relative } from 'path'\n\nexport interface SitemapEntry {\n url: string\n lastModified?: Date | string\n changeFrequency?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n priority?: number\n}\n\nexport interface SitemapConfig {\n /** Base URL for the site (required) */\n baseUrl: string\n /** Glob patterns to exclude (e.g., ['/admin/*', '/api/*']) */\n exclude?: string[]\n /** Default priority for pages */\n defaultPriority?: number\n /** Default change frequency */\n defaultChangeFrequency?: SitemapEntry['changeFrequency']\n /** Additional paths to include (for dynamic routes) */\n additionalPaths?: () => Promise<Array<{ path: string; priority?: number; changeFrequency?: SitemapEntry['changeFrequency'] }>>\n /** Priority overrides by path pattern */\n priorities?: Record<string, number>\n /** Portal API URL for syncing (defaults to NEXT_PUBLIC_UPTRADE_API_URL or https://api.uptrademedia.com) */\n apiUrl?: string\n /** Portal API key for syncing (defaults to NEXT_PUBLIC_UPTRADE_API_KEY) */\n apiKey?: string\n /** Disable auto-sync to Portal API */\n disableSync?: boolean\n}\n\n// Route groups and special folders to ignore\nconst IGNORED_FOLDERS = [\n 'api',\n 'admin',\n '_uptrade',\n '%5Fuptrade', // URL-encoded _uptrade\n 'uptrade-setup',\n 'offline',\n]\n\n// File patterns that indicate a page\nconst PAGE_FILES = ['page.tsx', 'page.jsx', 'page.js', 'page.ts']\n\n/**\n * Check if a path matches any exclude pattern\n */\nfunction isExcluded(path: string, patterns: string[]): boolean {\n return patterns.some(pattern => {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n return path.startsWith(prefix)\n }\n if (pattern.endsWith('*')) {\n const prefix = pattern.slice(0, -1)\n return path.startsWith(prefix)\n }\n return path === pattern\n })\n}\n\n/**\n * Recursively discover pages from the app directory\n */\nfunction discoverPages(\n appDir: string,\n currentPath: string = '',\n pages: string[] = []\n): string[] {\n const fullPath = join(appDir, currentPath)\n \n if (!existsSync(fullPath)) {\n return pages\n }\n\n const entries = readdirSync(fullPath)\n \n // Check if this directory has a page file\n const hasPage = entries.some(entry => PAGE_FILES.includes(entry))\n \n if (hasPage) {\n // Convert directory path to URL path\n let urlPath = '/' + currentPath\n \n // Handle route groups (parentheses) - remove them from URL\n urlPath = urlPath.replace(/\\/\\([^)]+\\)/g, '')\n \n // Clean up path\n urlPath = urlPath.replace(/\\/+/g, '/') // Remove double slashes\n if (urlPath !== '/' && urlPath.endsWith('/')) {\n urlPath = urlPath.slice(0, -1) // Remove trailing slash\n }\n \n pages.push(urlPath)\n }\n \n // Recurse into subdirectories\n for (const entry of entries) {\n const entryPath = join(fullPath, entry)\n const stat = statSync(entryPath)\n \n if (stat.isDirectory()) {\n // Skip ignored folders\n const folderName = entry.toLowerCase()\n if (IGNORED_FOLDERS.some(ignored => folderName.includes(ignored))) {\n continue\n }\n \n // Skip dynamic route segments for now (would need runtime data)\n if (entry.startsWith('[') && entry.endsWith(']')) {\n continue\n }\n \n // Skip private folders\n if (entry.startsWith('_')) {\n continue\n }\n \n discoverPages(appDir, join(currentPath, entry), pages)\n }\n }\n \n return pages\n}\n\n/**\n * Find the app directory from the current working directory\n */\nfunction findAppDir(): string {\n const cwd = process.cwd()\n \n // Try common locations\n const candidates = [\n join(cwd, 'app'),\n join(cwd, 'src', 'app'),\n ]\n \n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate\n }\n }\n \n throw new Error(\n '[site-kit] Could not find app directory. Ensure you have an \"app\" or \"src/app\" folder.'\n )\n}\n\n/**\n * Get priority for a path based on config\n */\nfunction getPriority(path: string, config: SitemapConfig): number {\n // Check priority overrides\n if (config.priorities) {\n for (const [pattern, priority] of Object.entries(config.priorities)) {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n if (path.startsWith(prefix)) return priority\n } else if (path === pattern) {\n return priority\n }\n }\n }\n \n // Home page gets highest priority\n if (path === '/') return 1.0\n \n // Shallow pages get higher priority\n const depth = path.split('/').filter(Boolean).length\n if (depth === 1) return 0.8\n if (depth === 2) return 0.6\n \n return config.defaultPriority ?? 0.5\n}\n\n/**\n * Sync sitemap entries to Portal API\n * Called automatically by createSitemap at build time\n */\nexport async function syncSitemapToPortal(\n entries: SitemapEntry[],\n apiUrl: string,\n apiKey: string\n): Promise<{ success: boolean; created: number; updated: number }> {\n if (!apiKey) {\n console.warn('[site-kit] No API key provided, skipping sitemap sync')\n return { success: false, created: 0, updated: 0 }\n }\n \n const normalizedEntries = entries.map(entry => {\n let path: string\n try {\n const url = new URL(entry.url)\n path = url.pathname\n } catch {\n path = entry.url.startsWith('/') ? entry.url : `/${entry.url}`\n }\n \n return {\n path,\n priority: entry.priority,\n changefreq: entry.changeFrequency,\n }\n })\n \n try {\n const response = await fetch(`${apiUrl}/api/public/seo/register-sitemap`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ entries: normalizedEntries }),\n })\n \n if (!response.ok) {\n console.error('[site-kit] Sitemap sync failed:', response.status, await response.text())\n return { success: false, created: 0, updated: 0 }\n }\n \n const result = await response.json()\n \n return {\n success: true,\n created: result.created || 0,\n updated: result.updated || 0,\n }\n } catch (error) {\n console.error('[site-kit] Sitemap sync error:', error)\n return { success: false, created: 0, updated: 0 }\n }\n}\n\n/**\n * Create a sitemap generator function for Next.js\n * Automatically syncs to Portal API at build time.\n * \n * @example\n * ```ts\n * // app/sitemap.ts\n * import { createSitemap } from '@uptrade/site-kit/sitemap'\n * \n * export default createSitemap({\n * baseUrl: 'https://example.com'\n * })\n * ```\n */\nexport function createSitemap(config: SitemapConfig): () => SitemapEntry[] | Promise<SitemapEntry[]> {\n return async () => {\n const { baseUrl, exclude = [], defaultChangeFrequency = 'weekly' } = config\n \n // Normalize base URL\n const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl\n \n // Default exclusions\n const allExclusions = [\n '/api/*',\n '/admin/*',\n '/_uptrade/*',\n '/uptrade-setup/*',\n '/offline/*',\n ...exclude,\n ]\n \n // Discover pages from app directory\n let pages: string[] = []\n try {\n const appDir = findAppDir()\n pages = discoverPages(appDir)\n } catch (error) {\n console.warn('[site-kit] Failed to discover pages:', error)\n // Fall back to just the home page\n pages = ['/']\n }\n \n // Filter out excluded pages\n pages = pages.filter(page => !isExcluded(page, allExclusions))\n \n // Build sitemap entries\n const entries: SitemapEntry[] = pages.map(path => ({\n url: `${normalizedBaseUrl}${path}`,\n lastModified: new Date(),\n changeFrequency: defaultChangeFrequency,\n priority: getPriority(path, config),\n }))\n \n // Add additional dynamic paths if provided\n if (config.additionalPaths) {\n try {\n const additional = await config.additionalPaths()\n for (const item of additional) {\n if (!isExcluded(item.path, allExclusions)) {\n entries.push({\n url: `${normalizedBaseUrl}${item.path}`,\n lastModified: new Date(),\n changeFrequency: item.changeFrequency ?? defaultChangeFrequency,\n priority: item.priority ?? getPriority(item.path, config),\n })\n }\n }\n } catch (error) {\n console.warn('[site-kit] Failed to get additional paths:', error)\n }\n }\n \n // Sort by priority descending\n entries.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n \n console.log(`[site-kit] Generated sitemap with ${entries.length} pages`)\n \n // Auto-sync to Portal API at build time (unless disabled)\n if (!config.disableSync) {\n const apiUrl = config.apiUrl || process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.uptrademedia.com'\n const apiKey = config.apiKey || process.env.NEXT_PUBLIC_UPTRADE_API_KEY\n \n if (apiKey) {\n // Fire and forget - don't block sitemap generation\n syncSitemapToPortal(entries, apiUrl, apiKey)\n .then(result => {\n if (result.success) {\n console.log(`[site-kit] Synced to Portal API: ${result.created} created, ${result.updated} updated`)\n }\n })\n .catch(err => {\n console.warn('[site-kit] Failed to sync sitemap to Portal API:', err.message)\n })\n } else {\n console.log('[site-kit] No API key found, skipping Portal API sync')\n }\n }\n \n return entries\n }\n}\n\nexport default createSitemap\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/sitemap/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @uptrade/site-kit - Sitemap Generator\n * \n * Automatically generates sitemap.xml from Next.js app directory structure.\n * Works at build time to discover all pages and sync them to Portal API.\n * \n * @example\n * ```ts\n * // app/sitemap.ts\n * import { createSitemap } from '@uptrade/site-kit/sitemap'\n * \n * export default createSitemap({\n * baseUrl: 'https://example.com',\n * // Optional: exclude patterns\n * exclude: ['/admin/*', '/api/*'],\n * // Optional: additional dynamic routes\n * additionalPaths: async () => [\n * { path: '/blog/post-1', priority: 0.7 },\n * ]\n * })\n * ```\n */\n\nimport { readdirSync, statSync, existsSync } from 'fs'\nimport { join, relative } from 'path'\n\nexport interface SitemapEntry {\n url: string\n lastModified?: Date | string\n changeFrequency?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n priority?: number\n}\n\nexport interface SitemapConfig {\n /** Base URL for the site (required) */\n baseUrl: string\n /** Glob patterns to exclude (e.g., ['/admin/*', '/api/*']) */\n exclude?: string[]\n /** Default priority for pages */\n defaultPriority?: number\n /** Default change frequency */\n defaultChangeFrequency?: SitemapEntry['changeFrequency']\n /** Additional paths to include (for dynamic routes) */\n additionalPaths?: () => Promise<Array<{ path: string; priority?: number; changeFrequency?: SitemapEntry['changeFrequency'] }>>\n /** Priority overrides by path pattern */\n priorities?: Record<string, number>\n /** Portal API URL for syncing (defaults to NEXT_PUBLIC_UPTRADE_API_URL or https://api.uptrademedia.com) */\n apiUrl?: string\n /** Portal API key for syncing (defaults to NEXT_PUBLIC_UPTRADE_API_KEY) */\n apiKey?: string\n /** Disable auto-sync to Portal API */\n disableSync?: boolean\n}\n\n// Route groups and special folders to ignore\nconst IGNORED_FOLDERS = [\n 'api',\n 'admin',\n '_uptrade',\n '%5Fuptrade', // URL-encoded _uptrade\n 'uptrade-setup',\n 'offline',\n]\n\n// File patterns that indicate a page\nconst PAGE_FILES = ['page.tsx', 'page.jsx', 'page.js', 'page.ts']\n\n/**\n * Check if a path matches any exclude pattern\n */\nfunction isExcluded(path: string, patterns: string[]): boolean {\n return patterns.some(pattern => {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n return path.startsWith(prefix)\n }\n if (pattern.endsWith('*')) {\n const prefix = pattern.slice(0, -1)\n return path.startsWith(prefix)\n }\n return path === pattern\n })\n}\n\n/**\n * Recursively discover pages from the app directory\n */\nfunction discoverPages(\n appDir: string,\n currentPath: string = '',\n pages: string[] = []\n): string[] {\n const fullPath = join(appDir, currentPath)\n \n if (!existsSync(fullPath)) {\n return pages\n }\n\n const entries = readdirSync(fullPath)\n \n // Check if this directory has a page file\n const hasPage = entries.some(entry => PAGE_FILES.includes(entry))\n \n if (hasPage) {\n // Convert directory path to URL path\n let urlPath = '/' + currentPath\n \n // Handle route groups (parentheses) - remove them from URL\n urlPath = urlPath.replace(/\\/\\([^)]+\\)/g, '')\n \n // Clean up path\n urlPath = urlPath.replace(/\\/+/g, '/') // Remove double slashes\n if (urlPath !== '/' && urlPath.endsWith('/')) {\n urlPath = urlPath.slice(0, -1) // Remove trailing slash\n }\n \n pages.push(urlPath)\n }\n \n // Recurse into subdirectories\n for (const entry of entries) {\n const entryPath = join(fullPath, entry)\n const stat = statSync(entryPath)\n \n if (stat.isDirectory()) {\n // Skip ignored folders\n const folderName = entry.toLowerCase()\n if (IGNORED_FOLDERS.some(ignored => folderName.includes(ignored))) {\n continue\n }\n \n // Skip dynamic route segments for now (would need runtime data)\n if (entry.startsWith('[') && entry.endsWith(']')) {\n continue\n }\n \n // Skip private folders\n if (entry.startsWith('_')) {\n continue\n }\n \n discoverPages(appDir, join(currentPath, entry), pages)\n }\n }\n \n return pages\n}\n\n/**\n * Find the app directory from the current working directory\n */\nfunction findAppDir(): string {\n const cwd = process.cwd()\n \n // Try common locations\n const candidates = [\n join(cwd, 'app'),\n join(cwd, 'src', 'app'),\n ]\n \n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate\n }\n }\n \n throw new Error(\n '[site-kit] Could not find app directory. Ensure you have an \"app\" or \"src/app\" folder.'\n )\n}\n\n/**\n * Get priority for a path based on config\n */\nfunction getPriority(path: string, config: SitemapConfig): number {\n // Check priority overrides\n if (config.priorities) {\n for (const [pattern, priority] of Object.entries(config.priorities)) {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n if (path.startsWith(prefix)) return priority\n } else if (path === pattern) {\n return priority\n }\n }\n }\n \n // Home page gets highest priority\n if (path === '/') return 1.0\n \n // Shallow pages get higher priority\n const depth = path.split('/').filter(Boolean).length\n if (depth === 1) return 0.8\n if (depth === 2) return 0.6\n \n return config.defaultPriority ?? 0.5\n}\n\n/**\n * Sync sitemap entries to Portal API\n * Called automatically by createSitemap at build time\n */\nexport async function syncSitemapToPortal(\n entries: SitemapEntry[],\n apiUrl: string,\n apiKey: string\n): Promise<{ success: boolean; created: number; updated: number }> {\n if (!apiKey) {\n console.warn('[site-kit] No API key provided, skipping sitemap sync')\n return { success: false, created: 0, updated: 0 }\n }\n \n const normalizedEntries = entries.map(entry => {\n let path: string\n try {\n const url = new URL(entry.url)\n path = url.pathname\n } catch {\n path = entry.url.startsWith('/') ? entry.url : `/${entry.url}`\n }\n \n return {\n path,\n priority: entry.priority,\n changefreq: entry.changeFrequency,\n }\n })\n \n try {\n const response = await fetch(`${apiUrl}/api/public/seo/register-sitemap`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ entries: normalizedEntries }),\n })\n \n if (!response.ok) {\n console.error('[site-kit] Sitemap sync failed:', response.status, await response.text())\n return { success: false, created: 0, updated: 0 }\n }\n \n const result = await response.json()\n \n return {\n success: true,\n created: result.created || 0,\n updated: result.updated || 0,\n }\n } catch (error) {\n console.error('[site-kit] Sitemap sync error:', error)\n return { success: false, created: 0, updated: 0 }\n }\n}\n\n/**\n * Create a sitemap generator function for Next.js\n * Automatically syncs to Portal API at build time.\n * \n * @example\n * ```ts\n * // app/sitemap.ts\n * import { createSitemap } from '@uptrade/site-kit/sitemap'\n * \n * export default createSitemap({\n * baseUrl: 'https://example.com'\n * })\n * ```\n */\nexport function createSitemap(config: SitemapConfig): () => SitemapEntry[] | Promise<SitemapEntry[]> {\n return async () => {\n const { baseUrl, exclude = [], defaultChangeFrequency = 'weekly' } = config\n \n // Normalize base URL\n const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl\n \n // Default exclusions\n const allExclusions = [\n '/api/*',\n '/admin/*',\n '/_uptrade/*',\n '/uptrade-setup/*',\n '/offline/*',\n ...exclude,\n ]\n \n // Discover pages from app directory\n let pages: string[] = []\n try {\n const appDir = findAppDir()\n pages = discoverPages(appDir)\n } catch (error) {\n console.warn('[site-kit] Failed to discover pages:', error)\n // Fall back to just the home page\n pages = ['/']\n }\n \n // Filter out excluded pages\n pages = pages.filter(page => !isExcluded(page, allExclusions))\n \n // Build sitemap entries\n const entries: SitemapEntry[] = pages.map(path => ({\n url: `${normalizedBaseUrl}${path}`,\n lastModified: new Date(),\n changeFrequency: defaultChangeFrequency,\n priority: getPriority(path, config),\n }))\n \n // Add additional dynamic paths if provided\n if (config.additionalPaths) {\n try {\n const additional = await config.additionalPaths()\n for (const item of additional) {\n if (!isExcluded(item.path, allExclusions)) {\n entries.push({\n url: `${normalizedBaseUrl}${item.path}`,\n lastModified: new Date(),\n changeFrequency: item.changeFrequency ?? defaultChangeFrequency,\n priority: item.priority ?? getPriority(item.path, config),\n })\n }\n }\n } catch (error) {\n console.warn('[site-kit] Failed to get additional paths:', error)\n }\n }\n \n // Sort by priority descending\n entries.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n \n console.log(`[site-kit] Generated sitemap with ${entries.length} pages`)\n \n // Auto-sync to Portal API at build time (unless disabled)\n if (!config.disableSync) {\n const apiUrl = config.apiUrl || process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.uptrademedia.com'\n // Server-side operations use UPTRADE_API_KEY, not NEXT_PUBLIC_\n const apiKey = config.apiKey || process.env.UPTRADE_API_KEY || process.env.NEXT_PUBLIC_UPTRADE_API_KEY\n \n if (apiKey) {\n // Fire and forget - don't block sitemap generation\n syncSitemapToPortal(entries, apiUrl, apiKey)\n .then(result => {\n if (result.success) {\n console.log(`[site-kit] Synced to Portal API: ${result.created} created, ${result.updated} updated`)\n }\n })\n .catch(err => {\n console.warn('[site-kit] Failed to sync sitemap to Portal API:', err.message)\n })\n } else {\n console.log('[site-kit] No API key found, skipping Portal API sync')\n }\n }\n \n return entries\n }\n}\n\nexport default createSitemap\n"]}
|
|
@@ -1,7 +1,67 @@
|
|
|
1
|
+
import React__default, { CSSProperties } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @uptrade/site-kit/engage - Design Renderer
|
|
5
|
+
*
|
|
6
|
+
* Renders design_json from Engage Studio as React components.
|
|
7
|
+
* This is the runtime renderer that converts the visual builder's
|
|
8
|
+
* JSON structure into actual React elements.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
interface DesignNode {
|
|
12
|
+
id: string;
|
|
13
|
+
type: string;
|
|
14
|
+
name: string;
|
|
15
|
+
children?: DesignNode[];
|
|
16
|
+
props?: Record<string, any>;
|
|
17
|
+
style?: CSSProperties;
|
|
18
|
+
}
|
|
19
|
+
interface DesignDocument {
|
|
20
|
+
id: string;
|
|
21
|
+
type: string;
|
|
22
|
+
name: string;
|
|
23
|
+
children: DesignNode[];
|
|
24
|
+
style?: CSSProperties;
|
|
25
|
+
props?: Record<string, any>;
|
|
26
|
+
}
|
|
27
|
+
interface DesignRendererProps {
|
|
28
|
+
design: DesignDocument;
|
|
29
|
+
onClose?: () => void;
|
|
30
|
+
onAction?: (action: ActionConfig, node: DesignNode) => void;
|
|
31
|
+
context?: EngageContext;
|
|
32
|
+
}
|
|
33
|
+
interface ActionConfig {
|
|
34
|
+
action: string;
|
|
35
|
+
url?: string;
|
|
36
|
+
newTab?: boolean;
|
|
37
|
+
target?: string;
|
|
38
|
+
text?: string;
|
|
39
|
+
productId?: string;
|
|
40
|
+
formId?: string;
|
|
41
|
+
}
|
|
42
|
+
interface EngageContext {
|
|
43
|
+
user?: {
|
|
44
|
+
name?: string;
|
|
45
|
+
email?: string;
|
|
46
|
+
isLoggedIn?: boolean;
|
|
47
|
+
};
|
|
48
|
+
cart?: {
|
|
49
|
+
itemCount?: number;
|
|
50
|
+
total?: number;
|
|
51
|
+
};
|
|
52
|
+
page?: {
|
|
53
|
+
url?: string;
|
|
54
|
+
title?: string;
|
|
55
|
+
};
|
|
56
|
+
[key: string]: any;
|
|
57
|
+
}
|
|
58
|
+
declare function DesignRenderer({ design, onClose, onAction, context, }: DesignRendererProps): React__default.ReactElement;
|
|
59
|
+
|
|
1
60
|
/**
|
|
2
61
|
* @uptrade/site-kit/engage - Type definitions
|
|
3
62
|
*/
|
|
4
|
-
|
|
63
|
+
|
|
64
|
+
type WidgetType = 'popup' | 'nudge' | 'bar' | 'chat' | 'slide-in';
|
|
5
65
|
interface EngageElement {
|
|
6
66
|
id: string;
|
|
7
67
|
project_id: string;
|
|
@@ -14,6 +74,9 @@ interface EngageElement {
|
|
|
14
74
|
priority: number;
|
|
15
75
|
created_at: string;
|
|
16
76
|
updated_at: string;
|
|
77
|
+
design_json?: DesignDocument;
|
|
78
|
+
compiled_bundle_url?: string;
|
|
79
|
+
status?: 'draft' | 'published' | 'archived' | 'paused';
|
|
17
80
|
}
|
|
18
81
|
interface WidgetConfig {
|
|
19
82
|
/** Visual style */
|
|
@@ -94,6 +157,9 @@ interface ChatConfig {
|
|
|
94
157
|
buttonIcon?: 'chat' | 'help' | 'custom';
|
|
95
158
|
buttonColor?: string;
|
|
96
159
|
buttonText?: string;
|
|
160
|
+
/** Brand colors (primary -> secondary gradient) */
|
|
161
|
+
brandPrimary?: string;
|
|
162
|
+
brandSecondary?: string;
|
|
97
163
|
/** Welcome message */
|
|
98
164
|
welcomeMessage?: string;
|
|
99
165
|
/** Operating hours */
|
|
@@ -114,7 +180,21 @@ interface ChatConfig {
|
|
|
114
180
|
skillId?: string;
|
|
115
181
|
handoffToLive?: boolean;
|
|
116
182
|
handoffKeywords?: string[];
|
|
183
|
+
/** When AI should suggest handoff based on sentiment or keywords */
|
|
184
|
+
handoffTriggers?: {
|
|
185
|
+
negativesentiment?: boolean;
|
|
186
|
+
keywords?: string[];
|
|
187
|
+
afterMessages?: number;
|
|
188
|
+
};
|
|
117
189
|
};
|
|
190
|
+
/** Offline mode settings (when no agents available) */
|
|
191
|
+
offlineMode?: 'form' | 'ai' | 'message';
|
|
192
|
+
/** Form slug to show when offline (defaults to 'contact') */
|
|
193
|
+
offlineFormSlug?: string;
|
|
194
|
+
/** AI fallback when no agents online (hybrid mode) */
|
|
195
|
+
aiFallbackEnabled?: boolean;
|
|
196
|
+
/** Custom offline message */
|
|
197
|
+
offlineMessage?: string;
|
|
118
198
|
}
|
|
119
199
|
interface ChatMessage {
|
|
120
200
|
id: string;
|
|
@@ -123,15 +203,31 @@ interface ChatMessage {
|
|
|
123
203
|
content: string;
|
|
124
204
|
metadata?: Record<string, unknown>;
|
|
125
205
|
created_at: string;
|
|
206
|
+
/** Name of the agent (for agent messages) */
|
|
207
|
+
sender_name?: string;
|
|
208
|
+
/** Avatar URL of the agent */
|
|
209
|
+
sender_avatar?: string;
|
|
126
210
|
}
|
|
127
211
|
interface ChatConversation {
|
|
128
212
|
id: string;
|
|
129
213
|
project_id: string;
|
|
130
214
|
visitor_id: string;
|
|
131
|
-
status: 'active' | '
|
|
215
|
+
status: 'active' | 'ai' | 'pending_handoff' | 'human' | 'closed';
|
|
132
216
|
assigned_to?: string;
|
|
133
217
|
last_message_at: string;
|
|
134
218
|
created_at: string;
|
|
219
|
+
/** AI summary of the conversation */
|
|
220
|
+
ai_summary?: string;
|
|
221
|
+
/** Visitor info */
|
|
222
|
+
visitor_name?: string;
|
|
223
|
+
visitor_email?: string;
|
|
224
|
+
}
|
|
225
|
+
/** Availability status returned by the widget API */
|
|
226
|
+
interface ChatAvailability {
|
|
227
|
+
available: boolean;
|
|
228
|
+
mode: 'live' | 'ai' | 'offline';
|
|
229
|
+
agentsOnline: number;
|
|
230
|
+
operatingHoursActive: boolean;
|
|
135
231
|
}
|
|
136
232
|
interface EngageConfig {
|
|
137
233
|
projectId: string;
|
|
@@ -152,4 +248,4 @@ interface EngageAnalytics {
|
|
|
152
248
|
created_at: string;
|
|
153
249
|
}
|
|
154
250
|
|
|
155
|
-
export type
|
|
251
|
+
export { type ActionConfig as A, type ChatConfig as C, DesignRenderer as D, type EngageContext as E, type TargetingRules as T, type WidgetType as W, type DesignDocument as a, type DesignNode as b, type EngageElement as c, type WidgetConfig as d, type TriggerConfig as e, type ChatMessage as f, type ChatConversation as g, type ChatAvailability as h, type EngageConfig as i, type EngageAnalytics as j };
|
|
@@ -1,7 +1,67 @@
|
|
|
1
|
+
import React__default, { CSSProperties } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @uptrade/site-kit/engage - Design Renderer
|
|
5
|
+
*
|
|
6
|
+
* Renders design_json from Engage Studio as React components.
|
|
7
|
+
* This is the runtime renderer that converts the visual builder's
|
|
8
|
+
* JSON structure into actual React elements.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
interface DesignNode {
|
|
12
|
+
id: string;
|
|
13
|
+
type: string;
|
|
14
|
+
name: string;
|
|
15
|
+
children?: DesignNode[];
|
|
16
|
+
props?: Record<string, any>;
|
|
17
|
+
style?: CSSProperties;
|
|
18
|
+
}
|
|
19
|
+
interface DesignDocument {
|
|
20
|
+
id: string;
|
|
21
|
+
type: string;
|
|
22
|
+
name: string;
|
|
23
|
+
children: DesignNode[];
|
|
24
|
+
style?: CSSProperties;
|
|
25
|
+
props?: Record<string, any>;
|
|
26
|
+
}
|
|
27
|
+
interface DesignRendererProps {
|
|
28
|
+
design: DesignDocument;
|
|
29
|
+
onClose?: () => void;
|
|
30
|
+
onAction?: (action: ActionConfig, node: DesignNode) => void;
|
|
31
|
+
context?: EngageContext;
|
|
32
|
+
}
|
|
33
|
+
interface ActionConfig {
|
|
34
|
+
action: string;
|
|
35
|
+
url?: string;
|
|
36
|
+
newTab?: boolean;
|
|
37
|
+
target?: string;
|
|
38
|
+
text?: string;
|
|
39
|
+
productId?: string;
|
|
40
|
+
formId?: string;
|
|
41
|
+
}
|
|
42
|
+
interface EngageContext {
|
|
43
|
+
user?: {
|
|
44
|
+
name?: string;
|
|
45
|
+
email?: string;
|
|
46
|
+
isLoggedIn?: boolean;
|
|
47
|
+
};
|
|
48
|
+
cart?: {
|
|
49
|
+
itemCount?: number;
|
|
50
|
+
total?: number;
|
|
51
|
+
};
|
|
52
|
+
page?: {
|
|
53
|
+
url?: string;
|
|
54
|
+
title?: string;
|
|
55
|
+
};
|
|
56
|
+
[key: string]: any;
|
|
57
|
+
}
|
|
58
|
+
declare function DesignRenderer({ design, onClose, onAction, context, }: DesignRendererProps): React__default.ReactElement;
|
|
59
|
+
|
|
1
60
|
/**
|
|
2
61
|
* @uptrade/site-kit/engage - Type definitions
|
|
3
62
|
*/
|
|
4
|
-
|
|
63
|
+
|
|
64
|
+
type WidgetType = 'popup' | 'nudge' | 'bar' | 'chat' | 'slide-in';
|
|
5
65
|
interface EngageElement {
|
|
6
66
|
id: string;
|
|
7
67
|
project_id: string;
|
|
@@ -14,6 +74,9 @@ interface EngageElement {
|
|
|
14
74
|
priority: number;
|
|
15
75
|
created_at: string;
|
|
16
76
|
updated_at: string;
|
|
77
|
+
design_json?: DesignDocument;
|
|
78
|
+
compiled_bundle_url?: string;
|
|
79
|
+
status?: 'draft' | 'published' | 'archived' | 'paused';
|
|
17
80
|
}
|
|
18
81
|
interface WidgetConfig {
|
|
19
82
|
/** Visual style */
|
|
@@ -94,6 +157,9 @@ interface ChatConfig {
|
|
|
94
157
|
buttonIcon?: 'chat' | 'help' | 'custom';
|
|
95
158
|
buttonColor?: string;
|
|
96
159
|
buttonText?: string;
|
|
160
|
+
/** Brand colors (primary -> secondary gradient) */
|
|
161
|
+
brandPrimary?: string;
|
|
162
|
+
brandSecondary?: string;
|
|
97
163
|
/** Welcome message */
|
|
98
164
|
welcomeMessage?: string;
|
|
99
165
|
/** Operating hours */
|
|
@@ -114,7 +180,21 @@ interface ChatConfig {
|
|
|
114
180
|
skillId?: string;
|
|
115
181
|
handoffToLive?: boolean;
|
|
116
182
|
handoffKeywords?: string[];
|
|
183
|
+
/** When AI should suggest handoff based on sentiment or keywords */
|
|
184
|
+
handoffTriggers?: {
|
|
185
|
+
negativesentiment?: boolean;
|
|
186
|
+
keywords?: string[];
|
|
187
|
+
afterMessages?: number;
|
|
188
|
+
};
|
|
117
189
|
};
|
|
190
|
+
/** Offline mode settings (when no agents available) */
|
|
191
|
+
offlineMode?: 'form' | 'ai' | 'message';
|
|
192
|
+
/** Form slug to show when offline (defaults to 'contact') */
|
|
193
|
+
offlineFormSlug?: string;
|
|
194
|
+
/** AI fallback when no agents online (hybrid mode) */
|
|
195
|
+
aiFallbackEnabled?: boolean;
|
|
196
|
+
/** Custom offline message */
|
|
197
|
+
offlineMessage?: string;
|
|
118
198
|
}
|
|
119
199
|
interface ChatMessage {
|
|
120
200
|
id: string;
|
|
@@ -123,15 +203,31 @@ interface ChatMessage {
|
|
|
123
203
|
content: string;
|
|
124
204
|
metadata?: Record<string, unknown>;
|
|
125
205
|
created_at: string;
|
|
206
|
+
/** Name of the agent (for agent messages) */
|
|
207
|
+
sender_name?: string;
|
|
208
|
+
/** Avatar URL of the agent */
|
|
209
|
+
sender_avatar?: string;
|
|
126
210
|
}
|
|
127
211
|
interface ChatConversation {
|
|
128
212
|
id: string;
|
|
129
213
|
project_id: string;
|
|
130
214
|
visitor_id: string;
|
|
131
|
-
status: 'active' | '
|
|
215
|
+
status: 'active' | 'ai' | 'pending_handoff' | 'human' | 'closed';
|
|
132
216
|
assigned_to?: string;
|
|
133
217
|
last_message_at: string;
|
|
134
218
|
created_at: string;
|
|
219
|
+
/** AI summary of the conversation */
|
|
220
|
+
ai_summary?: string;
|
|
221
|
+
/** Visitor info */
|
|
222
|
+
visitor_name?: string;
|
|
223
|
+
visitor_email?: string;
|
|
224
|
+
}
|
|
225
|
+
/** Availability status returned by the widget API */
|
|
226
|
+
interface ChatAvailability {
|
|
227
|
+
available: boolean;
|
|
228
|
+
mode: 'live' | 'ai' | 'offline';
|
|
229
|
+
agentsOnline: number;
|
|
230
|
+
operatingHoursActive: boolean;
|
|
135
231
|
}
|
|
136
232
|
interface EngageConfig {
|
|
137
233
|
projectId: string;
|
|
@@ -152,4 +248,4 @@ interface EngageAnalytics {
|
|
|
152
248
|
created_at: string;
|
|
153
249
|
}
|
|
154
250
|
|
|
155
|
-
export type
|
|
251
|
+
export { type ActionConfig as A, type ChatConfig as C, DesignRenderer as D, type EngageContext as E, type TargetingRules as T, type WidgetType as W, type DesignDocument as a, type DesignNode as b, type EngageElement as c, type WidgetConfig as d, type TriggerConfig as e, type ChatMessage as f, type ChatConversation as g, type ChatAvailability as h, type EngageConfig as i, type EngageAnalytics as j };
|
|
@@ -39,6 +39,8 @@ interface BlogPost {
|
|
|
39
39
|
question: string;
|
|
40
40
|
answer: string;
|
|
41
41
|
}[];
|
|
42
|
+
/** E-E-A-T: when present, use as JSON-LD on the post page (Article/FAQ/Person from Signal) */
|
|
43
|
+
schema?: object | object[];
|
|
42
44
|
service_callouts?: {
|
|
43
45
|
title: string;
|
|
44
46
|
description?: string;
|
|
@@ -39,6 +39,8 @@ interface BlogPost {
|
|
|
39
39
|
question: string;
|
|
40
40
|
answer: string;
|
|
41
41
|
}[];
|
|
42
|
+
/** E-E-A-T: when present, use as JSON-LD on the post page (Article/FAQ/Person from Signal) */
|
|
43
|
+
schema?: object | object[];
|
|
42
44
|
service_callouts?: {
|
|
43
45
|
title: string;
|
|
44
46
|
description?: string;
|
|
@@ -11,7 +11,7 @@ interface SEOPageData {
|
|
|
11
11
|
path: string;
|
|
12
12
|
url?: string;
|
|
13
13
|
managed_title?: string;
|
|
14
|
-
|
|
14
|
+
managed_meta_description?: string;
|
|
15
15
|
managed_og_title?: string;
|
|
16
16
|
managed_og_description?: string;
|
|
17
17
|
managed_og_image?: string;
|
|
@@ -122,6 +122,23 @@ interface ManagedContentProps {
|
|
|
122
122
|
className?: string;
|
|
123
123
|
/** For 'react' type, map of component names to components */
|
|
124
124
|
components?: Record<string, React.ComponentType<unknown>>;
|
|
125
|
+
/** Inject entity annotations from knowledge graph (data-sonor-entity attributes) */
|
|
126
|
+
injectEntityAnnotations?: boolean;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Entity from the knowledge graph (for content annotation)
|
|
130
|
+
*/
|
|
131
|
+
interface SEOEntity {
|
|
132
|
+
id: string;
|
|
133
|
+
project_id: string;
|
|
134
|
+
entity_type: 'organization' | 'person' | 'service' | 'product' | 'location' | 'concept' | 'credential';
|
|
135
|
+
name: string;
|
|
136
|
+
slug: string;
|
|
137
|
+
properties: Record<string, unknown>;
|
|
138
|
+
knows_about: string[];
|
|
139
|
+
same_as: string[];
|
|
140
|
+
schema_type?: string;
|
|
141
|
+
is_primary: boolean;
|
|
125
142
|
}
|
|
126
143
|
interface ABTest {
|
|
127
144
|
id: string;
|
|
@@ -224,4 +241,4 @@ interface GetSitemapEntriesOptions {
|
|
|
224
241
|
publishedOnly?: boolean;
|
|
225
242
|
}
|
|
226
243
|
|
|
227
|
-
export type { ABTest as A, FAQItem as F, GetManagedMetadataOptions as G, ManagedMetadataResult as M, RedirectResult as R, SEOPageData as S, UptradeSEOConfig as U, SchemaMarkup as a, ManagedSchemaProps as b, ManagedFAQData as c, ManagedFAQProps as d, ManagedLink as e, ManagedInternalLinksProps as f, ManagedContentBlock as g, ManagedContentProps as h,
|
|
244
|
+
export type { ABTest as A, FAQItem as F, GetManagedMetadataOptions as G, ManagedMetadataResult as M, RedirectResult as R, SEOPageData as S, UptradeSEOConfig as U, SchemaMarkup as a, ManagedSchemaProps as b, ManagedFAQData as c, ManagedFAQProps as d, ManagedLink as e, ManagedInternalLinksProps as f, ManagedContentBlock as g, ManagedContentProps as h, SEOEntity as i, ABTestResult as j, GetABVariantOptions as k, ManagedRedirect as l, GetRedirectOptions as m, ManagedScript as n, ManagedScriptsProps as o, RobotsDirective as p, GetRobotsOptions as q, SitemapEntry as r, GetSitemapEntriesOptions as s };
|
|
@@ -11,7 +11,7 @@ interface SEOPageData {
|
|
|
11
11
|
path: string;
|
|
12
12
|
url?: string;
|
|
13
13
|
managed_title?: string;
|
|
14
|
-
|
|
14
|
+
managed_meta_description?: string;
|
|
15
15
|
managed_og_title?: string;
|
|
16
16
|
managed_og_description?: string;
|
|
17
17
|
managed_og_image?: string;
|
|
@@ -122,6 +122,23 @@ interface ManagedContentProps {
|
|
|
122
122
|
className?: string;
|
|
123
123
|
/** For 'react' type, map of component names to components */
|
|
124
124
|
components?: Record<string, React.ComponentType<unknown>>;
|
|
125
|
+
/** Inject entity annotations from knowledge graph (data-sonor-entity attributes) */
|
|
126
|
+
injectEntityAnnotations?: boolean;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Entity from the knowledge graph (for content annotation)
|
|
130
|
+
*/
|
|
131
|
+
interface SEOEntity {
|
|
132
|
+
id: string;
|
|
133
|
+
project_id: string;
|
|
134
|
+
entity_type: 'organization' | 'person' | 'service' | 'product' | 'location' | 'concept' | 'credential';
|
|
135
|
+
name: string;
|
|
136
|
+
slug: string;
|
|
137
|
+
properties: Record<string, unknown>;
|
|
138
|
+
knows_about: string[];
|
|
139
|
+
same_as: string[];
|
|
140
|
+
schema_type?: string;
|
|
141
|
+
is_primary: boolean;
|
|
125
142
|
}
|
|
126
143
|
interface ABTest {
|
|
127
144
|
id: string;
|
|
@@ -224,4 +241,4 @@ interface GetSitemapEntriesOptions {
|
|
|
224
241
|
publishedOnly?: boolean;
|
|
225
242
|
}
|
|
226
243
|
|
|
227
|
-
export type { ABTest as A, FAQItem as F, GetManagedMetadataOptions as G, ManagedMetadataResult as M, RedirectResult as R, SEOPageData as S, UptradeSEOConfig as U, SchemaMarkup as a, ManagedSchemaProps as b, ManagedFAQData as c, ManagedFAQProps as d, ManagedLink as e, ManagedInternalLinksProps as f, ManagedContentBlock as g, ManagedContentProps as h,
|
|
244
|
+
export type { ABTest as A, FAQItem as F, GetManagedMetadataOptions as G, ManagedMetadataResult as M, RedirectResult as R, SEOPageData as S, UptradeSEOConfig as U, SchemaMarkup as a, ManagedSchemaProps as b, ManagedFAQData as c, ManagedFAQProps as d, ManagedLink as e, ManagedInternalLinksProps as f, ManagedContentBlock as g, ManagedContentProps as h, SEOEntity as i, ABTestResult as j, GetABVariantOptions as k, ManagedRedirect as l, GetRedirectOptions as m, ManagedScript as n, ManagedScriptsProps as o, RobotsDirective as p, GetRobotsOptions as q, SitemapEntry as r, GetSitemapEntriesOptions as s };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkZSMWDLMK_js = require('./chunk-ZSMWDLMK.js');
|
|
4
4
|
|
|
5
5
|
// node_modules/.pnpm/web-vitals@5.1.0/node_modules/web-vitals/dist/web-vitals.js
|
|
6
6
|
var e = -1;
|
|
@@ -38,9 +38,9 @@ function a(e2, t2) {
|
|
|
38
38
|
}
|
|
39
39
|
var d = class {
|
|
40
40
|
constructor() {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
chunkZSMWDLMK_js.__publicField(this, "t");
|
|
42
|
+
chunkZSMWDLMK_js.__publicField(this, "i", 0);
|
|
43
|
+
chunkZSMWDLMK_js.__publicField(this, "o", []);
|
|
44
44
|
}
|
|
45
45
|
h(e2) {
|
|
46
46
|
if (e2.hadRecentInput) return;
|
|
@@ -139,10 +139,10 @@ var I = () => {
|
|
|
139
139
|
var F = 0;
|
|
140
140
|
var k = class {
|
|
141
141
|
constructor() {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
142
|
+
chunkZSMWDLMK_js.__publicField(this, "u", []);
|
|
143
|
+
chunkZSMWDLMK_js.__publicField(this, "l", /* @__PURE__ */ new Map());
|
|
144
|
+
chunkZSMWDLMK_js.__publicField(this, "m");
|
|
145
|
+
chunkZSMWDLMK_js.__publicField(this, "p");
|
|
146
146
|
}
|
|
147
147
|
v() {
|
|
148
148
|
F = C(), this.u.length = 0, this.l.clear();
|
|
@@ -193,7 +193,7 @@ var S = (e2, i2 = {}) => {
|
|
|
193
193
|
};
|
|
194
194
|
var N = class {
|
|
195
195
|
constructor() {
|
|
196
|
-
|
|
196
|
+
chunkZSMWDLMK_js.__publicField(this, "m");
|
|
197
197
|
}
|
|
198
198
|
h(e2) {
|
|
199
199
|
this.m?.(e2);
|
|
@@ -248,5 +248,5 @@ exports.onFCP = E;
|
|
|
248
248
|
exports.onINP = S;
|
|
249
249
|
exports.onLCP = x;
|
|
250
250
|
exports.onTTFB = $;
|
|
251
|
-
//# sourceMappingURL=web-vitals-
|
|
252
|
-
//# sourceMappingURL=web-vitals-
|
|
251
|
+
//# sourceMappingURL=web-vitals-444RLW3B.js.map
|
|
252
|
+
//# sourceMappingURL=web-vitals-444RLW3B.js.map
|