framer-export 4.3.8 → 4.3.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../package.json","../../src/cli/theme.ts","../../src/cli/banner.ts","../../src/assets/asset-map.ts","../../src/config/index.ts","../../src/network/download.ts","../../src/logger/index.ts","../../src/platforms/framer.ts","../../src/platforms/webflow.ts","../../src/platforms/wix.ts","../../src/platforms/detect.ts","../../src/platforms/index.ts","../../src/exporter/capture.ts","../../src/network/pool.ts","../../src/exporter/download.ts","../../src/formatter/prettify.ts","../../src/server/template.ts","../../src/exporter/output.ts","../../src/cli/box.ts","../../src/exporter/summary.ts","../../src/cli/select.ts","../../src/ai/prompt-assistant.ts","../../src/cli/cooking.ts","../../src/exporter/index.ts","../../src/cli/setup.ts","../../src/cli/index.ts","../../src/cli/help.ts","../../src/cli/update-check.ts"],"sourcesContent":["{\n \"name\": \"framer-export\",\n \"version\": \"4.3.8\",\n \"description\": \"Export any Framer, Webflow, or Wix site into a fully working local mirror. Downloads all assets, strips badges, rewrites URLs, and pretty-prints JS.\",\n \"type\": \"module\",\n \"main\": \"dist/cli/index.js\",\n \"types\": \"dist/cli/index.d.ts\",\n \"bin\": {\n \"framer-export\": \"./bin/framer-export.js\",\n \"fexport\": \"./bin/fexport.js\",\n \"framerexport\": \"./bin/framerexport.js\"\n },\n \"files\": [\n \"dist/\",\n \"bin/\",\n \"LICENSE\",\n \"README.md\"\n ],\n \"scripts\": {\n \"start\": \"tsx src/cli/index.ts\",\n \"dev\": \"tsx src/cli/index.ts\",\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"format\": \"prettier --write \\\"src/**/*.ts\\\"\",\n \"prepublishOnly\": \"npm run build\",\n \"prepack\": \"npm run build\"\n },\n \"keywords\": [\n \"framer\",\n \"webflow\",\n \"wix\",\n \"exporter\",\n \"export\",\n \"scraper\",\n \"mirror\",\n \"site-downloader\",\n \"site-export\",\n \"cli\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/danbenba/FramerExport.git\"\n },\n \"homepage\": \"https://github.com/danbenba/FramerExport#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/danbenba/FramerExport/issues\"\n },\n \"license\": \"MIT\",\n \"author\": \"Dany (danbenba)\",\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"dependencies\": {\n \"chalk\": \"^5.3.0\",\n \"ora\": \"^8.0.0\",\n \"prettier\": \"^3.2.0\",\n \"puppeteer\": \"^22.0.0\",\n \"readline-promise\": \"^1.0.5\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.0.0\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.7.0\",\n \"typescript\": \"^5.4.0\"\n }\n}\n","import chalk from 'chalk';\n\nexport const THEME = {\n background: '#0A0A0A',\n panel: '#141414',\n element: '#1E1E1E',\n border: '#484848',\n borderActive: '#606060',\n text: '#EEEEEE',\n muted: '#808080',\n primary: '#FAB283',\n primarySoft: '#FFC09F',\n secondary: '#5C9CF5',\n accent: '#9D7CD8',\n success: '#7FD88F',\n warning: '#F5A742',\n error: '#E06C75',\n info: '#56B6C2',\n};\n\nexport const ui = {\n text: chalk.hex(THEME.text),\n muted: chalk.hex(THEME.muted),\n primary: chalk.hex(THEME.primary),\n primarySoft: chalk.hex(THEME.primarySoft),\n secondary: chalk.hex(THEME.secondary),\n accent: chalk.hex(THEME.accent),\n success: chalk.hex(THEME.success),\n warning: chalk.hex(THEME.warning),\n error: chalk.hex(THEME.error),\n info: chalk.hex(THEME.info),\n border: chalk.hex(THEME.border),\n borderActive: chalk.hex(THEME.borderActive),\n panel: chalk.hex(THEME.panel),\n};\n\nexport function stripAnsi(s: string): string {\n return s.replace(/\\x1B\\[[0-9;]*[a-zA-Z]/g, '');\n}\n\nexport function softGradient(text: string): string {\n const colors = [THEME.primary, THEME.primarySoft, THEME.text, THEME.primarySoft, THEME.primary];\n let cursor = 0;\n return text\n .split('')\n .map((char) => {\n if (char === ' ') return char;\n const color = colors[cursor % colors.length];\n cursor++;\n return chalk.hex(color).bold(char);\n })\n .join('');\n}\n\nexport function chip(label: string): string {\n return `${ui.border('[')}${ui.primary(label)}${ui.border(']')}`;\n}\n\nexport function bullet(label: string = '•'): string {\n return ui.primary(label);\n}\n","import pkg from '../../package.json';\nimport { chip, softGradient, ui } from './theme.js';\n\nfunction getWidth(): number {\n return process.stdout.columns || 80;\n}\n\nconst ASCII_ART = [\n ' ▄ ▄ ',\n '█▀▀ █▀█ ▄▀█ █▀▄▀█ █▀▀ █▀█ █▀▀ ▀▄▀ █▀█ █▀█ █▀█ ▀█▀',\n '█▀ █▀▄ █▀█ █ ▀ █ ██▄ █▀▄ ██▄ █ █ █▀▀ █▄█ █▀▄ █ ',\n '▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀▀▀ ▀ ▀ ▀▀▀ ▀ ▀ ▀ ▀▀▀ ▀ ▀ ▀ ',\n];\n\nexport function showBanner(): void {\n const width = getWidth();\n const isSmall = width < 65;\n\n if (isSmall) {\n console.log(`\\n ${ui.primary.bold('f-export')} ${ui.muted(`v${pkg.version}`)} ${chip('beta ui')}`);\n console.log(` ${ui.text.bold('Framer Export')} ${ui.muted('for Framer, Webflow, and Wix')}\\n`);\n return;\n }\n\n console.log('');\n ASCII_ART.forEach((line) => {\n console.log(' ' + softGradient(line));\n });\n console.log('');\n console.log(\n ` ${ui.muted(`v${pkg.version}`)} ${ui.text.bold('Framer Export')} ${chip('fexport')} ${ui.muted('local mirror exporter')}`\n );\n console.log(\n ` ${ui.muted('Framer')} ${ui.border('/')} ${ui.muted('Webflow')} ${ui.border('/')} ${ui.muted('Wix')} ${ui.border('·')} ${ui.primary('clean assets')} ${ui.border('·')} ${ui.secondary('local serve')}\\n`\n );\n}\n","import path from 'path';\nimport crypto from 'crypto';\nimport { URL } from 'url';\nimport type { PlatformHandler } from '../platforms/types.js';\n\ninterface AssetEntry {\n localPath: string;\n}\n\nexport class AssetMap {\n entries: Map<string, AssetEntry> = new Map();\n buffers: Map<string, Buffer> = new Map();\n\n localPathFor(urlStr: string, platform?: PlatformHandler): string | null {\n if (this.entries.has(urlStr)) return this.entries.get(urlStr)!.localPath;\n\n let parsed: URL;\n try {\n parsed = new URL(urlStr);\n } catch {\n return null;\n }\n\n const host: string = parsed.hostname;\n const pathname: string = parsed.pathname;\n const ext: string = path.extname(pathname.split('?')[0]).toLowerCase();\n\n let dir: string | null = null;\n\n if (platform) {\n dir = platform.mapAssetDir(host, pathname, ext);\n }\n\n if (!dir) {\n dir = this.fallbackDir(host, ext);\n }\n\n let filename: string;\n const baseName: string = path.basename(pathname.split('?')[0]);\n const hash: string = crypto.createHash('md5').update(urlStr).digest('hex').slice(0, 6);\n\n if (baseName && baseName.length > 1 && baseName !== '/') {\n const clean: string = baseName.replace(/[^a-zA-Z0-9._-]/g, '_');\n filename = clean.includes('.') ? clean : `${clean}-${hash}`;\n } else {\n filename = `asset-${hash}${ext || ''}`;\n }\n\n if (ext === '.mjs' || ext === '.js') {\n filename = baseName.replace(/[^a-zA-Z0-9._-]/g, '_');\n }\n\n const localPath: string = `${dir}/${filename}`;\n this.entries.set(urlStr, { localPath });\n\n const base: string = urlStr.split('?')[0];\n if (base !== urlStr && !this.entries.has(base)) {\n this.entries.set(base, { localPath });\n }\n\n return localPath;\n }\n\n rewrite(text: string, fromDir: string = ''): string {\n const sorted = [...this.entries.entries()].sort((a, b) => b[0].length - a[0].length);\n let out: string = text;\n for (const [url, { localPath }] of sorted) {\n const rel: string = fromDir ? path.posix.relative(fromDir, localPath) : localPath;\n out = out.split(url).join(rel);\n if (url.includes('&')) {\n out = out.split(url.replace(/&/g, '&amp;')).join(rel);\n }\n }\n return out;\n }\n\n private fallbackDir(host: string, ext: string): string {\n if (host.includes('fonts.gstatic.com') || host.includes('fonts.googleapis.com')) {\n return 'assets/fonts';\n }\n return ext === '.mjs' || ext === '.js' ? 'scripts/vendor' : 'assets/misc';\n }\n}\n","import type { Config } from '../types.js';\n\nexport const CFG: Config = {\n viewport: { width: 1440, height: 900 },\n timeout: 90000,\n scrollStep: 250,\n scrollDelay: 60,\n concurrency: 12,\n retries: 3,\n dlTimeout: 30000,\n sharedStripDomains: [\n 'sentry.io', 'www.googletagmanager.com', 'connect.facebook.net',\n 'stats.g.doubleclick.net',\n 'google-analytics.com',\n ],\n};\n","import https from 'https';\nimport http from 'http';\nimport { URL } from 'url';\nimport { CFG } from '../config/index.js';\n\nexport function dlBuffer(url: string, retries: number = CFG.retries): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const proto = url.startsWith('https') ? https : http;\n const go = (left: number): void => {\n const req = proto.get(url, { timeout: CFG.dlTimeout }, (res) => {\n if (res.statusCode! >= 300 && res.statusCode! < 400 && res.headers.location) {\n return dlBuffer(new URL(res.headers.location, url).href, left).then(resolve, reject);\n }\n if (res.statusCode !== 200) {\n return left > 1\n ? setTimeout(() => go(left - 1), 500)\n : reject(new Error(`HTTP ${res.statusCode}`));\n }\n const ch: Buffer[] = [];\n res.on('data', (c: Buffer) => ch.push(c));\n res.on('end', () => resolve(Buffer.concat(ch)));\n res.on('error', (e: Error) => (left > 1 ? setTimeout(() => go(left - 1), 500) : reject(e)));\n });\n req.on('error', (e: Error) => (left > 1 ? setTimeout(() => go(left - 1), 500) : reject(e)));\n req.on('timeout', () => {\n req.destroy();\n left > 1 ? setTimeout(() => go(left - 1), 500) : reject(new Error('Timeout'));\n });\n };\n go(retries);\n });\n}\n","import chalk from 'chalk';\nimport type { CookingSpinner } from '../cli/cooking.js';\nimport { THEME } from '../cli/theme.js';\n\nlet _cooking: CookingSpinner | null = null;\n\nexport function setCooking(spinner: CookingSpinner | null): void {\n _cooking = spinner;\n}\n\nconst T = (): string => new Date().toISOString().slice(11, 19);\n\nfunction trunc(text: string, max: number): string {\n if (text.length <= max) return text;\n return text.slice(0, max - 2) + '..';\n}\n\nfunction output(line: string): void {\n if (_cooking) _cooking.log(line);\n else console.log(line);\n}\n\nconst LOG_PALETTE: Array<(s: string) => string> = [\n (s) => chalk.hex(THEME.primary)(s),\n (s) => chalk.hex(THEME.primarySoft)(s),\n (s) => chalk.hex(THEME.secondary)(s),\n (s) => chalk.hex(THEME.accent)(s),\n (s) => chalk.hex(THEME.info)(s),\n (s) => chalk.hex(THEME.text)(s),\n];\nlet _li = 0;\n\nexport const log = (m: string): void => {\n _li++;\n const c = LOG_PALETTE[_li % LOG_PALETTE.length];\n output(`${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.primary)('[log]')} ${c(trunc(m, 120))}`);\n};\n\nconst INFO_PALETTE: Array<(s: string) => string> = [\n (s) => chalk.hex(THEME.info)(s),\n (s) => chalk.hex(THEME.secondary)(s),\n (s) => chalk.hex(THEME.primarySoft)(s),\n];\nlet _ii = 0;\n\nexport const info = (m: string): void => {\n _ii++;\n const c = INFO_PALETTE[_ii % INFO_PALETTE.length];\n output(`${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.info).bold('[info]')} ${c(trunc(m, 120))}`);\n};\n\nexport const warn = (m: string): void => {\n const colors: Array<(s: string) => string> = [\n (s) => chalk.hex(THEME.warning)(s),\n (s) => chalk.hex(THEME.primary)(s),\n ];\n const c = colors[Math.floor(Math.random() * colors.length)];\n const line = `${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.warning).bold('[warn]')} ${c(trunc(m, 120))}`;\n if (_cooking) _cooking.log(line);\n else console.warn(line);\n};\n\nexport const success = (m: string): void => {\n const colors: Array<(s: string) => string> = [\n (s) => chalk.hex(THEME.success)(s),\n (s) => chalk.hex(THEME.info)(s),\n ];\n const c = colors[Math.floor(Math.random() * colors.length)];\n output(`${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.success)('[ok]')} ${c(trunc(m, 120))}`);\n};\n\nexport const error = (m: string): void => {\n const colors: Array<(s: string) => string> = [\n (s) => chalk.hex(THEME.error)(s),\n ];\n const c = colors[Math.floor(Math.random() * colors.length)];\n const line = `${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.error)('[error]')} ${c(trunc(m, 120))}`;\n if (_cooking) _cooking.log(line);\n else console.error(line);\n};\n","import type { PlatformHandler } from './types.js';\n\nconst FONT_EXTS: string[] = ['.woff2', '.woff', '.ttf', '.otf'];\n\nexport const framer: PlatformHandler = {\n name: 'framer',\n displayName: 'Framer',\n\n detectByUrl(url: string): boolean {\n return /\\.framer\\.(app|website)|framercanvas\\.com/.test(url);\n },\n\n detectByHtml(html: string): boolean {\n return (\n html.includes('id=\"main\"') &&\n (html.includes('framerstatic.com') || html.includes('framerusercontent.com'))\n );\n },\n\n stripDomains: ['events.framer.com', 'api.framer.com', 'collect.frameranalytics.com'],\n\n stripSelectors: [\n 'script[src*=\"events.framer.com\"]',\n '#__framer-badge-container',\n '#__framer-badge',\n 'link[href*=\"canvas-sandbox\"]',\n 'script[src*=\"framer.com/bootstrap\"]',\n ],\n\n stripPatterns: [\n /<div id=\"__framer-badge-container\"[^>]*><\\/div>/g,\n /<script>try\\{if\\(localStorage\\.get\\(\"__framer_force_showing_editorbar_since\"\\)\\)[^<]*<\\/script>/g,\n ],\n\n hydrationTimeout: 10000,\n needsHydrationCheck: true,\n\n mapAssetDir(host: string, pathname: string, ext: string): string | null {\n if (host.includes('framerusercontent.com')) {\n if (pathname.startsWith('/images/')) return 'assets/images';\n if (pathname.startsWith('/assets/')) {\n return FONT_EXTS.includes(ext) ? 'assets/fonts' : 'assets/misc';\n }\n if (pathname.startsWith('/sites/')) {\n if (ext === '.mjs' || ext === '.js') return 'scripts/vendor';\n if (ext === '.json') return 'data';\n if (ext === '.css') return 'styles';\n if (ext === '.framercms') return 'data';\n return 'assets/misc';\n }\n if (pathname.startsWith('/modules/')) {\n return ext === '.framercms' ? 'data' : 'scripts/modules';\n }\n return 'assets/misc';\n }\n\n if (host.includes('app.framerstatic.com')) {\n if (ext === '.css') return 'styles';\n if (ext === '.mjs' || ext === '.js') return 'scripts/vendor';\n if (ext === '.woff2' || ext === '.woff') return 'assets/fonts';\n if (ext === '.png' || ext === '.svg') return 'assets/images';\n return 'assets/misc';\n }\n\n if (host.includes('framercanvas.com') || host.includes('framer.com')) {\n if (ext === '.mjs' || ext === '.js') return 'scripts/vendor';\n if (ext === '.css') return 'styles';\n return 'assets/misc';\n }\n\n return null;\n },\n};\n","import type { PlatformHandler } from './types.js';\n\nconst IMG_EXTS: string[] = ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp', '.avif'];\nconst FONT_EXTS: string[] = ['.woff2', '.woff', '.ttf', '.otf', '.eot'];\nconst VIDEO_EXTS: string[] = ['.mp4', '.webm', '.ogg'];\n\nexport const webflow: PlatformHandler = {\n name: 'webflow',\n displayName: 'Webflow',\n\n detectByUrl(url: string): boolean {\n return /\\.webflow\\.(io|com)/.test(url);\n },\n\n detectByHtml(html: string): boolean {\n return (\n html.includes('data-wf-site') ||\n html.includes('w-webflow-badge') ||\n html.includes('Webflow') ||\n html.includes('webflow.js')\n );\n },\n\n stripDomains: ['js-agent.newrelic.com', 'cdn.heapanalytics.com', 'tr.snapchat.com'],\n\n stripSelectors: ['.w-webflow-badge', 'link[href*=\"editorbar\"]'],\n\n stripPatterns: [\n /<a[^>]*class=\"[^\"]*w-webflow-badge[^\"]*\"[^>]*>[\\s\\S]*?<\\/a>/g,\n /<a[^>]*href=\"[^\"]*webflow\\.com\\?utm_campaign=brandjs[^\"]*\"[^>]*>[\\s\\S]*?<\\/a>/g,\n /<style>[^<]*\\.w-webflow-badge[^<]*<\\/style>/g,\n /Powered by <a[^>]*href=\"[^\"]*webflow\\.com\"[^>]*>[^<]*<\\/a>/g,\n /<!-- This site was created in Webflow\\.[^>]*-->/g,\n /<html([^>]*) data-wf-domain=\"[^\"]*\"/g,\n /<html([^>]*) data-wf-page=\"[^\"]*\"/g,\n /<html([^>]*) data-wf-site=\"[^\"]*\"/g,\n /<html([^>]*) data-wf-status=\"[^\"]*\"/g,\n /<meta[^>]*content=\"Webflow\"[^>]*>/g,\n ],\n\n hydrationTimeout: 2000,\n needsHydrationCheck: false,\n\n mapAssetDir(host: string, pathname: string, ext: string): string | null {\n if (\n host.includes('website-files.com') ||\n host.includes('webflow.com') ||\n host.includes('uploads-ssl.webflow.com')\n ) {\n if (VIDEO_EXTS.includes(ext)) return 'assets/videos';\n if (pathname.includes('/images/') || IMG_EXTS.includes(ext)) return 'assets/images';\n if (pathname.includes('/css/') || ext === '.css') return 'styles';\n if (pathname.includes('/js/') || ext === '.js') return 'scripts/vendor';\n if (pathname.includes('/gsap/') || pathname.includes('/plugins/')) return 'scripts/vendor';\n if (FONT_EXTS.includes(ext)) return 'assets/fonts';\n return 'assets/misc';\n }\n\n if (host.includes('d3e54v103j8qbb.cloudfront.net')) {\n if (ext === '.js') return 'scripts/vendor';\n if (ext === '.css') return 'styles';\n if (IMG_EXTS.includes(ext)) return 'assets/images';\n return 'assets/misc';\n }\n\n return null;\n },\n};\n","import type { PlatformHandler } from './types.js';\n\nconst IMG_EXTS: string[] = ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp', '.avif', '.ico'];\nconst FONT_EXTS: string[] = ['.woff2', '.woff', '.ttf', '.otf', '.eot'];\nconst VIDEO_EXTS: string[] = ['.mp4', '.webm', '.ogg'];\n\nexport const wix: PlatformHandler = {\n name: 'wix',\n displayName: 'Wix',\n\n detectByUrl(url: string): boolean {\n return /\\.wixsite\\.com|\\.wix\\.com/.test(url);\n },\n\n detectByHtml(html: string): boolean {\n return (\n html.includes('wix-viewer-model') ||\n html.includes('id=\"WIX_ADS\"') ||\n html.includes('X-Wix-') ||\n html.includes('Wix.com') ||\n html.includes('wixcode-sdk') ||\n html.includes('data-wix') ||\n html.includes('wix-code') ||\n html.includes('WixCode') ||\n /\\bwix\\.com\\b/.test(html) ||\n /meta\\s+name=[\"']generator[\"']\\s+content=[\"'][^\"']*Wix[^\"']*[\"']/i.test(html) ||\n /_wix_/i.test(html) ||\n /wix-ecom/i.test(html)\n );\n },\n\n stripDomains: [\n 'frog.wix.com',\n 'bi.wixapi.com',\n 'fed.wixcodescheduler.com',\n 'editor.wix.com',\n 'panorama.wixapps.net',\n ],\n\n stripSelectors: ['#WIX_ADS', '.wix-ads', '#wix-badge', '#SCROLL_TO_TOP'],\n\n stripPatterns: [\n /<div[^>]*class=\"[^\"]*wix-ads[^\"]*\"[^>]*>[\\s\\S]*?<\\/div>/g,\n ],\n\n hydrationTimeout: 3000,\n needsHydrationCheck: false,\n\n mapAssetDir(host: string, pathname: string, ext: string): string | null {\n if (host === 'video.wixstatic.com') {\n return 'assets/videos';\n }\n\n if (host.includes('wixstatic.com')) {\n if (VIDEO_EXTS.includes(ext)) return 'assets/videos';\n if (pathname.includes('/images/') || IMG_EXTS.includes(ext)) return 'assets/images';\n if (ext === '.css') return 'styles';\n if (ext === '.js') return 'scripts/vendor';\n if (FONT_EXTS.includes(ext)) return 'assets/fonts';\n return 'assets/misc';\n }\n\n if (host.includes('parastorage.com')) {\n if (ext === '.js') return 'scripts/vendor';\n if (ext === '.css') return 'styles';\n if (FONT_EXTS.includes(ext)) return 'assets/fonts';\n if (IMG_EXTS.includes(ext)) return 'assets/images';\n return 'assets/misc';\n }\n\n return null;\n },\n};\n","import type { PlatformHandler, PlatformType } from './types.js';\nimport type { Page } from 'puppeteer';\nimport { framer } from './framer.js';\nimport { webflow } from './webflow.js';\nimport { wix } from './wix.js';\n\nconst ALL_PLATFORMS: PlatformHandler[] = [framer, webflow, wix];\n\nexport function detectByUrl(url: string): PlatformHandler | null {\n for (const platform of ALL_PLATFORMS) {\n if (platform.detectByUrl(url)) return platform;\n }\n return null;\n}\n\nexport function detectByHtml(html: string): PlatformHandler | null {\n for (const platform of ALL_PLATFORMS) {\n if (platform.detectByHtml(html)) return platform;\n }\n return null;\n}\n\nexport function detectPlatform(url: string, html?: string): PlatformHandler {\n const byUrl = detectByUrl(url);\n if (byUrl) return byUrl;\n\n if (html) {\n const byHtml = detectByHtml(html);\n if (byHtml) return byHtml;\n }\n\n return framer;\n}\n\nexport async function detectByDom(page: Page): Promise<PlatformHandler | null> {\n try {\n const signal: string = await page.evaluate(() => {\n const html: string = document.documentElement.outerHTML || '';\n\n if (/wix-viewer-model|_wix_|wix-ecom/i.test(html)) return 'wix';\n if (/data-wf-|w-webflow-badge|webflow\\.js/i.test(html)) return 'webflow';\n if (/framerusercontent|framercanvas|framerstatic/i.test(html)) return 'framer';\n\n const srcs: string[] = [];\n const scripts: NodeListOf<HTMLScriptElement> = document.querySelectorAll('script[src]');\n scripts.forEach((s) => { if (s.src) srcs.push(s.src); });\n const allSrcs: string = srcs.join(' ');\n if (/wixstatic\\.com|parastorage\\.com/.test(allSrcs)) return 'wix';\n if (/website-files\\.com|webflow\\.com/.test(allSrcs)) return 'webflow';\n if (/framerusercontent\\.com|framerstatic\\.com|framer\\.app/.test(allSrcs)) return 'framer';\n\n return '';\n });\n\n if (signal === 'wix') return wix;\n if (signal === 'webflow') return webflow;\n if (signal === 'framer') return framer;\n } catch {}\n return null;\n}\n\nexport function getPlatformByName(name: PlatformType): PlatformHandler {\n const map: Record<string, PlatformHandler> = { framer, webflow, wix };\n return map[name] || framer;\n}\n","export type { PlatformHandler, PlatformType } from './types.js';\nexport { framer } from './framer.js';\nexport { webflow } from './webflow.js';\nexport { wix } from './wix.js';\nexport { detectPlatform, detectByUrl, detectByHtml, detectByDom, getPlatformByName } from './detect.js';\n","import puppeteer, { type Page } from 'puppeteer';\nimport { CFG } from '../config/index.js';\nimport { log, success, info } from '../logger/index.js';\nimport { detectByDom } from '../platforms/index.js';\nimport type { ExporterContext } from '../types.js';\n\nexport async function launchAndCapture(exporter: ExporterContext): Promise<void> {\n exporter.cooking?.update('Launching browser...');\n log('Launching headless Chromium...');\n\n exporter.browser = await puppeteer.launch({\n headless: true,\n args: ['--no-sandbox', '--disable-setuid-sandbox'],\n });\n success('Chromium launched');\n\n exporter.page = await exporter.browser.newPage();\n await exporter.page.setViewport(CFG.viewport);\n log('Viewport set to ' + CFG.viewport.width + 'x' + CFG.viewport.height);\n\n await exporter.page.setUserAgent(\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' +\n '(KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'\n );\n log('User agent set to Chrome 131');\n\n const allStripDomains: string[] = [\n ...CFG.sharedStripDomains,\n ...exporter.platform.stripDomains,\n ];\n log('Blocking ' + allStripDomains.length + ' tracking domains:');\n for (const domain of allStripDomains) {\n log(' - ' + domain);\n }\n\n let intercepted = 0;\n let blocked = 0;\n\n exporter.page.on('response', async (res) => {\n const url: string = res.url();\n if (url.startsWith('data:') || url.startsWith('blob:')) return;\n\n try {\n const host: string = new URL(url).hostname;\n if (allStripDomains.some((d) => host.includes(d))) {\n blocked++;\n return;\n }\n } catch {\n return;\n }\n\n exporter.assets.localPathFor(url, exporter.platform);\n try {\n exporter.assets.buffers.set(url, await res.buffer());\n intercepted++;\n } catch {}\n });\n\n log('Network interception enabled');\n\n exporter.cooking?.update('Navigating to site...');\n info('Navigating to ' + exporter.siteUrl);\n await exporter.page.goto(exporter.siteUrl, {\n waitUntil: 'networkidle2',\n timeout: CFG.timeout,\n });\n success('Page loaded (networkidle2)');\n log('Intercepted ' + intercepted + ' resources, blocked ' + blocked + ' tracking requests');\n\n log('Checking DOM-based platform detection...');\n const domDetected = await detectByDom(exporter.page);\n if (domDetected && domDetected.name !== exporter.platform.name) {\n log('Platform refined from DOM: ' + domDetected.displayName + ' (override: ' + exporter.platform.name + ')');\n exporter.platform = domDetected;\n }\n\n exporter.cooking?.update('Waiting for ' + exporter.platform.displayName + ' hydration...');\n\n if (exporter.platform.needsHydrationCheck) {\n log('Checking for #main element hydration...');\n log('Hydration timeout: ' + exporter.platform.hydrationTimeout + 'ms');\n const timeout = exporter.platform.hydrationTimeout;\n await exporter.page.evaluate(`\n new Promise(function(r) {\n var start = Date.now();\n var tick = function() {\n var m = document.getElementById('main') || document.body;\n if (m && m.children.length > 0) setTimeout(r, 2000);\n else if (Date.now() - start > ${timeout}) r();\n else setTimeout(tick, 200);\n };\n tick();\n })\n `);\n success('Hydration complete (SPA rendered)');\n } else {\n log('Static site detected, waiting ' + exporter.platform.hydrationTimeout + 'ms for render...');\n await new Promise<void>((r) => setTimeout(r, exporter.platform.hydrationTimeout));\n success(exporter.platform.displayName + ' page rendered');\n }\n\n exporter.cooking?.update('Scrolling page...');\n log('Starting full-page scroll (step: ' + CFG.scrollStep + 'px, delay: ' + CFG.scrollDelay + 'ms)');\n\n const scrollStep = CFG.scrollStep;\n const scrollDelay = CFG.scrollDelay;\n\n const pageHeight: number = await exporter.page.evaluate(`\n Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)\n `) as number;\n log('Page height: ' + pageHeight + 'px (' + Math.ceil(pageHeight / scrollStep) + ' scroll steps)');\n\n await exporter.page.evaluate(`\n new Promise(function(r) {\n var y = 0;\n var max = Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n var step = function() {\n y += ${scrollStep};\n window.scrollTo({ top: y, behavior: 'instant' });\n y < max + 500 ? setTimeout(step, ${scrollDelay}) : (window.scrollTo(0, 0), r());\n };\n step();\n })\n `);\n success('Full-page scroll complete');\n\n exporter.cooking?.update('Waiting for lazy resources...');\n log('Waiting 2s for lazy-loaded resources...');\n await new Promise<void>((r) => setTimeout(r, 2000));\n\n log('Checking network idle (1.5s quiet, 8s timeout)...');\n try {\n await exporter.page.waitForNetworkIdle({ idleTime: 1500, timeout: 8000 });\n success('Network idle confirmed');\n } catch {\n log('Network idle timeout reached (continuing anyway)');\n }\n\n const totalCaptured: number = exporter.assets.buffers.size;\n success('Captured ' + totalCaptured + ' network resources total');\n\n const cssCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.endsWith('.css')).length;\n const jsCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.endsWith('.js') || e.localPath.endsWith('.mjs')).length;\n const imgCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.startsWith('assets/images')).length;\n const fontCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.startsWith('assets/fonts')).length;\n log(' CSS: ' + cssCount + ' | JS: ' + jsCount + ' | Images: ' + imgCount + ' | Fonts: ' + fontCount);\n}\n\nexport async function closeBrowser(exporter: { browser: import('puppeteer').Browser | null }): Promise<void> {\n if (exporter.browser) {\n await exporter.browser.close();\n exporter.browser = null;\n log('Browser closed');\n }\n}\n\nexport async function captureSubpage(\n page: Page,\n url: string,\n platform: { needsHydrationCheck: boolean; hydrationTimeout: number }\n): Promise<string> {\n log(' Navigating to sub-page: ' + url);\n await page.goto(url, { waitUntil: 'networkidle2', timeout: CFG.timeout });\n\n if (platform.needsHydrationCheck) {\n await page.evaluate(\n `new Promise(function(r) {\n var t = Date.now();\n (function tick() {\n var m = document.getElementById('main') || document.body;\n if (m && m.children.length > 0) setTimeout(r, 500);\n else if (Date.now() - t > ${platform.hydrationTimeout}) r();\n else setTimeout(tick, 200);\n })();\n })`\n );\n } else {\n await new Promise<void>((r) => setTimeout(r, 1000));\n }\n\n const html: string = await page.evaluate(() => document.documentElement.outerHTML || document.body.innerHTML);\n log(' Sub-page fetched: ' + (html.length / 1024).toFixed(1) + ' KB');\n return html;\n}\n","export async function pool(tasks: Array<() => Promise<void>>, n: number): Promise<void> {\n let i = 0;\n const run = async (): Promise<void> => {\n while (i < tasks.length) {\n const j = i++;\n await tasks[j]();\n }\n };\n await Promise.all(Array.from({ length: Math.min(n, tasks.length) }, () => run()));\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { CFG } from '../config/index.js';\nimport { log, warn, success } from '../logger/index.js';\nimport { dlBuffer } from '../network/download.js';\nimport { pool } from '../network/pool.js';\nimport type { ExporterContext } from '../types.js';\n\nexport async function downloadAll(exporter: ExporterContext): Promise<void> {\n const seen: Set<string> = new Set();\n const toDownload: Array<{ url: string; localPath: string }> = [];\n for (const [url, { localPath }] of exporter.assets.entries) {\n if (seen.has(localPath)) continue;\n seen.add(localPath);\n toDownload.push({ url, localPath });\n }\n\n const total: number = toDownload.length;\n log('Starting download of ' + total + ' unique assets');\n log('Concurrency: ' + CFG.concurrency + ' parallel downloads');\n log('Retry policy: ' + CFG.retries + ' attempts, ' + CFG.dlTimeout + 'ms timeout');\n\n let ok = 0;\n let cached = 0;\n let fail = 0;\n let completed = 0;\n let lastReported = 0;\n\n const tasks: Array<() => Promise<void>> = toDownload.map(\n ({ url, localPath }) =>\n async (): Promise<void> => {\n const dest: string = path.join(exporter.outDir, localPath);\n await fs.mkdir(path.dirname(dest), { recursive: true });\n\n try {\n const buf: Buffer | undefined =\n exporter.assets.buffers.get(url) ||\n exporter.assets.buffers.get(url.split('?')[0]);\n if (buf) {\n await fs.writeFile(dest, buf);\n cached++;\n ok++;\n } else {\n const data: Buffer = await dlBuffer(url);\n await fs.writeFile(dest, data);\n ok++;\n }\n } catch (e) {\n fail++;\n if (\n !url.includes('framer.com/edit') &&\n !url.includes('framerstatic.com/editorbar')\n ) {\n warn('Download failed: ' + path.basename(localPath) + ' - ' + (e as Error).message);\n }\n }\n\n completed++;\n const pct: number = Math.floor((completed / total) * 100);\n if (pct >= lastReported + 10 || completed === total) {\n exporter.cooking?.update('Downloading... ' + completed + '/' + total + ' (' + pct + '%)');\n log('Download progress: ' + completed + '/' + total + ' (' + pct + '%)');\n lastReported = pct;\n }\n }\n );\n\n await pool(tasks, CFG.concurrency);\n\n success('Downloads complete: ' + ok + ' succeeded, ' + cached + ' from cache, ' + fail + ' failed');\n\n const totalBytes: number = [...exporter.assets.entries.values()].length;\n log('Total unique assets written to disk: ' + totalBytes);\n\n exporter.assets.buffers.clear();\n log('Network buffer cache cleared');\n}\n","import prettier from 'prettier';\n\nexport async function prettifyJS(src: string): Promise<string> {\n try {\n return await prettier.format(src, {\n parser: 'babel',\n printWidth: 100,\n tabWidth: 2,\n useTabs: false,\n semi: true,\n singleQuote: false,\n trailingComma: 'es5',\n bracketSpacing: true,\n arrowParens: 'always',\n });\n } catch {\n return src;\n }\n}\n","export const SERVE_SCRIPT: string = `#!/usr/bin/env node\nconst http = require('http');\nconst fs = require('fs');\nconst path = require('path');\n\nconst PORT = process.env.PORT || 3000;\nconst ROOT = __dirname;\n\nconst MIME = {\n '.html': 'text/html; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.js': 'application/javascript; charset=utf-8',\n '.mjs': 'application/javascript; charset=utf-8',\n '.json': 'application/json; charset=utf-8',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n '.avif': 'image/avif',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n '.otf': 'font/otf',\n '.mp4': 'video/mp4',\n '.webm': 'video/webm',\n '.ogg': 'video/ogg',\n '.framercms': 'application/octet-stream',\n};\n\nconst server = http.createServer((req, res) => {\n let url = decodeURIComponent(req.url.split('?')[0]);\n if (url === '/') url = '/index.html';\n\n let filePath = path.join(ROOT, url);\n if (!filePath.startsWith(ROOT)) {\n res.writeHead(403);\n res.end('Forbidden');\n return;\n }\n\n const serveFile = (pathToFile) => {\n fs.readFile(pathToFile, (err, data) => {\n if (err) {\n // SPA Fallback: if it's not a file, serve index.html\n if (url !== '/index.html' && !path.extname(url)) {\n return serveFile(path.join(ROOT, 'index.html'));\n }\n res.writeHead(404);\n res.end('Not found');\n return;\n }\n const ext = path.extname(pathToFile).toLowerCase();\n const mime = MIME[ext] || 'application/octet-stream';\n res.writeHead(200, {\n 'Content-Type': mime,\n 'Access-Control-Allow-Origin': '*',\n 'Cache-Control': 'public, max-age=3600',\n });\n res.end(data);\n });\n };\n\n serveFile(filePath);\n});\n\nserver.listen(PORT, () => {\n console.log('\\\\x1b[32m%s\\\\x1b[0m', ' 🚀 Cooksite Local Server Running');\n console.log('\\\\x1b[36m%s\\\\x1b[0m', ' ├─ URL: http://localhost:' + PORT);\n console.log('\\\\x1b[35m%s\\\\x1b[0m', ' └─ Directory: ' + ROOT);\n console.log('\\\\n Press Ctrl+C to stop.');\n});\n`;\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { log, warn, success } from '../logger/index.js';\nimport { prettifyJS } from '../formatter/prettify.js';\nimport { SERVE_SCRIPT } from '../server/template.js';\nimport type { ExporterContext } from '../types.js';\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction stripBySelector(html: string, sel: string): string {\n if (sel.includes('[src*=\"')) {\n const match = sel.match(/\\[src\\*=\"([^\"]+)\"\\]/);\n if (match) {\n const domain: string = escapeRegex(match[1]);\n html = html.replace(new RegExp(`<script[^>]*${domain}[^>]*>[^<]*<\\\\/script>`, 'g'), '');\n html = html.replace(new RegExp(`<script[^>]*${domain}[^>]*><\\\\/script>`, 'g'), '');\n }\n } else if (sel.includes('[href*=\"')) {\n const match = sel.match(/\\[href\\*=\"([^\"]+)\"\\]/);\n if (match) {\n const href: string = escapeRegex(match[1]);\n html = html.replace(new RegExp(`<link[^>]*${href}[^>]*>`, 'g'), '');\n }\n } else if (sel.startsWith('.')) {\n const cls: string = escapeRegex(sel.slice(1));\n html = html.replace(\n new RegExp(`<[^>]*class=\"[^\"]*${cls}[^\"]*\"[^>]*>[\\\\s\\\\S]*?<\\\\/[^>]*>`, 'g'),\n ''\n );\n } else if (sel.startsWith('#')) {\n const id: string = sel.slice(1);\n html = removeElementById(html, id);\n }\n return html;\n}\n\nfunction removeElementById(html: string, id: string): string {\n const marker: string = `id=\"${id}\"`;\n let idx: number = html.indexOf(marker);\n while (idx !== -1) {\n const tagStart: number = html.lastIndexOf('<', idx);\n if (tagStart === -1) break;\n\n const tagNameEnd: number = html.indexOf(' ', tagStart + 1);\n const tagName: string = html.slice(tagStart + 1, tagNameEnd).toLowerCase();\n\n let depth = 0;\n let i: number = tagStart;\n while (i < html.length) {\n if (html.startsWith(`<${tagName}`, i) && (html[i + tagName.length + 1] === ' ' || html[i + tagName.length + 1] === '>')) {\n depth++;\n i += tagName.length + 1;\n } else if (html.startsWith(`</${tagName}>`, i)) {\n depth--;\n if (depth === 0) {\n html = html.slice(0, tagStart) + html.slice(i + tagName.length + 3);\n break;\n }\n i += tagName.length + 3;\n } else {\n i++;\n }\n }\n\n idx = html.indexOf(marker);\n }\n return html;\n}\n\nfunction processSEO(html: string, url: string): string {\n const canonical = url.split('?')[0].replace(/\\/$/, '');\n \n // Inject Canonical\n if (!html.includes('rel=\"canonical\"')) {\n html = html.replace('</head>', ` <link rel=\"canonical\" href=\"${canonical}\">\\n </head>`);\n }\n\n // Inject Meta Description if missing\n if (!html.includes('name=\"description\"')) {\n html = html.replace('</head>', ` <meta name=\"description\" content=\"Exported with Cooksite - Fast, SEO-optimized, and clean.\">\\n </head>`);\n }\n\n // Inject OG Tags if missing\n if (!html.includes('property=\"og:')) {\n html = html.replace('</head>', ` <meta property=\"og:type\" content=\"website\">\\n <meta property=\"og:url\" content=\"${canonical}\">\\n <meta property=\"og:title\" content=\"Exported Site\">\\n <meta property=\"og:description\" content=\"A fast, clean version of this site, exported for performance.\">\\n </head>`);\n }\n\n // Inject Robot tags\n if (!html.includes('name=\"robots\"')) {\n html = html.replace('</head>', ` <meta name=\"robots\" content=\"index, follow\">\\n </head>`);\n }\n\n return html;\n}\n\nfunction stripIntegrityAndCors(html: string): string {\n html = html.replace(/\\s+integrity=\"[^\"]*\"/g, '');\n html = html.replace(/\\s+crossorigin=\"[^\"]*\"/g, '');\n html = html.replace(/\\s+crossorigin/g, '');\n html = html.replace(/<link[^>]*rel=\"preconnect\"[^>]*>/g, '');\n html = html.replace(/<link[^>]*rel=\"dns-prefetch\"[^>]*>/g, '');\n html = html.replace(/<meta[^>]*content-security-policy[^>]*>/gi, '');\n return html;\n}\n\nfunction stripSrcsetCdnUrls(html: string): string {\n html = html.replace(/srcset=\"([^\"]*)\"/g, (_match: string, srcset: string) => {\n const cleaned: string = srcset\n .split(',')\n .map((entry: string) => entry.trim())\n .filter((entry: string) => !entry.startsWith('http'))\n .join(', ');\n return cleaned ? 'srcset=\"' + cleaned + '\"' : '';\n });\n return html;\n}\n\nexport async function buildOutput(exporter: ExporterContext): Promise<void> {\n exporter.cooking?.update('Stripping platform badges...');\n log('Starting HTML post-processing...');\n log('HTML size: ' + (exporter.ssrHTML.length / 1024).toFixed(1) + ' KB');\n\n let html: string = exporter.ssrHTML;\n if (!html) {\n warn('No SSR HTML available, cannot build output');\n return;\n }\n\n exporter.cooking?.update('Removing integrity checks...');\n const beforeIntegrity: number = html.length;\n html = stripIntegrityAndCors(html);\n log('Stripped integrity/crossorigin/preconnect (' + (beforeIntegrity - html.length) + ' chars)');\n success('Integrity and CORS restrictions removed');\n\n if (typeof processSEO === 'function') {\n exporter.cooking?.update('Optimizing SEO...');\n html = processSEO(html, exporter.siteUrl);\n success('SEO meta tags optimized');\n }\n\n log('Stripping ' + exporter.platform.stripSelectors.length + ' selectors:');\n for (const sel of exporter.platform.stripSelectors) {\n const before: number = html.length;\n html = stripBySelector(html, sel);\n const removed: number = before - html.length;\n if (removed > 0) {\n log(' Stripped ' + sel + ' (' + removed + ' chars removed)');\n }\n }\n\n log('Applying ' + exporter.platform.stripPatterns.length + ' regex patterns...');\n for (const pattern of exporter.platform.stripPatterns) {\n const before: number = html.length;\n html = html.replace(new RegExp(pattern.source, pattern.flags), '');\n const removed: number = before - html.length;\n if (removed > 0) {\n log(' Pattern removed ' + removed + ' chars');\n }\n }\n success('Platform badges and tracking stripped');\n\n exporter.cooking?.update('Rewriting asset URLs...');\n log('Rewriting ' + exporter.assets.entries.size + ' CDN URLs to local paths...');\n const beforeRewrite: number = html.length;\n html = exporter.assets.rewrite(html, '');\n log('HTML rewrite delta: ' + (html.length - beforeRewrite) + ' chars');\n\n exporter.cooking?.update('Cleaning srcset references...');\n html = stripSrcsetCdnUrls(html);\n log('Cleaned remaining CDN URLs from srcset attributes');\n\n await rewriteDownloadedFiles(exporter);\n success('All URLs rewritten to local paths');\n\n exporter.cooking?.update('Pretty-printing JS files...');\n await prettifyDownloadedJS(exporter);\n\n exporter.cooking?.update('Writing final output...');\n log('Writing index.html (' + (html.length / 1024).toFixed(1) + ' KB)...');\n await fs.writeFile(path.join(exporter.outDir, 'index.html'), html);\n success('index.html written');\n\n await fs.writeFile(path.join(exporter.outDir, 'serve.cjs'), SERVE_SCRIPT);\n log('serve.cjs written');\n success('Output build complete');\n}\n\nasync function rewriteDownloadedFiles(exporter: ExporterContext): Promise<void> {\n const dirs: string[] = ['scripts/vendor', 'scripts/modules', 'styles'];\n let rewritten = 0;\n\n for (const dir of dirs) {\n const fullDir: string = path.join(exporter.outDir, dir);\n let files: string[];\n try {\n files = await fs.readdir(fullDir);\n } catch {\n continue;\n }\n\n for (const file of files) {\n const ext: string = path.extname(file).toLowerCase();\n if (!['.mjs', '.js', '.css'].includes(ext)) continue;\n\n const filePath: string = path.join(fullDir, file);\n try {\n let content: string = await fs.readFile(filePath, 'utf-8');\n const before: string = content;\n content = exporter.assets.rewrite(content, dir);\n if (content !== before) {\n await fs.writeFile(filePath, content);\n rewritten++;\n }\n } catch {}\n }\n }\n log('Rewrote URLs in ' + rewritten + ' JS/CSS files');\n}\n\nasync function prettifyDownloadedJS(exporter: ExporterContext): Promise<void> {\n const dirs: string[] = ['scripts/vendor', 'scripts/modules'];\n let count = 0;\n let total = 0;\n\n for (const dir of dirs) {\n const fullDir: string = path.join(exporter.outDir, dir);\n let files: string[];\n try {\n files = await fs.readdir(fullDir);\n } catch {\n continue;\n }\n\n const jsFiles: string[] = files.filter((f) => {\n const ext: string = path.extname(f).toLowerCase();\n return ext === '.mjs' || ext === '.js';\n });\n total += jsFiles.length;\n\n for (const file of jsFiles) {\n const filePath: string = path.join(fullDir, file);\n try {\n const raw: string = await fs.readFile(filePath, 'utf-8');\n\n const nlRatio: number = (raw.match(/\\n/g) || []).length / raw.length;\n if (nlRatio > 0.05) {\n count++;\n continue;\n }\n\n const pretty: string = await prettifyJS(raw);\n await fs.writeFile(filePath, pretty, 'utf-8');\n count++;\n\n if (count % 5 === 0) {\n exporter.cooking?.update('Pretty-printing... (' + count + '/' + total + ')');\n }\n } catch (e) {\n warn('Pretty-print skipped: ' + file + ' - ' + (e as Error).message);\n count++;\n }\n }\n }\n\n success('Formatted ' + count + '/' + total + ' JS/MJS files');\n}\n","import chalk from 'chalk';\nimport { stripAnsi, ui } from './theme.js';\n\nexport function maxWidth(): number {\n return Math.min(process.stdout.columns || 80, 62);\n}\n\nfunction padRight(text: string, w: number): string {\n const visible = stripAnsi(text).length;\n if (visible >= w) return text;\n return text + ' '.repeat(w - visible);\n}\n\nexport function boxTop(w: number): string {\n const inner = w - 4;\n return ' ' + ui.border('╭─') + ui.border('─'.repeat(inner)) + ui.border('─╮');\n}\n\nexport function boxBot(w: number): string {\n const inner = w - 4;\n return ' ' + ui.border('╰─') + ui.border('─'.repeat(inner)) + ui.border('─╯');\n}\n\nexport function boxLine(w: number, text: string): string {\n const inner = w - 4;\n const padded = padRight(text, inner);\n return ' ' + ui.border('│ ') + padded + ui.border(' │');\n}\n\nexport function boxSep(w: number): string {\n const inner = w - 4;\n return ' ' + ui.border('├─') + ui.border('─'.repeat(inner)) + ui.border('─┤');\n}\n\nexport function boxRow(w: number, label: string, value: string): string {\n const inner = w - 4;\n const labelPlain = stripAnsi(chalk.bold(label));\n const visible = labelPlain.length + 1 + value.length;\n if (visible > inner) {\n const avail = inner - labelPlain.length - 2;\n const truncated = value.length > avail ? value.slice(0, avail - 1) + '..' : value;\n return (\n ' ' +\n ui.border('│ ') +\n chalk.bold(label) +\n ': ' +\n ui.primary(truncated) +\n ' '.repeat(Math.max(0, inner - labelPlain.length - 1 - truncated.length)) +\n ui.border(' │')\n );\n }\n const right = inner - labelPlain.length - 1 - value.length;\n return (\n ' ' +\n ui.border('│ ') +\n chalk.bold(label) +\n ': ' +\n ui.primary(value) +\n ' '.repeat(right) +\n ui.border(' │')\n );\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport type { ExporterContext } from '../types.js';\nimport { boxTop, boxLine, boxBot, boxSep, maxWidth } from '../cli/box.js';\nimport { chip, ui } from '../cli/theme.js';\n\nexport async function printSummary(exporter: ExporterContext): Promise<void> {\n const w = maxWidth();\n const isSmall = w < 50;\n\n const count = async (d: string): Promise<number> => {\n try {\n return (await fs.readdir(path.join(exporter.outDir, d))).length;\n } catch {\n return 0;\n }\n };\n const [imgs, fonts, videos, misc, scripts, vendor, styles, data, subpages] = await Promise.all([\n count('assets/images'),\n count('assets/fonts'),\n count('assets/videos'),\n count('assets/misc'),\n count('scripts/modules'),\n count('scripts/vendor'),\n count('styles'),\n count('data'),\n count('subpages'),\n ]);\n\n const G = ui.primary;\n const G2 = ui.primarySoft;\n const C2 = ui.secondary;\n const Y = ui.accent;\n const O = ui.warning;\n const Br = ui.info;\n const Gr = ui.muted;\n const Gn = ui.success;\n\n const entries: Array<[string, number, string, (s: string) => string]> = [\n ['styles/', styles, 'CSS', G],\n ['scripts/vendor/', vendor, 'JS vendor', G2],\n ['scripts/modules/', scripts, 'JS modules', C2],\n ['assets/images/', imgs, 'images', Y],\n ['assets/videos/', videos, 'videos', O],\n ['assets/fonts/', fonts, 'fonts', Br],\n ['assets/misc/', misc, 'misc', Gr],\n ['data/', data, 'data', Gr],\n ['subpages/', subpages, 'pages', Gn],\n ];\n\n console.log('');\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, `${ui.text.bold(' Export Summary')} ${chip('done')}`));\n console.log(boxSep(w));\n } else {\n console.log(ui.text.bold(' Export Summary:'));\n }\n\n for (const [label, cnt, type, color] of entries) {\n if (cnt === 0) continue;\n const inner = w - 4;\n const l = label.padEnd(16);\n const c = String(cnt).padStart(3);\n const rowText = `${color(l)}${ui.text(c)} ${ui.muted(type)}`;\n const visible = 16 + 3 + 2 + type.length;\n const pad = Math.max(0, inner - visible);\n if (isSmall) {\n console.log(` ${color(label)} ${ui.text(String(cnt))} ${ui.muted(type)}`);\n } else {\n console.log(' ' + ui.border('│ ') + rowText + ' '.repeat(pad) + ui.border(' │'));\n }\n }\n\n if (!isSmall) {\n console.log(boxBot(w));\n }\n\n console.log('');\n const cdCmd = 'cd ' + path.basename(exporter.outDir) + ' && node serve.cjs';\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, ui.text.bold(' To serve locally')));\n console.log(boxSep(w));\n const inner = w - 6;\n const cmdLen = cdCmd.length;\n const pad = Math.max(0, inner - cmdLen);\n console.log(' ' + ui.border('│ ') + G(cdCmd) + ' '.repeat(pad) + ui.muted(' copy') + ui.border(' │'));\n console.log(boxBot(w));\n } else {\n console.log(ui.text.bold(' To serve locally:'));\n console.log(` ${G(cdCmd)}`);\n }\n\n console.log('');\n console.log(ui.muted(' note: must be served via HTTP for JS modules to work.'));\n console.log('');\n}\n","import readline from 'node:readline';\nimport { stdin, stdout } from 'node:process';\nimport { stripAnsi, ui } from './theme.js';\n\nexport interface SelectOption {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\nexport async function select(\n question: string,\n options: SelectOption[],\n defaultIndex: number = 0\n): Promise<string> {\n const isTTY = stdin.isTTY && stdout.isTTY;\n\n if (!isTTY) {\n return fallbackPrompt(question, options, defaultIndex);\n }\n\n return arrowSelect(question, options, defaultIndex);\n}\n\nasync function arrowSelect(\n question: string,\n options: SelectOption[],\n defaultIndex: number\n): Promise<string> {\n return new Promise((resolve) => {\n const firstEnabled: number = options.findIndex((option) => !option.disabled);\n let selected: number = options[defaultIndex]?.disabled ? firstEnabled : defaultIndex;\n if (selected < 0) selected = 0;\n\n const move = (direction: -1 | 1): void => {\n let next = selected + direction;\n while (next >= 0 && next < options.length) {\n if (!options[next].disabled) {\n selected = next;\n return;\n }\n next += direction;\n }\n };\n\n const render = (initial: boolean = false): void => {\n if (!initial) {\n stdout.write(`\\x1B[${options.length + 1}A`);\n stdout.write('\\x1B[J');\n }\n console.log(` ${ui.primary('●')} ${ui.text.bold(question)}`);\n for (let i = 0; i < options.length; i++) {\n if (options[i].disabled) {\n console.log(` ${ui.muted(stripAnsi(options[i].label))}`);\n } else if (i === selected) {\n console.log(` ${ui.primary('>')} ${ui.text.bold(options[i].label)}`);\n } else {\n console.log(` ${ui.muted(options[i].label)}`);\n }\n }\n };\n\n render(true);\n\n readline.emitKeypressEvents(stdin);\n stdin.setRawMode(true);\n\n const onKeypress = (_str: string | undefined, key: readline.Key): void => {\n if (!key) return;\n\n if (key.name === 'up' && selected > 0) {\n move(-1);\n render();\n } else if (key.name === 'down' && selected < options.length - 1) {\n move(1);\n render();\n } else if (key.name === 'return') {\n stdin.setRawMode(false);\n stdin.removeListener('keypress', onKeypress);\n stdin.pause();\n\n stdout.write(`\\x1B[${options.length + 1}A`);\n stdout.write('\\x1B[J');\n console.log(\n ` ${ui.success('✓')} ${ui.text.bold(question)} ${ui.primary(stripAnsi(options[selected].label))}\\n`\n );\n\n resolve(options[selected].value);\n } else if ((key.ctrl && key.name === 'c') || key.name === 'escape') {\n stdin.setRawMode(false);\n stdin.removeListener('keypress', onKeypress);\n process.exit(0);\n }\n };\n\n stdin.resume();\n stdin.on('keypress', onKeypress);\n });\n}\n\nasync function fallbackPrompt(\n question: string,\n options: SelectOption[],\n defaultIndex: number\n): Promise<string> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: stdin, output: stdout });\n const firstEnabled: number = options.findIndex((option) => !option.disabled);\n const enabledDefault: number = options[defaultIndex]?.disabled ? firstEnabled : defaultIndex;\n\n console.log(` ${ui.primary('●')} ${ui.text.bold(question)}\\n`);\n for (let i = 0; i < options.length; i++) {\n const marker = i === enabledDefault ? ui.success(' ◆') : ' ';\n const label = options[i].disabled\n ? ui.muted(stripAnsi(options[i].label))\n : ui.text(options[i].label);\n console.log(` ${ui.muted(`[${i + 1}]`)}${marker} ${label}`);\n }\n console.log('');\n const def = String(enabledDefault + 1);\n\n const ask = (): void => {\n rl.question(\n ` ${ui.primary('>')} ${ui.muted(`Choose [1-${options.length}] (${def})`)}: `,\n (answer) => {\n const trimmed = answer.trim();\n if (!trimmed) {\n rl.close();\n const label = stripAnsi(options[enabledDefault].label);\n console.log(` ${ui.success('✓')} ${ui.primary(label)}\\n`);\n resolve(options[enabledDefault].value);\n return;\n }\n const idx = parseInt(trimmed, 10);\n if (idx >= 1 && idx <= options.length && !options[idx - 1].disabled) {\n rl.close();\n const label = stripAnsi(options[idx - 1].label);\n console.log(` ${ui.success('✓')} ${ui.primary(label)}\\n`);\n resolve(options[idx - 1].value);\n } else if (idx >= 1 && idx <= options.length && options[idx - 1].disabled) {\n console.log(` ${ui.error('✗')} ${ui.warning('Option unavailable for now')}\\n`);\n ask();\n } else {\n console.log(` ${ui.error('✗')} ${ui.warning(`Enter 1-${options.length}`)}\\n`);\n ask();\n }\n }\n );\n };\n ask();\n });\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { stdin, stdout } from 'node:process';\nimport { spawn } from 'node:child_process';\nimport chalk from 'chalk';\nimport type { ExporterContext } from '../types.js';\nimport { select, type SelectOption } from '../cli/select.js';\nimport { boxTop, boxLine, boxSep, boxBot, maxWidth } from '../cli/box.js';\n\ninterface ConversionTarget {\n id: string;\n label: string;\n stack: string;\n projectDir: string;\n staticDir: string;\n scaffold: string;\n entryFiles: string;\n routing: string;\n}\n\ninterface AiTool {\n id: string;\n label: string;\n displayName: string;\n agentName: string;\n}\n\ninterface ConversionGoal {\n id: string;\n label: string;\n instruction: string;\n priority: string;\n}\n\ninterface ExportFacts {\n sourceUrl: string;\n outputDir: string;\n platformName: string;\n rootEntries: string[];\n counts: Record<string, number>;\n}\n\nconst IMPORTANT_DIRS = [\n 'index.html',\n 'styles',\n 'scripts/vendor',\n 'scripts/modules',\n 'assets/images',\n 'assets/videos',\n 'assets/fonts',\n 'assets/misc',\n 'data',\n 'subpages',\n];\n\nconst AI_TOOLS: AiTool[] = [\n {\n id: 'claude-code',\n label: 'Claude Code',\n displayName: 'Claude Code',\n agentName: 'Claude Code',\n },\n {\n id: 'codex',\n label: 'Codex',\n displayName: 'Codex',\n agentName: 'Codex coding agent',\n },\n {\n id: 'opencode',\n label: 'OpenCode',\n displayName: 'OpenCode',\n agentName: 'OpenCode',\n },\n {\n id: 'other-ai',\n label: 'Other AI coding agent',\n displayName: 'Other AI',\n agentName: 'AI coding agent',\n },\n];\n\nconst TARGETS: ConversionTarget[] = [\n {\n id: 'react-vite',\n label: 'React + Vite + TypeScript',\n stack: 'React 18/19, TypeScript, Vite, CSS modules or plain CSS',\n projectDir: 'converted-react-vite',\n staticDir: 'public',\n scaffold: 'npm create vite@latest converted-react-vite -- --template react-ts',\n entryFiles: 'src/main.tsx, src/App.tsx, src/components/*, src/styles/*',\n routing: 'Use React Router only if multiple exported pages exist in subpages/.',\n },\n {\n id: 'nextjs-app-router',\n label: 'Next.js App Router',\n stack: 'Next.js App Router, TypeScript, React Server Components where useful',\n projectDir: 'converted-nextjs',\n staticDir: 'public',\n scaffold: 'npx create-next-app@latest converted-nextjs --ts --app --eslint',\n entryFiles: 'app/page.tsx, app/layout.tsx, components/*, public/*',\n routing: 'Map exported subpages to app routes and keep shared layout code reusable.',\n },\n {\n id: 'vue-vite',\n label: 'Vue + Vite + TypeScript',\n stack: 'Vue 3, TypeScript, Vite, single-file components',\n projectDir: 'converted-vue-vite',\n staticDir: 'public',\n scaffold: 'npm create vite@latest converted-vue-vite -- --template vue-ts',\n entryFiles: 'src/main.ts, src/App.vue, src/components/*.vue, src/styles/*',\n routing: 'Use Vue Router only if multiple exported pages exist in subpages/.',\n },\n {\n id: 'sveltekit',\n label: 'SvelteKit',\n stack: 'SvelteKit, TypeScript, componentized routes and assets',\n projectDir: 'converted-sveltekit',\n staticDir: 'static',\n scaffold: 'npm create svelte@latest converted-sveltekit',\n entryFiles: 'src/routes/+page.svelte, src/lib/components/*, static/*',\n routing: 'Create SvelteKit routes for meaningful exported pages when subpages/ exists.',\n },\n {\n id: 'astro',\n label: 'Astro',\n stack: 'Astro, TypeScript, island components only where interactivity is needed',\n projectDir: 'converted-astro',\n staticDir: 'public',\n scaffold: 'npm create astro@latest converted-astro',\n entryFiles: 'src/pages/index.astro, src/components/*, public/*',\n routing: 'Use Astro pages for exported subpages and avoid unnecessary client JavaScript.',\n },\n];\n\nconst GOALS: ConversionGoal[] = [\n {\n id: 'clean-rebuild',\n label: 'Clean professional rebuild',\n instruction:\n 'Rebuild the export as clean production code, not as a one-file HTML clone, while preserving the full page experience.',\n priority: 'Readable structure, maintainability, complete pages, and faithful visual result.',\n },\n {\n id: 'pixel-perfect',\n label: 'Pixel-perfect visual migration',\n instruction:\n 'Prioritize pixel-perfect fidelity before refactoring anything aggressively, even when the layout is difficult.',\n priority:\n 'Spacing, typography, responsive behavior, colors, media, animations, and page-by-page fidelity.',\n },\n {\n id: 'component-system',\n label: 'Reusable component system',\n instruction:\n 'Extract repeated UI blocks into reusable components with clean props without simplifying the original pages.',\n priority:\n 'Components, layout primitives, naming, future editability, and complete section coverage.',\n },\n {\n id: 'performance-seo',\n label: 'Performance and SEO rebuild',\n instruction:\n 'Rebuild the site while reducing unused vendor code and improving SEO basics without losing visual fidelity.',\n priority:\n 'Fast loading, semantic markup, metadata, accessibility, asset hygiene, and faithful pages.',\n },\n];\n\nexport async function runAiPromptAssistant(exporter: ExporterContext): Promise<void> {\n if (!stdin.isTTY || !stdout.isTTY) return;\n\n const targetOptions: SelectOption[] = [\n ...TARGETS.map((target) => ({ label: target.label, value: target.id })),\n { label: 'Customize with AI - BETA in development', value: 'custom-ai', disabled: true },\n { label: 'Skip AI prompt', value: 'skip' },\n ];\n\n console.log('');\n const targetId = await select('AI Prompt Assistant BETA: choose target stack', targetOptions, 0);\n if (targetId === 'skip') return;\n\n const aiToolId = await select(\n 'Choose the AI coding tool',\n AI_TOOLS.map((tool) => ({ label: tool.label, value: tool.id })),\n 0\n );\n\n const goalId = await select(\n 'Choose the conversion situation',\n GOALS.map((goal) => ({ label: goal.label, value: goal.id })),\n 0\n );\n\n const target = TARGETS.find((item) => item.id === targetId) || TARGETS[0];\n const aiTool = AI_TOOLS.find((item) => item.id === aiToolId) || AI_TOOLS[0];\n const goal = GOALS.find((item) => item.id === goalId) || GOALS[0];\n const facts = await collectExportFacts(exporter);\n const prompt = buildConversionPrompt(target, aiTool, goal, facts);\n const aiDir = path.join(exporter.outDir, 'ai');\n const promptPath = path.join(aiDir, `${aiTool.id}-${target.id}-${goal.id}-prompt.md`);\n\n await fs.mkdir(aiDir, { recursive: true });\n await fs.writeFile(promptPath, prompt, 'utf-8');\n\n printPromptResult(promptPath, target, aiTool, goal);\n\n const copyChoice = await select(\n 'Copy prompt to clipboard?',\n [\n { label: 'Copy prompt', value: 'yes' },\n { label: 'No, keep file only', value: 'no' },\n ],\n 0\n );\n\n if (copyChoice === 'yes') {\n try {\n await copyToClipboard(prompt);\n console.log(` ${chalk.green('✓')} ${chalk.white.bold('Prompt copied to clipboard')}\\n`);\n } catch (error) {\n console.log(\n ` ${chalk.yellow('!')} ${chalk.yellow('Clipboard copy unavailable:')} ${chalk.gray((error as Error).message)}\\n`\n );\n }\n }\n}\n\nasync function collectExportFacts(exporter: ExporterContext): Promise<ExportFacts> {\n const counts: Record<string, number> = {};\n const rootEntries = await safeReadDir(exporter.outDir);\n\n for (const item of IMPORTANT_DIRS) {\n counts[item] =\n item === 'index.html'\n ? (await exists(path.join(exporter.outDir, item)))\n ? 1\n : 0\n : await countEntries(path.join(exporter.outDir, item));\n }\n\n return {\n sourceUrl: exporter.siteUrl,\n outputDir: exporter.outDir,\n platformName: exporter.platform.displayName,\n rootEntries,\n counts,\n };\n}\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function safeReadDir(dir: string): Promise<string[]> {\n try {\n return (await fs.readdir(dir)).sort();\n } catch {\n return [];\n }\n}\n\nasync function countEntries(dir: string): Promise<number> {\n try {\n return (await fs.readdir(dir)).length;\n } catch {\n return 0;\n }\n}\n\nfunction buildConversionPrompt(\n target: ConversionTarget,\n aiTool: AiTool,\n goal: ConversionGoal,\n facts: ExportFacts\n): string {\n const rootEntries = facts.rootEntries.length\n ? facts.rootEntries.join(', ')\n : 'No root entries detected';\n const exportDir = quoteForPrompt(facts.outputDir);\n const projectDir = quoteForPrompt(path.join(facts.outputDir, target.projectDir));\n const scaffoldCommand = `cd ${exportDir}; ${target.scaffold}`;\n const sourceAssets = quoteForPrompt(path.join(facts.outputDir, 'assets', '*'));\n const destinationAssets = quoteForPrompt(\n path.join(facts.outputDir, target.projectDir, target.staticDir, 'assets')\n );\n const windowsAssetCopyCommand = `New-Item -ItemType Directory -Force -Path ${destinationAssets}; Copy-Item -Path ${sourceAssets} -Destination ${destinationAssets} -Recurse -Force`;\n const unixSourceAssets = quoteForPrompt(toPosixPath(path.join(facts.outputDir, 'assets')));\n const unixDestinationParent = quoteForPrompt(\n toPosixPath(path.join(facts.outputDir, target.projectDir, target.staticDir))\n );\n const unixAssetCopyCommand = `mkdir -p ${unixDestinationParent} && cp -R ${unixSourceAssets} ${unixDestinationParent}/assets`;\n const directoryLines = IMPORTANT_DIRS.map(\n (dir) => `Inspect ${dir}: ${facts.counts[dir]} item(s) detected in the export.`\n );\n const promptLines = [\n `You are ${aiTool.agentName} working inside a local export created by Cooksite / Framer Export.`,\n 'This brief was generated by the Cooksite AI Prompt Assistant BETA.',\n 'Treat this beta prompt as a strict conversion checklist, not as permission to skip inspection.',\n 'Your mission is to convert this exported static mirror into a clean production project.',\n `Target stack: ${target.stack}.`,\n `Selected AI coding tool: ${aiTool.displayName}.`,\n `Selected conversion situation: ${goal.label}.`,\n `Primary instruction for this situation: ${goal.instruction}`,\n `Main priority: ${goal.priority}`,\n `Source URL from the real export: ${facts.sourceUrl}`,\n `Detected platform from the real export: ${facts.platformName}`,\n `Export folder to inspect first: ${facts.outputDir}`,\n `Root entries actually present: ${rootEntries}`,\n `Create the converted project in: ${projectDir}`,\n `Recommended scaffold command: ${scaffoldCommand}`,\n `Expected important target files: ${target.entryFiles}`,\n `Routing guidance: ${target.routing}`,\n `Static assets destination for this stack: ${target.staticDir}/assets inside the converted project.`,\n `PowerShell command to copy exported assets after scaffolding: ${windowsAssetCopyCommand}`,\n `macOS/Linux command to copy exported assets after scaffolding: ${unixAssetCopyCommand}`,\n 'Run the asset copy command; do not recreate, redownload, rename randomly, or replace real exported assets with placeholders.',\n 'After copying assets, update every image, video, font, CSS url(), and script reference to the new local asset path.',\n 'Do not rush. Take time to inspect the export before writing the final implementation.',\n 'Do not invent brand names, copy, images, links, animations, colors, or sections.',\n 'Use only real information found in index.html, CSS files, JavaScript files, data files, and assets.',\n 'If a detail is missing, inspect more files instead of guessing.',\n 'If a vendor script is minified or hard to understand, identify what behavior it provides before replacing it.',\n 'Keep the final result professional, clean, responsive, and maintainable.',\n 'Do not simplify the site because a section, animation, page, or layout is difficult.',\n 'If something is hard, break it into smaller components and keep working until the result matches closely.',\n 'For every exported page, aim for the closest possible pixel-perfect result: spacing, typography, images, viewport behavior, and motion.',\n 'Do not merge multiple pages into one generic page unless the export proves they are duplicate routes.',\n 'Do not replace complex exported sections with summaries, cards, screenshots, or placeholder blocks.',\n 'If a page has visual depth, overlapping layers, sticky sections, galleries, or scroll effects, recreate those behaviors instead of flattening them.',\n 'Start by listing the files and directories that matter for the conversion.',\n ...directoryLines,\n 'Read index.html fully enough to understand page structure, metadata, linked assets, and scripts.',\n 'Read the CSS files that define layout, typography, responsive rules, and visual details.',\n 'Inspect scripts/vendor only to understand required interactions; do not blindly copy huge vendor bundles.',\n 'Inspect scripts/modules for page-specific logic, animations, sliders, menus, and dynamic behavior.',\n 'Inspect data files for CMS-like content, page data, configuration, or serialized props.',\n 'Inspect assets/images and preserve the real image files that are actually used.',\n 'Inspect assets/fonts and preserve font loading if the design depends on custom fonts.',\n 'Inspect subpages if it contains exported pages; map them to routes only when they represent real pages.',\n 'If subpages contains pages, convert each meaningful page with its own route and page component.',\n 'For each converted page, compare against the original exported HTML route and adjust until it is visually close.',\n 'Create a clean project structure instead of dumping everything into one component.',\n 'Separate global layout, page sections, shared components, data helpers, and styles.',\n 'Use semantic HTML for headings, navigation, buttons, forms, sections, and footer content.',\n 'Preserve the original hierarchy of visible content unless there is a clear bug to fix.',\n 'Preserve real URLs and links, but convert local asset paths to the new project structure.',\n 'Move static assets into the target framework public/static asset location when appropriate.',\n 'Do not keep broken CDN references if a local exported asset already exists.',\n 'Do not hardcode absolute machine paths into source files; use framework-relative public asset paths after copying.',\n 'Keep original filenames when possible so CSS and content references remain traceable.',\n 'Do not leave unused analytics, editor badges, platform badges, or export-only scripts in the new app.',\n 'Replace platform-specific runtime code with native framework components when possible.',\n 'Keep interactions that users can see: menus, hover states, forms, sliders, animations, and scroll effects.',\n 'If an interaction is too complex, implement a clean equivalent and document the difference briefly.',\n 'Keep responsive behavior for desktop, tablet, and mobile.',\n 'Check layout at small widths and avoid fixed desktop-only dimensions unless the original requires them.',\n 'Use CSS variables or a clear theme file for colors, spacing, radius, shadows, and typography.',\n 'Name components after their role: Hero, Header, FeatureGrid, Gallery, Pricing, Footer, and similar real sections.',\n 'Avoid generic placeholder components if the exported site has specific section meaning.',\n 'Use TypeScript types where they make the content or component props clearer.',\n 'Do not add unnecessary libraries unless they replace a real exported behavior cleanly.',\n 'If you add a library, explain why it is needed and where it is used.',\n 'Keep package.json scripts standard: dev, build, preview, lint when available.',\n 'Keep the build reproducible from a fresh install.',\n 'After implementing, run the install/build/typecheck commands available for the target project.',\n 'Fix any build errors instead of leaving TODOs.',\n 'Open the generated app locally if possible and compare against the exported index.html visually.',\n 'When there are subpages, compare every generated route against its matching exported file.',\n 'Verify that every visible image loads from the new project.',\n 'Verify that font rendering is close to the export.',\n 'Verify that navigation and internal links work.',\n 'Verify that responsive breakpoints do not overlap or hide important content.',\n 'Verify that there are no console errors caused by missing assets or copied platform scripts.',\n 'Keep accessibility basics: alt text when inferable, keyboard-reachable controls, visible focus states.',\n 'Keep SEO basics: title, meta description if present, canonical only if it is correct, Open Graph when present.',\n 'Do not fabricate SEO copy; reuse existing metadata or ask for missing copy if necessary.',\n 'Commit to a small number of high-quality files rather than many noisy fragments.',\n 'If a section repeats, extract a reusable component and data array.',\n 'If a section is unique, keep it simple and local to the page.',\n 'Document important migration decisions in a short README inside the converted project.',\n 'The README must mention the source export folder, target stack, setup command, and known limitations.',\n 'Do not delete the original export folder.',\n 'Do not modify unrelated files outside the new converted project unless required for setup.',\n 'If the worktree has existing changes, avoid reverting or overwriting them.',\n 'Before large edits, inspect first and explain the conversion plan briefly.',\n 'Then implement the conversion step by step until the app builds.',\n 'Final answer must summarize what was converted, where the new project lives, and which checks passed.',\n 'If something could not be converted, state the exact file or behavior and the reason.',\n 'Quality bar: the result should feel like a real hand-built production app, not an automated scrape or simplified demo.',\n ];\n\n return [\n `# ${aiTool.displayName} Conversion Prompt - ${target.label}`,\n '',\n 'Status: BETA assistant output. Review the export carefully and follow the real files.',\n `Generated from real export: ${facts.outputDir}`,\n `AI tool: ${aiTool.displayName}`,\n `Target: ${target.label}`,\n `Situation: ${goal.label}`,\n '',\n promptLines.map((line, index) => `${String(index + 1).padStart(2, '0')}. ${line}`).join('\\n'),\n '',\n ].join('\\n');\n}\n\nfunction quoteForPrompt(value: string): string {\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\n}\n\nfunction toPosixPath(value: string): string {\n return value.replace(/\\\\/g, '/');\n}\n\nasync function copyToClipboard(text: string): Promise<void> {\n const commands =\n process.platform === 'win32'\n ? [{ command: 'clip', args: [] }]\n : process.platform === 'darwin'\n ? [{ command: 'pbcopy', args: [] }]\n : [\n { command: 'wl-copy', args: [] },\n { command: 'xclip', args: ['-selection', 'clipboard'] },\n { command: 'xsel', args: ['--clipboard', '--input'] },\n ];\n\n let lastError: Error | null = null;\n for (const item of commands) {\n try {\n await pipeToCommand(item.command, item.args, text);\n return;\n } catch (error) {\n lastError = error as Error;\n }\n }\n\n throw lastError || new Error('No clipboard command found');\n}\n\nfunction pipeToCommand(command: string, args: string[], input: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { stdio: ['pipe', 'ignore', 'pipe'] });\n let stderr = '';\n let settled = false;\n\n const finish = (error?: Error): void => {\n if (settled) return;\n settled = true;\n if (error) reject(error);\n else resolve();\n };\n\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n child.on('error', finish);\n child.on('close', (code) => {\n if (code === 0) {\n finish();\n } else {\n finish(new Error(`${command} exited with ${code}${stderr ? `: ${stderr.trim()}` : ''}`));\n }\n });\n child.stdin?.end(input);\n });\n}\n\nfunction printPromptResult(\n promptPath: string,\n target: ConversionTarget,\n aiTool: AiTool,\n goal: ConversionGoal\n): void {\n const w = maxWidth();\n const isSmall = w < 50;\n const relPath = path.relative(process.cwd(), promptPath) || promptPath;\n\n console.log('');\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, chalk.bold.white(' AI Prompt Ready - BETA')));\n console.log(boxSep(w));\n console.log(boxLine(w, ` Tool: ${aiTool.displayName}`));\n console.log(boxLine(w, ` Stack: ${target.label}`));\n console.log(boxLine(w, ` Situation: ${goal.label}`));\n console.log(boxLine(w, ` File: ${relPath}`));\n console.log(boxBot(w));\n } else {\n console.log(chalk.bold.white(' AI Prompt Ready - BETA'));\n console.log(` Tool: ${chalk.hex('#D4A017')(aiTool.displayName)}`);\n console.log(` Stack: ${chalk.hex('#D4A017')(target.label)}`);\n console.log(` Situation: ${chalk.hex('#D4A017')(goal.label)}`);\n console.log(` File: ${chalk.hex('#D4A017')(relPath)}`);\n }\n console.log('');\n}\n","import chalk from 'chalk';\nimport { ui } from './theme.js';\n\nconst SHINE_WIDTH = 10;\nconst FRAME_INTERVAL = 80;\n\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nexport class CookingSpinner {\n private interval: NodeJS.Timeout | null = null;\n private frame = 0;\n private phase = '';\n private active = false;\n\n start(phase: string = ''): void {\n this.phase = phase;\n this.frame = 0;\n this.active = true;\n this.draw();\n this.interval = setInterval(() => {\n this.frame++;\n this.draw();\n }, FRAME_INTERVAL);\n }\n\n update(phase: string): void {\n this.phase = phase;\n }\n\n log(message: string): void {\n if (this.active) {\n process.stdout.write('\\r\\x1B[2K');\n }\n process.stdout.write(message + '\\n');\n if (this.active) {\n this.draw();\n }\n }\n\n stop(): void {\n this.active = false;\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n process.stdout.write('\\r\\x1B[2K');\n }\n\n private draw(): void {\n if (!this.active) return;\n\n const spinner = SPINNER_FRAMES[this.frame % SPINNER_FRAMES.length];\n const shimmer = this.renderShimmer('f-export');\n const frameStr = ui.primary(spinner);\n const phaseStr = this.phase\n ? ` ${ui.muted(this.limitLen(this.phase, 52))}`\n : '';\n\n process.stdout.write(`\\r\\x1B[2K ${frameStr} ${shimmer}${phaseStr}`);\n }\n\n private renderShimmer(text: string): string {\n let result = '';\n const pos = this.frame % (text.length + SHINE_WIDTH * 2) - SHINE_WIDTH;\n for (let i = 0; i < text.length; i++) {\n const dist = Math.abs(i - pos);\n if (dist < SHINE_WIDTH) {\n const t = 1 - dist / SHINE_WIDTH;\n const g = Math.floor(160 + t * 95);\n result += chalk.rgb(250, Math.min(255, g), Math.min(255, Math.floor(g * 0.75)))(text[i]);\n } else {\n result += ui.muted(text[i]);\n }\n }\n return result;\n }\n\n private limitLen(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max - 1) + '…';\n }\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport chalk from 'chalk';\nimport type { Browser, Page } from 'puppeteer';\nimport { AssetMap } from '../assets/asset-map.js';\nimport { dlBuffer } from '../network/download.js';\nimport { info, log, success, setCooking } from '../logger/index.js';\nimport { launchAndCapture, captureSubpage, closeBrowser } from './capture.js';\nimport { downloadAll } from './download.js';\nimport { buildOutput } from './output.js';\nimport { printSummary } from './summary.js';\nimport { runAiPromptAssistant } from '../ai/prompt-assistant.js';\nimport { detectPlatform, getPlatformByName } from '../platforms/index.js';\nimport type { PlatformHandler, PlatformType } from '../platforms/types.js';\nimport type { ExporterContext } from '../types.js';\nimport { CookingSpinner } from '../cli/cooking.js';\nimport { chip, ui } from '../cli/theme.js';\n\nexport function deriveOutputName(url: string, platformName: PlatformType): string {\n try {\n const parsed = new URL(url);\n const hostname: string = parsed.hostname;\n\n let siteName: string;\n if (hostname.endsWith('.webflow.io')) {\n siteName = hostname.replace('.webflow.io', '');\n } else if (hostname.includes('.wixsite.com')) {\n const parts: string[] = parsed.pathname.split('/').filter(Boolean);\n siteName = parts[0] || hostname.split('.')[0];\n } else if (hostname.match(/\\.framer\\.(app|website|ai)$/)) {\n siteName = hostname.split('.framer.')[0];\n } else {\n siteName = hostname.replace(/\\./g, '-');\n }\n\n return `${platformName}-${siteName}`;\n } catch {\n return 'framer-export-output';\n }\n}\n\nexport class FramerExporter implements ExporterContext {\n siteUrl: string;\n outDir: string;\n assets: AssetMap;\n browser: Browser | null;\n page: Page | null;\n ssrHTML: string;\n prettyPrint: boolean;\n platform: PlatformHandler;\n cooking?: CookingSpinner;\n\n constructor(siteUrl: string, outDir: string, platformOverride?: PlatformType) {\n this.siteUrl = siteUrl;\n this.outDir = outDir;\n this.assets = new AssetMap();\n this.browser = null;\n this.page = null;\n this.ssrHTML = '';\n this.prettyPrint = true;\n\n if (platformOverride && platformOverride !== 'unknown') {\n this.platform = getPlatformByName(platformOverride);\n } else {\n this.platform = detectPlatform(siteUrl);\n }\n }\n\n async run(includeSubpages: boolean = false): Promise<void> {\n console.log(`\\n ${ui.text.bold('Framer Export')} ${chip('mirror')} ${ui.muted('v4 pipeline')}\\n`);\n info('Source : ' + chalk.underline(this.siteUrl));\n info('Output : ' + ui.primary(this.outDir));\n info('Platform : ' + ui.primary(this.platform.displayName));\n if (includeSubpages) {\n info('Subpages : ' + ui.success('enabled'));\n }\n console.log('');\n\n this.cooking = new CookingSpinner();\n setCooking(this.cooking);\n this.cooking.start('Preparing directories...');\n\n for (const d of [\n '',\n 'assets/images',\n 'assets/fonts',\n 'assets/videos',\n 'assets/misc',\n 'styles',\n 'scripts/vendor',\n 'scripts/modules',\n 'data',\n 'subpages',\n ]) {\n await fs.mkdir(path.join(this.outDir, d), { recursive: true });\n }\n log('Output directory structure created');\n\n this.cooking.update('Fetching SSR HTML...');\n log('Fetching SSR HTML from ' + this.siteUrl);\n try {\n const buf: Buffer = await dlBuffer(this.siteUrl);\n this.ssrHTML = buf.toString('utf-8');\n success('SSR HTML fetched (' + (this.ssrHTML.length / 1024).toFixed(1) + ' KB)');\n } catch (e) {\n log(chalk.red('Could not fetch SSR HTML: ' + (e as Error).message));\n }\n\n const htmlDetected = detectPlatform(this.siteUrl, this.ssrHTML);\n if (htmlDetected.name !== this.platform.name) {\n this.platform = htmlDetected;\n log(\n 'Platform refined: ' +\n ui.primary(this.platform.displayName) +\n ' (from HTML analysis)'\n );\n }\n\n await launchAndCapture(this);\n\n if (includeSubpages && this.page) {\n await this.crawlSubpages();\n }\n\n await closeBrowser(this);\n\n this.cooking.update('Downloading assets...');\n await downloadAll(this);\n\n this.cooking.update('Building output...');\n await buildOutput(this);\n\n this.cooking.stop();\n setCooking(null);\n\n console.log('');\n success('Export complete!');\n await printSummary(this);\n await runAiPromptAssistant(this);\n }\n\n private async crawlSubpages(): Promise<void> {\n this.cooking?.update('Discovering sub-pages...');\n log('Scanning page for internal links...');\n\n const page = this.page!;\n const baseUrl = new URL(this.siteUrl);\n const baseHost = baseUrl.hostname.replace(/^www\\./, '');\n\n const links: string[] = await page.evaluate((host: string) => {\n const anchors = Array.from(document.querySelectorAll('a[href]'));\n const hrefs = new Set<string>();\n for (const a of anchors) {\n const href = (a as HTMLAnchorElement).href;\n if (\n !href ||\n href.startsWith('javascript:') ||\n href.startsWith('mailto:') ||\n href.startsWith('tel:') ||\n href.startsWith('#')\n )\n continue;\n try {\n const u = new URL(href);\n const h = u.hostname.replace(/^www\\./, '');\n if (\n h === host &&\n u.pathname !== '/' &&\n u.pathname !== '' &&\n !u.pathname.startsWith('/#')\n ) {\n hrefs.add(href.split('#')[0]);\n }\n } catch {}\n }\n return Array.from(hrefs);\n }, baseHost);\n\n log('Found ' + links.length + ' sub-page links');\n const uniqueLinks = [...new Set(links)].slice(0, 50);\n\n if (uniqueLinks.length === 0) {\n log('No sub-pages to crawl');\n return;\n }\n\n for (let i = 0; i < uniqueLinks.length; i++) {\n const link = uniqueLinks[i];\n this.cooking?.update('Crawling sub-page ' + (i + 1) + '/' + uniqueLinks.length);\n try {\n const html = await captureSubpage(page, link, {\n needsHydrationCheck: this.platform.needsHydrationCheck,\n hydrationTimeout: this.platform.hydrationTimeout,\n });\n\n const slug = this.deriveSlug(link, baseUrl);\n const filename = slug + '.html';\n const filepath = path.join(this.outDir, 'subpages', filename);\n\n await fs.writeFile(filepath, html, 'utf-8');\n log(' Saved: subpages/' + filename);\n } catch (e) {\n log(' Skipped ' + link + ': ' + (e as Error).message);\n }\n }\n\n success('Sub-pages crawled: ' + uniqueLinks.length);\n }\n\n private deriveSlug(link: string, baseUrl: URL): string {\n try {\n const u = new URL(link);\n let pathname = u.pathname.replace(/\\/+$/, '').replace(/^\\//, '');\n if (!pathname) return 'index';\n return pathname.replace(/[^a-zA-Z0-9_-]/g, '_').replace(/_+/g, '_') || 'page';\n } catch {\n return 'page';\n }\n }\n}\n","import readline from 'node:readline/promises';\nimport { stdin, stdout } from 'node:process';\nimport path from 'node:path';\nimport { URL } from 'node:url';\nimport chalk from 'chalk';\nimport { showBanner } from './banner.js';\nimport { FramerExporter, deriveOutputName } from '../exporter/index.js';\nimport { detectPlatform } from '../platforms/index.js';\nimport { select } from './select.js';\nimport type { PlatformType } from '../platforms/types.js';\nimport { boxTop, boxLine, boxSep, boxBot, boxRow, maxWidth } from './box.js';\nimport { bullet, chip, ui } from './theme.js';\n\nfunction drawHeader(title: string): void {\n const w = maxWidth();\n if (w < 50) {\n console.log(`\\n ${bullet('●')} ${ui.text.bold(title)}`);\n return;\n }\n console.log(boxTop(w));\n console.log(boxLine(w, ui.text.bold(' ' + title)));\n console.log(boxBot(w));\n console.log('');\n}\n\nexport async function runSetup(legacyMode: boolean = false): Promise<void> {\n showBanner();\n\n console.log(` ${ui.text.bold('Framer Export setup')} ${chip('interactive')}`);\n console.log(` ${ui.muted('Export Framer, Webflow, and Wix sites into a clean local mirror.')}\\n`);\n\n const rl = readline.createInterface({ input: stdin, output: stdout });\n\n const ask = async (question: string, defaultVal?: string): Promise<string> => {\n const suffix: string = defaultVal ? chalk.gray(` (${defaultVal})`) : '';\n const prompt: string = ` ${ui.primary('●')} ${ui.text.bold(question)}${suffix} ${ui.muted('>')} `;\n const answer: string = await rl.question(prompt);\n return answer.trim() || defaultVal || '';\n };\n\n drawHeader('Step 1 : Site URL');\n\n let siteUrl = '';\n while (!siteUrl) {\n const input: string = await ask('Enter the site URL');\n try {\n new URL(input);\n siteUrl = input;\n } catch {\n console.log(` ${ui.error('✗')} ${ui.error('Invalid URL. Enter a valid URL (https://...)')}\\n`);\n }\n }\n console.log(` ${ui.success('✓')} ${ui.success('URL:')} ${chalk.underline(siteUrl)}\\n`);\n\n drawHeader('Step 2 : Platform');\n\n const detected = detectPlatform(siteUrl);\n let platformName: PlatformType;\n\n if (legacyMode) {\n console.log(` ${ui.info('i')} Auto-detected: ${ui.primary(detected.displayName)}`);\n const platformInput: string = await ask('Platform (framer/webflow/wix)', detected.name);\n platformName = (['framer', 'webflow', 'wix'].includes(platformInput)\n ? platformInput\n : detected.name) as PlatformType;\n console.log(` ${ui.success('✓')} ${ui.success('Platform:')} ${ui.primary(platformName)}\\n`);\n } else {\n rl.close();\n const platforms = [\n { label: `Framer${detected.name === 'framer' ? chalk.gray(' (detected)') : ''}`, value: 'framer' },\n { label: `Webflow${detected.name === 'webflow' ? chalk.gray(' (detected)') : ''}`, value: 'webflow' },\n { label: `Wix${detected.name === 'wix' ? chalk.gray(' (detected)') : ''}`, value: 'wix' },\n ];\n const defaultIdx = ['framer', 'webflow', 'wix'].indexOf(detected.name);\n platformName = await select('Select platform', platforms, Math.max(0, defaultIdx)) as PlatformType;\n }\n\n const rl2 = legacyMode ? rl : readline.createInterface({ input: stdin, output: stdout });\n\n const ask2 = async (question: string, defaultVal?: string): Promise<string> => {\n const suffix: string = defaultVal ? chalk.gray(` (${defaultVal})`) : '';\n const prompt: string = ` ${ui.primary('●')} ${ui.text.bold(question)}${suffix} ${ui.muted('>')} `;\n const answer: string = await rl2.question(prompt);\n return answer.trim() || defaultVal || '';\n };\n\n const derivedName: string = deriveOutputName(siteUrl, platformName);\n\n drawHeader('Step 3 : Output Directory');\n\n const outDir: string = await ask2('Output directory', './' + derivedName);\n console.log(` ${ui.success('✓')} ${ui.success('Output:')} ${ui.primary(outDir)}\\n`);\n\n drawHeader('Step 4 : Options');\n\n let prettyPrint: boolean;\n let concurrency: number;\n let includeSubpages: boolean;\n\n if (legacyMode) {\n const prettyAnswer: string = await ask2('Pretty-print JS files? (y/n)', 'y');\n prettyPrint = prettyAnswer.toLowerCase().startsWith('y');\n console.log(` ${ui.success('✓')} Pretty-print: ${prettyPrint ? ui.success('yes') : ui.error('no')}\\n`);\n\n const subpagesAnswer: string = await ask2('Export sub-pages? (y/n)', 'n');\n includeSubpages = subpagesAnswer.toLowerCase().startsWith('y');\n console.log(` ${ui.success('✓')} Sub-pages: ${includeSubpages ? ui.success('yes') : ui.error('no')}\\n`);\n\n const concurrencyAnswer: string = await ask2('Download concurrency', '12');\n concurrency = parseInt(concurrencyAnswer, 10) || 12;\n console.log(` ${ui.success('✓')} Concurrency: ${ui.primary(String(concurrency))}\\n`);\n } else {\n rl2.close();\n const prettyVal = await select('Pretty-print JS files?', [\n { label: 'Yes', value: 'yes' },\n { label: 'No', value: 'no' },\n ]);\n prettyPrint = prettyVal === 'yes';\n\n const subpagesVal = await select('Export sub-pages?', [\n { label: 'No', value: 'no' },\n { label: 'Yes, crawl and export', value: 'yes' },\n ], 0);\n includeSubpages = subpagesVal === 'yes';\n\n const concurrencyVal = await select('Download concurrency', [\n { label: '6 (slow connection)', value: '6' },\n { label: '12 (default)', value: '12' },\n { label: '20 (fast connection)', value: '20' },\n ], 1);\n concurrency = parseInt(concurrencyVal, 10);\n }\n\n const w = maxWidth();\n const isSmall = w < 50;\n console.log('');\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, ui.text.bold(' Summary')));\n console.log(boxSep(w));\n } else {\n console.log(ui.text.bold(' Summary:'));\n }\n\n for (const [label, value] of [\n ['URL', siteUrl],\n ['Platform', platformName],\n ['Output', path.resolve(outDir)],\n ['Pretty-print', prettyPrint ? 'yes' : 'no'],\n ['Sub-pages', includeSubpages ? 'yes' : 'no'],\n ['Concurrency', String(concurrency)],\n ]) {\n console.log(boxRow(w, label, value));\n }\n\n if (!isSmall) {\n console.log(boxBot(w));\n }\n console.log('');\n\n let startExport: boolean;\n\n if (legacyMode) {\n const confirm: string = await ask2('Start export? (y/n)', 'y');\n startExport = confirm.toLowerCase().startsWith('y');\n rl2.close();\n } else {\n const confirmVal = await select('Start export?', [\n { label: 'Yes, start now', value: 'yes' },\n { label: 'Cancel', value: 'no' },\n ]);\n startExport = confirmVal === 'yes';\n }\n\n if (!startExport) {\n console.log(`\\n ${ui.warning('Export cancelled.')}\\n`);\n return;\n }\n\n console.log('');\n\n const { CFG } = await import('../config/index.js');\n CFG.concurrency = concurrency;\n\n const exporter = new FramerExporter(siteUrl, path.resolve(outDir), platformName);\n exporter.prettyPrint = prettyPrint;\n await exporter.run(includeSubpages);\n}\n","import path from 'path';\nimport { URL } from 'url';\nimport pkg from '../../package.json';\nimport { showHelp } from './help.js';\nimport { showBanner } from './banner.js';\nimport { checkForUpdates } from './update-check.js';\nimport { ui } from './theme.js';\nimport type { PlatformType } from '../platforms/types.js';\n\nconst VERSION = pkg.version;\n\nfunction extractFlag(args: string[], flag: string): string | null {\n const idx: number = args.indexOf(flag);\n if (idx === -1 || idx + 1 >= args.length) return null;\n const value: string = args[idx + 1];\n args.splice(idx, 2);\n return value;\n}\n\nfunction hasFlag(args: string[], flag: string): boolean {\n const idx: number = args.indexOf(flag);\n if (idx === -1) return false;\n args.splice(idx, 1);\n return true;\n}\n\nasync function main(): Promise<void> {\n const args: string[] = process.argv.slice(2);\n\n if (args.includes('--version') || args.includes('-v')) {\n console.log(VERSION);\n process.exit(0);\n }\n\n if (args.includes('--about')) {\n const chalk = (await import('chalk')).default;\n showBanner();\n console.log(` ${ui.text.bold('Framer Export')} ${ui.muted(`v${pkg.version}`)}`);\n console.log(` ${ui.text(pkg.description)}\\n`);\n console.log(` ${ui.text.bold('Author')} ${ui.primary('Dany (danbenba)')}`);\n console.log(` ${ui.text.bold('Portfolio')} ${chalk.underline.hex('#FAB283')('https://github.com/danbenba')}`);\n console.log(` ${ui.text.bold('GitHub')} ${chalk.underline.hex('#FAB283')(pkg.repository.url.replace('git+', '').replace('.git', ''))}`);\n console.log(` ${ui.text.bold('npm')} ${chalk.underline.hex('#FAB283')(`https://www.npmjs.com/package/${pkg.name}`)}`);\n console.log(` ${ui.text.bold('License')} ${ui.success(pkg.license)}`);\n console.log(` ${ui.text.bold('Node')} ${ui.muted(`>=${pkg.engines.node}`)}`);\n console.log('');\n process.exit(0);\n }\n\n checkForUpdates(VERSION).then((latest) => {\n if (!latest) return;\n console.log('');\n console.log(` ${ui.warning('↳')} Update available: ${ui.muted(VERSION)} -> ${ui.success(latest)}`);\n console.log(` ${ui.primary(' Run:')} ${ui.primarySoft('npm i -g framer-export@latest')}`);\n console.log('');\n });\n\n if (args.includes('--help') || args.includes('-h')) {\n showHelp();\n process.exit(0);\n }\n\n if (args.includes('--setup')) {\n hasFlag(args, '--setup');\n const legacyMode: boolean = hasFlag(args, '--legacy-mode');\n const { runSetup } = await import('./setup.js');\n await runSetup(legacyMode);\n return;\n }\n\n if (!args.length) {\n const { runSetup } = await import('./setup.js');\n await runSetup(false);\n return;\n }\n\n const platformOverride = extractFlag(args, '--platform') as PlatformType | null;\n const includeSubpages: boolean = hasFlag(args, '--subpages');\n\n showBanner();\n\n const url: string = args[0];\n\n try {\n new URL(url);\n } catch {\n console.log(` ${ui.error('✗')} ${ui.error.bold('Invalid URL:')} ${ui.text(url)}`);\n console.log(` ${ui.muted('Expected: https://yoursite.framer.app')}\\n`);\n process.exit(1);\n }\n\n const { FramerExporter, deriveOutputName } = await import('../exporter/index.js');\n const { detectPlatform } = await import('../platforms/index.js');\n\n const detected = platformOverride || detectPlatform(url).name;\n const defaultDir: string = deriveOutputName(url, detected as PlatformType);\n const out: string = args[1] || `./${defaultDir}`;\n\n try {\n await new FramerExporter(url, path.resolve(out), platformOverride || undefined).run(includeSubpages);\n } catch (e) {\n const chalk = (await import('chalk')).default;\n console.log(`\\n ${ui.error('✗')} ${ui.error.bold('FAILED:')} ${ui.text((e as Error).message)}`);\n console.log(chalk.gray((e as Error).stack || ''));\n process.exit(1);\n }\n}\n\nmain();\n","import { showBanner } from './banner.js';\nimport { chip, ui } from './theme.js';\n\nexport function showHelp(): void {\n showBanner();\n\n console.log(`${ui.text.bold(' USAGE')} ${chip('cli')}\\n`);\n console.log(` ${ui.primary('framer-export')} ${ui.warning('<url>')} ${ui.muted('[output-dir]')}`);\n console.log(` ${ui.primary('fexport')} ${ui.warning('<url>')} ${ui.muted('[output-dir]')}`);\n\n console.log('');\n console.log(ui.text.bold(' OPTIONS\\n'));\n\n const opts: Array<[string, string]> = [\n ['--setup', 'Launch the interactive setup assistant'],\n ['--platform <p>', 'Force platform: framer, webflow, wix'],\n ['--subpages', 'Crawl and export sub-pages'],\n ['--legacy-mode', 'Use text input instead of arrow selection'],\n ['--help, -h', 'Show this help message'],\n ];\n\n for (const [flag, desc] of opts) {\n console.log(` ${ui.success(flag.padEnd(18))} ${ui.text(desc)}`);\n }\n\n console.log('');\n console.log(ui.text.bold(' SUPPORTED PLATFORMS\\n'));\n\n const platforms: Array<[string, string]> = [\n ['Framer', 'Auto-detected via .framer.app / .framer.website URLs'],\n ['Webflow', 'Auto-detected via .webflow.io URLs'],\n ['Wix', 'Auto-detected via .wixsite.com URLs + HTML analysis'],\n ];\n\n for (const [name, desc] of platforms) {\n console.log(` ${ui.primary(name.padEnd(12))} ${ui.muted(desc)}`);\n }\n\n console.log('');\n console.log(ui.text.bold(' EXAMPLES\\n'));\n console.log(` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.warning('https://mysite.framer.app')}`);\n console.log(` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.warning('https://mysite.webflow.io')}`);\n console.log(` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.warning('https://user.wixsite.com/my-site')}`);\n console.log(` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.success('--platform webflow')} ${ui.warning('https://custom.com')}`);\n console.log(` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.success('--subpages')} ${ui.warning('https://mysite.com')}`);\n console.log(` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.success('--setup')}`);\n console.log(` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.success('--setup --legacy-mode')}`);\n console.log('');\n}\n","import https from 'https';\n\nexport async function checkForUpdates(currentVersion: string): Promise<string | null> {\n return new Promise((resolve) => {\n const req = https.get(\n 'https://registry.npmjs.org/framer-export/latest',\n { timeout: 3000 },\n (res) => {\n let data = '';\n res.on('data', (chunk) => (data += chunk));\n res.on('end', () => {\n try {\n const json = JSON.parse(data);\n const latest = json.version;\n if (!latest) return resolve(null);\n if (latest !== currentVersion) return resolve(latest);\n resolve(null);\n } catch {\n resolve(null);\n }\n });\n },\n );\n req.on('error', () => resolve(null));\n req.on('timeout', () => {\n req.destroy();\n resolve(null);\n });\n });\n}\n"],"mappings":"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","names":["URL","https","URL","chalk","FONT_EXTS","IMG_EXTS","FONT_EXTS","VIDEO_EXTS","path","init_download","fs","path","chalk","fs","path","fs","path","stdin","stdout","chalk","target","goal","chalk","fs","path","chalk","init_download","readline","stdin","stdout","path","URL","chalk","CFG","path","URL","chalk","runSetup","URL","FramerExporter","deriveOutputName","detectPlatform","path"]}
1
+ {"version":3,"sources":["../../package.json","../../src/cli/theme.ts","../../src/cli/banner.ts","../../src/assets/asset-map.ts","../../src/config/index.ts","../../src/network/download.ts","../../src/logger/index.ts","../../src/platforms/framer.ts","../../src/platforms/webflow.ts","../../src/platforms/wix.ts","../../src/platforms/detect.ts","../../src/platforms/index.ts","../../src/exporter/capture.ts","../../src/network/pool.ts","../../src/exporter/download.ts","../../src/formatter/prettify.ts","../../src/server/template.ts","../../src/exporter/output.ts","../../src/cli/box.ts","../../src/exporter/summary.ts","../../src/cli/select.ts","../../src/ai/prompt-assistant.ts","../../src/cli/cooking.ts","../../src/exporter/index.ts","../../src/cli/setup.ts","../../src/cli/index.ts","../../src/cli/help.ts","../../src/cli/update-check.ts"],"sourcesContent":["{\n \"name\": \"framer-export\",\n \"version\": \"4.3.10\",\n \"description\": \"Export any Framer, Webflow, or Wix site into a fully working local mirror. Downloads all assets, strips badges, rewrites URLs, and pretty-prints JS.\",\n \"type\": \"module\",\n \"main\": \"dist/cli/index.js\",\n \"types\": \"dist/cli/index.d.ts\",\n \"bin\": {\n \"framer-export\": \"./bin/framer-export.js\",\n \"fexport\": \"./bin/fexport.js\",\n \"framerexport\": \"./bin/framerexport.js\"\n },\n \"files\": [\n \"dist/\",\n \"bin/\",\n \"LICENSE\",\n \"README.md\"\n ],\n \"scripts\": {\n \"start\": \"tsx src/cli/index.ts\",\n \"dev\": \"tsx src/cli/index.ts\",\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"format\": \"prettier --write \\\"src/**/*.ts\\\"\",\n \"prepublishOnly\": \"npm run build\",\n \"prepack\": \"npm run build\"\n },\n \"keywords\": [\n \"framer\",\n \"webflow\",\n \"wix\",\n \"exporter\",\n \"export\",\n \"scraper\",\n \"mirror\",\n \"site-downloader\",\n \"site-export\",\n \"cli\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/danbenba/FramerExport.git\"\n },\n \"homepage\": \"https://github.com/danbenba/FramerExport#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/danbenba/FramerExport/issues\"\n },\n \"license\": \"MIT\",\n \"author\": \"Dany (danbenba)\",\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"dependencies\": {\n \"chalk\": \"^5.3.0\",\n \"ora\": \"^8.0.0\",\n \"prettier\": \"^3.2.0\",\n \"puppeteer\": \"^22.0.0\",\n \"readline-promise\": \"^1.0.5\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.0.0\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.7.0\",\n \"typescript\": \"^5.4.0\"\n }\n}\n","import chalk from 'chalk';\n\nexport const THEME = {\n background: '#0A0A0A',\n panel: '#141414',\n element: '#1E1E1E',\n border: '#484848',\n borderActive: '#606060',\n text: '#EEEEEE',\n muted: '#808080',\n primary: '#FAB283',\n primarySoft: '#FFC09F',\n secondary: '#5C9CF5',\n accent: '#9D7CD8',\n success: '#7FD88F',\n warning: '#F5A742',\n error: '#E06C75',\n info: '#56B6C2',\n};\n\nexport const ui = {\n text: chalk.hex(THEME.text),\n muted: chalk.hex(THEME.muted),\n primary: chalk.hex(THEME.primary),\n primarySoft: chalk.hex(THEME.primarySoft),\n secondary: chalk.hex(THEME.secondary),\n accent: chalk.hex(THEME.accent),\n success: chalk.hex(THEME.success),\n warning: chalk.hex(THEME.warning),\n error: chalk.hex(THEME.error),\n info: chalk.hex(THEME.info),\n border: chalk.hex(THEME.border),\n borderActive: chalk.hex(THEME.borderActive),\n panel: chalk.hex(THEME.panel),\n};\n\nexport function stripAnsi(s: string): string {\n return s.replace(/\\x1B\\[[0-9;]*[a-zA-Z]/g, '');\n}\n\nexport function softGradient(text: string): string {\n const colors = [THEME.primary, THEME.primarySoft, THEME.text, THEME.primarySoft, THEME.primary];\n let cursor = 0;\n return text\n .split('')\n .map((char) => {\n if (char === ' ') return char;\n const color = colors[cursor % colors.length];\n cursor++;\n return chalk.hex(color).bold(char);\n })\n .join('');\n}\n\nexport function chip(label: string): string {\n return `${ui.border('[')}${ui.primary(label)}${ui.border(']')}`;\n}\n\nexport function bullet(label: string = '•'): string {\n return ui.primary(label);\n}\n\nexport function centerText(text: string, width: number): string {\n const visible = stripAnsi(text).length;\n if (visible >= width) return text;\n const left = Math.floor((width - visible) / 2);\n return ' '.repeat(left) + text + ' '.repeat(width - visible - left);\n}\n\nexport function truncatePlain(text: string, max: number): string {\n if (text.length <= max) return text;\n return text.slice(0, Math.max(0, max - 2)) + '..';\n}\n","import pkg from '../../package.json';\nimport { chip, softGradient, ui } from './theme.js';\n\nfunction getWidth(): number {\n return process.stdout.columns || 80;\n}\n\nconst ASCII_ART = [\n '███████╗██████╗ █████╗ ███╗ ███╗███████╗██████╗ ',\n '██╔════╝██╔══██╗██╔══██╗████╗ ████║██╔════╝██╔══██╗',\n '█████╗ ██████╔╝███████║██╔████╔██║█████╗ ██████╔╝',\n '██╔══╝ ██╔══██╗██╔══██║██║╚██╔╝██║██╔══╝ ██╔══██╗',\n '██║ ██║ ██║██║ ██║██║ ╚═╝ ██║███████╗██║ ██║',\n '╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝',\n '███████╗██╗ ██╗██████╗ ██████╗ ██████╗ ████████╗',\n '██╔════╝╚██╗██╔╝██╔══██╗██╔═══██╗██╔══██╗╚══██╔══╝',\n '█████╗ ╚███╔╝ ██████╔╝██║ ██║██████╔╝ ██║ ',\n '██╔══╝ ██╔██╗ ██╔═══╝ ██║ ██║██╔══██╗ ██║ ',\n '███████╗██╔╝ ██╗██║ ╚██████╔╝██║ ██║ ██║ ',\n '╚══════╝╚═╝ ╚═╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ',\n];\n\nexport function showBanner(): void {\n const width = getWidth();\n const isSmall = width < 65;\n\n if (isSmall) {\n console.log(\n `\\n ${ui.primary.bold('f-export')} ${ui.muted(`v${pkg.version}`)} ${chip('beta ui')}`\n );\n console.log(` ${ui.text.bold('Framer Export')} ${ui.muted('for Framer, Webflow, and Wix')}\\n`);\n return;\n }\n\n console.log('');\n ASCII_ART.forEach((line) => {\n console.log(' ' + softGradient(line));\n });\n console.log('');\n console.log(\n ` ${ui.muted(`v${pkg.version}`)} ${ui.text.bold('Framer Export')} ${chip('fexport')} ${ui.muted('local mirror exporter')}`\n );\n console.log(\n ` ${ui.muted('Framer')} ${ui.border('/')} ${ui.muted('Webflow')} ${ui.border('/')} ${ui.muted('Wix')} ${ui.border('·')} ${ui.primary('clean assets')} ${ui.border('·')} ${ui.secondary('local serve')}\\n`\n );\n}\n","import path from 'path';\nimport crypto from 'crypto';\nimport { URL } from 'url';\nimport type { PlatformHandler } from '../platforms/types.js';\n\ninterface AssetEntry {\n localPath: string;\n}\n\nexport class AssetMap {\n entries: Map<string, AssetEntry> = new Map();\n buffers: Map<string, Buffer> = new Map();\n\n localPathFor(urlStr: string, platform?: PlatformHandler): string | null {\n if (this.entries.has(urlStr)) return this.entries.get(urlStr)!.localPath;\n\n let parsed: URL;\n try {\n parsed = new URL(urlStr);\n } catch {\n return null;\n }\n\n const host: string = parsed.hostname;\n const pathname: string = parsed.pathname;\n const ext: string = path.extname(pathname.split('?')[0]).toLowerCase();\n\n let dir: string | null = null;\n\n if (platform) {\n dir = platform.mapAssetDir(host, pathname, ext);\n }\n\n if (!dir) {\n dir = this.fallbackDir(host, ext);\n }\n\n let filename: string;\n const baseName: string = path.basename(pathname.split('?')[0]);\n const hash: string = crypto.createHash('md5').update(urlStr).digest('hex').slice(0, 6);\n\n if (baseName && baseName.length > 1 && baseName !== '/') {\n const clean: string = baseName.replace(/[^a-zA-Z0-9._-]/g, '_');\n filename = clean.includes('.') ? clean : `${clean}-${hash}`;\n } else {\n filename = `asset-${hash}${ext || ''}`;\n }\n\n if (ext === '.mjs' || ext === '.js') {\n filename = baseName.replace(/[^a-zA-Z0-9._-]/g, '_');\n }\n\n const localPath: string = `${dir}/${filename}`;\n this.entries.set(urlStr, { localPath });\n\n const base: string = urlStr.split('?')[0];\n if (base !== urlStr && !this.entries.has(base)) {\n this.entries.set(base, { localPath });\n }\n\n return localPath;\n }\n\n rewrite(text: string, fromDir: string = ''): string {\n const sorted = [...this.entries.entries()].sort((a, b) => b[0].length - a[0].length);\n let out: string = text;\n for (const [url, { localPath }] of sorted) {\n const rel: string = fromDir ? path.posix.relative(fromDir, localPath) : localPath;\n out = out.split(url).join(rel);\n if (url.includes('&')) {\n out = out.split(url.replace(/&/g, '&amp;')).join(rel);\n }\n }\n return out;\n }\n\n private fallbackDir(host: string, ext: string): string {\n if (host.includes('fonts.gstatic.com') || host.includes('fonts.googleapis.com')) {\n return 'assets/fonts';\n }\n return ext === '.mjs' || ext === '.js' ? 'scripts/vendor' : 'assets/misc';\n }\n}\n","import type { Config } from '../types.js';\n\nexport const CFG: Config = {\n viewport: { width: 1440, height: 900 },\n timeout: 90000,\n scrollStep: 250,\n scrollDelay: 60,\n concurrency: 12,\n retries: 3,\n dlTimeout: 30000,\n sharedStripDomains: [\n 'sentry.io', 'www.googletagmanager.com', 'connect.facebook.net',\n 'stats.g.doubleclick.net',\n 'google-analytics.com',\n ],\n};\n","import https from 'https';\nimport http from 'http';\nimport { URL } from 'url';\nimport { CFG } from '../config/index.js';\n\nexport function dlBuffer(url: string, retries: number = CFG.retries): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const proto = url.startsWith('https') ? https : http;\n const go = (left: number): void => {\n const req = proto.get(url, { timeout: CFG.dlTimeout }, (res) => {\n if (res.statusCode! >= 300 && res.statusCode! < 400 && res.headers.location) {\n return dlBuffer(new URL(res.headers.location, url).href, left).then(resolve, reject);\n }\n if (res.statusCode !== 200) {\n return left > 1\n ? setTimeout(() => go(left - 1), 500)\n : reject(new Error(`HTTP ${res.statusCode}`));\n }\n const ch: Buffer[] = [];\n res.on('data', (c: Buffer) => ch.push(c));\n res.on('end', () => resolve(Buffer.concat(ch)));\n res.on('error', (e: Error) => (left > 1 ? setTimeout(() => go(left - 1), 500) : reject(e)));\n });\n req.on('error', (e: Error) => (left > 1 ? setTimeout(() => go(left - 1), 500) : reject(e)));\n req.on('timeout', () => {\n req.destroy();\n left > 1 ? setTimeout(() => go(left - 1), 500) : reject(new Error('Timeout'));\n });\n };\n go(retries);\n });\n}\n","import chalk from 'chalk';\nimport type { CookingSpinner } from '../cli/cooking.js';\nimport { THEME } from '../cli/theme.js';\n\nlet _cooking: CookingSpinner | null = null;\n\nexport function setCooking(spinner: CookingSpinner | null): void {\n _cooking = spinner;\n}\n\nconst T = (): string => new Date().toISOString().slice(11, 19);\n\nfunction trunc(text: string, max: number): string {\n if (text.length <= max) return text;\n return text.slice(0, max - 2) + '..';\n}\n\nfunction output(line: string): void {\n if (_cooking) _cooking.log(line);\n else console.log(line);\n}\n\nconst LOG_PALETTE: Array<(s: string) => string> = [\n (s) => chalk.hex(THEME.primary)(s),\n (s) => chalk.hex(THEME.primarySoft)(s),\n (s) => chalk.hex(THEME.secondary)(s),\n (s) => chalk.hex(THEME.accent)(s),\n (s) => chalk.hex(THEME.info)(s),\n (s) => chalk.hex(THEME.text)(s),\n];\nlet _li = 0;\n\nexport const log = (m: string): void => {\n _li++;\n const c = LOG_PALETTE[_li % LOG_PALETTE.length];\n output(\n `${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.primary)('[log]')} ${c(trunc(m, 120))}`\n );\n};\n\nconst INFO_PALETTE: Array<(s: string) => string> = [\n (s) => chalk.hex(THEME.info)(s),\n (s) => chalk.hex(THEME.secondary)(s),\n (s) => chalk.hex(THEME.primarySoft)(s),\n];\nlet _ii = 0;\n\nexport const info = (m: string): void => {\n _ii++;\n const c = INFO_PALETTE[_ii % INFO_PALETTE.length];\n output(\n `${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.info).bold('[info]')} ${c(trunc(m, 120))}`\n );\n};\n\nexport const warn = (m: string): void => {\n const colors: Array<(s: string) => string> = [\n (s) => chalk.hex(THEME.warning)(s),\n (s) => chalk.hex(THEME.primary)(s),\n ];\n const c = colors[Math.floor(Math.random() * colors.length)];\n const line = `${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.warning).bold('[warn]')} ${c(trunc(m, 120))}`;\n if (_cooking) _cooking.log(line);\n else console.warn(line);\n};\n\nexport const success = (m: string): void => {\n const colors: Array<(s: string) => string> = [\n (s) => chalk.hex(THEME.success)(s),\n (s) => chalk.hex(THEME.info)(s),\n ];\n const c = colors[Math.floor(Math.random() * colors.length)];\n output(\n `${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.success)('[ok]')} ${c(trunc(m, 120))}`\n );\n};\n\nexport const error = (m: string): void => {\n const colors: Array<(s: string) => string> = [(s) => chalk.hex(THEME.error)(s)];\n const c = colors[Math.floor(Math.random() * colors.length)];\n const line = `${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.error)('[error]')} ${c(trunc(m, 120))}`;\n if (_cooking) _cooking.log(line);\n else console.error(line);\n};\n","import type { PlatformHandler } from './types.js';\n\nconst FONT_EXTS: string[] = ['.woff2', '.woff', '.ttf', '.otf'];\n\nexport const framer: PlatformHandler = {\n name: 'framer',\n displayName: 'Framer',\n\n detectByUrl(url: string): boolean {\n return /\\.framer\\.(app|website)|framercanvas\\.com/.test(url);\n },\n\n detectByHtml(html: string): boolean {\n return (\n html.includes('id=\"main\"') &&\n (html.includes('framerstatic.com') || html.includes('framerusercontent.com'))\n );\n },\n\n stripDomains: ['events.framer.com', 'api.framer.com', 'collect.frameranalytics.com'],\n\n stripSelectors: [\n 'script[src*=\"events.framer.com\"]',\n '#__framer-badge-container',\n '#__framer-badge',\n 'link[href*=\"canvas-sandbox\"]',\n 'script[src*=\"framer.com/bootstrap\"]',\n ],\n\n stripPatterns: [\n /<div id=\"__framer-badge-container\"[^>]*><\\/div>/g,\n /<script>try\\{if\\(localStorage\\.get\\(\"__framer_force_showing_editorbar_since\"\\)\\)[^<]*<\\/script>/g,\n ],\n\n hydrationTimeout: 10000,\n needsHydrationCheck: true,\n\n mapAssetDir(host: string, pathname: string, ext: string): string | null {\n if (host.includes('framerusercontent.com')) {\n if (pathname.startsWith('/images/')) return 'assets/images';\n if (pathname.startsWith('/assets/')) {\n return FONT_EXTS.includes(ext) ? 'assets/fonts' : 'assets/misc';\n }\n if (pathname.startsWith('/sites/')) {\n if (ext === '.mjs' || ext === '.js') return 'scripts/vendor';\n if (ext === '.json') return 'data';\n if (ext === '.css') return 'styles';\n if (ext === '.framercms') return 'data';\n return 'assets/misc';\n }\n if (pathname.startsWith('/modules/')) {\n return ext === '.framercms' ? 'data' : 'scripts/modules';\n }\n return 'assets/misc';\n }\n\n if (host.includes('app.framerstatic.com')) {\n if (ext === '.css') return 'styles';\n if (ext === '.mjs' || ext === '.js') return 'scripts/vendor';\n if (ext === '.woff2' || ext === '.woff') return 'assets/fonts';\n if (ext === '.png' || ext === '.svg') return 'assets/images';\n return 'assets/misc';\n }\n\n if (host.includes('framercanvas.com') || host.includes('framer.com')) {\n if (ext === '.mjs' || ext === '.js') return 'scripts/vendor';\n if (ext === '.css') return 'styles';\n return 'assets/misc';\n }\n\n return null;\n },\n};\n","import type { PlatformHandler } from './types.js';\n\nconst IMG_EXTS: string[] = ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp', '.avif'];\nconst FONT_EXTS: string[] = ['.woff2', '.woff', '.ttf', '.otf', '.eot'];\nconst VIDEO_EXTS: string[] = ['.mp4', '.webm', '.ogg'];\n\nexport const webflow: PlatformHandler = {\n name: 'webflow',\n displayName: 'Webflow',\n\n detectByUrl(url: string): boolean {\n return /\\.webflow\\.(io|com)/.test(url);\n },\n\n detectByHtml(html: string): boolean {\n return (\n html.includes('data-wf-site') ||\n html.includes('w-webflow-badge') ||\n html.includes('Webflow') ||\n html.includes('webflow.js')\n );\n },\n\n stripDomains: ['js-agent.newrelic.com', 'cdn.heapanalytics.com', 'tr.snapchat.com'],\n\n stripSelectors: ['.w-webflow-badge', 'link[href*=\"editorbar\"]'],\n\n stripPatterns: [\n /<a[^>]*class=\"[^\"]*w-webflow-badge[^\"]*\"[^>]*>[\\s\\S]*?<\\/a>/g,\n /<a[^>]*href=\"[^\"]*webflow\\.com\\?utm_campaign=brandjs[^\"]*\"[^>]*>[\\s\\S]*?<\\/a>/g,\n /<style>[^<]*\\.w-webflow-badge[^<]*<\\/style>/g,\n /Powered by <a[^>]*href=\"[^\"]*webflow\\.com\"[^>]*>[^<]*<\\/a>/g,\n /<!-- This site was created in Webflow\\.[^>]*-->/g,\n /<html([^>]*) data-wf-domain=\"[^\"]*\"/g,\n /<html([^>]*) data-wf-page=\"[^\"]*\"/g,\n /<html([^>]*) data-wf-site=\"[^\"]*\"/g,\n /<html([^>]*) data-wf-status=\"[^\"]*\"/g,\n /<meta[^>]*content=\"Webflow\"[^>]*>/g,\n ],\n\n hydrationTimeout: 2000,\n needsHydrationCheck: false,\n\n mapAssetDir(host: string, pathname: string, ext: string): string | null {\n if (\n host.includes('website-files.com') ||\n host.includes('webflow.com') ||\n host.includes('uploads-ssl.webflow.com')\n ) {\n if (VIDEO_EXTS.includes(ext)) return 'assets/videos';\n if (pathname.includes('/images/') || IMG_EXTS.includes(ext)) return 'assets/images';\n if (pathname.includes('/css/') || ext === '.css') return 'styles';\n if (pathname.includes('/js/') || ext === '.js') return 'scripts/vendor';\n if (pathname.includes('/gsap/') || pathname.includes('/plugins/')) return 'scripts/vendor';\n if (FONT_EXTS.includes(ext)) return 'assets/fonts';\n return 'assets/misc';\n }\n\n if (host.includes('d3e54v103j8qbb.cloudfront.net')) {\n if (ext === '.js') return 'scripts/vendor';\n if (ext === '.css') return 'styles';\n if (IMG_EXTS.includes(ext)) return 'assets/images';\n return 'assets/misc';\n }\n\n return null;\n },\n};\n","import type { PlatformHandler } from './types.js';\n\nconst IMG_EXTS: string[] = ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp', '.avif', '.ico'];\nconst FONT_EXTS: string[] = ['.woff2', '.woff', '.ttf', '.otf', '.eot'];\nconst VIDEO_EXTS: string[] = ['.mp4', '.webm', '.ogg'];\n\nexport const wix: PlatformHandler = {\n name: 'wix',\n displayName: 'Wix',\n\n detectByUrl(url: string): boolean {\n return /\\.wixsite\\.com|\\.wix\\.com/.test(url);\n },\n\n detectByHtml(html: string): boolean {\n return (\n html.includes('wix-viewer-model') ||\n html.includes('id=\"WIX_ADS\"') ||\n html.includes('X-Wix-') ||\n html.includes('Wix.com') ||\n html.includes('wixcode-sdk') ||\n html.includes('data-wix') ||\n html.includes('wix-code') ||\n html.includes('WixCode') ||\n /\\bwix\\.com\\b/.test(html) ||\n /meta\\s+name=[\"']generator[\"']\\s+content=[\"'][^\"']*Wix[^\"']*[\"']/i.test(html) ||\n /_wix_/i.test(html) ||\n /wix-ecom/i.test(html)\n );\n },\n\n stripDomains: [\n 'frog.wix.com',\n 'bi.wixapi.com',\n 'fed.wixcodescheduler.com',\n 'editor.wix.com',\n 'panorama.wixapps.net',\n ],\n\n stripSelectors: ['#WIX_ADS', '.wix-ads', '#wix-badge', '#SCROLL_TO_TOP'],\n\n stripPatterns: [\n /<div[^>]*class=\"[^\"]*wix-ads[^\"]*\"[^>]*>[\\s\\S]*?<\\/div>/g,\n ],\n\n hydrationTimeout: 3000,\n needsHydrationCheck: false,\n\n mapAssetDir(host: string, pathname: string, ext: string): string | null {\n if (host === 'video.wixstatic.com') {\n return 'assets/videos';\n }\n\n if (host.includes('wixstatic.com')) {\n if (VIDEO_EXTS.includes(ext)) return 'assets/videos';\n if (pathname.includes('/images/') || IMG_EXTS.includes(ext)) return 'assets/images';\n if (ext === '.css') return 'styles';\n if (ext === '.js') return 'scripts/vendor';\n if (FONT_EXTS.includes(ext)) return 'assets/fonts';\n return 'assets/misc';\n }\n\n if (host.includes('parastorage.com')) {\n if (ext === '.js') return 'scripts/vendor';\n if (ext === '.css') return 'styles';\n if (FONT_EXTS.includes(ext)) return 'assets/fonts';\n if (IMG_EXTS.includes(ext)) return 'assets/images';\n return 'assets/misc';\n }\n\n return null;\n },\n};\n","import type { PlatformHandler, PlatformType } from './types.js';\nimport type { Page } from 'puppeteer';\nimport { framer } from './framer.js';\nimport { webflow } from './webflow.js';\nimport { wix } from './wix.js';\n\nconst ALL_PLATFORMS: PlatformHandler[] = [framer, webflow, wix];\n\nexport function detectByUrl(url: string): PlatformHandler | null {\n for (const platform of ALL_PLATFORMS) {\n if (platform.detectByUrl(url)) return platform;\n }\n return null;\n}\n\nexport function detectByHtml(html: string): PlatformHandler | null {\n for (const platform of ALL_PLATFORMS) {\n if (platform.detectByHtml(html)) return platform;\n }\n return null;\n}\n\nexport function detectPlatform(url: string, html?: string): PlatformHandler {\n const byUrl = detectByUrl(url);\n if (byUrl) return byUrl;\n\n if (html) {\n const byHtml = detectByHtml(html);\n if (byHtml) return byHtml;\n }\n\n return framer;\n}\n\nexport async function detectByDom(page: Page): Promise<PlatformHandler | null> {\n try {\n const signal: string = await page.evaluate(() => {\n const html: string = document.documentElement.outerHTML || '';\n\n if (/wix-viewer-model|_wix_|wix-ecom/i.test(html)) return 'wix';\n if (/data-wf-|w-webflow-badge|webflow\\.js/i.test(html)) return 'webflow';\n if (/framerusercontent|framercanvas|framerstatic/i.test(html)) return 'framer';\n\n const srcs: string[] = [];\n const scripts: NodeListOf<HTMLScriptElement> = document.querySelectorAll('script[src]');\n scripts.forEach((s) => { if (s.src) srcs.push(s.src); });\n const allSrcs: string = srcs.join(' ');\n if (/wixstatic\\.com|parastorage\\.com/.test(allSrcs)) return 'wix';\n if (/website-files\\.com|webflow\\.com/.test(allSrcs)) return 'webflow';\n if (/framerusercontent\\.com|framerstatic\\.com|framer\\.app/.test(allSrcs)) return 'framer';\n\n return '';\n });\n\n if (signal === 'wix') return wix;\n if (signal === 'webflow') return webflow;\n if (signal === 'framer') return framer;\n } catch {}\n return null;\n}\n\nexport function getPlatformByName(name: PlatformType): PlatformHandler {\n const map: Record<string, PlatformHandler> = { framer, webflow, wix };\n return map[name] || framer;\n}\n","export type { PlatformHandler, PlatformType } from './types.js';\nexport { framer } from './framer.js';\nexport { webflow } from './webflow.js';\nexport { wix } from './wix.js';\nexport { detectPlatform, detectByUrl, detectByHtml, detectByDom, getPlatformByName } from './detect.js';\n","import puppeteer, { type Page } from 'puppeteer';\nimport { CFG } from '../config/index.js';\nimport { log, success, info } from '../logger/index.js';\nimport { detectByDom } from '../platforms/index.js';\nimport type { ExporterContext } from '../types.js';\n\nexport async function launchAndCapture(exporter: ExporterContext): Promise<void> {\n exporter.cooking?.update('Launching browser...');\n log('Launching headless Chromium...');\n\n exporter.browser = await puppeteer.launch({\n headless: true,\n args: ['--no-sandbox', '--disable-setuid-sandbox'],\n });\n success('Chromium launched');\n\n exporter.page = await exporter.browser.newPage();\n await exporter.page.setViewport(CFG.viewport);\n log('Viewport set to ' + CFG.viewport.width + 'x' + CFG.viewport.height);\n\n await exporter.page.setUserAgent(\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' +\n '(KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'\n );\n log('User agent set to Chrome 131');\n\n const allStripDomains: string[] = [\n ...CFG.sharedStripDomains,\n ...exporter.platform.stripDomains,\n ];\n log('Blocking ' + allStripDomains.length + ' tracking domains:');\n for (const domain of allStripDomains) {\n log(' - ' + domain);\n }\n\n let intercepted = 0;\n let blocked = 0;\n\n exporter.page.on('response', async (res) => {\n const url: string = res.url();\n if (url.startsWith('data:') || url.startsWith('blob:')) return;\n\n try {\n const host: string = new URL(url).hostname;\n if (allStripDomains.some((d) => host.includes(d))) {\n blocked++;\n return;\n }\n } catch {\n return;\n }\n\n exporter.assets.localPathFor(url, exporter.platform);\n try {\n exporter.assets.buffers.set(url, await res.buffer());\n intercepted++;\n } catch {}\n });\n\n log('Network interception enabled');\n\n exporter.cooking?.update('Navigating to site...');\n info('Navigating to ' + exporter.siteUrl);\n await exporter.page.goto(exporter.siteUrl, {\n waitUntil: 'networkidle2',\n timeout: CFG.timeout,\n });\n success('Page loaded (networkidle2)');\n log('Intercepted ' + intercepted + ' resources, blocked ' + blocked + ' tracking requests');\n\n log('Checking DOM-based platform detection...');\n const domDetected = await detectByDom(exporter.page);\n if (domDetected && domDetected.name !== exporter.platform.name) {\n log('Platform refined from DOM: ' + domDetected.displayName + ' (override: ' + exporter.platform.name + ')');\n exporter.platform = domDetected;\n }\n\n exporter.cooking?.update('Waiting for ' + exporter.platform.displayName + ' hydration...');\n\n if (exporter.platform.needsHydrationCheck) {\n log('Checking for #main element hydration...');\n log('Hydration timeout: ' + exporter.platform.hydrationTimeout + 'ms');\n const timeout = exporter.platform.hydrationTimeout;\n await exporter.page.evaluate(`\n new Promise(function(r) {\n var start = Date.now();\n var tick = function() {\n var m = document.getElementById('main') || document.body;\n if (m && m.children.length > 0) setTimeout(r, 2000);\n else if (Date.now() - start > ${timeout}) r();\n else setTimeout(tick, 200);\n };\n tick();\n })\n `);\n success('Hydration complete (SPA rendered)');\n } else {\n log('Static site detected, waiting ' + exporter.platform.hydrationTimeout + 'ms for render...');\n await new Promise<void>((r) => setTimeout(r, exporter.platform.hydrationTimeout));\n success(exporter.platform.displayName + ' page rendered');\n }\n\n exporter.cooking?.update('Scrolling page...');\n log('Starting full-page scroll (step: ' + CFG.scrollStep + 'px, delay: ' + CFG.scrollDelay + 'ms)');\n\n const scrollStep = CFG.scrollStep;\n const scrollDelay = CFG.scrollDelay;\n\n const pageHeight: number = await exporter.page.evaluate(`\n Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)\n `) as number;\n log('Page height: ' + pageHeight + 'px (' + Math.ceil(pageHeight / scrollStep) + ' scroll steps)');\n\n await exporter.page.evaluate(`\n new Promise(function(r) {\n var y = 0;\n var max = Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n var step = function() {\n y += ${scrollStep};\n window.scrollTo({ top: y, behavior: 'instant' });\n y < max + 500 ? setTimeout(step, ${scrollDelay}) : (window.scrollTo(0, 0), r());\n };\n step();\n })\n `);\n success('Full-page scroll complete');\n\n exporter.cooking?.update('Waiting for lazy resources...');\n log('Waiting 2s for lazy-loaded resources...');\n await new Promise<void>((r) => setTimeout(r, 2000));\n\n log('Checking network idle (1.5s quiet, 8s timeout)...');\n try {\n await exporter.page.waitForNetworkIdle({ idleTime: 1500, timeout: 8000 });\n success('Network idle confirmed');\n } catch {\n log('Network idle timeout reached (continuing anyway)');\n }\n\n const totalCaptured: number = exporter.assets.buffers.size;\n success('Captured ' + totalCaptured + ' network resources total');\n\n const cssCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.endsWith('.css')).length;\n const jsCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.endsWith('.js') || e.localPath.endsWith('.mjs')).length;\n const imgCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.startsWith('assets/images')).length;\n const fontCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.startsWith('assets/fonts')).length;\n log(' CSS: ' + cssCount + ' | JS: ' + jsCount + ' | Images: ' + imgCount + ' | Fonts: ' + fontCount);\n}\n\nexport async function closeBrowser(exporter: { browser: import('puppeteer').Browser | null }): Promise<void> {\n if (exporter.browser) {\n await exporter.browser.close();\n exporter.browser = null;\n log('Browser closed');\n }\n}\n\nexport async function captureSubpage(\n page: Page,\n url: string,\n platform: { needsHydrationCheck: boolean; hydrationTimeout: number }\n): Promise<string> {\n log(' Navigating to sub-page: ' + url);\n await page.goto(url, { waitUntil: 'networkidle2', timeout: CFG.timeout });\n\n if (platform.needsHydrationCheck) {\n await page.evaluate(\n `new Promise(function(r) {\n var t = Date.now();\n (function tick() {\n var m = document.getElementById('main') || document.body;\n if (m && m.children.length > 0) setTimeout(r, 500);\n else if (Date.now() - t > ${platform.hydrationTimeout}) r();\n else setTimeout(tick, 200);\n })();\n })`\n );\n } else {\n await new Promise<void>((r) => setTimeout(r, 1000));\n }\n\n const html: string = await page.evaluate(() => document.documentElement.outerHTML || document.body.innerHTML);\n log(' Sub-page fetched: ' + (html.length / 1024).toFixed(1) + ' KB');\n return html;\n}\n","export async function pool(tasks: Array<() => Promise<void>>, n: number): Promise<void> {\n let i = 0;\n const run = async (): Promise<void> => {\n while (i < tasks.length) {\n const j = i++;\n await tasks[j]();\n }\n };\n await Promise.all(Array.from({ length: Math.min(n, tasks.length) }, () => run()));\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { CFG } from '../config/index.js';\nimport { log, warn, success } from '../logger/index.js';\nimport { dlBuffer } from '../network/download.js';\nimport { pool } from '../network/pool.js';\nimport type { ExporterContext } from '../types.js';\n\nexport async function downloadAll(exporter: ExporterContext): Promise<void> {\n const seen: Set<string> = new Set();\n const toDownload: Array<{ url: string; localPath: string }> = [];\n for (const [url, { localPath }] of exporter.assets.entries) {\n if (seen.has(localPath)) continue;\n seen.add(localPath);\n toDownload.push({ url, localPath });\n }\n\n const total: number = toDownload.length;\n log('Starting download of ' + total + ' unique assets');\n log('Concurrency: ' + CFG.concurrency + ' parallel downloads');\n log('Retry policy: ' + CFG.retries + ' attempts, ' + CFG.dlTimeout + 'ms timeout');\n\n let ok = 0;\n let cached = 0;\n let fail = 0;\n let completed = 0;\n let lastReported = 0;\n\n const tasks: Array<() => Promise<void>> = toDownload.map(\n ({ url, localPath }) =>\n async (): Promise<void> => {\n const dest: string = path.join(exporter.outDir, localPath);\n await fs.mkdir(path.dirname(dest), { recursive: true });\n\n try {\n const buf: Buffer | undefined =\n exporter.assets.buffers.get(url) ||\n exporter.assets.buffers.get(url.split('?')[0]);\n if (buf) {\n await fs.writeFile(dest, buf);\n cached++;\n ok++;\n } else {\n const data: Buffer = await dlBuffer(url);\n await fs.writeFile(dest, data);\n ok++;\n }\n } catch (e) {\n fail++;\n if (\n !url.includes('framer.com/edit') &&\n !url.includes('framerstatic.com/editorbar')\n ) {\n warn('Download failed: ' + path.basename(localPath) + ' - ' + (e as Error).message);\n }\n }\n\n completed++;\n const pct: number = Math.floor((completed / total) * 100);\n if (pct >= lastReported + 10 || completed === total) {\n exporter.cooking?.update('Downloading... ' + completed + '/' + total + ' (' + pct + '%)');\n log('Download progress: ' + completed + '/' + total + ' (' + pct + '%)');\n lastReported = pct;\n }\n }\n );\n\n await pool(tasks, CFG.concurrency);\n\n success('Downloads complete: ' + ok + ' succeeded, ' + cached + ' from cache, ' + fail + ' failed');\n\n const totalBytes: number = [...exporter.assets.entries.values()].length;\n log('Total unique assets written to disk: ' + totalBytes);\n\n exporter.assets.buffers.clear();\n log('Network buffer cache cleared');\n}\n","import prettier from 'prettier';\n\nexport async function prettifyJS(src: string): Promise<string> {\n try {\n return await prettier.format(src, {\n parser: 'babel',\n printWidth: 100,\n tabWidth: 2,\n useTabs: false,\n semi: true,\n singleQuote: false,\n trailingComma: 'es5',\n bracketSpacing: true,\n arrowParens: 'always',\n });\n } catch {\n return src;\n }\n}\n","export const SERVE_SCRIPT: string = `#!/usr/bin/env node\nconst http = require('http');\nconst fs = require('fs');\nconst path = require('path');\n\nconst PORT = process.env.PORT || 3000;\nconst ROOT = __dirname;\n\nconst MIME = {\n '.html': 'text/html; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.js': 'application/javascript; charset=utf-8',\n '.mjs': 'application/javascript; charset=utf-8',\n '.json': 'application/json; charset=utf-8',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n '.avif': 'image/avif',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n '.otf': 'font/otf',\n '.mp4': 'video/mp4',\n '.webm': 'video/webm',\n '.ogg': 'video/ogg',\n '.framercms': 'application/octet-stream',\n};\n\nconst server = http.createServer((req, res) => {\n let url = decodeURIComponent(req.url.split('?')[0]);\n if (url === '/') url = '/index.html';\n\n let filePath = path.join(ROOT, url);\n if (!filePath.startsWith(ROOT)) {\n res.writeHead(403);\n res.end('Forbidden');\n return;\n }\n\n const serveFile = (pathToFile) => {\n fs.readFile(pathToFile, (err, data) => {\n if (err) {\n // SPA Fallback: if it's not a file, serve index.html\n if (url !== '/index.html' && !path.extname(url)) {\n return serveFile(path.join(ROOT, 'index.html'));\n }\n res.writeHead(404);\n res.end('Not found');\n return;\n }\n const ext = path.extname(pathToFile).toLowerCase();\n const mime = MIME[ext] || 'application/octet-stream';\n res.writeHead(200, {\n 'Content-Type': mime,\n 'Access-Control-Allow-Origin': '*',\n 'Cache-Control': 'public, max-age=3600',\n });\n res.end(data);\n });\n };\n\n serveFile(filePath);\n});\n\nconst ANSI = {\n reset: '\\\\x1b[0m',\n primary: '\\\\x1b[38;2;250;178;131m',\n soft: '\\\\x1b[38;2;255;192;159m',\n text: '\\\\x1b[38;2;238;238;238m',\n muted: '\\\\x1b[38;2;128;128;128m',\n border: '\\\\x1b[38;2;72;72;72m',\n success: '\\\\x1b[38;2;127;216;143m',\n info: '\\\\x1b[38;2;86;182;194m',\n};\n\nfunction color(name, value) {\n return ANSI[name] + value + ANSI.reset;\n}\n\nfunction frameLine(label, value) {\n const text = ' ' + label.padEnd(10) + value;\n const pad = Math.max(0, 56 - text.length);\n console.log(' ' + color('border', '│ ') + color('muted', label.padEnd(10)) + color('text', value) + ' '.repeat(pad) + color('border', ' │'));\n}\n\nfunction drawServerUi() {\n const logo = [\n '███████╗██████╗ █████╗ ███╗ ███╗███████╗██████╗ ',\n '██╔════╝██╔══██╗██╔══██╗████╗ ████║██╔════╝██╔══██╗',\n '█████╗ ██████╔╝███████║██╔████╔██║█████╗ ██████╔╝',\n '███████╗██╗ ██╗██████╗ ██████╗ ██████╗ ████████╗',\n '██╔════╝╚██╗██╔╝██╔══██╗██╔═══██╗██╔══██╗╚══██╔══╝',\n '█████╗ ╚███╔╝ ██████╔╝██║ ██║██████╔╝ ██║ ',\n ];\n\n console.log('');\n for (const line of logo) console.log(' ' + color('primary', line));\n console.log('');\n console.log(' ' + color('border', '╭─' + '─'.repeat(56) + '─╮'));\n console.log(' ' + color('border', '│ ') + color('text', ' Framer Export local server') + ' '.repeat(28) + color('border', ' │'));\n console.log(' ' + color('border', '├─' + '─'.repeat(56) + '─┤'));\n frameLine('URL', 'http://localhost:' + PORT);\n frameLine('Root', ROOT);\n frameLine('Mode', 'static mirror + SPA fallback');\n console.log(' ' + color('border', '╰─' + '─'.repeat(56) + '─╯'));\n console.log('');\n console.log(' ' + color('success', 'ready') + color('muted', ' press Ctrl+C to stop') + '\\\\n');\n}\n\nserver.listen(PORT, () => {\n const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n let i = 0;\n const timer = setInterval(() => {\n process.stdout.write('\\\\r\\\\x1B[2K ' + color('primary', frames[i % frames.length]) + ' ' + color('muted', 'starting Framer Export server'));\n i++;\n }, 80);\n\n setTimeout(() => {\n clearInterval(timer);\n process.stdout.write('\\\\r\\\\x1B[2K');\n drawServerUi();\n }, 720);\n});\n`;\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { log, warn, success } from '../logger/index.js';\nimport { prettifyJS } from '../formatter/prettify.js';\nimport { SERVE_SCRIPT } from '../server/template.js';\nimport type { ExporterContext } from '../types.js';\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction stripBySelector(html: string, sel: string): string {\n if (sel.includes('[src*=\"')) {\n const match = sel.match(/\\[src\\*=\"([^\"]+)\"\\]/);\n if (match) {\n const domain: string = escapeRegex(match[1]);\n html = html.replace(new RegExp(`<script[^>]*${domain}[^>]*>[^<]*<\\\\/script>`, 'g'), '');\n html = html.replace(new RegExp(`<script[^>]*${domain}[^>]*><\\\\/script>`, 'g'), '');\n }\n } else if (sel.includes('[href*=\"')) {\n const match = sel.match(/\\[href\\*=\"([^\"]+)\"\\]/);\n if (match) {\n const href: string = escapeRegex(match[1]);\n html = html.replace(new RegExp(`<link[^>]*${href}[^>]*>`, 'g'), '');\n }\n } else if (sel.startsWith('.')) {\n const cls: string = escapeRegex(sel.slice(1));\n html = html.replace(\n new RegExp(`<[^>]*class=\"[^\"]*${cls}[^\"]*\"[^>]*>[\\\\s\\\\S]*?<\\\\/[^>]*>`, 'g'),\n ''\n );\n } else if (sel.startsWith('#')) {\n const id: string = sel.slice(1);\n html = removeElementById(html, id);\n }\n return html;\n}\n\nfunction removeElementById(html: string, id: string): string {\n const marker: string = `id=\"${id}\"`;\n let idx: number = html.indexOf(marker);\n while (idx !== -1) {\n const tagStart: number = html.lastIndexOf('<', idx);\n if (tagStart === -1) break;\n\n const tagNameEnd: number = html.indexOf(' ', tagStart + 1);\n const tagName: string = html.slice(tagStart + 1, tagNameEnd).toLowerCase();\n\n let depth = 0;\n let i: number = tagStart;\n while (i < html.length) {\n if (\n html.startsWith(`<${tagName}`, i) &&\n (html[i + tagName.length + 1] === ' ' || html[i + tagName.length + 1] === '>')\n ) {\n depth++;\n i += tagName.length + 1;\n } else if (html.startsWith(`</${tagName}>`, i)) {\n depth--;\n if (depth === 0) {\n html = html.slice(0, tagStart) + html.slice(i + tagName.length + 3);\n break;\n }\n i += tagName.length + 3;\n } else {\n i++;\n }\n }\n\n idx = html.indexOf(marker);\n }\n return html;\n}\n\nfunction processSEO(html: string, url: string): string {\n const canonical = url.split('?')[0].replace(/\\/$/, '');\n\n // Inject Canonical\n if (!html.includes('rel=\"canonical\"')) {\n html = html.replace('</head>', ` <link rel=\"canonical\" href=\"${canonical}\">\\n </head>`);\n }\n\n // Inject Meta Description if missing\n if (!html.includes('name=\"description\"')) {\n html = html.replace(\n '</head>',\n ` <meta name=\"description\" content=\"Exported with Framer Export - Fast, SEO-optimized, and clean.\">\\n </head>`\n );\n }\n\n // Inject OG Tags if missing\n if (!html.includes('property=\"og:')) {\n html = html.replace(\n '</head>',\n ` <meta property=\"og:type\" content=\"website\">\\n <meta property=\"og:url\" content=\"${canonical}\">\\n <meta property=\"og:title\" content=\"Exported Site\">\\n <meta property=\"og:description\" content=\"A fast, clean version of this site, exported for performance.\">\\n </head>`\n );\n }\n\n // Inject Robot tags\n if (!html.includes('name=\"robots\"')) {\n html = html.replace('</head>', ` <meta name=\"robots\" content=\"index, follow\">\\n </head>`);\n }\n\n return html;\n}\n\nfunction stripIntegrityAndCors(html: string): string {\n html = html.replace(/\\s+integrity=\"[^\"]*\"/g, '');\n html = html.replace(/\\s+crossorigin=\"[^\"]*\"/g, '');\n html = html.replace(/\\s+crossorigin/g, '');\n html = html.replace(/<link[^>]*rel=\"preconnect\"[^>]*>/g, '');\n html = html.replace(/<link[^>]*rel=\"dns-prefetch\"[^>]*>/g, '');\n html = html.replace(/<meta[^>]*content-security-policy[^>]*>/gi, '');\n return html;\n}\n\nfunction stripSrcsetCdnUrls(html: string): string {\n html = html.replace(/srcset=\"([^\"]*)\"/g, (_match: string, srcset: string) => {\n const cleaned: string = srcset\n .split(',')\n .map((entry: string) => entry.trim())\n .filter((entry: string) => !entry.startsWith('http'))\n .join(', ');\n return cleaned ? 'srcset=\"' + cleaned + '\"' : '';\n });\n return html;\n}\n\nexport async function buildOutput(exporter: ExporterContext): Promise<void> {\n exporter.cooking?.update('Stripping platform badges...');\n log('Starting HTML post-processing...');\n log('HTML size: ' + (exporter.ssrHTML.length / 1024).toFixed(1) + ' KB');\n\n let html: string = exporter.ssrHTML;\n if (!html) {\n warn('No SSR HTML available, cannot build output');\n return;\n }\n\n exporter.cooking?.update('Removing integrity checks...');\n const beforeIntegrity: number = html.length;\n html = stripIntegrityAndCors(html);\n log('Stripped integrity/crossorigin/preconnect (' + (beforeIntegrity - html.length) + ' chars)');\n success('Integrity and CORS restrictions removed');\n\n if (typeof processSEO === 'function') {\n exporter.cooking?.update('Optimizing SEO...');\n html = processSEO(html, exporter.siteUrl);\n success('SEO meta tags optimized');\n }\n\n log('Stripping ' + exporter.platform.stripSelectors.length + ' selectors:');\n for (const sel of exporter.platform.stripSelectors) {\n const before: number = html.length;\n html = stripBySelector(html, sel);\n const removed: number = before - html.length;\n if (removed > 0) {\n log(' Stripped ' + sel + ' (' + removed + ' chars removed)');\n }\n }\n\n log('Applying ' + exporter.platform.stripPatterns.length + ' regex patterns...');\n for (const pattern of exporter.platform.stripPatterns) {\n const before: number = html.length;\n html = html.replace(new RegExp(pattern.source, pattern.flags), '');\n const removed: number = before - html.length;\n if (removed > 0) {\n log(' Pattern removed ' + removed + ' chars');\n }\n }\n success('Platform badges and tracking stripped');\n\n exporter.cooking?.update('Rewriting asset URLs...');\n log('Rewriting ' + exporter.assets.entries.size + ' CDN URLs to local paths...');\n const beforeRewrite: number = html.length;\n html = exporter.assets.rewrite(html, '');\n log('HTML rewrite delta: ' + (html.length - beforeRewrite) + ' chars');\n\n exporter.cooking?.update('Cleaning srcset references...');\n html = stripSrcsetCdnUrls(html);\n log('Cleaned remaining CDN URLs from srcset attributes');\n\n await rewriteDownloadedFiles(exporter);\n success('All URLs rewritten to local paths');\n\n exporter.cooking?.update('Pretty-printing JS files...');\n await prettifyDownloadedJS(exporter);\n\n exporter.cooking?.update('Writing final output...');\n log('Writing index.html (' + (html.length / 1024).toFixed(1) + ' KB)...');\n await fs.writeFile(path.join(exporter.outDir, 'index.html'), html);\n success('index.html written');\n\n await fs.writeFile(path.join(exporter.outDir, 'serve.cjs'), SERVE_SCRIPT);\n log('serve.cjs written');\n success('Output build complete');\n}\n\nasync function rewriteDownloadedFiles(exporter: ExporterContext): Promise<void> {\n const dirs: string[] = ['scripts/vendor', 'scripts/modules', 'styles'];\n let rewritten = 0;\n\n for (const dir of dirs) {\n const fullDir: string = path.join(exporter.outDir, dir);\n let files: string[];\n try {\n files = await fs.readdir(fullDir);\n } catch {\n continue;\n }\n\n for (const file of files) {\n const ext: string = path.extname(file).toLowerCase();\n if (!['.mjs', '.js', '.css'].includes(ext)) continue;\n\n const filePath: string = path.join(fullDir, file);\n try {\n let content: string = await fs.readFile(filePath, 'utf-8');\n const before: string = content;\n content = exporter.assets.rewrite(content, dir);\n if (content !== before) {\n await fs.writeFile(filePath, content);\n rewritten++;\n }\n } catch {}\n }\n }\n log('Rewrote URLs in ' + rewritten + ' JS/CSS files');\n}\n\nasync function prettifyDownloadedJS(exporter: ExporterContext): Promise<void> {\n const dirs: string[] = ['scripts/vendor', 'scripts/modules'];\n let count = 0;\n let total = 0;\n\n for (const dir of dirs) {\n const fullDir: string = path.join(exporter.outDir, dir);\n let files: string[];\n try {\n files = await fs.readdir(fullDir);\n } catch {\n continue;\n }\n\n const jsFiles: string[] = files.filter((f) => {\n const ext: string = path.extname(f).toLowerCase();\n return ext === '.mjs' || ext === '.js';\n });\n total += jsFiles.length;\n\n for (const file of jsFiles) {\n const filePath: string = path.join(fullDir, file);\n try {\n const raw: string = await fs.readFile(filePath, 'utf-8');\n\n const nlRatio: number = (raw.match(/\\n/g) || []).length / raw.length;\n if (nlRatio > 0.05) {\n count++;\n continue;\n }\n\n const pretty: string = await prettifyJS(raw);\n await fs.writeFile(filePath, pretty, 'utf-8');\n count++;\n\n if (count % 5 === 0) {\n exporter.cooking?.update('Pretty-printing... (' + count + '/' + total + ')');\n }\n } catch (e) {\n warn('Pretty-print skipped: ' + file + ' - ' + (e as Error).message);\n count++;\n }\n }\n }\n\n success('Formatted ' + count + '/' + total + ' JS/MJS files');\n}\n","import chalk from 'chalk';\nimport { stripAnsi, ui } from './theme.js';\n\nexport function maxWidth(): number {\n return Math.min(process.stdout.columns || 80, 76);\n}\n\nfunction padRight(text: string, w: number): string {\n const visible = stripAnsi(text).length;\n if (visible >= w) return text;\n return text + ' '.repeat(w - visible);\n}\n\nexport function boxTop(w: number): string {\n const inner = w - 4;\n return ' ' + ui.border('╭─') + ui.border('─'.repeat(inner)) + ui.border('─╮');\n}\n\nexport function boxBot(w: number): string {\n const inner = w - 4;\n return ' ' + ui.border('╰─') + ui.border('─'.repeat(inner)) + ui.border('─╯');\n}\n\nexport function boxLine(w: number, text: string): string {\n const inner = w - 4;\n const padded = padRight(text, inner);\n return ' ' + ui.border('│ ') + padded + ui.border(' │');\n}\n\nexport function boxSep(w: number): string {\n const inner = w - 4;\n return ' ' + ui.border('├─') + ui.border('─'.repeat(inner)) + ui.border('─┤');\n}\n\nexport function boxRow(w: number, label: string, value: string): string {\n const inner = w - 4;\n const labelPlain = stripAnsi(chalk.bold(label));\n const visible = labelPlain.length + 1 + value.length;\n if (visible > inner) {\n const avail = inner - labelPlain.length - 2;\n const truncated = value.length > avail ? value.slice(0, avail - 1) + '..' : value;\n return (\n ' ' +\n ui.border('│ ') +\n chalk.bold(label) +\n ': ' +\n ui.primary(truncated) +\n ' '.repeat(Math.max(0, inner - labelPlain.length - 1 - truncated.length)) +\n ui.border(' │')\n );\n }\n const right = inner - labelPlain.length - 1 - value.length;\n return (\n ' ' +\n ui.border('│ ') +\n chalk.bold(label) +\n ': ' +\n ui.primary(value) +\n ' '.repeat(right) +\n ui.border(' │')\n );\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport type { ExporterContext } from '../types.js';\nimport { boxTop, boxLine, boxBot, boxSep, maxWidth } from '../cli/box.js';\nimport { chip, ui } from '../cli/theme.js';\n\nexport async function printSummary(exporter: ExporterContext): Promise<void> {\n const w = maxWidth();\n const isSmall = w < 50;\n\n const count = async (d: string): Promise<number> => {\n try {\n return (await fs.readdir(path.join(exporter.outDir, d))).length;\n } catch {\n return 0;\n }\n };\n const [imgs, fonts, videos, misc, scripts, vendor, styles, data, subpages] = await Promise.all([\n count('assets/images'),\n count('assets/fonts'),\n count('assets/videos'),\n count('assets/misc'),\n count('scripts/modules'),\n count('scripts/vendor'),\n count('styles'),\n count('data'),\n count('subpages'),\n ]);\n\n const G = ui.primary;\n const G2 = ui.primarySoft;\n const C2 = ui.secondary;\n const Y = ui.accent;\n const O = ui.warning;\n const Br = ui.info;\n const Gr = ui.muted;\n const Gn = ui.success;\n\n const entries: Array<[string, number, string, (s: string) => string]> = [\n ['styles/', styles, 'CSS', G],\n ['scripts/vendor/', vendor, 'JS vendor', G2],\n ['scripts/modules/', scripts, 'JS modules', C2],\n ['assets/images/', imgs, 'images', Y],\n ['assets/videos/', videos, 'videos', O],\n ['assets/fonts/', fonts, 'fonts', Br],\n ['assets/misc/', misc, 'misc', Gr],\n ['data/', data, 'data', Gr],\n ['subpages/', subpages, 'pages', Gn],\n ];\n\n console.log('');\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, `${ui.text.bold(' Export Summary')} ${chip('done')}`));\n console.log(boxSep(w));\n } else {\n console.log(ui.text.bold(' Export Summary:'));\n }\n\n for (const [label, cnt, type, color] of entries) {\n if (cnt === 0) continue;\n const inner = w - 4;\n const l = label.padEnd(16);\n const c = String(cnt).padStart(3);\n const rowText = `${color(l)}${ui.text(c)} ${ui.muted(type)}`;\n const visible = 16 + 3 + 2 + type.length;\n const pad = Math.max(0, inner - visible);\n if (isSmall) {\n console.log(` ${color(label)} ${ui.text(String(cnt))} ${ui.muted(type)}`);\n } else {\n console.log(' ' + ui.border('│ ') + rowText + ' '.repeat(pad) + ui.border(' │'));\n }\n }\n\n if (!isSmall) {\n console.log(boxBot(w));\n }\n\n console.log('');\n const cdCmd = 'cd ' + path.basename(exporter.outDir) + ' && node serve.cjs';\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, ui.text.bold(' To serve locally')));\n console.log(boxSep(w));\n const inner = w - 6;\n const cmdLen = cdCmd.length;\n const pad = Math.max(0, inner - cmdLen);\n console.log(\n ' ' + ui.border('│ ') + G(cdCmd) + ' '.repeat(pad) + ui.muted(' copy') + ui.border(' │')\n );\n console.log(boxBot(w));\n } else {\n console.log(ui.text.bold(' To serve locally:'));\n console.log(` ${G(cdCmd)}`);\n }\n\n console.log('');\n console.log(ui.muted(' note: must be served via HTTP for JS modules to work.'));\n console.log('');\n}\n","import readline from 'node:readline';\nimport { stdin, stdout } from 'node:process';\nimport { boxBot, boxLine, boxSep, boxTop, maxWidth } from './box.js';\nimport { centerText, stripAnsi, truncatePlain, ui } from './theme.js';\n\nexport interface SelectOption {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\nexport async function select(\n question: string,\n options: SelectOption[],\n defaultIndex: number = 0\n): Promise<string> {\n const isTTY = stdin.isTTY && stdout.isTTY;\n\n if (!isTTY) {\n return fallbackPrompt(question, options, defaultIndex);\n }\n\n return arrowSelect(question, options, defaultIndex);\n}\n\nasync function arrowSelect(\n question: string,\n options: SelectOption[],\n defaultIndex: number\n): Promise<string> {\n const panelTopRow = await queryCursorRow();\n const width = Math.min(maxWidth(), 72);\n const inner = width - 4;\n const optionStartOffset = 3;\n const lineCount = options.length + 4;\n\n return new Promise((resolve) => {\n const firstEnabled: number = options.findIndex((option) => !option.disabled);\n let selected: number = options[defaultIndex]?.disabled ? firstEnabled : defaultIndex;\n if (selected < 0) selected = 0;\n\n const move = (direction: -1 | 1): void => {\n let next = selected + direction;\n while (next >= 0 && next < options.length) {\n if (!options[next].disabled) {\n selected = next;\n return;\n }\n next += direction;\n }\n };\n\n const render = (initial: boolean = false): void => {\n if (!initial) {\n stdout.write(`\\x1B[${lineCount}A`);\n stdout.write('\\x1B[J');\n }\n console.log(boxTop(width));\n console.log(\n boxLine(width, centerText(`${ui.primary('●')} ${ui.text.bold(question)}`, inner))\n );\n console.log(boxSep(width));\n for (let i = 0; i < options.length; i++) {\n console.log(\n boxLine(width, centerText(renderOption(options[i], i === selected, inner), inner))\n );\n }\n console.log(boxBot(width));\n };\n\n const choose = (): void => {\n cleanup();\n\n stdout.write(`\\x1B[${lineCount}A`);\n stdout.write('\\x1B[J');\n console.log(\n ` ${ui.success('✓')} ${ui.text.bold(question)} ${ui.primary(stripAnsi(options[selected].label))}\\n`\n );\n\n resolve(options[selected].value);\n };\n\n const onMouseData = (chunk: Buffer): void => {\n const mouse = parseMouseEvent(chunk);\n if (!mouse) return;\n\n if (mouse.kind === 'wheel-up') {\n move(-1);\n render();\n return;\n }\n\n if (mouse.kind === 'wheel-down') {\n move(1);\n render();\n return;\n }\n\n if (panelTopRow === null) return;\n const idx = mouse.y - panelTopRow - optionStartOffset;\n if (idx < 0 || idx >= options.length || options[idx].disabled) return;\n\n if (selected !== idx) {\n selected = idx;\n render();\n }\n\n if (mouse.kind === 'click') {\n choose();\n }\n };\n\n const cleanup = (): void => {\n disableMouse();\n stdin.setRawMode(false);\n stdin.removeListener('keypress', onKeypress);\n stdin.removeListener('data', onMouseData);\n stdin.pause();\n };\n\n render(true);\n\n readline.emitKeypressEvents(stdin);\n stdin.setRawMode(true);\n enableInteractiveInput();\n\n const onKeypress = (_str: string | undefined, key: readline.Key): void => {\n if (!key) return;\n\n if (key.name === 'up' && selected > 0) {\n move(-1);\n render();\n } else if (key.name === 'down' && selected < options.length - 1) {\n move(1);\n render();\n } else if (key.name === 'return') {\n choose();\n } else if ((key.ctrl && key.name === 'c') || key.name === 'escape') {\n cleanup();\n process.exit(0);\n }\n };\n\n stdin.resume();\n stdin.on('data', onMouseData);\n stdin.on('keypress', onKeypress);\n });\n}\n\nasync function fallbackPrompt(\n question: string,\n options: SelectOption[],\n defaultIndex: number\n): Promise<string> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: stdin, output: stdout });\n const firstEnabled: number = options.findIndex((option) => !option.disabled);\n const enabledDefault: number = options[defaultIndex]?.disabled ? firstEnabled : defaultIndex;\n\n console.log(` ${ui.primary('●')} ${ui.text.bold(question)}\\n`);\n for (let i = 0; i < options.length; i++) {\n const marker = i === enabledDefault ? ui.success(' ◆') : ' ';\n const label = options[i].disabled\n ? ui.muted(stripAnsi(options[i].label))\n : ui.text(options[i].label);\n console.log(` ${ui.muted(`[${i + 1}]`)}${marker} ${label}`);\n }\n console.log('');\n const def = String(enabledDefault + 1);\n\n const ask = (): void => {\n rl.question(\n ` ${ui.primary('>')} ${ui.muted(`Choose [1-${options.length}] (${def})`)}: `,\n (answer) => {\n const trimmed = answer.trim();\n if (!trimmed) {\n rl.close();\n const label = stripAnsi(options[enabledDefault].label);\n console.log(` ${ui.success('✓')} ${ui.primary(label)}\\n`);\n resolve(options[enabledDefault].value);\n return;\n }\n const idx = parseInt(trimmed, 10);\n if (idx >= 1 && idx <= options.length && !options[idx - 1].disabled) {\n rl.close();\n const label = stripAnsi(options[idx - 1].label);\n console.log(` ${ui.success('✓')} ${ui.primary(label)}\\n`);\n resolve(options[idx - 1].value);\n } else if (idx >= 1 && idx <= options.length && options[idx - 1].disabled) {\n console.log(` ${ui.error('✗')} ${ui.warning('Option unavailable for now')}\\n`);\n ask();\n } else {\n console.log(` ${ui.error('✗')} ${ui.warning(`Enter 1-${options.length}`)}\\n`);\n ask();\n }\n }\n );\n };\n ask();\n });\n}\n\ntype MouseEventInfo =\n | { kind: 'click'; x: number; y: number }\n | { kind: 'hover'; x: number; y: number }\n | { kind: 'wheel-up'; x: number; y: number }\n | { kind: 'wheel-down'; x: number; y: number };\n\nfunction renderOption(option: SelectOption, selected: boolean, width: number): string {\n const plain = truncatePlain(stripAnsi(option.label), Math.max(10, width - 12));\n if (option.disabled) {\n return `${ui.border('[')} ${ui.muted(plain)} ${ui.border(']')}`;\n }\n if (selected) {\n return `${ui.primary('›')} ${ui.primary('[')} ${ui.text.bold(plain)} ${ui.primary(']')} ${ui.primary('‹')}`;\n }\n return `${ui.muted(' ')} ${ui.border('[')} ${ui.muted(plain)} ${ui.border(']')} ${ui.muted(' ')}`;\n}\n\nfunction enableInteractiveInput(): void {\n stdout.write('\\x1B[?25l\\x1B[?1000h\\x1B[?1002h\\x1B[?1003h\\x1B[?1006h');\n}\n\nfunction disableMouse(): void {\n stdout.write('\\x1B[?1003l\\x1B[?1002l\\x1B[?1000l\\x1B[?1006l\\x1B[?25h');\n}\n\nfunction parseMouseEvent(chunk: Buffer): MouseEventInfo | null {\n const text = chunk.toString('utf-8');\n const match = text.match(/\\x1B\\[<(\\d+);(\\d+);(\\d+)([mM])/);\n if (!match) return null;\n\n const code = Number(match[1]);\n const x = Number(match[2]);\n const y = Number(match[3]);\n const state = match[4];\n if (code === 64) return { kind: 'wheel-up', x, y };\n if (code === 65) return { kind: 'wheel-down', x, y };\n if (state === 'm') return { kind: 'click', x, y };\n if ((code & 32) === 32 || code === 35) return { kind: 'hover', x, y };\n if ((code & 3) === 0) return { kind: 'hover', x, y };\n return null;\n}\n\nfunction queryCursorRow(): Promise<number | null> {\n if (!stdin.isTTY || !stdout.isTTY) return Promise.resolve(null);\n\n return new Promise((resolve) => {\n const wasRaw = stdin.isRaw;\n let done = false;\n\n const finish = (row: number | null): void => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n stdin.removeListener('data', onData);\n if (!wasRaw) stdin.setRawMode(false);\n resolve(row);\n };\n\n const onData = (chunk: Buffer): void => {\n const match = chunk.toString('utf-8').match(/\\x1B\\[(\\d+);\\d+R/);\n if (!match) return;\n finish(Number(match[1]));\n };\n\n const timer = setTimeout(() => finish(null), 80);\n stdin.setRawMode(true);\n stdin.resume();\n stdin.on('data', onData);\n stdout.write('\\x1B[6n');\n });\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { stdin, stdout } from 'node:process';\nimport { spawn } from 'node:child_process';\nimport type { ExporterContext } from '../types.js';\nimport { select, type SelectOption } from '../cli/select.js';\nimport { boxTop, boxLine, boxSep, boxBot, maxWidth } from '../cli/box.js';\nimport { stripAnsi, ui } from '../cli/theme.js';\n\ninterface ConversionTarget {\n id: string;\n label: string;\n stack: string;\n projectDir: string;\n staticDir: string;\n scaffold: string;\n entryFiles: string;\n routing: string;\n}\n\ninterface AiTool {\n id: string;\n label: string;\n displayName: string;\n agentName: string;\n}\n\ninterface ConversionGoal {\n id: string;\n label: string;\n instruction: string;\n priority: string;\n}\n\ninterface ExportFacts {\n sourceUrl: string;\n outputDir: string;\n platformName: string;\n rootEntries: string[];\n counts: Record<string, number>;\n}\n\nconst IMPORTANT_DIRS = [\n 'index.html',\n 'styles',\n 'scripts/vendor',\n 'scripts/modules',\n 'assets/images',\n 'assets/videos',\n 'assets/fonts',\n 'assets/misc',\n 'data',\n 'subpages',\n];\n\nconst AI_TOOLS: AiTool[] = [\n {\n id: 'claude-code',\n label: 'Claude Code',\n displayName: 'Claude Code',\n agentName: 'Claude Code',\n },\n {\n id: 'codex',\n label: 'Codex',\n displayName: 'Codex',\n agentName: 'Codex coding agent',\n },\n {\n id: 'opencode',\n label: 'OpenCode',\n displayName: 'OpenCode',\n agentName: 'OpenCode',\n },\n {\n id: 'other-ai',\n label: 'Other AI coding agent',\n displayName: 'Other AI',\n agentName: 'AI coding agent',\n },\n];\n\nconst TARGETS: ConversionTarget[] = [\n {\n id: 'react-vite',\n label: 'React + Vite + TypeScript',\n stack: 'React 18/19, TypeScript, Vite, CSS modules or plain CSS',\n projectDir: 'converted-react-vite',\n staticDir: 'public',\n scaffold: 'npm create vite@latest converted-react-vite -- --template react-ts',\n entryFiles: 'src/main.tsx, src/App.tsx, src/components/*, src/styles/*',\n routing: 'Use React Router only if multiple exported pages exist in subpages/.',\n },\n {\n id: 'nextjs-app-router',\n label: 'Next.js App Router',\n stack: 'Next.js App Router, TypeScript, React Server Components where useful',\n projectDir: 'converted-nextjs',\n staticDir: 'public',\n scaffold: 'npx create-next-app@latest converted-nextjs --ts --app --eslint',\n entryFiles: 'app/page.tsx, app/layout.tsx, components/*, public/*',\n routing: 'Map exported subpages to app routes and keep shared layout code reusable.',\n },\n {\n id: 'vue-vite',\n label: 'Vue + Vite + TypeScript',\n stack: 'Vue 3, TypeScript, Vite, single-file components',\n projectDir: 'converted-vue-vite',\n staticDir: 'public',\n scaffold: 'npm create vite@latest converted-vue-vite -- --template vue-ts',\n entryFiles: 'src/main.ts, src/App.vue, src/components/*.vue, src/styles/*',\n routing: 'Use Vue Router only if multiple exported pages exist in subpages/.',\n },\n {\n id: 'sveltekit',\n label: 'SvelteKit',\n stack: 'SvelteKit, TypeScript, componentized routes and assets',\n projectDir: 'converted-sveltekit',\n staticDir: 'static',\n scaffold: 'npm create svelte@latest converted-sveltekit',\n entryFiles: 'src/routes/+page.svelte, src/lib/components/*, static/*',\n routing: 'Create SvelteKit routes for meaningful exported pages when subpages/ exists.',\n },\n {\n id: 'astro',\n label: 'Astro',\n stack: 'Astro, TypeScript, island components only where interactivity is needed',\n projectDir: 'converted-astro',\n staticDir: 'public',\n scaffold: 'npm create astro@latest converted-astro',\n entryFiles: 'src/pages/index.astro, src/components/*, public/*',\n routing: 'Use Astro pages for exported subpages and avoid unnecessary client JavaScript.',\n },\n];\n\nconst GOALS: ConversionGoal[] = [\n {\n id: 'clean-rebuild',\n label: 'Clean professional rebuild',\n instruction:\n 'Rebuild the export as clean production code, not as a one-file HTML clone, while preserving the full page experience.',\n priority: 'Readable structure, maintainability, complete pages, and faithful visual result.',\n },\n {\n id: 'pixel-perfect',\n label: 'Pixel-perfect visual migration',\n instruction:\n 'Prioritize pixel-perfect fidelity before refactoring anything aggressively, even when the layout is difficult.',\n priority:\n 'Spacing, typography, responsive behavior, colors, media, animations, and page-by-page fidelity.',\n },\n {\n id: 'component-system',\n label: 'Reusable component system',\n instruction:\n 'Extract repeated UI blocks into reusable components with clean props without simplifying the original pages.',\n priority:\n 'Components, layout primitives, naming, future editability, and complete section coverage.',\n },\n {\n id: 'performance-seo',\n label: 'Performance and SEO rebuild',\n instruction:\n 'Rebuild the site while reducing unused vendor code and improving SEO basics without losing visual fidelity.',\n priority:\n 'Fast loading, semantic markup, metadata, accessibility, asset hygiene, and faithful pages.',\n },\n];\n\nexport async function runAiPromptAssistant(exporter: ExporterContext): Promise<void> {\n if (!stdin.isTTY || !stdout.isTTY) return;\n\n printConvertPanel(exporter);\n const action = await select(\n 'Framer Export AI Convert',\n [\n { label: `${buttonLabel('Convert')} open AI prompt modal`, value: 'convert' },\n { label: `${buttonLabel('Skip')} finish export`, value: 'skip' },\n ],\n 0\n );\n if (action === 'skip') return;\n\n printAssistantModal('AI conversion prompt', [\n 'Choose a target stack, AI tool, and conversion situation.',\n 'Mouse clicks are supported in the terminal when available.',\n 'A detailed prompt file will be generated inside the export folder.',\n ]);\n\n const targetOptions: SelectOption[] = [\n ...TARGETS.map((target) => ({ label: target.label, value: target.id })),\n { label: 'Customize with AI - BETA in development', value: 'custom-ai', disabled: true },\n ];\n\n const targetId = await select('Choose target stack', targetOptions, 0);\n\n const aiToolId = await select(\n 'Choose the AI coding tool',\n AI_TOOLS.map((tool) => ({ label: tool.label, value: tool.id })),\n 0\n );\n\n const goalId = await select(\n 'Choose the conversion situation',\n GOALS.map((goal) => ({ label: goal.label, value: goal.id })),\n 0\n );\n\n const target = TARGETS.find((item) => item.id === targetId) || TARGETS[0];\n const aiTool = AI_TOOLS.find((item) => item.id === aiToolId) || AI_TOOLS[0];\n const goal = GOALS.find((item) => item.id === goalId) || GOALS[0];\n const facts = await collectExportFacts(exporter);\n const prompt = buildConversionPrompt(target, aiTool, goal, facts);\n const aiDir = path.join(exporter.outDir, 'ai');\n const promptPath = path.join(aiDir, `${aiTool.id}-${target.id}-${goal.id}-prompt.md`);\n\n await fs.mkdir(aiDir, { recursive: true });\n await fs.writeFile(promptPath, prompt, 'utf-8');\n\n printPromptResult(promptPath, target, aiTool, goal);\n\n const promptAction = await select(\n 'Prompt actions',\n [\n { label: `${buttonLabel('Copy prompt')} clipboard`, value: 'copy' },\n { label: `${buttonLabel('Done')} keep file only`, value: 'done' },\n ],\n 0\n );\n\n if (promptAction === 'copy') {\n try {\n await copyToClipboard(prompt);\n console.log(` ${ui.success('✓')} ${ui.text.bold('Prompt copied to clipboard')}\\n`);\n } catch (error) {\n console.log(\n ` ${ui.warning('!')} ${ui.warning('Clipboard copy unavailable:')} ${ui.muted((error as Error).message)}\\n`\n );\n }\n }\n}\n\nasync function collectExportFacts(exporter: ExporterContext): Promise<ExportFacts> {\n const counts: Record<string, number> = {};\n const rootEntries = await safeReadDir(exporter.outDir);\n\n for (const item of IMPORTANT_DIRS) {\n counts[item] =\n item === 'index.html'\n ? (await exists(path.join(exporter.outDir, item)))\n ? 1\n : 0\n : await countEntries(path.join(exporter.outDir, item));\n }\n\n return {\n sourceUrl: exporter.siteUrl,\n outputDir: exporter.outDir,\n platformName: exporter.platform.displayName,\n rootEntries,\n counts,\n };\n}\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function safeReadDir(dir: string): Promise<string[]> {\n try {\n return (await fs.readdir(dir)).sort();\n } catch {\n return [];\n }\n}\n\nasync function countEntries(dir: string): Promise<number> {\n try {\n return (await fs.readdir(dir)).length;\n } catch {\n return 0;\n }\n}\n\nfunction buttonLabel(label: string): string {\n return `${ui.border('[')} ${ui.text.bold(label)} ${ui.border(']')}`;\n}\n\nfunction centerText(text: string, width: number): string {\n const visible = stripAnsi(text).length;\n if (visible >= width) return text;\n const left = Math.floor((width - visible) / 2);\n return ' '.repeat(left) + text + ' '.repeat(width - visible - left);\n}\n\nfunction printConvertPanel(exporter: ExporterContext): void {\n const w = maxWidth();\n const inner = w - 4;\n const rows = [\n centerText(`${ui.text.bold('AI Convert')} ${ui.muted('BETA')}`, inner),\n centerText(ui.muted('Generate a conversion prompt after the export.'), inner),\n centerText(`${buttonLabel('Convert')} ${ui.muted('or')} ${buttonLabel('Skip')}`, inner),\n centerText(ui.muted(path.basename(exporter.outDir)), inner),\n ];\n\n console.log('');\n console.log(boxTop(w));\n for (const row of rows) console.log(boxLine(w, row));\n console.log(boxBot(w));\n console.log('');\n}\n\nfunction printAssistantModal(title: string, lines: string[]): void {\n const w = maxWidth();\n const inner = w - 4;\n\n console.log('');\n console.log(boxTop(w));\n console.log(boxLine(w, centerText(`${ui.primary('◆')} ${ui.text.bold(title)}`, inner)));\n console.log(boxSep(w));\n for (const line of lines) {\n console.log(boxLine(w, centerText(ui.muted(line), inner)));\n }\n console.log(boxBot(w));\n console.log('');\n}\n\nfunction buildConversionPrompt(\n target: ConversionTarget,\n aiTool: AiTool,\n goal: ConversionGoal,\n facts: ExportFacts\n): string {\n const rootEntries = facts.rootEntries.length\n ? facts.rootEntries.join(', ')\n : 'No root entries detected';\n const exportDir = quoteForPrompt(facts.outputDir);\n const projectDir = quoteForPrompt(path.join(facts.outputDir, target.projectDir));\n const scaffoldCommand = `cd ${exportDir}; ${target.scaffold}`;\n const sourceAssets = quoteForPrompt(path.join(facts.outputDir, 'assets', '*'));\n const destinationAssets = quoteForPrompt(\n path.join(facts.outputDir, target.projectDir, target.staticDir, 'assets')\n );\n const windowsAssetCopyCommand = `New-Item -ItemType Directory -Force -Path ${destinationAssets}; Copy-Item -Path ${sourceAssets} -Destination ${destinationAssets} -Recurse -Force`;\n const unixSourceAssets = quoteForPrompt(toPosixPath(path.join(facts.outputDir, 'assets')));\n const unixDestinationParent = quoteForPrompt(\n toPosixPath(path.join(facts.outputDir, target.projectDir, target.staticDir))\n );\n const unixAssetCopyCommand = `mkdir -p ${unixDestinationParent} && cp -R ${unixSourceAssets} ${unixDestinationParent}/assets`;\n const directoryLines = IMPORTANT_DIRS.map(\n (dir) => `Inspect ${dir}: ${facts.counts[dir]} item(s) detected in the export.`\n );\n const promptLines = [\n `You are ${aiTool.agentName} working inside a local export created by Framer Export.`,\n 'This brief was generated by the Framer Export AI Prompt Assistant BETA.',\n 'Treat this beta prompt as a strict conversion checklist, not as permission to skip inspection.',\n 'Your mission is to convert this exported static mirror into a clean production project.',\n `Target stack: ${target.stack}.`,\n `Selected AI coding tool: ${aiTool.displayName}.`,\n `Selected conversion situation: ${goal.label}.`,\n `Primary instruction for this situation: ${goal.instruction}`,\n `Main priority: ${goal.priority}`,\n `Source URL from the real export: ${facts.sourceUrl}`,\n `Detected platform from the real export: ${facts.platformName}`,\n `Export folder to inspect first: ${facts.outputDir}`,\n `Root entries actually present: ${rootEntries}`,\n `Create the converted project in: ${projectDir}`,\n `Recommended scaffold command: ${scaffoldCommand}`,\n `Expected important target files: ${target.entryFiles}`,\n `Routing guidance: ${target.routing}`,\n `Static assets destination for this stack: ${target.staticDir}/assets inside the converted project.`,\n `PowerShell command to copy exported assets after scaffolding: ${windowsAssetCopyCommand}`,\n `macOS/Linux command to copy exported assets after scaffolding: ${unixAssetCopyCommand}`,\n 'Run the asset copy command; do not recreate, redownload, rename randomly, or replace real exported assets with placeholders.',\n 'After copying assets, update every image, video, font, CSS url(), and script reference to the new local asset path.',\n 'Do not rush. Take time to inspect the export before writing the final implementation.',\n 'Do not invent brand names, copy, images, links, animations, colors, or sections.',\n 'Use only real information found in index.html, CSS files, JavaScript files, data files, and assets.',\n 'If a detail is missing, inspect more files instead of guessing.',\n 'If a vendor script is minified or hard to understand, identify what behavior it provides before replacing it.',\n 'Keep the final result professional, clean, responsive, and maintainable.',\n 'Do not simplify the site because a section, animation, page, or layout is difficult.',\n 'If something is hard, break it into smaller components and keep working until the result matches closely.',\n 'For every exported page, aim for the closest possible pixel-perfect result: spacing, typography, images, viewport behavior, and motion.',\n 'Do not merge multiple pages into one generic page unless the export proves they are duplicate routes.',\n 'Do not replace complex exported sections with summaries, cards, screenshots, or placeholder blocks.',\n 'If a page has visual depth, overlapping layers, sticky sections, galleries, or scroll effects, recreate those behaviors instead of flattening them.',\n 'Start by listing the files and directories that matter for the conversion.',\n ...directoryLines,\n 'Read index.html fully enough to understand page structure, metadata, linked assets, and scripts.',\n 'Read the CSS files that define layout, typography, responsive rules, and visual details.',\n 'Inspect scripts/vendor only to understand required interactions; do not blindly copy huge vendor bundles.',\n 'Inspect scripts/modules for page-specific logic, animations, sliders, menus, and dynamic behavior.',\n 'Inspect data files for CMS-like content, page data, configuration, or serialized props.',\n 'Inspect assets/images and preserve the real image files that are actually used.',\n 'Inspect assets/fonts and preserve font loading if the design depends on custom fonts.',\n 'Inspect subpages if it contains exported pages; map them to routes only when they represent real pages.',\n 'If subpages contains pages, convert each meaningful page with its own route and page component.',\n 'For each converted page, compare against the original exported HTML route and adjust until it is visually close.',\n 'Create a clean project structure instead of dumping everything into one component.',\n 'Separate global layout, page sections, shared components, data helpers, and styles.',\n 'Use semantic HTML for headings, navigation, buttons, forms, sections, and footer content.',\n 'Preserve the original hierarchy of visible content unless there is a clear bug to fix.',\n 'Preserve real URLs and links, but convert local asset paths to the new project structure.',\n 'Move static assets into the target framework public/static asset location when appropriate.',\n 'Do not keep broken CDN references if a local exported asset already exists.',\n 'Do not hardcode absolute machine paths into source files; use framework-relative public asset paths after copying.',\n 'Keep original filenames when possible so CSS and content references remain traceable.',\n 'Do not leave unused analytics, editor badges, platform badges, or export-only scripts in the new app.',\n 'Replace platform-specific runtime code with native framework components when possible.',\n 'Keep interactions that users can see: menus, hover states, forms, sliders, animations, and scroll effects.',\n 'If an interaction is too complex, implement a clean equivalent and document the difference briefly.',\n 'Keep responsive behavior for desktop, tablet, and mobile.',\n 'Check layout at small widths and avoid fixed desktop-only dimensions unless the original requires them.',\n 'Use CSS variables or a clear theme file for colors, spacing, radius, shadows, and typography.',\n 'Name components after their role: Hero, Header, FeatureGrid, Gallery, Pricing, Footer, and similar real sections.',\n 'Avoid generic placeholder components if the exported site has specific section meaning.',\n 'Use TypeScript types where they make the content or component props clearer.',\n 'Do not add unnecessary libraries unless they replace a real exported behavior cleanly.',\n 'If you add a library, explain why it is needed and where it is used.',\n 'Keep package.json scripts standard: dev, build, preview, lint when available.',\n 'Keep the build reproducible from a fresh install.',\n 'After implementing, run the install/build/typecheck commands available for the target project.',\n 'Fix any build errors instead of leaving TODOs.',\n 'Open the generated app locally if possible and compare against the exported index.html visually.',\n 'When there are subpages, compare every generated route against its matching exported file.',\n 'Verify that every visible image loads from the new project.',\n 'Verify that font rendering is close to the export.',\n 'Verify that navigation and internal links work.',\n 'Verify that responsive breakpoints do not overlap or hide important content.',\n 'Verify that there are no console errors caused by missing assets or copied platform scripts.',\n 'Keep accessibility basics: alt text when inferable, keyboard-reachable controls, visible focus states.',\n 'Keep SEO basics: title, meta description if present, canonical only if it is correct, Open Graph when present.',\n 'Do not fabricate SEO copy; reuse existing metadata or ask for missing copy if necessary.',\n 'Commit to a small number of high-quality files rather than many noisy fragments.',\n 'If a section repeats, extract a reusable component and data array.',\n 'If a section is unique, keep it simple and local to the page.',\n 'Document important migration decisions in a short README inside the converted project.',\n 'The README must mention the source export folder, target stack, setup command, and known limitations.',\n 'Do not delete the original export folder.',\n 'Do not modify unrelated files outside the new converted project unless required for setup.',\n 'If the worktree has existing changes, avoid reverting or overwriting them.',\n 'Before large edits, inspect first and explain the conversion plan briefly.',\n 'Then implement the conversion step by step until the app builds.',\n 'Final answer must summarize what was converted, where the new project lives, and which checks passed.',\n 'If something could not be converted, state the exact file or behavior and the reason.',\n 'Quality bar: the result should feel like a real hand-built production app, not an automated scrape or simplified demo.',\n ];\n\n return [\n `# ${aiTool.displayName} Conversion Prompt - ${target.label}`,\n '',\n 'Status: BETA assistant output. Review the export carefully and follow the real files.',\n `Generated from real export: ${facts.outputDir}`,\n `AI tool: ${aiTool.displayName}`,\n `Target: ${target.label}`,\n `Situation: ${goal.label}`,\n '',\n promptLines.map((line, index) => `${String(index + 1).padStart(2, '0')}. ${line}`).join('\\n'),\n '',\n ].join('\\n');\n}\n\nfunction quoteForPrompt(value: string): string {\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\n}\n\nfunction toPosixPath(value: string): string {\n return value.replace(/\\\\/g, '/');\n}\n\nasync function copyToClipboard(text: string): Promise<void> {\n const commands =\n process.platform === 'win32'\n ? [{ command: 'clip', args: [] }]\n : process.platform === 'darwin'\n ? [{ command: 'pbcopy', args: [] }]\n : [\n { command: 'wl-copy', args: [] },\n { command: 'xclip', args: ['-selection', 'clipboard'] },\n { command: 'xsel', args: ['--clipboard', '--input'] },\n ];\n\n let lastError: Error | null = null;\n for (const item of commands) {\n try {\n await pipeToCommand(item.command, item.args, text);\n return;\n } catch (error) {\n lastError = error as Error;\n }\n }\n\n throw lastError || new Error('No clipboard command found');\n}\n\nfunction pipeToCommand(command: string, args: string[], input: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { stdio: ['pipe', 'ignore', 'pipe'] });\n let stderr = '';\n let settled = false;\n\n const finish = (error?: Error): void => {\n if (settled) return;\n settled = true;\n if (error) reject(error);\n else resolve();\n };\n\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n child.on('error', finish);\n child.on('close', (code) => {\n if (code === 0) {\n finish();\n } else {\n finish(new Error(`${command} exited with ${code}${stderr ? `: ${stderr.trim()}` : ''}`));\n }\n });\n child.stdin?.end(input);\n });\n}\n\nfunction printPromptResult(\n promptPath: string,\n target: ConversionTarget,\n aiTool: AiTool,\n goal: ConversionGoal\n): void {\n const w = maxWidth();\n const isSmall = w < 50;\n const inner = w - 4;\n const relPath = path.relative(process.cwd(), promptPath) || promptPath;\n\n console.log('');\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(\n boxLine(\n w,\n centerText(\n `${ui.success('✓')} ${ui.text.bold('AI Prompt Ready')} ${ui.muted('BETA')}`,\n inner\n )\n )\n );\n console.log(boxSep(w));\n console.log(\n boxLine(w, centerText(`${ui.muted('Tool')} ${ui.primary(aiTool.displayName)}`, inner))\n );\n console.log(boxLine(w, centerText(`${ui.muted('Stack')} ${ui.primary(target.label)}`, inner)));\n console.log(boxLine(w, centerText(`${ui.muted('Mode')} ${ui.primary(goal.label)}`, inner)));\n console.log(boxLine(w, centerText(`${ui.muted('File')} ${ui.primary(relPath)}`, inner)));\n console.log(boxSep(w));\n console.log(\n boxLine(w, centerText(`${buttonLabel('Copy prompt')} ${buttonLabel('Done')}`, inner))\n );\n console.log(boxBot(w));\n } else {\n console.log(ui.text.bold(' AI Prompt Ready - BETA'));\n console.log(` Tool: ${ui.primary(aiTool.displayName)}`);\n console.log(` Stack: ${ui.primary(target.label)}`);\n console.log(` Situation: ${ui.primary(goal.label)}`);\n console.log(` File: ${ui.primary(relPath)}`);\n }\n console.log('');\n}\n","import chalk from 'chalk';\nimport { ui } from './theme.js';\n\nconst SHINE_WIDTH = 10;\nconst FRAME_INTERVAL = 80;\n\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nexport class CookingSpinner {\n private interval: NodeJS.Timeout | null = null;\n private frame = 0;\n private phase = '';\n private active = false;\n\n start(phase: string = ''): void {\n this.phase = phase;\n this.frame = 0;\n this.active = true;\n this.draw();\n this.interval = setInterval(() => {\n this.frame++;\n this.draw();\n }, FRAME_INTERVAL);\n }\n\n update(phase: string): void {\n this.phase = phase;\n }\n\n log(message: string): void {\n if (this.active) {\n process.stdout.write('\\r\\x1B[2K');\n }\n process.stdout.write(message + '\\n');\n if (this.active) {\n this.draw();\n }\n }\n\n stop(): void {\n this.active = false;\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n process.stdout.write('\\r\\x1B[2K');\n }\n\n private draw(): void {\n if (!this.active) return;\n\n const spinner = SPINNER_FRAMES[this.frame % SPINNER_FRAMES.length];\n const shimmer = this.renderShimmer('Exporting');\n const frameStr = ui.primary(spinner);\n const phaseStr = this.phase ? ` ${ui.muted(this.limitLen(this.phase, 52))}` : '';\n\n process.stdout.write(`\\r\\x1B[2K ${frameStr} ${shimmer}${phaseStr}`);\n }\n\n private renderShimmer(text: string): string {\n let result = '';\n const pos = (this.frame % (text.length + SHINE_WIDTH * 2)) - SHINE_WIDTH;\n for (let i = 0; i < text.length; i++) {\n const dist = Math.abs(i - pos);\n if (dist < SHINE_WIDTH) {\n const t = 1 - dist / SHINE_WIDTH;\n const g = Math.floor(160 + t * 95);\n result += chalk.rgb(250, Math.min(255, g), Math.min(255, Math.floor(g * 0.75)))(text[i]);\n } else {\n result += ui.muted(text[i]);\n }\n }\n return result;\n }\n\n private limitLen(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max - 1) + '…';\n }\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport chalk from 'chalk';\nimport type { Browser, Page } from 'puppeteer';\nimport { AssetMap } from '../assets/asset-map.js';\nimport { dlBuffer } from '../network/download.js';\nimport { info, log, success, setCooking } from '../logger/index.js';\nimport { launchAndCapture, captureSubpage, closeBrowser } from './capture.js';\nimport { downloadAll } from './download.js';\nimport { buildOutput } from './output.js';\nimport { printSummary } from './summary.js';\nimport { runAiPromptAssistant } from '../ai/prompt-assistant.js';\nimport { detectPlatform, getPlatformByName } from '../platforms/index.js';\nimport type { PlatformHandler, PlatformType } from '../platforms/types.js';\nimport type { ExporterContext } from '../types.js';\nimport { CookingSpinner } from '../cli/cooking.js';\nimport { chip, ui } from '../cli/theme.js';\n\nexport function deriveOutputName(url: string, platformName: PlatformType): string {\n try {\n const parsed = new URL(url);\n const hostname: string = parsed.hostname;\n\n let siteName: string;\n if (hostname.endsWith('.webflow.io')) {\n siteName = hostname.replace('.webflow.io', '');\n } else if (hostname.includes('.wixsite.com')) {\n const parts: string[] = parsed.pathname.split('/').filter(Boolean);\n siteName = parts[0] || hostname.split('.')[0];\n } else if (hostname.match(/\\.framer\\.(app|website|ai)$/)) {\n siteName = hostname.split('.framer.')[0];\n } else {\n siteName = hostname.replace(/\\./g, '-');\n }\n\n return `${platformName}-${siteName}`;\n } catch {\n return 'framer-export-output';\n }\n}\n\nexport class FramerExporter implements ExporterContext {\n siteUrl: string;\n outDir: string;\n assets: AssetMap;\n browser: Browser | null;\n page: Page | null;\n ssrHTML: string;\n prettyPrint: boolean;\n platform: PlatformHandler;\n cooking?: CookingSpinner;\n\n constructor(siteUrl: string, outDir: string, platformOverride?: PlatformType) {\n this.siteUrl = siteUrl;\n this.outDir = outDir;\n this.assets = new AssetMap();\n this.browser = null;\n this.page = null;\n this.ssrHTML = '';\n this.prettyPrint = true;\n\n if (platformOverride && platformOverride !== 'unknown') {\n this.platform = getPlatformByName(platformOverride);\n } else {\n this.platform = detectPlatform(siteUrl);\n }\n }\n\n async run(includeSubpages: boolean = false): Promise<void> {\n console.log(\n `\\n ${ui.text.bold('Framer Export')} ${chip('mirror')} ${ui.muted('v4 pipeline')}\\n`\n );\n info('Source : ' + chalk.underline(this.siteUrl));\n info('Output : ' + ui.primary(this.outDir));\n info('Platform : ' + ui.primary(this.platform.displayName));\n if (includeSubpages) {\n info('Subpages : ' + ui.success('enabled'));\n }\n console.log('');\n\n this.cooking = new CookingSpinner();\n setCooking(this.cooking);\n this.cooking.start('Preparing directories...');\n\n for (const d of [\n '',\n 'assets/images',\n 'assets/fonts',\n 'assets/videos',\n 'assets/misc',\n 'styles',\n 'scripts/vendor',\n 'scripts/modules',\n 'data',\n 'subpages',\n ]) {\n await fs.mkdir(path.join(this.outDir, d), { recursive: true });\n }\n log('Output directory structure created');\n\n this.cooking.update('Fetching SSR HTML...');\n log('Fetching SSR HTML from ' + this.siteUrl);\n try {\n const buf: Buffer = await dlBuffer(this.siteUrl);\n this.ssrHTML = buf.toString('utf-8');\n success('SSR HTML fetched (' + (this.ssrHTML.length / 1024).toFixed(1) + ' KB)');\n } catch (e) {\n log(chalk.red('Could not fetch SSR HTML: ' + (e as Error).message));\n }\n\n const htmlDetected = detectPlatform(this.siteUrl, this.ssrHTML);\n if (htmlDetected.name !== this.platform.name) {\n this.platform = htmlDetected;\n log('Platform refined: ' + ui.primary(this.platform.displayName) + ' (from HTML analysis)');\n }\n\n await launchAndCapture(this);\n\n if (includeSubpages && this.page) {\n await this.crawlSubpages();\n }\n\n await closeBrowser(this);\n\n this.cooking.update('Downloading assets...');\n await downloadAll(this);\n\n this.cooking.update('Building output...');\n await buildOutput(this);\n\n this.cooking.stop();\n setCooking(null);\n\n console.log('');\n success('Export complete!');\n await printSummary(this);\n await runAiPromptAssistant(this);\n }\n\n private async crawlSubpages(): Promise<void> {\n this.cooking?.update('Discovering sub-pages...');\n log('Scanning page for internal links...');\n\n const page = this.page!;\n const baseUrl = new URL(this.siteUrl);\n const baseHost = baseUrl.hostname.replace(/^www\\./, '');\n\n const links: string[] = await page.evaluate((host: string) => {\n const anchors = Array.from(document.querySelectorAll('a[href]'));\n const hrefs = new Set<string>();\n for (const a of anchors) {\n const href = (a as HTMLAnchorElement).href;\n if (\n !href ||\n href.startsWith('javascript:') ||\n href.startsWith('mailto:') ||\n href.startsWith('tel:') ||\n href.startsWith('#')\n )\n continue;\n try {\n const u = new URL(href);\n const h = u.hostname.replace(/^www\\./, '');\n if (\n h === host &&\n u.pathname !== '/' &&\n u.pathname !== '' &&\n !u.pathname.startsWith('/#')\n ) {\n hrefs.add(href.split('#')[0]);\n }\n } catch {}\n }\n return Array.from(hrefs);\n }, baseHost);\n\n log('Found ' + links.length + ' sub-page links');\n const uniqueLinks = [...new Set(links)].slice(0, 50);\n\n if (uniqueLinks.length === 0) {\n log('No sub-pages to crawl');\n return;\n }\n\n for (let i = 0; i < uniqueLinks.length; i++) {\n const link = uniqueLinks[i];\n this.cooking?.update('Crawling sub-page ' + (i + 1) + '/' + uniqueLinks.length);\n try {\n const html = await captureSubpage(page, link, {\n needsHydrationCheck: this.platform.needsHydrationCheck,\n hydrationTimeout: this.platform.hydrationTimeout,\n });\n\n const slug = this.deriveSlug(link, baseUrl);\n const filename = slug + '.html';\n const filepath = path.join(this.outDir, 'subpages', filename);\n\n await fs.writeFile(filepath, html, 'utf-8');\n log(' Saved: subpages/' + filename);\n } catch (e) {\n log(' Skipped ' + link + ': ' + (e as Error).message);\n }\n }\n\n success('Sub-pages crawled: ' + uniqueLinks.length);\n }\n\n private deriveSlug(link: string, baseUrl: URL): string {\n try {\n const u = new URL(link);\n let pathname = u.pathname.replace(/\\/+$/, '').replace(/^\\//, '');\n if (!pathname) return 'index';\n return pathname.replace(/[^a-zA-Z0-9_-]/g, '_').replace(/_+/g, '_') || 'page';\n } catch {\n return 'page';\n }\n }\n}\n","import readline from 'node:readline/promises';\nimport { stdin, stdout } from 'node:process';\nimport path from 'node:path';\nimport { URL } from 'node:url';\nimport chalk from 'chalk';\nimport { showBanner } from './banner.js';\nimport { FramerExporter, deriveOutputName } from '../exporter/index.js';\nimport { detectPlatform } from '../platforms/index.js';\nimport { select } from './select.js';\nimport type { PlatformType } from '../platforms/types.js';\nimport { boxTop, boxLine, boxSep, boxBot, boxRow, maxWidth } from './box.js';\nimport { bullet, chip, ui } from './theme.js';\n\nfunction drawHeader(title: string): void {\n const w = maxWidth();\n if (w < 50) {\n console.log(`\\n ${bullet('●')} ${ui.text.bold(title)}`);\n return;\n }\n console.log(boxTop(w));\n console.log(boxLine(w, ui.text.bold(' ' + title)));\n console.log(boxBot(w));\n console.log('');\n}\n\nexport async function runSetup(legacyMode: boolean = false): Promise<void> {\n showBanner();\n\n console.log(` ${ui.text.bold('Framer Export setup')} ${chip('interactive')}`);\n console.log(\n ` ${ui.muted('Export Framer, Webflow, and Wix sites into a clean local mirror.')}\\n`\n );\n\n const rl = readline.createInterface({ input: stdin, output: stdout });\n\n const ask = async (question: string, defaultVal?: string): Promise<string> => {\n const suffix: string = defaultVal ? chalk.gray(` (${defaultVal})`) : '';\n const prompt: string = ` ${ui.primary('●')} ${ui.text.bold(question)}${suffix} ${ui.muted('>')} `;\n const answer: string = await rl.question(prompt);\n return answer.trim() || defaultVal || '';\n };\n\n drawHeader('Step 1 : Site URL');\n\n let siteUrl = '';\n while (!siteUrl) {\n const input: string = await ask('Enter the site URL');\n try {\n new URL(input);\n siteUrl = input;\n } catch {\n console.log(\n ` ${ui.error('✗')} ${ui.error('Invalid URL. Enter a valid URL (https://...)')}\\n`\n );\n }\n }\n console.log(` ${ui.success('✓')} ${ui.success('URL:')} ${chalk.underline(siteUrl)}\\n`);\n\n drawHeader('Step 2 : Platform');\n\n const detected = detectPlatform(siteUrl);\n let platformName: PlatformType;\n\n if (legacyMode) {\n console.log(` ${ui.info('i')} Auto-detected: ${ui.primary(detected.displayName)}`);\n const platformInput: string = await ask('Platform (framer/webflow/wix)', detected.name);\n platformName = (\n ['framer', 'webflow', 'wix'].includes(platformInput) ? platformInput : detected.name\n ) as PlatformType;\n console.log(` ${ui.success('✓')} ${ui.success('Platform:')} ${ui.primary(platformName)}\\n`);\n } else {\n rl.close();\n const platforms = [\n {\n label: `Framer${detected.name === 'framer' ? chalk.gray(' (detected)') : ''}`,\n value: 'framer',\n },\n {\n label: `Webflow${detected.name === 'webflow' ? chalk.gray(' (detected)') : ''}`,\n value: 'webflow',\n },\n { label: `Wix${detected.name === 'wix' ? chalk.gray(' (detected)') : ''}`, value: 'wix' },\n ];\n const defaultIdx = ['framer', 'webflow', 'wix'].indexOf(detected.name);\n platformName = (await select(\n 'Select platform',\n platforms,\n Math.max(0, defaultIdx)\n )) as PlatformType;\n }\n\n const rl2 = legacyMode ? rl : readline.createInterface({ input: stdin, output: stdout });\n\n const ask2 = async (question: string, defaultVal?: string): Promise<string> => {\n const suffix: string = defaultVal ? chalk.gray(` (${defaultVal})`) : '';\n const prompt: string = ` ${ui.primary('●')} ${ui.text.bold(question)}${suffix} ${ui.muted('>')} `;\n const answer: string = await rl2.question(prompt);\n return answer.trim() || defaultVal || '';\n };\n\n const derivedName: string = deriveOutputName(siteUrl, platformName);\n\n drawHeader('Step 3 : Output Directory');\n\n const outDir: string = await ask2('Output directory', './' + derivedName);\n console.log(` ${ui.success('✓')} ${ui.success('Output:')} ${ui.primary(outDir)}\\n`);\n\n drawHeader('Step 4 : Options');\n\n let prettyPrint: boolean;\n let concurrency: number;\n let includeSubpages: boolean;\n\n if (legacyMode) {\n const prettyAnswer: string = await ask2('Pretty-print JS files? (y/n)', 'y');\n prettyPrint = prettyAnswer.toLowerCase().startsWith('y');\n console.log(\n ` ${ui.success('✓')} Pretty-print: ${prettyPrint ? ui.success('yes') : ui.error('no')}\\n`\n );\n\n const subpagesAnswer: string = await ask2('Export sub-pages? (y/n)', 'n');\n includeSubpages = subpagesAnswer.toLowerCase().startsWith('y');\n console.log(\n ` ${ui.success('✓')} Sub-pages: ${includeSubpages ? ui.success('yes') : ui.error('no')}\\n`\n );\n\n const concurrencyAnswer: string = await ask2('Download concurrency', '12');\n concurrency = parseInt(concurrencyAnswer, 10) || 12;\n console.log(` ${ui.success('✓')} Concurrency: ${ui.primary(String(concurrency))}\\n`);\n } else {\n rl2.close();\n const prettyVal = await select('Pretty-print JS files?', [\n { label: 'Yes', value: 'yes' },\n { label: 'No', value: 'no' },\n ]);\n prettyPrint = prettyVal === 'yes';\n\n const subpagesVal = await select(\n 'Export sub-pages?',\n [\n { label: 'No', value: 'no' },\n { label: 'Yes, crawl and export', value: 'yes' },\n ],\n 0\n );\n includeSubpages = subpagesVal === 'yes';\n\n const concurrencyVal = await select(\n 'Download concurrency',\n [\n { label: '6 (slow connection)', value: '6' },\n { label: '12 (default)', value: '12' },\n { label: '20 (fast connection)', value: '20' },\n ],\n 1\n );\n concurrency = parseInt(concurrencyVal, 10);\n }\n\n const w = maxWidth();\n const isSmall = w < 50;\n console.log('');\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, ui.text.bold(' Summary')));\n console.log(boxSep(w));\n } else {\n console.log(ui.text.bold(' Summary:'));\n }\n\n for (const [label, value] of [\n ['URL', siteUrl],\n ['Platform', platformName],\n ['Output', path.resolve(outDir)],\n ['Pretty-print', prettyPrint ? 'yes' : 'no'],\n ['Sub-pages', includeSubpages ? 'yes' : 'no'],\n ['Concurrency', String(concurrency)],\n ]) {\n console.log(boxRow(w, label, value));\n }\n\n if (!isSmall) {\n console.log(boxBot(w));\n }\n console.log('');\n\n let startExport: boolean;\n\n if (legacyMode) {\n const confirm: string = await ask2('Start export? (y/n)', 'y');\n startExport = confirm.toLowerCase().startsWith('y');\n rl2.close();\n } else {\n const confirmVal = await select('Start export?', [\n { label: 'Yes, start now', value: 'yes' },\n { label: 'Cancel', value: 'no' },\n ]);\n startExport = confirmVal === 'yes';\n }\n\n if (!startExport) {\n console.log(`\\n ${ui.warning('Export cancelled.')}\\n`);\n return;\n }\n\n console.log('');\n\n const { CFG } = await import('../config/index.js');\n CFG.concurrency = concurrency;\n\n const exporter = new FramerExporter(siteUrl, path.resolve(outDir), platformName);\n exporter.prettyPrint = prettyPrint;\n await exporter.run(includeSubpages);\n}\n","import path from 'path';\nimport { URL } from 'url';\nimport pkg from '../../package.json';\nimport { showHelp } from './help.js';\nimport { showBanner } from './banner.js';\nimport { checkForUpdates } from './update-check.js';\nimport { ui } from './theme.js';\nimport type { PlatformType } from '../platforms/types.js';\n\nconst VERSION = pkg.version;\n\nfunction extractFlag(args: string[], flag: string): string | null {\n const idx: number = args.indexOf(flag);\n if (idx === -1 || idx + 1 >= args.length) return null;\n const value: string = args[idx + 1];\n args.splice(idx, 2);\n return value;\n}\n\nfunction hasFlag(args: string[], flag: string): boolean {\n const idx: number = args.indexOf(flag);\n if (idx === -1) return false;\n args.splice(idx, 1);\n return true;\n}\n\nasync function main(): Promise<void> {\n const args: string[] = process.argv.slice(2);\n\n if (args.includes('--version') || args.includes('-v')) {\n console.log(VERSION);\n process.exit(0);\n }\n\n if (args.includes('--about')) {\n const chalk = (await import('chalk')).default;\n showBanner();\n console.log(` ${ui.text.bold('Framer Export')} ${ui.muted(`v${pkg.version}`)}`);\n console.log(` ${ui.text(pkg.description)}\\n`);\n console.log(` ${ui.text.bold('Author')} ${ui.primary('Dany (danbenba)')}`);\n console.log(\n ` ${ui.text.bold('Portfolio')} ${chalk.underline.hex('#FAB283')('https://github.com/danbenba')}`\n );\n console.log(\n ` ${ui.text.bold('GitHub')} ${chalk.underline.hex('#FAB283')(pkg.repository.url.replace('git+', '').replace('.git', ''))}`\n );\n console.log(\n ` ${ui.text.bold('npm')} ${chalk.underline.hex('#FAB283')(`https://www.npmjs.com/package/${pkg.name}`)}`\n );\n console.log(` ${ui.text.bold('License')} ${ui.success(pkg.license)}`);\n console.log(` ${ui.text.bold('Node')} ${ui.muted(`>=${pkg.engines.node}`)}`);\n console.log('');\n process.exit(0);\n }\n\n checkForUpdates(VERSION).then((latest) => {\n if (!latest) return;\n console.log('');\n console.log(\n ` ${ui.warning('↳')} Update available: ${ui.muted(VERSION)} -> ${ui.success(latest)}`\n );\n console.log(` ${ui.primary(' Run:')} ${ui.primarySoft('npm i -g framer-export@latest')}`);\n console.log('');\n });\n\n if (args.includes('--help') || args.includes('-h')) {\n showHelp();\n process.exit(0);\n }\n\n if (args.includes('--setup')) {\n hasFlag(args, '--setup');\n const legacyMode: boolean = hasFlag(args, '--legacy-mode');\n const { runSetup } = await import('./setup.js');\n await runSetup(legacyMode);\n return;\n }\n\n if (!args.length) {\n const { runSetup } = await import('./setup.js');\n await runSetup(false);\n return;\n }\n\n const platformOverride = extractFlag(args, '--platform') as PlatformType | null;\n const includeSubpages: boolean = hasFlag(args, '--subpages');\n\n showBanner();\n\n const url: string = args[0];\n\n try {\n new URL(url);\n } catch {\n console.log(` ${ui.error('✗')} ${ui.error.bold('Invalid URL:')} ${ui.text(url)}`);\n console.log(` ${ui.muted('Expected: https://yoursite.framer.app')}\\n`);\n process.exit(1);\n }\n\n const { FramerExporter, deriveOutputName } = await import('../exporter/index.js');\n const { detectPlatform } = await import('../platforms/index.js');\n\n const detected = platformOverride || detectPlatform(url).name;\n const defaultDir: string = deriveOutputName(url, detected as PlatformType);\n const out: string = args[1] || `./${defaultDir}`;\n\n try {\n await new FramerExporter(url, path.resolve(out), platformOverride || undefined).run(\n includeSubpages\n );\n } catch (e) {\n const chalk = (await import('chalk')).default;\n console.log(\n `\\n ${ui.error('✗')} ${ui.error.bold('FAILED:')} ${ui.text((e as Error).message)}`\n );\n console.log(chalk.gray((e as Error).stack || ''));\n process.exit(1);\n }\n}\n\nmain();\n","import { showBanner } from './banner.js';\nimport { chip, ui } from './theme.js';\n\nexport function showHelp(): void {\n showBanner();\n\n console.log(`${ui.text.bold(' USAGE')} ${chip('cli')}\\n`);\n console.log(\n ` ${ui.primary('framer-export')} ${ui.warning('<url>')} ${ui.muted('[output-dir]')}`\n );\n console.log(\n ` ${ui.primary('fexport')} ${ui.warning('<url>')} ${ui.muted('[output-dir]')}`\n );\n\n console.log('');\n console.log(ui.text.bold(' OPTIONS\\n'));\n\n const opts: Array<[string, string]> = [\n ['--setup', 'Launch the interactive setup assistant'],\n ['--platform <p>', 'Force platform: framer, webflow, wix'],\n ['--subpages', 'Crawl and export sub-pages'],\n ['--legacy-mode', 'Use text input instead of arrow selection'],\n ['--help, -h', 'Show this help message'],\n ];\n\n for (const [flag, desc] of opts) {\n console.log(` ${ui.success(flag.padEnd(18))} ${ui.text(desc)}`);\n }\n\n console.log('');\n console.log(ui.text.bold(' SUPPORTED PLATFORMS\\n'));\n\n const platforms: Array<[string, string]> = [\n ['Framer', 'Auto-detected via .framer.app / .framer.website URLs'],\n ['Webflow', 'Auto-detected via .webflow.io URLs'],\n ['Wix', 'Auto-detected via .wixsite.com URLs + HTML analysis'],\n ];\n\n for (const [name, desc] of platforms) {\n console.log(` ${ui.primary(name.padEnd(12))} ${ui.muted(desc)}`);\n }\n\n console.log('');\n console.log(ui.text.bold(' EXAMPLES\\n'));\n console.log(\n ` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.warning('https://mysite.framer.app')}`\n );\n console.log(\n ` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.warning('https://mysite.webflow.io')}`\n );\n console.log(\n ` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.warning('https://user.wixsite.com/my-site')}`\n );\n console.log(\n ` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.success('--platform webflow')} ${ui.warning('https://custom.com')}`\n );\n console.log(\n ` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.success('--subpages')} ${ui.warning('https://mysite.com')}`\n );\n console.log(` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.success('--setup')}`);\n console.log(\n ` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.success('--setup --legacy-mode')}`\n );\n console.log('');\n}\n","import https from 'https';\n\nexport async function checkForUpdates(currentVersion: string): Promise<string | null> {\n return new Promise((resolve) => {\n const req = https.get(\n 'https://registry.npmjs.org/framer-export/latest',\n { timeout: 3000 },\n (res) => {\n let data = '';\n res.on('data', (chunk) => (data += chunk));\n res.on('end', () => {\n try {\n const json = JSON.parse(data);\n const latest = json.version;\n if (!latest) return resolve(null);\n if (latest !== currentVersion) return resolve(latest);\n resolve(null);\n } catch {\n resolve(null);\n }\n });\n },\n );\n req.on('error', () => resolve(null));\n req.on('timeout', () => {\n req.destroy();\n resolve(null);\n });\n });\n}\n"],"mappings":"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","names":["URL","https","URL","chalk","FONT_EXTS","IMG_EXTS","FONT_EXTS","VIDEO_EXTS","path","init_download","fs","path","chalk","fs","path","fs","path","stdin","stdout","target","goal","centerText","chalk","fs","path","chalk","init_download","readline","stdin","stdout","path","URL","chalk","CFG","path","URL","chalk","runSetup","URL","FramerExporter","deriveOutputName","detectPlatform","path"]}