framer-export 4.3.0 → 4.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../package.json","../../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/exporter/summary.ts","../../src/cli/cooking.ts","../../src/exporter/index.ts","../../src/cli/select.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.0\",\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';\nimport pkg from '../../package.json';\n\nfunction getWidth(): number {\n return process.stdout.columns || 80;\n}\n\nconst ASCII_ART = [\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 ${chalk.hex('#D4A017').bold('F-EXPORT')} ${chalk.gray(`v${pkg.version}`)}`);\n console.log(` ${chalk.white.bold('Framer · Webflow · Wix Exporter')}\\n`);\n return;\n }\n\n const gold = chalk.hex('#D4A017').bold;\n const gray = chalk.gray;\n\n console.log('');\n ASCII_ART.forEach((line) => {\n console.log(' ' + gold(line));\n });\n console.log('');\n console.log(` ${gray(`v${pkg.version}`)} ${chalk.white.bold('Framer · Webflow · Wix Exporter')}\\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';\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\nconst TIME_COLORS = [\n chalk.gray,\n chalk.hex('#9e9e9e'),\n chalk.hex('#757575'),\n chalk.hex('#6d6d6d'),\n];\n\nconst TAG_ROTATION: Array<(s: string) => string> = [\n (s) => chalk.hex('#D4A017')(s),\n (s) => chalk.hex('#E0A030')(s),\n (s) => chalk.hex('#DAA520')(s),\n (s) => chalk.hex('#C4953A')(s),\n (s) => chalk.hex('#F0C040')(s),\n];\n\nlet _tagIdx = 0;\n\nfunction nextTagColor(fn: (s: string) => string): string {\n const color = TAG_ROTATION[_tagIdx % TAG_ROTATION.length];\n _tagIdx++;\n return color(fn(''));\n}\n\nconst MSG_COLORS: Array<(s: string) => string> = [\n (s) => chalk.hex('#D4A017')(s),\n (s) => chalk.hex('#C8A951')(s),\n (s) => chalk.hex('#B8960A')(s),\n (s) => chalk.hex('#d4a76a')(s),\n (s) => chalk.hex('#c0a060')(s),\n (s) => chalk.hex('#dab660')(s),\n];\n\nlet _msgIdx = 0;\n\nfunction nextMsgColor(): (s: string) => string {\n return MSG_COLORS[_msgIdx++ % MSG_COLORS.length];\n}\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) {\n _cooking.log(line);\n } else {\n console.log(line);\n }\n}\n\nexport const log = (m: string): void => {\n const timeColor = TIME_COLORS[Math.floor(Math.random() * TIME_COLORS.length)];\n const t = timeColor(`[${T()}]`);\n const tag = TAG_ROTATION[0]('[LOG]');\n const msg = nextMsgColor()(trunc(m, 120));\n output(`${t} ${tag} ${msg}`);\n};\n\nexport const info = (m: string): void => {\n const timeColor = chalk.gray;\n const t = timeColor(`[${T()}]`);\n const tag = chalk.hex('#E8A317')('[INFO]');\n output(`${t} ${tag} ${chalk.bold(trunc(m, 120))}`);\n};\n\nexport const warn = (m: string): void => {\n const line = `${chalk.gray(`[${T()}]`)} ${chalk.hex('#CC7722').bold('[WARN]')} ${chalk.hex('#CC7722')(trunc(m, 120))}`;\n if (_cooking) _cooking.log(line);\n else console.warn(line);\n};\n\nexport const success = (m: string): void => {\n const t = chalk.hex('#8a8a8a')(`[${T()}]`);\n const tag = chalk.greenBright('[OK]');\n const msg = chalk.green(trunc(m, 120));\n output(`${t} ${tag} ${msg}`);\n};\n\nexport const error = (m: string): void => {\n const line = `${chalk.gray(`[${T()}]`)} ${chalk.redBright('[ERROR]')} ${chalk.red.bold(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 fs from 'fs/promises';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { log } from '../logger/index.js';\nimport type { ExporterContext } from '../types.js';\n\nfunction getWidth(): number {\n return process.stdout.columns || 80;\n}\n\nexport async function printSummary(exporter: ExporterContext): Promise<void> {\n const width = getWidth();\n const isSmall = width < 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] = 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 ]);\n\n const G = chalk.hex('#D4A017');\n\n console.log('');\n if (!isSmall) {\n console.log(G(' ┌─────────────────────────────────────────────┐'));\n console.log(G(' │') + chalk.bold.white(' Export Summary ') + G('│'));\n console.log(G(' ├─────────────────────────────────────────────┤'));\n } else {\n console.log(chalk.bold.white(' Export Summary:'));\n }\n\n const row = (label: string, count: number, type: string) => {\n if (count === 0) return;\n const l = label.padEnd(18);\n const c = String(count).padStart(3);\n if (isSmall) {\n console.log(` ${chalk.yellow(label)} ${chalk.white(String(count))} ${chalk.gray(type)}`);\n } else {\n console.log(` ${G('│')} ${chalk.yellow(l)} ${chalk.white(c)} ${chalk.gray(type.padEnd(20))} ${G('│')}`);\n }\n };\n\n row('styles/', styles, 'CSS files');\n row('scripts/vendor/', vendor, 'JS modules');\n row('scripts/modules/', scripts, 'components');\n row('assets/images/', imgs, 'images');\n row('assets/videos/', videos, 'videos');\n row('assets/fonts/', fonts, 'fonts');\n row('assets/misc/', misc, 'misc files');\n row('data/', data, 'data files');\n\n if (!isSmall) {\n console.log(G(' └─────────────────────────────────────────────┘'));\n }\n\n console.log('');\n const quotedDir: string = `\"${exporter.outDir}\"`;\n \n if (!isSmall) {\n console.log(G(' ┌─────────────────────────────────────────────┐'));\n console.log(G(' │') + chalk.bold.white(' To serve locally ') + G('│'));\n console.log(G(' ├─────────────────────────────────────────────┤'));\n console.log(` ${G('│')} ${chalk.hex('#D4A017')('cd ' + path.basename(exporter.outDir) + ' && node serve.cjs').padEnd(44)} ${G('│')}`);\n console.log(G(' └─────────────────────────────────────────────┘'));\n } else {\n console.log(chalk.bold.white(' To serve locally:'));\n console.log(` ${chalk.hex('#D4A017')('cd ' + path.basename(exporter.outDir) + ' && node serve.cjs')}`);\n }\n \n console.log('');\n console.log(chalk.gray(' NOTE: Must be served via HTTP for JS modules to work.'));\n console.log('');\n}\n","import chalk from 'chalk';\n\nconst SHINE_WIDTH = 10;\nconst FRAME_INTERVAL = 140;\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nconst PALETTE: Array<(s: string) => string> = [\n (s) => chalk.hex('#D4A017')(s),\n (s) => chalk.hex('#E8A317')(s),\n (s) => chalk.hex('#DAA520')(s),\n (s) => chalk.hex('#F0C040')(s),\n (s) => chalk.hex('#C4953A')(s),\n (s) => chalk.hex('#E6B83C')(s),\n (s) => chalk.hex('#C8A951')(s),\n (s) => chalk.hex('#D9B44D')(s),\n];\n\nexport class CookingSpinner {\n private interval: NodeJS.Timeout | null = null;\n private bgInterval: NodeJS.Timeout | null = null;\n private frame = 0;\n private phase = '';\n private active = false;\n private bar = 0;\n private barDir = 1;\n\n start(phase: string = ''): void {\n this.phase = phase;\n this.frame = 0;\n this.bar = 0;\n this.barDir = 1;\n this.active = true;\n this.draw();\n this.interval = setInterval(() => {\n this.frame++;\n this.draw();\n }, FRAME_INTERVAL);\n this.bgInterval = setInterval(() => {\n this.bar++;\n this.draw();\n }, 800);\n }\n\n update(phase: string): void {\n this.phase = phase;\n if (!this.active) this.draw();\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) { clearInterval(this.interval); this.interval = null; }\n if (this.bgInterval) { clearInterval(this.bgInterval); this.bgInterval = null; }\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 paletteFn = PALETTE[this.frame % PALETTE.length];\n\n const dotPhase = Math.floor(this.frame / 3) % 4;\n const dotStr = dotPhase === 0 ? ' ' : dotPhase === 1 ? '. ' : dotPhase === 2 ? '.. ' : '...';\n\n const shimmer = this.renderShimmer('Cooking');\n const spinnerChar = chalk.hex('#F0C040')(spinner);\n\n const barLen = 12;\n const barPos = this.bar % (barLen * 2);\n const barStr = this.renderBar(barLen, barPos);\n\n const phaseStr = this.phase ? ` ${chalk.gray(this.limitLen(this.phase, 38))}` : '';\n\n process.stdout.write(\n `\\r\\x1B[2K ${spinnerChar} ${shimmer} ${paletteFn(dotStr)} ${barStr}${phaseStr}`\n );\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(g, g, g)(text[i]);\n } else {\n result += chalk.rgb(160, 160, 160)(text[i]);\n }\n }\n return result;\n }\n\n private renderBar(len: number, pos: number): string {\n let s = '';\n for (let i = 0; i < len; i++) {\n const dist = Math.abs(i - pos);\n if (dist < 3) {\n const t = 1 - dist / 3;\n const r = Math.floor(200 + t * 55);\n const g = Math.floor(160 + t * 50);\n const b = Math.floor(20 + t * 30);\n s += chalk.rgb(r, g, b)('▌');\n } else if (dist < 6) {\n s += chalk.rgb(140, 100, 20)('▌');\n } else {\n s += chalk.rgb(50, 35, 10)(' ');\n }\n }\n return `[${s}]`;\n }\n\n private limitLen(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max - 3) + '…';\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 { 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';\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(chalk.bold.hex('#D4A017')('\\n Cooksite v4 - Full Mirror & Clean Export\\n'));\n info('Source : ' + chalk.underline(this.siteUrl));\n info('Output : ' + chalk.yellow(this.outDir));\n info('Platform : ' + chalk.hex('#D4A017')(this.platform.displayName));\n if (includeSubpages) {\n info('Subpages : ' + chalk.green('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: ' + chalk.hex('#D4A017')(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 }\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 (!href || href.startsWith('javascript:') || href.startsWith('mailto:') || href.startsWith('tel:') || href.startsWith('#')) continue;\n try {\n const u = new URL(href);\n const h = u.hostname.replace(/^www\\./, '');\n if (h === host && u.pathname !== '/' && u.pathname !== '' && !u.pathname.startsWith('/#')) {\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';\nimport { stdin, stdout } from 'node:process';\nimport chalk from 'chalk';\n\nexport interface SelectOption {\n label: string;\n value: string;\n}\n\nexport async function select(question: string, options: SelectOption[], defaultIndex: number = 0): Promise<string> {\n return new Promise((resolve) => {\n let selected: number = defaultIndex;\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(` ${chalk.hex('#D4A017')('?')} ${chalk.white.bold(question)}`);\n for (let i = 0; i < options.length; i++) {\n if (i === selected) {\n console.log(` ${chalk.hex('#D4A017')('>')} ${chalk.white.bold(options[i].label)}`);\n } else {\n console.log(` ${chalk.gray(options[i].label)}`);\n }\n }\n };\n\n render(true);\n\n readline.emitKeypressEvents(stdin);\n const wasTTY: boolean = stdin.isTTY || false;\n if (wasTTY) 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 selected--;\n render();\n } else if (key.name === 'down' && selected < options.length - 1) {\n selected++;\n render();\n } else if (key.name === 'return') {\n if (wasTTY) 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(` ${chalk.green('✓')} ${chalk.white.bold(question)} ${chalk.hex('#D4A017')(options[selected].label)}\\n`);\n\n resolve(options[selected].value);\n } else if ((key.ctrl && key.name === 'c') || key.name === 'escape') {\n if (wasTTY) 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","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';\n\nfunction getWidth(): number {\n return process.stdout.columns || 80;\n}\n\nfunction drawHeader(title: string): void {\n const width = getWidth();\n const isSmall = width < 50;\n const magenta = chalk.hex('#D4A017');\n const boldWhite = chalk.bold.white;\n\n if (isSmall) {\n console.log(`\\n${magenta('●')} ${boldWhite(title)}`);\n return;\n }\n\n const boxWidth = 45;\n const padding = Math.max(0, boxWidth - title.length - 2);\n const rightPad = ' '.repeat(padding);\n \n console.log(magenta(' ┌─────────────────────────────────────────────┐'));\n console.log(magenta(' │') + boldWhite(' ' + title) + rightPad + magenta('│'));\n console.log(magenta(' └─────────────────────────────────────────────┘'));\n console.log('');\n}\n\nfunction line(label: string, value: string): void {\n const width = getWidth();\n const isSmall = width < 50;\n const magenta = chalk.hex('#D4A017');\n \n if (isSmall) {\n console.log(` ${chalk.bold(label)}: ${chalk.yellow(value)}`);\n return;\n }\n console.log(` ${magenta('│')} ${chalk.bold(label.padEnd(14))} ${chalk.yellow(value)}`);\n}\n\nexport async function runSetup(legacyMode: boolean = false): Promise<void> {\n showBanner();\n\n console.log(chalk.bold.white(' Welcome to Framer Export setup.\\n'));\n console.log(chalk.gray(' Supports Framer, Webflow, and Wix sites.\\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 = ` ${chalk.hex('#D4A017')('?')} ${chalk.white.bold(question)}${suffix} ${chalk.gray('>')} `;\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(` ${chalk.red('✗')} ${chalk.red('Invalid URL. Enter a valid URL (https://...)')}\\n`);\n }\n }\n console.log(` ${chalk.green('✓')} ${chalk.green('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(` ${chalk.blue('i')} Auto-detected: ${chalk.hex('#D4A017')(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(` ${chalk.green('✓')} ${chalk.green('Platform:')} ${chalk.hex('#D4A017')(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 = ` ${chalk.hex('#D4A017')('?')} ${chalk.white.bold(question)}${suffix} ${chalk.gray('>')} `;\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(` ${chalk.green('✓')} ${chalk.green('Output:')} ${chalk.yellow(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(` ${chalk.green('✓')} Pretty-print: ${prettyPrint ? chalk.green('yes') : chalk.red('no')}\\n`);\n\n const subpagesAnswer: string = await ask2('Export sub-pages? (y/n)', 'n');\n includeSubpages = subpagesAnswer.toLowerCase().startsWith('y');\n console.log(` ${chalk.green('✓')} Sub-pages: ${includeSubpages ? chalk.green('yes') : chalk.red('no')}\\n`);\n\n const concurrencyAnswer: string = await ask2('Download concurrency', '12');\n concurrency = parseInt(concurrencyAnswer, 10) || 12;\n console.log(` ${chalk.green('✓')} Concurrency: ${chalk.yellow(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 console.log('');\n const width = getWidth();\n const isSmall = width < 50;\n if (!isSmall) {\n console.log(chalk.hex('#D4A017')(' ┌─────────────────────────────────────────────┐'));\n console.log(chalk.hex('#D4A017')(' │') + chalk.bold.white(' Summary ') + chalk.hex('#D4A017')('│'));\n console.log(chalk.hex('#D4A017')(' ├─────────────────────────────────────────────┤'));\n } else {\n console.log(chalk.bold.white(' Summary:'));\n }\n line('URL', siteUrl);\n line('Platform', platformName);\n line('Output', path.resolve(outDir));\n line('Pretty-print', prettyPrint ? 'yes' : 'no');\n line('Sub-pages', includeSubpages ? 'yes' : 'no');\n line('Concurrency', String(concurrency));\n if (!isSmall) {\n console.log(chalk.hex('#D4A017')(' └─────────────────────────────────────────────┘'));\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 ${chalk.yellow('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 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(` ${chalk.white.bold('Framer Export')} ${chalk.gray(`v${pkg.version}`)}`);\n console.log(` ${chalk.white(pkg.description)}\\n`);\n console.log(` ${chalk.white.bold('Author')} ${chalk.hex('#D4A017')('Dany (danbenba)')}`);\n console.log(` ${chalk.white.bold('Portfolio')} ${chalk.underline.hex('#D4A017')('https://github.com/danbenba')}`);\n console.log(` ${chalk.white.bold('GitHub')} ${chalk.underline.hex('#D4A017')(pkg.repository.url.replace('git+', '').replace('.git', ''))}`);\n console.log(` ${chalk.white.bold('npm')} ${chalk.underline.hex('#D4A017')(`https://www.npmjs.com/package/${pkg.name}`)}`);\n console.log(` ${chalk.white.bold('License')} ${chalk.green(pkg.license)}`);\n console.log(` ${chalk.white.bold('Node')} ${chalk.gray(`>=${pkg.engines.node}`)}`);\n console.log('');\n process.exit(0);\n }\n\n checkForUpdates(VERSION).then((latest) => {\n if (!latest) return;\n import('chalk').then((chalk) => {\n console.log('');\n console.log(\n ` ${chalk.default.yellow('↳')} Update available: ${chalk.default.gray(VERSION)} → ${chalk.default.green(latest)}`,\n );\n console.log(` ${chalk.default.hex('#D4A017')(' Run:')} ${chalk.default.hex('#B8860B')('npm i -g framer-export@latest')}`);\n console.log('');\n });\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 const chalk = (await import('chalk')).default;\n console.log(` ${chalk.red('✗')} ${chalk.red.bold('Invalid URL:')} ${chalk.white(url)}`);\n console.log(` ${chalk.gray('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 ${chalk.red('✗')} ${chalk.red.bold('FAILED:')} ${chalk.white((e as Error).message)}`);\n console.log(chalk.gray((e as Error).stack || ''));\n process.exit(1);\n }\n}\n\nmain();\n","import chalk from 'chalk';\nimport { showBanner } from './banner.js';\n\nexport function showHelp(): void {\n showBanner();\n\n console.log(chalk.white.bold(' USAGE\\n'));\n console.log(` ${chalk.hex('#D4A017')('framer-export')} ${chalk.yellow('<url>')} ${chalk.gray('[output-dir]')}`);\n console.log(` ${chalk.hex('#D4A017')('fexport')} ${chalk.yellow('<url>')} ${chalk.gray('[output-dir]')}`);\n\n console.log('');\n console.log(chalk.white.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(` ${chalk.green(flag.padEnd(18))} ${chalk.white(desc)}`);\n }\n\n console.log('');\n console.log(chalk.white.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(` ${chalk.hex('#D4A017')(name.padEnd(12))} ${chalk.gray(desc)}`);\n }\n\n console.log('');\n console.log(chalk.white.bold(' EXAMPLES\\n'));\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.yellow('https://mysite.framer.app')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.yellow('https://mysite.webflow.io')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.yellow('https://user.wixsite.com/my-site')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.green('--platform webflow')} ${chalk.yellow('https://custom.com')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.green('--subpages')} ${chalk.yellow('https://mysite.com')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.green('--setup')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.green('--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":["line","URL","https","URL","chalk","line","FONT_EXTS","IMG_EXTS","FONT_EXTS","VIDEO_EXTS","path","init_download","fs","path","fs","path","chalk","getWidth","count","chalk","fs","path","chalk","init_download","chalk","readline","stdin","stdout","path","URL","chalk","getWidth","CFG","path","URL","chalk","chalk","runSetup","URL","FramerExporter","deriveOutputName","detectPlatform","path"]}
1
+ {"version":3,"sources":["../../package.json","../../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/cooking.ts","../../src/exporter/index.ts","../../src/cli/select.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.7\",\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';\nimport pkg from '../../package.json';\n\nfunction getWidth(): number {\n return process.stdout.columns || 80;\n}\n\nconst ASCII_ART = [\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 ${chalk.hex('#D4A017').bold('F-EXPORT')} ${chalk.gray(`v${pkg.version}`)}`);\n console.log(` ${chalk.white.bold('Framer · Webflow · Wix Exporter')}\\n`);\n return;\n }\n\n const gold = chalk.hex('#D4A017').bold;\n const gray = chalk.gray;\n\n console.log('');\n ASCII_ART.forEach((line) => {\n console.log(' ' + gold(line));\n });\n console.log('');\n console.log(` ${gray(`v${pkg.version}`)} ${chalk.white.bold('Framer · Webflow · Wix Exporter')}\\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';\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('#D4A017')(s),\n (s) => chalk.hex('#DAA520')(s),\n (s) => chalk.hex('#C8A951')(s),\n (s) => chalk.hex('#E0B040')(s),\n (s) => chalk.hex('#daa520')(s),\n (s) => chalk.hex('#c4953a')(s),\n (s) => chalk.hex('#e8c33a')(s),\n (s) => chalk.hex('#dab660')(s),\n (s) => chalk.hex('#b8960a')(s),\n (s) => chalk.hex('#d4a76a')(s),\n (s) => chalk.hex('#e0a030')(s),\n (s) => chalk.hex('#c0a060')(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('#6d6d6d')(`[${T()}]`)} ${chalk.hex('#B8960A')('[LOG]')} ${c(trunc(m, 120))}`);\n};\n\nconst INFO_PALETTE: Array<(s: string) => string> = [\n (s) => chalk.hex('#4DB8B0')(s),\n (s) => chalk.hex('#5CC0BA')(s),\n (s) => chalk.hex('#3AA89E')(s),\n (s) => chalk.hex('#6BC4BE')(s),\n (s) => chalk.hex('#48B5AD')(s),\n (s) => chalk.hex('#52BAB4')(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('#6d6d6d')(`[${T()}]`)} ${chalk.hex('#3AA89E').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('#E8833A')(s),\n (s) => chalk.hex('#F09040')(s),\n (s) => chalk.hex('#CC7722')(s),\n (s) => chalk.hex('#E87D2A')(s),\n ];\n const c = colors[Math.floor(Math.random() * colors.length)];\n const line = `${chalk.hex('#7a7a7a')(`[${T()}]`)} ${chalk.hex('#E8833A').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('#4CAF50')(s),\n (s) => chalk.hex('#66BB6A')(s),\n (s) => chalk.hex('#43A047')(s),\n (s) => chalk.hex('#81C784')(s),\n (s) => chalk.hex('#2E7D32')(s),\n ];\n const c = colors[Math.floor(Math.random() * colors.length)];\n output(`${chalk.hex('#6d6d6d')(`[${T()}]`)} ${chalk.greenBright('[OK]')} ${c(trunc(m, 120))}`);\n};\n\nexport const error = (m: string): void => {\n const colors: Array<(s: string) => string> = [\n (s) => chalk.hex('#EF5350')(s),\n (s) => chalk.hex('#E53935')(s),\n (s) => chalk.hex('#F44336')(s),\n (s) => chalk.hex('#D32F2F')(s),\n ];\n const c = colors[Math.floor(Math.random() * colors.length)];\n const line = `${chalk.hex('#7a7a7a')(`[${T()}]`)} ${chalk.redBright('[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';\n\nexport function maxWidth(): number {\n return Math.min(process.stdout.columns || 80, 62);\n}\n\nconst B = chalk.hex('#8B6914');\nconst G = chalk.hex('#C4953A');\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\nfunction stripAnsi(s: string): string {\n return s.replace(/\\x1B\\[[0-9;]*[a-zA-Z]/g, '');\n}\n\nexport function boxTop(w: number): string {\n const inner = w - 4;\n return ' ' + B('╔═') + B('═'.repeat(inner)) + B('═╗');\n}\n\nexport function boxBot(w: number): string {\n const inner = w - 4;\n return ' ' + B('╚═') + B('═'.repeat(inner)) + B('═╝');\n}\n\nexport function boxLine(w: number, text: string): string {\n const inner = w - 4;\n const padded = padRight(text, inner);\n return ' ' + B('║ ') + padded + B(' ║');\n}\n\nexport function boxSep(w: number): string {\n const inner = w - 4;\n return ' ' + B('╠═') + B('═'.repeat(inner)) + B('═╣');\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 ' ' + G('║ ') + chalk.bold(label) + ': ' + chalk.yellow(truncated) + ' '.repeat(Math.max(0, inner - labelPlain.length - 1 - truncated.length)) + G(' ║');\n }\n const right = inner - labelPlain.length - 1 - value.length;\n return ' ' + G('║ ') + chalk.bold(label) + ': ' + chalk.yellow(value) + ' '.repeat(right) + G(' ║');\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport chalk from 'chalk';\nimport type { ExporterContext } from '../types.js';\nimport { boxTop, boxLine, boxBot, boxSep, maxWidth } from '../cli/box.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 = chalk.hex('#D4A017');\n const G2 = chalk.hex('#DAA520');\n const C2 = chalk.hex('#E0B040');\n const Y = chalk.yellow;\n const O = chalk.hex('#CC7722');\n const Br = chalk.hex('#B8860B');\n const Gr = chalk.gray;\n const Gn = chalk.green;\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, chalk.bold.white(' Export Summary')));\n console.log(boxSep(w));\n } else {\n console.log(chalk.bold.white(' 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)}${chalk.white(c)} ${chalk.gray(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)} ${chalk.white(String(cnt))} ${chalk.gray(type)}`);\n } else {\n console.log(' ' + chalk.hex('#C4953A')('║ ') + rowText + ' '.repeat(pad) + chalk.hex('#C4953A')(' ║'));\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, chalk.bold.white(' 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(' ' + chalk.hex('#C4953A')('║ ') + G(cdCmd) + ' '.repeat(pad) + chalk.hex('#9e9e9e')(' 🗐') + chalk.hex('#C4953A')(' ║'));\n console.log(boxBot(w));\n } else {\n console.log(chalk.bold.white(' To serve locally:'));\n console.log(` ${G(cdCmd)}`);\n }\n \n console.log('');\n console.log(chalk.gray(' NOTE: Must be served via HTTP for JS modules to work.'));\n console.log('');\n}\n","import chalk from 'chalk';\n\nconst SHINE_WIDTH = 10;\nconst FRAME_INTERVAL = 140;\n\nconst DOT_PHASES = [' ', '. ', '.. ', '...', ' ..', ' .', ' '];\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 dots = DOT_PHASES[this.frame % DOT_PHASES.length];\n const shimmer = this.renderShimmer('Cooking');\n const dotStr = chalk.hex('#D4A017')(dots);\n const phaseStr = this.phase\n ? ` ${chalk.gray(this.limitLen(this.phase, 38))}`\n : '';\n\n process.stdout.write(`\\r\\x1B[2K ${shimmer} ${dotStr}${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(g, g, g)(text[i]);\n } else {\n result += chalk.rgb(160, 160, 160)(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 { 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';\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(chalk.bold.hex('#D4A017')('\\n Cooksite v4 - Full Mirror & Clean Export\\n'));\n info('Source : ' + chalk.underline(this.siteUrl));\n info('Output : ' + chalk.yellow(this.outDir));\n info('Platform : ' + chalk.hex('#D4A017')(this.platform.displayName));\n if (includeSubpages) {\n info('Subpages : ' + chalk.green('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: ' + chalk.hex('#D4A017')(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 }\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 (!href || href.startsWith('javascript:') || href.startsWith('mailto:') || href.startsWith('tel:') || href.startsWith('#')) continue;\n try {\n const u = new URL(href);\n const h = u.hostname.replace(/^www\\./, '');\n if (h === host && u.pathname !== '/' && u.pathname !== '' && !u.pathname.startsWith('/#')) {\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';\nimport { stdin, stdout } from 'node:process';\nimport chalk from 'chalk';\n\nexport interface SelectOption {\n label: string;\n value: string;\n}\n\nfunction stripAnsi(s: string): string {\n return s.replace(/\\x1B\\[[0-9;]*[a-zA-Z]/g, '');\n}\n\nexport async function select(question: string, options: SelectOption[], defaultIndex: number = 0): 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(question: string, options: SelectOption[], defaultIndex: number): Promise<string> {\n return new Promise((resolve) => {\n let selected: number = defaultIndex;\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(` ${chalk.hex('#D4A017')('?')} ${chalk.white.bold(question)}`);\n for (let i = 0; i < options.length; i++) {\n if (i === selected) {\n console.log(` ${chalk.hex('#D4A017')('>')} ${chalk.white.bold(options[i].label)}`);\n } else {\n console.log(` ${chalk.gray(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 selected--;\n render();\n } else if (key.name === 'down' && selected < options.length - 1) {\n selected++;\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(` ${chalk.green('✓')} ${chalk.white.bold(question)} ${chalk.hex('#D4A017')(stripAnsi(options[selected].label))}\\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(question: string, options: SelectOption[], defaultIndex: number): Promise<string> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: stdin, output: stdout });\n\n console.log(` ${chalk.hex('#D4A017')('?')} ${chalk.white.bold(question)}\\n`);\n for (let i = 0; i < options.length; i++) {\n const marker = i === defaultIndex ? chalk.green(' ★') : ' ';\n console.log(` ${chalk.gray(`[${i + 1}]`)}${marker} ${chalk.white(options[i].label)}`);\n }\n console.log('');\n const def = String(defaultIndex + 1);\n\n const ask = (): void => {\n rl.question(` ${chalk.hex('#D4A017')('>')} ${chalk.gray(`Choose [1-${options.length}] (${def})`)}: `, (answer) => {\n const trimmed = answer.trim();\n if (!trimmed) {\n rl.close();\n const label = stripAnsi(options[defaultIndex].label);\n console.log(` ${chalk.green('✓')} ${chalk.hex('#D4A017')(label)}\\n`);\n resolve(options[defaultIndex].value);\n return;\n }\n const idx = parseInt(trimmed, 10);\n if (idx >= 1 && idx <= options.length) {\n rl.close();\n const label = stripAnsi(options[idx - 1].label);\n console.log(` ${chalk.green('✓')} ${chalk.hex('#D4A017')(label)}\\n`);\n resolve(options[idx - 1].value);\n } else {\n console.log(` ${chalk.red('✗')} Enter 1-${options.length}\\n`);\n ask();\n }\n });\n };\n ask();\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';\n\nfunction drawHeader(title: string): void {\n const w = maxWidth();\n if (w < 50) {\n console.log(`\\n ${chalk.hex('#D4A017')('●')} ${chalk.bold.white(title)}`);\n return;\n }\n console.log(boxTop(w));\n console.log(boxLine(w, chalk.bold.white(' ' + 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(chalk.bold.white(' Welcome to Framer Export setup.\\n'));\n console.log(chalk.gray(' Supports Framer, Webflow, and Wix sites.\\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 = ` ${chalk.hex('#D4A017')('?')} ${chalk.white.bold(question)}${suffix} ${chalk.gray('>')} `;\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(` ${chalk.red('✗')} ${chalk.red('Invalid URL. Enter a valid URL (https://...)')}\\n`);\n }\n }\n console.log(` ${chalk.green('✓')} ${chalk.green('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(` ${chalk.blue('i')} Auto-detected: ${chalk.hex('#D4A017')(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(` ${chalk.green('✓')} ${chalk.green('Platform:')} ${chalk.hex('#D4A017')(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 = ` ${chalk.hex('#D4A017')('?')} ${chalk.white.bold(question)}${suffix} ${chalk.gray('>')} `;\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(` ${chalk.green('✓')} ${chalk.green('Output:')} ${chalk.yellow(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(` ${chalk.green('✓')} Pretty-print: ${prettyPrint ? chalk.green('yes') : chalk.red('no')}\\n`);\n\n const subpagesAnswer: string = await ask2('Export sub-pages? (y/n)', 'n');\n includeSubpages = subpagesAnswer.toLowerCase().startsWith('y');\n console.log(` ${chalk.green('✓')} Sub-pages: ${includeSubpages ? chalk.green('yes') : chalk.red('no')}\\n`);\n\n const concurrencyAnswer: string = await ask2('Download concurrency', '12');\n concurrency = parseInt(concurrencyAnswer, 10) || 12;\n console.log(` ${chalk.green('✓')} Concurrency: ${chalk.yellow(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 const G = chalk.hex('#C4953A');\n const B = chalk.hex('#8B6914');\n\n console.log('');\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, chalk.bold.white(' Summary')));\n } else {\n console.log(chalk.bold.white(' 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 ${chalk.yellow('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 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(` ${chalk.white.bold('Framer Export')} ${chalk.gray(`v${pkg.version}`)}`);\n console.log(` ${chalk.white(pkg.description)}\\n`);\n console.log(` ${chalk.white.bold('Author')} ${chalk.hex('#D4A017')('Dany (danbenba)')}`);\n console.log(` ${chalk.white.bold('Portfolio')} ${chalk.underline.hex('#D4A017')('https://github.com/danbenba')}`);\n console.log(` ${chalk.white.bold('GitHub')} ${chalk.underline.hex('#D4A017')(pkg.repository.url.replace('git+', '').replace('.git', ''))}`);\n console.log(` ${chalk.white.bold('npm')} ${chalk.underline.hex('#D4A017')(`https://www.npmjs.com/package/${pkg.name}`)}`);\n console.log(` ${chalk.white.bold('License')} ${chalk.green(pkg.license)}`);\n console.log(` ${chalk.white.bold('Node')} ${chalk.gray(`>=${pkg.engines.node}`)}`);\n console.log('');\n process.exit(0);\n }\n\n checkForUpdates(VERSION).then((latest) => {\n if (!latest) return;\n import('chalk').then((chalk) => {\n console.log('');\n console.log(\n ` ${chalk.default.yellow('↳')} Update available: ${chalk.default.gray(VERSION)} → ${chalk.default.green(latest)}`,\n );\n console.log(` ${chalk.default.hex('#D4A017')(' Run:')} ${chalk.default.hex('#B8860B')('npm i -g framer-export@latest')}`);\n console.log('');\n });\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 const chalk = (await import('chalk')).default;\n console.log(` ${chalk.red('✗')} ${chalk.red.bold('Invalid URL:')} ${chalk.white(url)}`);\n console.log(` ${chalk.gray('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 ${chalk.red('✗')} ${chalk.red.bold('FAILED:')} ${chalk.white((e as Error).message)}`);\n console.log(chalk.gray((e as Error).stack || ''));\n process.exit(1);\n }\n}\n\nmain();\n","import chalk from 'chalk';\nimport { showBanner } from './banner.js';\n\nexport function showHelp(): void {\n showBanner();\n\n console.log(chalk.white.bold(' USAGE\\n'));\n console.log(` ${chalk.hex('#D4A017')('framer-export')} ${chalk.yellow('<url>')} ${chalk.gray('[output-dir]')}`);\n console.log(` ${chalk.hex('#D4A017')('fexport')} ${chalk.yellow('<url>')} ${chalk.gray('[output-dir]')}`);\n\n console.log('');\n console.log(chalk.white.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(` ${chalk.green(flag.padEnd(18))} ${chalk.white(desc)}`);\n }\n\n console.log('');\n console.log(chalk.white.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(` ${chalk.hex('#D4A017')(name.padEnd(12))} ${chalk.gray(desc)}`);\n }\n\n console.log('');\n console.log(chalk.white.bold(' EXAMPLES\\n'));\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.yellow('https://mysite.framer.app')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.yellow('https://mysite.webflow.io')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.yellow('https://user.wixsite.com/my-site')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.green('--platform webflow')} ${chalk.yellow('https://custom.com')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.green('--subpages')} ${chalk.yellow('https://mysite.com')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.green('--setup')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.green('--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","chalk","G","G2","chalk","fs","path","chalk","init_download","chalk","stripAnsi","readline","stdin","stdout","path","URL","chalk","G","B","CFG","path","URL","chalk","chalk","runSetup","URL","FramerExporter","deriveOutputName","detectPlatform","path"]}