@artinstack/migrator 0.1.10 → 0.1.12

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.
Files changed (34) hide show
  1. package/dist/{bundle-Do-9ikQv.d.ts → bundle-CysqqLij.d.ts} +1 -1
  2. package/dist/chunk-J7EUSPEA.js +667 -0
  3. package/dist/chunk-J7EUSPEA.js.map +1 -0
  4. package/dist/{chunk-3YJFSTYR.js → chunk-MUFGDYGI.js} +2 -1
  5. package/dist/chunk-MUFGDYGI.js.map +1 -0
  6. package/dist/{chunk-LC7CGWDN.js → chunk-PFUXPS7A.js} +1 -1
  7. package/dist/chunk-PFUXPS7A.js.map +1 -0
  8. package/dist/{chunk-YLVPZ4M3.js → chunk-Q44KGFIH.js} +28 -524
  9. package/dist/chunk-Q44KGFIH.js.map +1 -0
  10. package/dist/chunk-QFJXNEXG.js +355 -0
  11. package/dist/chunk-QFJXNEXG.js.map +1 -0
  12. package/dist/{chunk-3A2PA4P3.js → chunk-VRRYN6NS.js} +4 -232
  13. package/dist/chunk-VRRYN6NS.js.map +1 -0
  14. package/dist/{chunk-S4SUJT2D.js → chunk-WCAHVNWW.js} +98 -3
  15. package/dist/chunk-WCAHVNWW.js.map +1 -0
  16. package/dist/cli/index.js +5 -4
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/index.d.ts +3 -3
  19. package/dist/index.js +7 -6
  20. package/dist/normalizer/index.d.ts +10 -4
  21. package/dist/normalizer/index.js +2 -2
  22. package/dist/sinks/index.d.ts +2 -2
  23. package/dist/sinks/index.js +3 -3
  24. package/dist/transformers/index.d.ts +1 -1
  25. package/dist/transformers/index.js +3 -2
  26. package/dist/{types-TCHy3Oko.d.ts → types-CLNmloya.d.ts} +2 -0
  27. package/package.json +1 -1
  28. package/dist/chunk-3A2PA4P3.js.map +0 -1
  29. package/dist/chunk-3YJFSTYR.js.map +0 -1
  30. package/dist/chunk-BONZ3U3I.js +0 -124
  31. package/dist/chunk-BONZ3U3I.js.map +0 -1
  32. package/dist/chunk-LC7CGWDN.js.map +0 -1
  33. package/dist/chunk-S4SUJT2D.js.map +0 -1
  34. package/dist/chunk-YLVPZ4M3.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/parsers/wordpress/parse-wxr.ts","../src/parsers/wordpress/builders/flatten.ts","../src/parsers/wordpress/index.ts","../src/parsers/smugmug/api.ts","../src/parsers/smugmug/parse-node.ts","../src/parsers/smugmug/index.ts","../src/parsers/squarespace/index.ts","../src/parsers/wix/api.ts","../src/parsers/wix/ricos-to-html.ts","../src/parsers/wix/map-wire.ts","../src/parsers/wix/snapshot.ts","../src/parsers/wix/parse-export.ts","../src/parsers/wix/index.ts","../src/parsers/index.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\n\nimport { XMLParser } from \"fast-xml-parser\";\n\nimport {\n buildContentMediaUrlIndex,\n canonicalizeInlineAssetUrl,\n discoverContentAssets,\n parseMigrationMediaRef,\n resolveFeaturedContentAssetUrl,\n rewriteOriginUrlsInText,\n type OriginUrlRewriteConfig,\n} from \"../../lib/media-urls.js\";\nimport { stampMigrationMediaRefs } from \"../../transformers/rewrite-inline-images.js\";\nimport { linkToPath, sanitizeSlug } from \"../../lib/utility.js\";\nimport { flattenWordPressBuilders } from \"./builders/flatten.js\";\nimport type {\n NormalizedAsset,\n NormalizedCategory,\n NormalizedEntity,\n NormalizedPage,\n NormalizedPost,\n NormalizedTag,\n PublishStatus,\n SourceMetadata,\n WxrImportSummary,\n} from \"../../normalizer/types.js\";\n\nconst PLATFORM = \"wordpress\" as const;\n\n/** OSS-18 — theme/plugin CPT slugs emitted as `NormalizedPage` (default: Oshine `portfolio`). */\nexport const DEFAULT_WORDPRESS_PORTFOLIO_CPT_SLUGS = [\"portfolio\"] as const;\n\nconst WOOCOMMERCE_STUB_PAGE_SLUGS = new Set([\"cart\", \"checkout\", \"my-account\"]);\nconst WOOCOMMERCE_STUB_SHORTCODE = /^\\[woocommerce_(?:cart|checkout|my_account)\\]\\s*$/i;\n\nfunction isWooCommerceStubPage(slug: string, contentHtml: string): boolean {\n if (WOOCOMMERCE_STUB_PAGE_SLUGS.has(slug)) return true;\n const trimmed = contentHtml.trim();\n if (!trimmed) return false;\n return WOOCOMMERCE_STUB_SHORTCODE.test(trimmed);\n}\n\nexport interface WxrParseOptions {\n filePath: string;\n exportedAt?: string;\n /** Swap legacy gateway/staging domains before parse, fetch, or asset discovery. */\n originUrlRewrite?: OriginUrlRewriteConfig;\n /** Pre-DTO builder flattening (Bucket 1 + Bucket 2). Default: true. */\n flattenBuilders?: boolean;\n /** Omit WooCommerce cart/checkout/my-account stub pages. Default: true. */\n skipWooCommerceStubPages?: boolean;\n /**\n * After asset discovery, stamp resolved upload URLs as OSS-14 migration media refs\n * in emitted `contentHtml`. Default: true.\n */\n stampMigrationMediaRefs?: boolean;\n /**\n * WordPress CPT slugs to emit as `NormalizedPage` (OSS-18).\n * Default: `portfolio`. Extend with `jetpack-portfolio`, `project`, etc.\n */\n portfolioCptSlugs?: readonly string[];\n}\n\ninterface WxrItem {\n title?: string;\n link?: string;\n encoded?: string;\n post_id?: string | number;\n post_date?: string;\n post_name?: string;\n status?: string;\n post_type?: string;\n attachment_url?: string;\n postmeta?: WxrPostMeta | WxrPostMeta[];\n category?: WxrCategory | WxrCategory[];\n}\n\ninterface WxrPostMeta {\n meta_key?: string;\n meta_value?: string | number;\n}\n\ninterface WxrCategory {\n \"@_domain\"?: string;\n \"@_nicename\"?: string;\n \"#text\"?: string;\n}\n\ninterface AttachmentIndexEntry {\n sourceUrl: string;\n filename: string;\n mimeType?: string;\n title?: string;\n}\n\nfunction asArray<T>(value: T | T[] | undefined): T[] {\n if (value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction textValue(value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"string\" || typeof value === \"number\") return String(value);\n if (typeof value === \"object\" && value !== null && \"#text\" in value) {\n return String((value as { \"#text\": unknown })[\"#text\"] ?? \"\");\n }\n return String(value);\n}\n\nfunction mapPublishStatus(wpStatus: string | undefined): PublishStatus {\n switch ((wpStatus ?? \"\").toLowerCase()) {\n case \"publish\":\n return \"published\";\n case \"draft\":\n case \"pending\":\n return \"draft\";\n default:\n return \"archived\";\n }\n}\n\nfunction getContentEncoded(item: WxrItem): string {\n const content = (item as { content?: { encoded?: string } | string }).content;\n if (content !== undefined) {\n if (typeof content === \"string\") return content;\n return textValue(content.encoded);\n }\n return textValue(item.encoded);\n}\n\nfunction sourceMeta(\n id: string,\n link?: string,\n exportedAt?: string,\n postType?: string,\n): SourceMetadata {\n return {\n platform: PLATFORM,\n id,\n url: link || undefined,\n path: linkToPath(link),\n exportedAt,\n ...(postType ? { postType } : {}),\n };\n}\n\nfunction resolvePortfolioCptSlugs(options: WxrParseOptions): Set<string> {\n const slugs = options.portfolioCptSlugs ?? DEFAULT_WORDPRESS_PORTFOLIO_CPT_SLUGS;\n return new Set(slugs.map((slug) => slug.toLowerCase()));\n}\n\nfunction portfolioCptSourceId(postId: string): string {\n return `portfolio:${postId}`;\n}\n\nfunction isPortfolioCptPostType(postType: string, portfolioCptSlugs: Set<string>): boolean {\n return portfolioCptSlugs.has(postType.toLowerCase());\n}\n\nfunction countWxrPortfolioCptItems(\n items: WxrItem[],\n portfolioCptSlugs: Set<string> = new Set(DEFAULT_WORDPRESS_PORTFOLIO_CPT_SLUGS),\n): number {\n return items.filter((item) => isPortfolioCptPostType(textValue(item.post_type), portfolioCptSlugs))\n .length;\n}\n\n/** OSS-19 — dry-run accounting for WXR rows omitted by `parse-wxr`. */\nexport type { WxrImportSummary } from \"../../normalizer/types.js\";\n\nfunction isImportableWxrPostType(postType: string, portfolioCptSlugs: Set<string>): boolean {\n const normalized = postType.toLowerCase();\n return (\n normalized === \"post\" ||\n normalized === \"page\" ||\n normalized === \"attachment\" ||\n isPortfolioCptPostType(normalized, portfolioCptSlugs)\n );\n}\n\nfunction contentForWooStubCheck(item: WxrItem, options: WxrParseOptions): string {\n let html = getContentEncoded(item);\n if (options.originUrlRewrite) {\n html = rewriteOriginUrlsInText(html, options.originUrlRewrite);\n }\n if (options.flattenBuilders !== false) {\n html = flattenWordPressBuilders(html).html;\n }\n return html;\n}\n\n/** Count importable vs skipped WXR items without emitting DTOs. */\nexport function summarizeWxrImport(items: WxrItem[], options: WxrParseOptions): WxrImportSummary {\n const portfolioCptSlugs = resolvePortfolioCptSlugs(options);\n let importableItemCount = 0;\n let skippedWooCommerceStubPages = 0;\n const skippedPostTypes: Record<string, number> = {};\n\n for (const item of items) {\n const postType = textValue(item.post_type) || \"unknown\";\n const normalizedType = postType.toLowerCase();\n\n if (isImportableWxrPostType(normalizedType, portfolioCptSlugs)) {\n if (\n normalizedType === \"page\" &&\n options.skipWooCommerceStubPages !== false &&\n isWooCommerceStubPage(\n sanitizeSlug(textValue(item.post_name) || textValue(item.title) || textValue(item.post_id)),\n contentForWooStubCheck(item, options),\n )\n ) {\n skippedWooCommerceStubPages++;\n continue;\n }\n importableItemCount++;\n continue;\n }\n\n skippedPostTypes[normalizedType] = (skippedPostTypes[normalizedType] ?? 0) + 1;\n }\n\n const skippedUnsupported = Object.values(skippedPostTypes).reduce((sum, count) => sum + count, 0);\n\n return {\n importableItemCount,\n unsupportedOnly: importableItemCount === 0 && skippedUnsupported > 0,\n skippedPostTypes,\n ...(skippedWooCommerceStubPages > 0\n ? { skippedWooCommerceStubPages }\n : {}),\n };\n}\n\nexport async function summarizeWxrImportFromFile(\n filePath: string,\n options: WxrParseOptions = { filePath },\n): Promise<WxrImportSummary> {\n const xml = await readFile(filePath, \"utf8\");\n return summarizeWxrImport(parseItems(xml), options);\n}\n\nfunction getExcerpt(item: WxrItem): string {\n const excerpt = (item as { excerpt?: { encoded?: string } | string }).excerpt;\n if (!excerpt) return \"\";\n if (typeof excerpt === \"string\") return excerpt;\n return textValue(excerpt.encoded);\n}\n\nfunction getPostMeta(item: WxrItem, key: string): string | undefined {\n for (const meta of asArray(item.postmeta)) {\n if (textValue(meta.meta_key) === key) {\n return textValue(meta.meta_value);\n }\n }\n return undefined;\n}\n\nfunction parseItems(xml: string): WxrItem[] {\n const parser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: \"@_\",\n removeNSPrefix: true,\n trimValues: false,\n parseTagValue: false,\n });\n\n const doc = parser.parse(xml) as {\n rss?: { channel?: { item?: WxrItem | WxrItem[] } };\n };\n\n return asArray(doc.rss?.channel?.item);\n}\n\nfunction buildAttachmentIndex(\n items: WxrItem[],\n originUrlRewrite?: OriginUrlRewriteConfig,\n): Map<string, AttachmentIndexEntry> {\n const index = new Map<string, AttachmentIndexEntry>();\n\n for (const item of items) {\n if (textValue(item.post_type) !== \"attachment\") continue;\n const id = textValue(item.post_id);\n const rawUrl = textValue(item.attachment_url) || textValue(item.link);\n if (!id || !rawUrl) continue;\n const canonical = canonicalizeInlineAssetUrl(rawUrl, originUrlRewrite);\n if (!canonical) continue;\n const url = canonical.canonicalUrl;\n\n const filename = basename(new URL(url, \"http://local.invalid\").pathname) || `attachment-${id}`;\n index.set(id, {\n sourceUrl: url,\n filename,\n mimeType: getPostMeta(item, \"_wp_attached_file\") ? undefined : guessMime(filename),\n title: textValue(item.title),\n });\n }\n\n return index;\n}\n\nfunction guessMime(filename: string): string | undefined {\n const ext = filename.split(\".\").pop()?.toLowerCase();\n const map: Record<string, string> = {\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n pdf: \"application/pdf\",\n };\n return ext ? map[ext] : undefined;\n}\n\nfunction collectTaxonomies(items: WxrItem[]): {\n categories: Map<string, NormalizedCategory>;\n tags: Map<string, NormalizedTag>;\n} {\n const categories = new Map<string, NormalizedCategory>();\n const tags = new Map<string, NormalizedTag>();\n\n for (const item of items) {\n const postType = textValue(item.post_type);\n if (postType !== \"post\" && postType !== \"page\") continue;\n\n for (const cat of asArray(item.category)) {\n const domain = cat[\"@_domain\"] ?? \"\";\n const nicename = sanitizeSlug(cat[\"@_nicename\"] ?? textValue(cat[\"#text\"]));\n const name = textValue(cat[\"#text\"]) || nicename;\n if (!nicename) continue;\n\n if (domain === \"category\") {\n if (!categories.has(nicename)) {\n categories.set(nicename, {\n type: \"category\",\n source: sourceMeta(`cat:${nicename}`),\n sourceId: `cat:${nicename}`,\n name,\n slug: nicename,\n });\n }\n } else if (domain === \"post_tag\") {\n if (!tags.has(nicename)) {\n tags.set(nicename, {\n type: \"tag\",\n source: sourceMeta(`tag:${nicename}`),\n sourceId: `tag:${nicename}`,\n name,\n slug: nicename,\n });\n }\n }\n }\n }\n\n return { categories, tags };\n}\n\nfunction collectInlineAssets(\n html: string,\n attachmentIndex: Map<string, AttachmentIndexEntry>,\n seenUrls: Set<string>,\n seenAttachmentIds: Set<string>,\n exportedAt?: string,\n originUrlRewrite?: OriginUrlRewriteConfig,\n): NormalizedAsset[] {\n const assets: NormalizedAsset[] = [];\n const discovery = discoverContentAssets(html);\n\n for (const discovered of discovery.urls) {\n const canonical = canonicalizeInlineAssetUrl(discovered, originUrlRewrite);\n if (!canonical) continue;\n if (seenUrls.has(canonical.canonicalUrl)) continue;\n seenUrls.add(canonical.canonicalUrl);\n\n let filename: string;\n try {\n filename =\n basename(new URL(canonical.canonicalUrl, \"http://local.invalid\").pathname) || \"inline-asset\";\n } catch {\n filename = \"inline-asset\";\n }\n\n assets.push({\n type: \"asset\",\n source: sourceMeta(canonical.sourceId, canonical.canonicalUrl, exportedAt),\n sourceId: canonical.sourceId,\n sourceUrl: canonical.canonicalUrl,\n filename,\n mimeType: guessMime(filename),\n });\n }\n\n for (const attachmentId of discovery.unresolvedAttachmentIds) {\n if (seenAttachmentIds.has(attachmentId)) continue;\n seenAttachmentIds.add(attachmentId);\n\n const entry = attachmentIndex.get(attachmentId);\n if (!entry) continue;\n\n if (seenUrls.has(entry.sourceUrl)) continue;\n seenUrls.add(entry.sourceUrl);\n\n assets.push({\n type: \"asset\",\n source: sourceMeta(attachmentId, entry.sourceUrl, exportedAt),\n sourceId: attachmentId,\n sourceUrl: entry.sourceUrl,\n filename: entry.filename,\n mimeType: entry.mimeType ?? guessMime(entry.filename),\n caption: entry.title,\n });\n }\n\n return assets;\n}\n\nfunction preprocessContent(rawHtml: string, options: WxrParseOptions): string {\n let html = rawHtml;\n if (options.originUrlRewrite) {\n html = rewriteOriginUrlsInText(html, options.originUrlRewrite);\n }\n if (options.flattenBuilders !== false) {\n html = flattenWordPressBuilders(html).html;\n }\n return html;\n}\n\nfunction resolveFeaturedAssetSourceId(\n thumbnailId: string | undefined,\n attachmentIndex: Map<string, AttachmentIndexEntry>,\n contentHtml: string,\n originUrlRewrite?: OriginUrlRewriteConfig,\n): string | undefined {\n if (thumbnailId && attachmentIndex.has(thumbnailId)) {\n return thumbnailId;\n }\n const featuredUrl = resolveFeaturedContentAssetUrl(contentHtml);\n if (!featuredUrl) return undefined;\n\n const fromRef = parseMigrationMediaRef(featuredUrl);\n if (fromRef) return fromRef;\n\n return canonicalizeInlineAssetUrl(featuredUrl, originUrlRewrite)?.sourceId;\n}\n\nfunction maybeRewriteUrl(url: string | undefined, config?: OriginUrlRewriteConfig): string | undefined {\n if (!url) return undefined;\n if (!config) return url;\n return rewriteOriginUrlsInText(url, config);\n}\n\nexport async function* enumerateWxrEntities(\n options: WxrParseOptions,\n): AsyncGenerator<NormalizedEntity> {\n const xml = await readFile(options.filePath, \"utf8\");\n const items = parseItems(xml);\n const attachmentIndex = buildAttachmentIndex(items, options.originUrlRewrite);\n const { categories, tags } = collectTaxonomies(items);\n const seenAssetUrls = new Set<string>();\n const emittedAttachmentIds = new Set<string>();\n\n for (const category of categories.values()) {\n yield category;\n }\n for (const tag of tags.values()) {\n yield tag;\n }\n\n // Emit attachment assets\n for (const [id, entry] of attachmentIndex) {\n emittedAttachmentIds.add(id);\n seenAssetUrls.add(entry.sourceUrl);\n yield {\n type: \"asset\",\n source: sourceMeta(id, entry.sourceUrl, options.exportedAt),\n sourceId: id,\n sourceUrl: entry.sourceUrl,\n filename: entry.filename,\n mimeType: entry.mimeType,\n caption: entry.title,\n } satisfies NormalizedAsset;\n }\n\n const portfolioCptSlugs = resolvePortfolioCptSlugs(options);\n\n for (const item of items) {\n const postType = textValue(item.post_type);\n const isPost = postType === \"post\";\n const isPage = postType === \"page\";\n const isPortfolioCpt = isPortfolioCptPostType(postType, portfolioCptSlugs);\n if (!isPost && !isPage && !isPortfolioCpt) continue;\n\n const id = textValue(item.post_id);\n const link = maybeRewriteUrl(textValue(item.link), options.originUrlRewrite);\n const slug = sanitizeSlug(textValue(item.post_name) || textValue(item.title) || id);\n let contentHtml = preprocessContent(getContentEncoded(item), options);\n\n if (\n isPage &&\n options.skipWooCommerceStubPages !== false &&\n isWooCommerceStubPage(slug, contentHtml)\n ) {\n continue;\n }\n\n const inlineAssets = collectInlineAssets(\n contentHtml,\n attachmentIndex,\n seenAssetUrls,\n emittedAttachmentIds,\n options.exportedAt,\n options.originUrlRewrite,\n );\n for (const asset of inlineAssets) {\n yield asset;\n }\n\n if (options.stampMigrationMediaRefs !== false) {\n const urlIndex = buildContentMediaUrlIndex(\n [\n ...[...attachmentIndex.entries()].map(([sourceId, entry]) => ({\n sourceId,\n sourceUrl: entry.sourceUrl,\n })),\n ...inlineAssets.map((asset) => ({\n sourceId: asset.sourceId,\n sourceUrl: asset.sourceUrl,\n })),\n ],\n options.originUrlRewrite,\n );\n contentHtml = stampMigrationMediaRefs(contentHtml, {\n urlToSourceId: urlIndex,\n originUrlRewrite: options.originUrlRewrite,\n }).html;\n }\n\n const categorySlugs: string[] = [];\n const tagSlugs: string[] = [];\n for (const cat of asArray(item.category)) {\n const domain = cat[\"@_domain\"] ?? \"\";\n const nicename = sanitizeSlug(cat[\"@_nicename\"] ?? textValue(cat[\"#text\"]));\n if (!nicename) continue;\n if (domain === \"category\") categorySlugs.push(nicename);\n if (domain === \"post_tag\") tagSlugs.push(nicename);\n }\n\n if (isPost) {\n const thumbnailId = getPostMeta(item, \"_thumbnail_id\");\n const featuredAssetSourceId = resolveFeaturedAssetSourceId(\n thumbnailId,\n attachmentIndex,\n contentHtml,\n options.originUrlRewrite,\n );\n\n const post: NormalizedPost = {\n type: \"post\",\n source: sourceMeta(id, link, options.exportedAt),\n sourceId: id,\n title: textValue(item.title) || slug,\n slug,\n excerpt: getExcerpt(item) || undefined,\n contentHtml,\n publishedAt: textValue(item.post_date) || undefined,\n status: mapPublishStatus(textValue(item.status)),\n categorySlugs: categorySlugs.length ? categorySlugs : undefined,\n tagSlugs: tagSlugs.length ? tagSlugs : undefined,\n sourceFeaturedMediaId: thumbnailId,\n featuredAssetSourceId,\n };\n yield post;\n } else {\n const isHomePage =\n !isPortfolioCpt &&\n (getPostMeta(item, \"_wp_show_on_front\") === \"1\" ||\n getPostMeta(item, \"page_on_front\") === \"1\");\n\n const pageSourceId = isPortfolioCpt ? portfolioCptSourceId(id) : id;\n\n const page: NormalizedPage = {\n type: \"page\",\n source: sourceMeta(pageSourceId, link, options.exportedAt, isPortfolioCpt ? postType : undefined),\n sourceId: pageSourceId,\n title: textValue(item.title) || slug,\n slug,\n contentHtml,\n isHomePage: isHomePage || undefined,\n status: mapPublishStatus(textValue(item.status)),\n };\n yield page;\n }\n }\n}\n\nexport async function validateWxrFile(\n filePath: string,\n options: WxrParseOptions = { filePath },\n): Promise<{\n ok: boolean;\n issues: { code: string; message: string }[];\n summary: Record<string, number>;\n importSummary: WxrImportSummary;\n}> {\n const issues: { code: string; message: string }[] = [];\n let xml: string;\n try {\n xml = await readFile(filePath, \"utf8\");\n } catch {\n return {\n ok: false,\n issues: [{ code: \"file_not_found\", message: `Cannot read file: ${filePath}` }],\n summary: {},\n importSummary: {\n importableItemCount: 0,\n unsupportedOnly: false,\n skippedPostTypes: {},\n },\n };\n }\n\n const looksLikeWxr =\n xml.includes(\"<rss\") &&\n (xml.includes(\"wp:wxr_version\") ||\n xml.includes(\"xmlns:wp=\") ||\n xml.includes(\"WordPress eXtended RSS\"));\n if (!looksLikeWxr) {\n issues.push({ code: \"invalid_wxr\", message: \"File does not appear to be WordPress WXR\" });\n }\n\n const items = parseItems(xml);\n const importSummary = summarizeWxrImport(items, { ...options, filePath });\n const summary = {\n posts: items.filter((i) => textValue(i.post_type) === \"post\").length,\n pages: items.filter((i) => textValue(i.post_type) === \"page\").length,\n assets: items.filter((i) => textValue(i.post_type) === \"attachment\").length,\n portfolioCpt: countWxrPortfolioCptItems(items),\n categories: 0,\n tags: 0,\n importableItemCount: importSummary.importableItemCount,\n };\n\n const { categories, tags } = collectTaxonomies(items);\n summary.categories = categories.size;\n summary.tags = tags.size;\n\n return { ok: issues.length === 0, issues, summary, importSummary };\n}\n","import { normalizeAssetUrl } from \"../../../lib/media-urls.js\";\nimport type {\n BuilderIconImageRule,\n BuilderPlaceholderRule,\n BuilderTextRule,\n BuilderThemeConfig,\n BuilderUrlRule,\n BuilderWrapperRule,\n FractionalLayoutMap,\n ExtendedPrefixedLayoutMap,\n PrefixedLayoutMap,\n StructuralLayoutMap,\n TextHtmlTag,\n BuilderHtmlTag,\n} from \"./registry.js\";\nimport {\n WORDPRESS_BUILDER_REGISTRY,\n WORDPRESS_WIDGET_REGISTRY,\n WP_WIDGET_PLACEHOLDER,\n type WordPressWidgetRegistry,\n} from \"./registry.js\";\n\nexport interface FlattenWordPressBuildersOptions {\n registry?: BuilderThemeConfig[];\n widgetRegistry?: WordPressWidgetRegistry;\n}\n\nexport interface FlattenWordPressBuildersResult {\n html: string;\n detectedThemes: string[];\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/** Read a quoted shortcode attribute value (supports multiline). */\nexport function extractQuotedParam(params: string, name: string): string | undefined {\n const pattern = new RegExp(`\\\\b${escapeRegExp(name)}\\\\s*=\\\\s*`, \"i\");\n const match = pattern.exec(params);\n if (!match) return undefined;\n\n let index = match.index + match[0].length;\n while (index < params.length && /\\s/.test(params[index]!)) index += 1;\n\n const quote = params[index];\n if (quote !== '\"' && quote !== \"'\") return undefined;\n index += 1;\n\n let value = \"\";\n while (index < params.length) {\n const char = params[index]!;\n if (char === \"\\\\\" && index + 1 < params.length) {\n value += params[index + 1];\n index += 2;\n continue;\n }\n if (char === quote) break;\n value += char;\n index += 1;\n }\n\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n\nfunction escapeLayoutAttr(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\");\n}\n\n/** Parse `width=\"1/2\"` / `columns=\"1/3+1/3+1/3\"` style strings → percentage or column count. */\nexport function parseFractionWidth(fraction: string | undefined): string | undefined {\n if (!fraction?.trim()) return undefined;\n const trimmed = fraction.trim();\n const match = trimmed.match(/^(\\d+)\\s*\\/\\s*(\\d+)$/);\n if (!match) return undefined;\n const numerator = Number(match[1]);\n const denominator = Number(match[2]);\n if (!Number.isFinite(numerator) || !Number.isFinite(denominator) || denominator <= 0) {\n return undefined;\n }\n const percent = (numerator / denominator) * 100;\n const rounded = Math.round(percent * 100) / 100;\n return `${rounded % 1 === 0 ? rounded.toFixed(0) : rounded}%`;\n}\n\n/** Parse row `layout=\"1/2+1/2\"` style strings → column count. */\nexport function parseRowLayoutCols(layout: string | undefined): number | undefined {\n if (!layout?.trim()) return undefined;\n const parts = layout.split(\"+\").map((part) => part.trim()).filter(Boolean);\n return parts.length > 1 ? parts.length : undefined;\n}\n\nfunction openSectionDiv(params: string, bgParamName?: string): string {\n const attrs = ['data-layout=\"section\"'];\n const bgImage = extractQuotedParam(params, bgParamName ?? \"bg_image\");\n if (bgImage?.startsWith(\"http\")) {\n attrs.push(`data-bg-image=\"${escapeLayoutAttr(bgImage)}\"`);\n }\n return `<div ${attrs.join(\" \")}>`;\n}\n\nfunction openRowDiv(params: string, colsParamName?: string): string {\n const attrs = ['data-layout=\"row\"'];\n const cols = parseRowLayoutCols(extractQuotedParam(params, colsParamName ?? \"layout\"));\n if (cols) attrs.push(`data-cols=\"${cols}\"`);\n return `<div ${attrs.join(\" \")}>`;\n}\n\nfunction openColumnDiv(params: string, widthParamName?: string): string {\n const attrs = ['data-layout=\"column\"'];\n const width = parseFractionWidth(extractQuotedParam(params, widthParamName ?? \"width\"));\n if (width) attrs.push(`data-col-width=\"${width}\"`);\n return `<div ${attrs.join(\" \")}>`;\n}\n\nfunction applyPrefixedLayoutMap(content: string, map: PrefixedLayoutMap): string {\n let html = content;\n html = html.replace(map.sectionRegex, (_, params: string) => openSectionDiv(params, map.bgParamName));\n html = html.replace(map.sectionCloseRegex, \"</div>\");\n html = html.replace(map.rowRegex, (_, params: string) => openRowDiv(params, map.colsParamName));\n html = html.replace(map.rowCloseRegex, \"</div>\");\n html = html.replace(map.columnRegex, '<div data-layout=\"column\">');\n html = html.replace(map.columnCloseRegex, \"</div>\");\n return html;\n}\n\nfunction applyFractionalLayoutMap(content: string, map: FractionalLayoutMap): string {\n let html = content;\n html = html.replace(map.sectionRegex, (_, params: string) => openSectionDiv(params, map.bgParamName));\n html = html.replace(map.sectionCloseRegex, \"</div>\");\n html = html.replace(map.rowRegex, (_, params: string) => openRowDiv(params));\n html = html.replace(map.rowCloseRegex, \"</div>\");\n\n for (let index = 0; index < map.columnTokens.length; index += 1) {\n const token = map.columnTokens[index]!;\n const width = map.columnWidths[token];\n const openRegex = map.columnOpenRegexes[index]!;\n const closeRegex = map.columnCloseRegexes[index]!;\n html = html.replace(openRegex, () => {\n const attrs = ['data-layout=\"column\"'];\n if (width) attrs.push(`data-col-width=\"${width}\"`);\n return `<div ${attrs.join(\" \")}>`;\n });\n html = html.replace(closeRegex, \"</div>\");\n }\n return html;\n}\n\nfunction applyExtendedPrefixedLayoutMap(content: string, map: ExtendedPrefixedLayoutMap): string {\n let html = content;\n const levels = [...map.levels].sort((left, right) => {\n const leftMax = Math.max(...left.tokens.map((token) => token.length));\n const rightMax = Math.max(...right.tokens.map((token) => token.length));\n return rightMax - leftMax;\n });\n\n for (const level of levels) {\n const tokens = [...level.tokens].sort((left, right) => right.length - left.length);\n for (const token of tokens) {\n const openRegex = new RegExp(`\\\\[${escapeRegExp(token)}\\\\b([^\\\\]]*)\\\\]`, \"gi\");\n const closeRegex = new RegExp(`\\\\[\\\\/${escapeRegExp(token)}\\\\b[^\\\\]]*\\\\]`, \"gi\");\n\n html = html.replace(openRegex, (_, params: string) => {\n switch (level.role) {\n case \"section\":\n return openSectionDiv(params, level.bgParamName);\n case \"row\":\n return openRowDiv(params, level.colsParamName);\n case \"column\":\n return openColumnDiv(params, level.widthParamName);\n }\n });\n html = html.replace(closeRegex, \"</div>\");\n }\n }\n\n return html;\n}\n\n/** Map builder layout shortcodes → editor-neutral `data-layout` HTML. */\nexport function applyStructuralLayoutMap(content: string, map: StructuralLayoutMap): string {\n switch (map.kind) {\n case \"prefixed\":\n return applyPrefixedLayoutMap(content, map);\n case \"fractional\":\n return applyFractionalLayoutMap(content, map);\n case \"extended-prefixed\":\n return applyExtendedPrefixedLayoutMap(content, map);\n }\n}\n\nfunction collectLayoutMaps(theme: BuilderThemeConfig): StructuralLayoutMap[] {\n const maps: StructuralLayoutMap[] = [];\n if (theme.layoutMap) maps.push(theme.layoutMap);\n if (theme.layoutMaps?.length) maps.push(...theme.layoutMaps);\n return maps;\n}\n\nfunction extractShortcodeParam(params: string, names: string[]): string | undefined {\n for (const name of names) {\n const value = extractQuotedParam(params, name);\n if (value) return value;\n }\n return undefined;\n}\n\nfunction escapeHtmlText(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nfunction textToHtml(text: string, tag: TextHtmlTag): string {\n const paragraphs = text.split(/\\n{2,}/).map((part) => part.trim()).filter(Boolean);\n if (paragraphs.length === 0) return \"\";\n\n return paragraphs\n .map((paragraph) => {\n const inner = escapeHtmlText(paragraph).replace(/\\n/g, \"<br />\");\n return `<${tag}>${inner}</${tag}>`;\n })\n .join(\"\\n\");\n}\n\nfunction emitHtmlTag(tag: BuilderHtmlTag, url: string): string {\n const normalized = normalizeAssetUrl(url) ?? url;\n const escaped = normalized\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\");\n\n switch (tag) {\n case \"img\":\n return `<img src=\"${escaped}\" alt=\"\" />`;\n case \"video\":\n return `<video src=\"${escaped}\" controls></video>`;\n case \"iframe\":\n return `<iframe src=\"${escaped}\" loading=\"lazy\"></iframe>`;\n }\n}\n\nfunction convertUrlRule(content: string, rule: BuilderUrlRule): string {\n const prefix = escapeRegExp(rule.shortcodePrefix);\n const pattern = new RegExp(\n `\\\\[${prefix}\\\\b([^\\\\]]*)\\\\]\\\\s*(?:\\\\[\\\\/${prefix}\\\\b[^\\\\]]*\\\\])?`,\n \"gi\",\n );\n\n return content.replace(pattern, (block, params: string) => {\n const url = extractShortcodeParam(params, rule.urlParams);\n if (!url) return block;\n return emitHtmlTag(rule.tag, url);\n });\n}\n\nfunction convertTextRule(content: string, rule: BuilderTextRule): string {\n const prefix = escapeRegExp(rule.shortcodePrefix);\n const pattern = new RegExp(\n `\\\\[${prefix}\\\\b([^\\\\]]*)\\\\]\\\\s*(?:\\\\[\\\\/${prefix}\\\\b[^\\\\]]*\\\\])?`,\n \"gis\",\n );\n\n return content.replace(pattern, (block, params: string) => {\n const parts: string[] = [];\n for (const field of rule.fields) {\n const text = extractQuotedParam(params, field.param);\n if (!text) continue;\n const html = textToHtml(text, field.tag);\n if (html) parts.push(html);\n }\n return parts.length > 0 ? parts.join(\"\\n\") : block;\n });\n}\n\nfunction convertWrapperRule(content: string, rule: BuilderWrapperRule): string {\n const prefix = escapeRegExp(rule.shortcodePrefix);\n const pattern = new RegExp(\n `\\\\[${prefix}\\\\b([^\\\\]]*)\\\\]([\\\\s\\\\S]*?)\\\\[\\\\/${prefix}\\\\b[^\\\\]]*\\\\]`,\n \"gi\",\n );\n\n return content.replace(pattern, (_, params: string, inner: string) => {\n const parts: string[] = [];\n if (rule.urlParams?.length) {\n const url = extractShortcodeParam(params, rule.urlParams);\n if (url) parts.push(emitHtmlTag(\"img\", url));\n }\n parts.push(inner.trim());\n return parts.filter(Boolean).join(\"\\n\");\n });\n}\n\nfunction convertIconImageRule(content: string, rule: BuilderIconImageRule): string {\n const prefix = escapeRegExp(rule.shortcodePrefix);\n const pattern = new RegExp(\n `\\\\[${prefix}\\\\b([^\\\\]]*)\\\\]\\\\s*(?:\\\\[\\\\/${prefix}\\\\b[^\\\\]]*\\\\])?`,\n \"gi\",\n );\n\n return content.replace(pattern, (_, params: string) => {\n const iconImage = extractQuotedParam(params, rule.imageParam);\n if (!iconImage?.startsWith(\"http\") || iconImage.includes(\"placehold\")) {\n return \"\";\n }\n const img = emitHtmlTag(\"img\", iconImage);\n if (rule.hrefParam) {\n const href = extractQuotedParam(params, rule.hrefParam);\n if (href?.startsWith(\"http\")) {\n const escapedHref = href\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\");\n return `<a href=\"${escapedHref}\">${img}</a>`;\n }\n }\n return img;\n });\n}\n\nfunction convertPlaceholderRule(content: string, rule: BuilderPlaceholderRule): string {\n const prefix = escapeRegExp(rule.shortcodePrefix);\n const pattern = new RegExp(\n `\\\\[${prefix}\\\\b([^\\\\]]*)\\\\]\\\\s*(?:\\\\[\\\\/${prefix}\\\\b[^\\\\]]*\\\\])?`,\n \"gi\",\n );\n return content.replace(pattern, rule.html);\n}\n\nfunction stripScaffoldingPrefix(content: string, prefix: string): string {\n const escaped = escapeRegExp(prefix);\n const opener = new RegExp(`\\\\[${escaped}[a-z0-9_-]*[^\\\\]]*\\\\]`, \"gi\");\n const closer = new RegExp(`\\\\[\\\\/${escaped}[a-z0-9_-]*[^\\\\]]*\\\\]`, \"gi\");\n return content.replace(opener, \"\").replace(closer, \"\");\n}\n\nfunction stripLegacyTokens(content: string, tokens: string[]): string {\n let result = content;\n for (const token of tokens) {\n const escaped = escapeRegExp(token);\n const opener = new RegExp(`\\\\[${escaped}\\\\b[^\\\\]]*\\\\]`, \"gi\");\n const closer = new RegExp(`\\\\[\\\\/${escaped}\\\\b[^\\\\]]*\\\\]`, \"gi\");\n result = result.replace(opener, \"\").replace(closer, \"\");\n }\n return result;\n}\n\nfunction detectThemes(content: string, registry: BuilderThemeConfig[]): BuilderThemeConfig[] {\n return registry.filter((theme) => theme.detect.test(content));\n}\n\nfunction extractBareOrQuotedParam(params: string, name: string): string | undefined {\n const quoted = extractQuotedParam(params, name);\n if (quoted) return quoted;\n const pattern = new RegExp(`\\\\b${escapeRegExp(name)}\\\\s*=\\\\s*([^\\\\s\"'\\\\]]+)`, \"i\");\n const match = pattern.exec(params);\n return match?.[1]?.trim() || undefined;\n}\n\nfunction emitWidgetStub(\n widget: string,\n attrs: Record<string, string | undefined>,\n tag: \"div\" | \"section\" = \"div\",\n): string {\n const parts = [`data-wp-widget=\"${escapeLayoutAttr(widget)}\"`];\n for (const [key, value] of Object.entries(attrs)) {\n if (value) parts.push(`${key}=\"${escapeLayoutAttr(value)}\"`);\n }\n return `<${tag} ${parts.join(\" \")}>${WP_WIDGET_PLACEHOLDER}</${tag}>`;\n}\n\n/** OSS-16 — normalize YouTube/Vimeo share URLs to canonical embed URLs. */\nexport function normalizeVideoEmbedUrl(\n raw: string,\n): { provider: \"youtube\" | \"vimeo\" | \"external\"; embedUrl: string } | undefined {\n const trimmed = raw.trim();\n if (!trimmed || trimmed.startsWith(\"data:\")) return undefined;\n\n try {\n const url = new URL(trimmed.startsWith(\"//\") ? `https:${trimmed}` : trimmed);\n const host = url.hostname.replace(/^www\\./, \"\").replace(/^m\\./, \"\");\n\n if (host === \"youtu.be\") {\n const id = url.pathname.split(\"/\").filter(Boolean)[0];\n if (id) {\n return { provider: \"youtube\", embedUrl: `https://www.youtube-nocookie.com/embed/${id}` };\n }\n }\n\n if (host === \"youtube.com\" || host === \"youtube-nocookie.com\") {\n const embedMatch = url.pathname.match(/\\/embed\\/([^/?#]+)/);\n if (embedMatch?.[1]) {\n const start = url.searchParams.get(\"start\");\n const suffix = start ? `?start=${start}` : \"\";\n return {\n provider: \"youtube\",\n embedUrl: `https://www.youtube-nocookie.com/embed/${embedMatch[1]}${suffix}`,\n };\n }\n const videoId = url.searchParams.get(\"v\");\n if (videoId) {\n const t = url.searchParams.get(\"t\") ?? url.searchParams.get(\"start\");\n const startSeconds = t?.endsWith(\"s\") ? t.slice(0, -1) : t;\n const suffix = startSeconds ? `?start=${startSeconds}` : \"\";\n return {\n provider: \"youtube\",\n embedUrl: `https://www.youtube-nocookie.com/embed/${videoId}${suffix}`,\n };\n }\n }\n\n if (host === \"vimeo.com\") {\n const segments = url.pathname.split(\"/\").filter(Boolean);\n const id = segments[segments.length - 1];\n if (id && /^\\d+$/.test(id)) {\n return { provider: \"vimeo\", embedUrl: `https://player.vimeo.com/video/${id}` };\n }\n }\n\n if (host === \"player.vimeo.com\") {\n const match = url.pathname.match(/\\/video\\/(\\d+)/);\n if (match?.[1]) {\n return { provider: \"vimeo\", embedUrl: `https://player.vimeo.com/video/${match[1]}` };\n }\n }\n } catch {\n return undefined;\n }\n\n return undefined;\n}\n\nfunction emitVideoWidgetFromParams(params: string, inner: string): string {\n const url =\n extractShortcodeParam(params, [\"url\", \"src\", \"video\", \"link\", \"youtube_url\", \"vimeo_url\"]) ??\n inner.trim().match(/^https?:\\/\\/\\S+/)?.[0];\n\n if (!url) {\n return emitWidgetStub(\"video\", { \"data-video-provider\": \"external\" });\n }\n\n const normalized = normalizeVideoEmbedUrl(url);\n if (normalized) {\n return emitWidgetStub(\"video\", {\n \"data-video-provider\": normalized.provider,\n \"data-embed-url\": normalized.embedUrl,\n });\n }\n\n if (/\\.(mp4|webm|ogg)(\\?|#|$)/i.test(url)) {\n return emitHtmlTag(\"video\", url);\n }\n\n return emitWidgetStub(\"video\", {\n \"data-video-provider\": \"external\",\n \"data-embed-url\": url,\n });\n}\n\nfunction flattenMapShortcodes(content: string, widgetRegistry: WordPressWidgetRegistry): string {\n let html = content;\n for (const prefix of widgetRegistry.mapShortcodePrefixes) {\n const pattern = new RegExp(\n `\\\\[${escapeRegExp(prefix)}\\\\b([^\\\\]]*)\\\\]\\\\s*(?:\\\\[\\\\/${escapeRegExp(prefix)}\\\\b[^\\\\]]*\\\\])?`,\n \"gi\",\n );\n html = html.replace(pattern, (_, params: string) => {\n const embedUrl = extractShortcodeParam(params, [\"embed_url\", \"url\", \"src\", \"map_url\"]);\n const query = extractBareOrQuotedParam(params, \"address\") ?? extractBareOrQuotedParam(params, \"q\");\n return emitWidgetStub(\"map\", {\n ...(embedUrl?.includes(\"google.com/maps\") ? { \"data-embed-url\": embedUrl } : {}),\n ...(query && !embedUrl ? { \"data-wp-map-query\": query } : {}),\n });\n });\n }\n return html;\n}\n\nfunction flattenContactFormShortcodes(content: string, widgetRegistry: WordPressWidgetRegistry): string {\n let html = content;\n for (const rule of widgetRegistry.contactFormRules) {\n const pattern = new RegExp(\n `\\\\[${escapeRegExp(rule.tag)}\\\\b([^\\\\]]*)\\\\]\\\\s*(?:\\\\[\\\\/${escapeRegExp(rule.tag)}\\\\b[^\\\\]]*\\\\])?`,\n \"gi\",\n );\n html = html.replace(pattern, (_, params: string) => {\n const id = extractBareOrQuotedParam(params, rule.idParam);\n return emitWidgetStub(\n \"contact-form\",\n {\n \"data-wp-form-source\": rule.source,\n ...(id ? { \"data-wp-form-id\": id } : {}),\n },\n \"section\",\n );\n });\n }\n return html;\n}\n\nfunction emitInlineGalleryFromIds(idList: string[]): string {\n const images = idList\n .map((id) => `<img data-wp-attachment-id=\"${escapeLayoutAttr(id)}\" alt=\"\" />`)\n .join(\"\");\n return `<figure data-wp-inline-gallery>${images}</figure>`;\n}\n\nfunction parseGalleryAttachmentIds(params: string): string[] | undefined {\n const ids = extractBareOrQuotedParam(params, \"ids\");\n const idList = ids\n ?.split(\",\")\n .map((part) => part.trim())\n .filter((part) => /^\\d+$/.test(part));\n return idList?.length ? idList : undefined;\n}\n\nfunction flattenIdGalleryShortcode(content: string, tag: string): string {\n const escaped = escapeRegExp(tag);\n const pattern = new RegExp(`\\\\[${escaped}\\\\b([^\\\\]]*)\\\\](?:\\\\s*\\\\[\\\\/${escaped}\\\\])?`, \"gi\");\n return content.replace(pattern, (fullMatch, params: string) => {\n const idList = parseGalleryAttachmentIds(params);\n if (idList?.length) {\n return emitInlineGalleryFromIds(idList);\n }\n return fullMatch;\n });\n}\n\nfunction flattenGalleryShortcodes(content: string, widgetRegistry: WordPressWidgetRegistry): string {\n const tag = escapeRegExp(widgetRegistry.galleryShortcode);\n const pattern = new RegExp(`\\\\[${tag}\\\\b([^\\\\]]*)\\\\](?:\\\\s*\\\\[\\\\/${tag}\\\\])?`, \"gi\");\n return content.replace(pattern, (_, params: string) => {\n const idList = parseGalleryAttachmentIds(params);\n\n if (idList?.length) {\n return emitInlineGalleryFromIds(idList);\n }\n\n const category = extractBareOrQuotedParam(params, \"category\") ?? extractBareOrQuotedParam(params, \"type\");\n return emitWidgetStub(\"portfolio\", {\n \"data-wp-gallery-dynamic\": \"1\",\n ...(category ? { \"data-wp-portfolio-category\": category } : {}),\n });\n });\n}\n\nfunction flattenIdBasedGalleryShortcodes(\n content: string,\n widgetRegistry: WordPressWidgetRegistry,\n): string {\n let html = content;\n for (const tag of widgetRegistry.idGalleryShortcodes) {\n html = flattenIdGalleryShortcode(html, tag);\n }\n return html;\n}\n\nfunction flattenPortfolioShortcodes(content: string, widgetRegistry: WordPressWidgetRegistry): string {\n const tag = escapeRegExp(widgetRegistry.portfolioShortcode);\n const pattern = new RegExp(`\\\\[${tag}\\\\b([^\\\\]]*)\\\\](?:\\\\s*\\\\[\\\\/${tag}\\\\])?`, \"gi\");\n return content.replace(pattern, (_, params: string) => {\n const category = extractBareOrQuotedParam(params, \"category\");\n const slug = extractBareOrQuotedParam(params, \"slug\");\n return emitWidgetStub(\"portfolio\", {\n ...(category ? { \"data-wp-portfolio-category\": category } : {}),\n ...(slug ? { \"data-wp-portfolio-slug\": slug } : {}),\n });\n });\n}\n\nfunction flattenVideoShortcodes(content: string, widgetRegistry: WordPressWidgetRegistry): string {\n let html = content;\n for (const prefix of widgetRegistry.videoShortcodePrefixes) {\n const wrapped = new RegExp(\n `\\\\[${escapeRegExp(prefix)}\\\\b([^\\\\]]*)\\\\]([\\\\s\\\\S]*?)\\\\[\\\\/${escapeRegExp(prefix)}\\\\b[^\\\\]]*\\\\]`,\n \"gi\",\n );\n html = html.replace(wrapped, (_, params: string, inner: string) =>\n emitVideoWidgetFromParams(params, inner),\n );\n\n const selfClosing = new RegExp(\n `\\\\[${escapeRegExp(prefix)}\\\\b([^\\\\]]*)\\\\]`,\n \"gi\",\n );\n html = html.replace(selfClosing, (_, params: string) => emitVideoWidgetFromParams(params, \"\"));\n }\n return html;\n}\n\n/** OSS-12 / OSS-16 — cross-builder widget + video stubs (before scaffolding strip). */\nfunction flattenWordPressWidgets(\n content: string,\n widgetRegistry: WordPressWidgetRegistry = WORDPRESS_WIDGET_REGISTRY,\n): string {\n let html = content;\n html = flattenGalleryShortcodes(html, widgetRegistry);\n html = flattenIdBasedGalleryShortcodes(html, widgetRegistry);\n html = flattenPortfolioShortcodes(html, widgetRegistry);\n html = flattenMapShortcodes(html, widgetRegistry);\n html = flattenContactFormShortcodes(html, widgetRegistry);\n html = flattenVideoShortcodes(html, widgetRegistry);\n return html;\n}\n\n/**\n * Pre-DTO WordPress builder flattening — Bucket 1 (asset/text shortcodes → HTML) then\n * Bucket 2 (layout scaffolding stripped). Decoupled from sink-time rewriteInlineImages.\n */\nexport function flattenWordPressBuilders(\n content: string,\n options: FlattenWordPressBuildersOptions = {},\n): FlattenWordPressBuildersResult {\n if (!content.trim()) {\n return { html: content, detectedThemes: [] };\n }\n\n const registry = options.registry ?? WORDPRESS_BUILDER_REGISTRY;\n const themes = detectThemes(content, registry);\n\n const widgetRegistry = options.widgetRegistry ?? WORDPRESS_WIDGET_REGISTRY;\n // Widget stubs before scaffolding strips (e.g. blox_gmap, tatsu_video, portfolio).\n let html = flattenWordPressWidgets(content, widgetRegistry);\n for (const theme of themes) {\n for (const rule of theme.wrapperRules ?? []) {\n html = convertWrapperRule(html, rule);\n }\n for (const rule of theme.textRules ?? []) {\n html = convertTextRule(html, rule);\n }\n for (const rule of theme.urlRules ?? []) {\n html = convertUrlRule(html, rule);\n }\n for (const rule of theme.placeholderRules ?? []) {\n html = convertPlaceholderRule(html, rule);\n }\n for (const rule of theme.iconImageRules ?? []) {\n html = convertIconImageRule(html, rule);\n }\n for (const layoutMap of collectLayoutMaps(theme)) {\n html = applyStructuralLayoutMap(html, layoutMap);\n }\n for (const prefix of theme.scaffoldingPrefixes ?? []) {\n html = stripScaffoldingPrefix(html, prefix);\n }\n if (theme.legacyScaffoldingTokens?.length) {\n html = stripLegacyTokens(html, theme.legacyScaffoldingTokens);\n }\n }\n\n html = html.replace(/\\n{3,}/g, \"\\n\\n\").trim();\n\n return {\n html,\n detectedThemes: themes.map((theme) => theme.id),\n };\n}\n","import type { AdapterContext, MigrationAdapter, ValidationResult, WxrImportSummary } from \"../../normalizer/types.js\";\nimport type { OriginUrlRewriteConfig } from \"../../lib/media-urls.js\";\nimport {\n DEFAULT_WORDPRESS_PORTFOLIO_CPT_SLUGS,\n enumerateWxrEntities,\n summarizeWxrImportFromFile,\n validateWxrFile,\n type WxrParseOptions,\n} from \"./parse-wxr.js\";\n\nexport {\n flattenWordPressBuilders,\n extractQuotedParam,\n normalizeVideoEmbedUrl,\n} from \"./builders/flatten.js\";\nexport {\n WORDPRESS_BUILDER_REGISTRY,\n WORDPRESS_WIDGET_REGISTRY,\n UNRESOLVABLE_SHORTCODE_PREFIXES,\n} from \"./builders/registry.js\";\nexport {\n findWordPressShortcodeMarkers,\n hasUnresolvableShortcodes,\n} from \"./builders/shortcode-conflicts.js\";\nexport type {\n BuilderThemeConfig,\n BuilderContentRule,\n BuilderUrlRule,\n BuilderTextRule,\n WordPressWidgetRegistry,\n WordPressContactFormWidgetRule,\n} from \"./builders/registry.js\";\nexport {\n DEFAULT_WORDPRESS_PORTFOLIO_CPT_SLUGS,\n summarizeWxrImport,\n summarizeWxrImportFromFile,\n validateWxrFile,\n} from \"./parse-wxr.js\";\nexport type { WxrImportSummary, WxrParseOptions } from \"./parse-wxr.js\";\n\nexport interface WordPressParseInput {\n path: string;\n originUrlRewrite?: OriginUrlRewriteConfig;\n flattenBuilders?: boolean;\n skipWooCommerceStubPages?: boolean;\n portfolioCptSlugs?: readonly string[];\n}\n\nfunction resolveWxrOptions(input: unknown): WxrParseOptions {\n if (typeof input === \"string\") {\n return { filePath: input };\n }\n if (input && typeof input === \"object\" && \"path\" in input) {\n const obj = input as WordPressParseInput;\n return {\n filePath: String(obj.path),\n originUrlRewrite: obj.originUrlRewrite,\n flattenBuilders: obj.flattenBuilders,\n skipWooCommerceStubPages: obj.skipWooCommerceStubPages,\n portfolioCptSlugs: obj.portfolioCptSlugs,\n };\n }\n throw new Error(\n \"WordPress adapter requires input path (string or { path, originUrlRewrite?, flattenBuilders?, skipWooCommerceStubPages?, portfolioCptSlugs? })\",\n );\n}\n\nexport const wordpressAdapter: MigrationAdapter = {\n platform: \"wordpress\",\n\n async validateInput(input: unknown): Promise<ValidationResult> {\n const options = resolveWxrOptions(input);\n const result = await validateWxrFile(options.filePath, options);\n return {\n ok: result.ok,\n issues: result.issues,\n summary: {\n ...result.summary,\n unsupportedOnly: result.importSummary.unsupportedOnly,\n skippedPostTypes: result.importSummary.skippedPostTypes,\n },\n };\n },\n\n async getImportSummary(input: unknown): Promise<WxrImportSummary> {\n const options = resolveWxrOptions(input);\n return summarizeWxrImportFromFile(options.filePath, options);\n },\n\n enumerateEntities(ctx: AdapterContext) {\n return enumerateWxrEntities(resolveWxrOptions(ctx.input));\n },\n};\n","import { createHmac, randomBytes } from \"node:crypto\";\n\nimport { z } from \"zod\";\n\nimport type { SmugMugFlatAlbum, SmugMugFlatExport, SmugMugFlatFolder, SmugMugFlatImage } from \"./types.js\";\n\n/** SmugMug API v2 base (OAuth 1.0a). No secrets — inject credentials at runtime. */\nexport const SMUGMUG_API_HOST = \"api.smugmug.com\";\nexport const SMUGMUG_API_BASE = `https://${SMUGMUG_API_HOST}/api/v2`;\n\nexport const SMUGMUG_OAUTH_ENDPOINTS = {\n requestToken: \"https://api.smugmug.com/services/oauth/1.0a/getRequestToken\",\n authorize: \"https://api.smugmug.com/services/oauth/1.0a/authorize\",\n accessToken: \"https://api.smugmug.com/services/oauth/1.0a/getAccessToken\",\n} as const;\n\nexport const smugMugCredentialsSchema = z.object({\n consumerKey: z.string().min(1),\n consumerSecret: z.string().min(1),\n accessToken: z.string().min(1),\n accessTokenSecret: z.string().min(1),\n});\n\nexport type SmugMugCredentials = z.infer<typeof smugMugCredentialsSchema>;\n\nexport const smugMugClientOptionsSchema = z.object({\n credentials: smugMugCredentialsSchema,\n pageSize: z.number().int().min(1).max(500).default(100),\n maxRetries: z.number().int().min(0).max(10).default(3),\n retryBaseDelayMs: z.number().int().min(0).default(500),\n maxRetryDelayMs: z.number().int().min(0).default(8000),\n requestIntervalMs: z.number().int().min(0).default(200),\n fetchImpl: z.custom<typeof fetch>().optional(),\n});\n\nexport type SmugMugClientOptions = z.input<typeof smugMugClientOptionsSchema>;\n\nconst ALBUM_IMAGES_CONFIG = {\n expand: {\n AlbumImage: {\n expand: {\n Image: {\n filter: [\"FileName\", \"Caption\", \"KeywordsArray\"],\n filteruri: [\"ImageMetadata\", \"ImageSizeDetails\"],\n expand: {\n ImageMetadata: {\n filter: [\"ISO\", \"Aperture\", \"ApertureValue\", \"ShutterSpeed\", \"ExposureTime\", \"FocalLength\"],\n },\n ImageSizeDetails: {\n filter: [\"OriginalImageUrl\"],\n },\n },\n },\n },\n },\n },\n};\n\ninterface SmugMugPages {\n Total?: number;\n Start?: number;\n Count?: number;\n NextPage?: string;\n}\n\ninterface SmugMugApiEnvelope<T> {\n Response: T & { Pages?: SmugMugPages; Uri?: string };\n Code: number;\n Message: string;\n}\n\ninterface SmugMugUserWire {\n NickName?: string;\n Uri: string;\n Uris: { Node: string };\n}\n\ninterface SmugMugNodeWire {\n NodeID: string;\n Type: \"Folder\" | \"Album\" | \"Page\" | string;\n Name: string;\n Description?: string;\n UrlName?: string;\n WebUri?: string;\n Uri: string;\n Uris?: { Album?: string; ChildNodes?: string };\n}\n\ninterface SmugMugImageMetadataWire {\n ISO?: number | string;\n Aperture?: number | string;\n ApertureValue?: number | string;\n ShutterSpeed?: string;\n ExposureTime?: string;\n FocalLength?: number | string;\n}\n\ninterface SmugMugImageWire {\n FileName?: string;\n Caption?: string;\n KeywordsArray?: string[];\n ImageMetadata?: SmugMugImageMetadataWire;\n ImageSizeDetails?: { OriginalImageUrl?: string };\n}\n\ninterface SmugMugAlbumImageWire {\n ImageKey: string;\n Caption?: string;\n FileName?: string;\n WebUri?: string;\n Image?: SmugMugImageWire;\n LargestImage?: { Url?: string };\n ImageMetadata?: SmugMugImageMetadataWire;\n}\n\n/** RFC 3986 encoding used by OAuth 1.0a parameter normalization. */\nexport function oauthPercentEncode(value: string): string {\n return encodeURIComponent(value).replace(/[!'()*]/g, (char) =>\n `%${char.charCodeAt(0).toString(16).toUpperCase()}`,\n );\n}\n\nfunction normalizeRequestUrl(url: URL): string {\n const protocol = url.protocol.replace(/:$/, \"\").toLowerCase();\n const host = url.hostname.toLowerCase();\n const defaultPort = protocol === \"http\" ? \"80\" : \"443\";\n const port = url.port && url.port !== defaultPort ? `:${url.port}` : \"\";\n return `${protocol}://${host}${port}${url.pathname}`;\n}\n\nfunction sortedParameterString(params: Record<string, string>): string {\n return Object.keys(params)\n .sort((a, b) => (a === b ? 0 : a < b ? -1 : 1))\n .map((key) => `${oauthPercentEncode(key)}=${oauthPercentEncode(params[key]!)}`)\n .join(\"&\");\n}\n\nfunction collectSignatureParams(\n url: URL,\n oauthParams: Record<string, string>,\n bodyParams?: Record<string, string>,\n): Record<string, string> {\n const params: Record<string, string> = { ...oauthParams };\n url.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n if (bodyParams) {\n for (const [key, value] of Object.entries(bodyParams)) {\n params[key] = value;\n }\n }\n return params;\n}\n\n/** Build OAuth 1.0a HMAC-SHA1 signature for a SmugMug API request. */\nexport function signSmugMugOAuthRequest(input: {\n method: string;\n url: string;\n credentials: SmugMugCredentials;\n oauthParams: Record<string, string>;\n bodyParams?: Record<string, string>;\n}): string {\n const url = new URL(input.url);\n const parameterString = sortedParameterString(\n collectSignatureParams(url, input.oauthParams, input.bodyParams),\n );\n const signatureBase = [\n input.method.toUpperCase(),\n oauthPercentEncode(normalizeRequestUrl(url)),\n oauthPercentEncode(parameterString),\n ].join(\"&\");\n const signingKey = `${oauthPercentEncode(input.credentials.consumerSecret)}&${oauthPercentEncode(input.credentials.accessTokenSecret)}`;\n return createHmac(\"sha1\", signingKey).update(signatureBase).digest(\"base64\");\n}\n\nfunction buildOAuthParams(credentials: SmugMugCredentials, nonce: string, timestamp: string) {\n return {\n oauth_consumer_key: credentials.consumerKey,\n oauth_token: credentials.accessToken,\n oauth_signature_method: \"HMAC-SHA1\",\n oauth_timestamp: timestamp,\n oauth_nonce: nonce,\n oauth_version: \"1.0\",\n };\n}\n\nexport function buildSmugMugAuthorizationHeader(input: {\n method: string;\n url: string;\n credentials: SmugMugCredentials;\n nonce?: string;\n timestamp?: string;\n bodyParams?: Record<string, string>;\n}): string {\n const nonce = input.nonce ?? randomBytes(16).toString(\"hex\");\n const timestamp = input.timestamp ?? String(Math.floor(Date.now() / 1000));\n const oauthParams = buildOAuthParams(input.credentials, nonce, timestamp);\n const signature = signSmugMugOAuthRequest({\n method: input.method,\n url: input.url,\n credentials: input.credentials,\n oauthParams,\n bodyParams: input.bodyParams,\n });\n const headerParams = { ...oauthParams, oauth_signature: signature };\n const headerValue = Object.keys(headerParams)\n .sort()\n .map((key) => `${oauthPercentEncode(key)}=\"${oauthPercentEncode(headerParams[key as keyof typeof headerParams]!)}\"`)\n .join(\", \");\n return `OAuth ${headerValue}`;\n}\n\nexport function readSmugMugCredentialsFromEnv(\n env: Record<string, string | undefined> = process.env,\n): SmugMugCredentials {\n return smugMugCredentialsSchema.parse({\n consumerKey: env.SMUGMUG_CONSUMER_KEY,\n consumerSecret: env.SMUGMUG_CONSUMER_SECRET,\n accessToken: env.SMUGMUG_ACCESS_TOKEN,\n accessTokenSecret: env.SMUGMUG_ACCESS_TOKEN_SECRET,\n });\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction albumKeyFromUri(uri: string): string {\n const match = uri.match(/\\/album\\/([^/?!]+)/i);\n if (!match?.[1]) {\n throw new Error(`Unable to parse album key from URI: ${uri}`);\n }\n return match[1];\n}\n\nfunction nodeIdFromUri(uri: string): string {\n const match = uri.match(/\\/node\\/([^/?!]+)/i);\n if (!match?.[1]) {\n throw new Error(`Unable to parse node id from URI: ${uri}`);\n }\n return match[1];\n}\n\nfunction mapAlbumImage(\n albumImage: SmugMugAlbumImageWire,\n portfolioSourceId: string,\n sort: number,\n): SmugMugFlatImage {\n const image = albumImage.Image;\n const metadata = image?.ImageMetadata ?? albumImage.ImageMetadata;\n const originalUrl =\n image?.ImageSizeDetails?.OriginalImageUrl ?? albumImage.LargestImage?.Url ?? albumImage.WebUri;\n const fileName = image?.FileName ?? albumImage.FileName;\n return {\n sourceId: albumImage.ImageKey,\n portfolioSourceId,\n sort,\n fileName,\n originalUrl,\n caption: albumImage.Caption ?? image?.Caption,\n keywords: image?.KeywordsArray?.length ? image.KeywordsArray : undefined,\n exif: metadata\n ? {\n iso: metadata.ISO,\n aperture: metadata.Aperture ?? metadata.ApertureValue,\n shutter: metadata.ShutterSpeed ?? metadata.ExposureTime,\n focalLength: metadata.FocalLength,\n }\n : undefined,\n };\n}\n\n/** Signed SmugMug API client — recursively discovers folders, albums, and images. */\nexport class SmugMugApiClient {\n readonly credentials: SmugMugCredentials;\n readonly pageSize: number;\n readonly maxRetries: number;\n readonly retryBaseDelayMs: number;\n readonly maxRetryDelayMs: number;\n readonly requestIntervalMs: number;\n readonly fetchImpl: typeof fetch;\n\n private lastRequestAt = 0;\n\n constructor(options: SmugMugClientOptions) {\n const parsed = smugMugClientOptionsSchema.parse(options);\n this.credentials = parsed.credentials;\n this.pageSize = parsed.pageSize;\n this.maxRetries = parsed.maxRetries;\n this.retryBaseDelayMs = parsed.retryBaseDelayMs;\n this.maxRetryDelayMs = parsed.maxRetryDelayMs;\n this.requestIntervalMs = parsed.requestIntervalMs;\n this.fetchImpl = parsed.fetchImpl ?? fetch;\n }\n\n /** Validate credentials against `GET /user/!authuser`. */\n async validateCredentials(): Promise<{ nick?: string; rootNodeUri: string }> {\n const user = await this.getAuthUser();\n return { nick: user.NickName, rootNodeUri: user.Uris.Node };\n }\n\n /** Crawl the authenticated user's node tree into flat export tables for `parse-node.ts`. */\n async crawlExport(): Promise<SmugMugFlatExport> {\n const user = await this.getAuthUser();\n const folders: SmugMugFlatFolder[] = [];\n const albums: SmugMugFlatAlbum[] = [];\n const images: SmugMugFlatImage[] = [];\n\n await this.walkNode(user.Uris.Node, undefined, folders, albums, images);\n\n return {\n exportVersion: 1,\n exportedAt: new Date().toISOString(),\n Folders: folders,\n Albums: albums,\n Images: images,\n };\n }\n\n private async getAuthUser(): Promise<SmugMugUserWire> {\n const envelope = await this.requestJson<SmugMugUserWire>(`${SMUGMUG_API_BASE}/user/!authuser`);\n return envelope.Response;\n }\n\n private async walkNode(\n nodeUri: string,\n parentFolderId: string | undefined,\n folders: SmugMugFlatFolder[],\n albums: SmugMugFlatAlbum[],\n images: SmugMugFlatImage[],\n ): Promise<void> {\n const childrenPath = `${nodeUri}!children`;\n for await (const child of this.paginateNodes(childrenPath)) {\n if (child.Type === \"Page\") continue;\n\n if (child.Type === \"Folder\") {\n folders.push({\n sourceId: child.NodeID,\n name: child.Name,\n parentSourceId: parentFolderId,\n slug: child.UrlName,\n description: child.Description,\n });\n await this.walkNode(child.Uri, child.NodeID, folders, albums, images);\n continue;\n }\n\n if (child.Type === \"Album\") {\n albums.push({\n sourceId: child.NodeID,\n name: child.Name,\n parentSourceId: parentFolderId,\n slug: child.UrlName,\n description: child.Description,\n url: child.WebUri,\n });\n const albumUri = child.Uris?.Album;\n if (albumUri) {\n await this.collectAlbumImages(albumUri, child.NodeID, images);\n }\n }\n }\n }\n\n private async collectAlbumImages(\n albumUri: string,\n portfolioSourceId: string,\n images: SmugMugFlatImage[],\n ): Promise<void> {\n const albumKey = albumKeyFromUri(albumUri);\n const configQuery = `_config=${encodeURIComponent(JSON.stringify(ALBUM_IMAGES_CONFIG))}`;\n const initialPath = `${SMUGMUG_API_BASE}/album/${albumKey}!images?${configQuery}`;\n\n let sort = 0;\n for await (const albumImage of this.paginateAlbumImages(initialPath)) {\n images.push(mapAlbumImage(albumImage, portfolioSourceId, sort));\n sort += 1;\n }\n }\n\n private async *paginateNodes(path: string): AsyncGenerator<SmugMugNodeWire> {\n for await (const page of this.paginate<{ Node?: SmugMugNodeWire[] }>(path)) {\n for (const node of page.Node ?? []) {\n yield node;\n }\n }\n }\n\n private async *paginateAlbumImages(path: string): AsyncGenerator<SmugMugAlbumImageWire> {\n for await (const page of this.paginate<{ AlbumImage?: SmugMugAlbumImageWire[] }>(path)) {\n for (const albumImage of page.AlbumImage ?? []) {\n yield albumImage;\n }\n }\n }\n\n private async *paginate<T extends Record<string, unknown>>(\n initialPath: string,\n ): AsyncGenerator<T> {\n let nextPath: string | undefined = appendPagination(initialPath, this.pageSize, 1);\n while (nextPath) {\n const envelope: SmugMugApiEnvelope<T> = await this.requestJson<T>(nextPath);\n yield envelope.Response;\n nextPath = envelope.Response.Pages?.NextPage;\n }\n }\n\n private async requestJson<T>(pathOrUrl: string): Promise<SmugMugApiEnvelope<T>> {\n const url = toAbsoluteUrl(pathOrUrl);\n const response = await this.requestWithRetry(url);\n const body = (await response.json()) as SmugMugApiEnvelope<T>;\n if (body.Code !== 200) {\n throw new Error(`SmugMug API error ${body.Code}: ${body.Message}`);\n }\n return body;\n }\n\n private async requestWithRetry(url: URL): Promise<Response> {\n let attempt = 0;\n while (true) {\n await this.throttle();\n const authorization = buildSmugMugAuthorizationHeader({\n method: \"GET\",\n url: url.toString(),\n credentials: this.credentials,\n });\n const response = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n Authorization: authorization,\n },\n });\n\n if (response.ok) {\n return response;\n }\n\n const retryable = response.status === 429 || response.status >= 500;\n if (!retryable || attempt >= this.maxRetries) {\n const detail = await response.text().catch(() => \"\");\n throw new Error(\n `SmugMug HTTP ${response.status}${detail ? `: ${detail.slice(0, 200)}` : \"\"}`,\n );\n }\n\n const retryAfter = Number.parseInt(response.headers.get(\"retry-after\") ?? \"\", 10);\n const delay = Number.isFinite(retryAfter)\n ? retryAfter * 1000\n : Math.min(this.maxRetryDelayMs, this.retryBaseDelayMs * 2 ** attempt);\n await sleep(delay);\n attempt += 1;\n }\n }\n\n private async throttle(): Promise<void> {\n if (this.requestIntervalMs <= 0) return;\n const elapsed = Date.now() - this.lastRequestAt;\n if (elapsed < this.requestIntervalMs) {\n await sleep(this.requestIntervalMs - elapsed);\n }\n this.lastRequestAt = Date.now();\n }\n}\n\nfunction toAbsoluteUrl(pathOrUrl: string): URL {\n if (pathOrUrl.startsWith(\"http://\") || pathOrUrl.startsWith(\"https://\")) {\n return new URL(pathOrUrl);\n }\n if (pathOrUrl.startsWith(\"/\")) {\n return new URL(`https://${SMUGMUG_API_HOST}${pathOrUrl}`);\n }\n return new URL(pathOrUrl);\n}\n\nfunction appendPagination(pathOrUrl: string, count: number, start: number): string {\n const url = toAbsoluteUrl(pathOrUrl);\n url.searchParams.set(\"count\", String(count));\n url.searchParams.set(\"start\", String(start));\n return url.toString();\n}\n\n/** @internal Exported for crawl tests — resolves root node id from user node URI. */\nexport function smugMugRootNodeIdFromUserNodeUri(nodeUri: string): string {\n return nodeIdFromUri(nodeUri);\n}\n","import { readFile } from \"node:fs/promises\";\n\nimport { sanitizeSlug } from \"../../lib/utility.js\";\nimport type {\n NormalizedAsset,\n NormalizedAssetExif,\n NormalizedEntity,\n NormalizedPortfolio,\n SourceMetadata,\n} from \"../../normalizer/types.js\";\nimport { SmugMugApiClient, type SmugMugClientOptions, type SmugMugCredentials } from \"./api.js\";\nimport type {\n SmugMugExportDocument,\n SmugMugFlatExport,\n SmugMugFlatImage,\n SmugMugMockAlbum,\n SmugMugMockExport,\n SmugMugMockFolder,\n} from \"./types.js\";\n\nconst PLATFORM = \"smugmug\" as const;\nconst UNRESOLVED_URL_PREFIX = \"unspecified://smugmug/\";\n\nexport interface SmugMugParseOptions {\n filePath?: string;\n data?: SmugMugExportDocument;\n /** Pre-constructed signed API client (live crawl). */\n client?: SmugMugApiClient;\n /** OAuth credentials — builds a client when `client` is omitted. */\n credentials?: SmugMugCredentials;\n /** Optional tuning for credential-backed client. */\n clientOptions?: Omit<SmugMugClientOptions, \"credentials\">;\n}\n\nfunction sourceMeta(id: string, url?: string, exportedAt?: string): SourceMetadata {\n return {\n platform: PLATFORM,\n id,\n url,\n exportedAt,\n };\n}\n\nfunction guessMime(filename: string): string | undefined {\n const ext = filename.split(\".\").pop()?.toLowerCase();\n const map: Record<string, string> = {\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n tif: \"image/tiff\",\n tiff: \"image/tiff\",\n };\n return ext ? map[ext] : undefined;\n}\n\nfunction parseExifNumber(value: number | string | undefined): number | undefined {\n if (value === undefined) return undefined;\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n const parsed = Number.parseFloat(String(value).replace(/[^0-9.]/g, \"\"));\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction normalizeExif(\n exif: SmugMugFlatImage[\"exif\"] | SmugMugMockAlbum[\"images\"][0][\"exif\"],\n): NormalizedAssetExif | undefined {\n if (!exif || Object.keys(exif).length === 0) return undefined;\n const normalized: NormalizedAssetExif = {\n iso: parseExifNumber(exif.iso),\n aperture: parseExifNumber(exif.aperture),\n shutter: exif.shutter,\n focalLength: parseExifNumber(exif.focalLength),\n };\n if (\n normalized.iso === undefined &&\n normalized.aperture === undefined &&\n !normalized.shutter &&\n normalized.focalLength === undefined\n ) {\n return undefined;\n }\n return normalized;\n}\n\nexport function isSmugMugFlatExport(value: unknown): value is SmugMugFlatExport {\n if (!value || typeof value !== \"object\") return false;\n const record = value as SmugMugFlatExport;\n const version = record.exportVersion;\n return (\n (version === 1 || version === \"1\") &&\n Array.isArray(record.Folders) &&\n Array.isArray(record.Albums) &&\n Array.isArray(record.Images)\n );\n}\n\nfunction isSmugMugNestedExport(value: unknown): value is SmugMugMockExport {\n if (!value || typeof value !== \"object\") return false;\n const record = value as SmugMugMockExport;\n const version = record.exportVersion;\n return (version === 1 || version === \"1\") && Array.isArray(record.folders);\n}\n\nexport async function loadSmugMugExport(options: SmugMugParseOptions): Promise<SmugMugExportDocument> {\n if (options.data) return options.data;\n if (!options.filePath) {\n throw new Error(\"SmugMug parser requires filePath or data\");\n }\n const raw: unknown = JSON.parse(await readFile(options.filePath, \"utf8\"));\n if (isSmugMugFlatExport(raw) || isSmugMugNestedExport(raw)) {\n return raw;\n }\n throw new Error(\n \"Invalid SmugMug export: expected exportVersion 1 with folders[] (nested) or Folders/Albums/Images (flat)\",\n );\n}\n\nfunction resolveAssetUrl(image: SmugMugFlatImage): string {\n if (image.originalUrl) return image.originalUrl;\n return `${UNRESOLVED_URL_PREFIX}${image.sourceId}`;\n}\n\nfunction resolveFilename(image: SmugMugFlatImage): string {\n if (image.fileName) return image.fileName;\n return `${image.sourceId}.jpg`;\n}\n\nfunction* emitNestedFolderPortfolio(\n folder: SmugMugMockFolder,\n exportedAt?: string,\n): Generator<NormalizedPortfolio> {\n yield {\n type: \"portfolio\",\n source: sourceMeta(folder.id, undefined, exportedAt),\n sourceId: folder.id,\n title: folder.name,\n slug: sanitizeSlug(folder.slug ?? folder.name),\n description: folder.description,\n };\n}\n\nfunction* emitNestedAlbumPortfolio(\n folder: SmugMugMockFolder,\n album: SmugMugMockAlbum,\n exportedAt?: string,\n): Generator<NormalizedPortfolio> {\n yield {\n type: \"portfolio\",\n source: sourceMeta(album.id, album.url, exportedAt),\n sourceId: album.id,\n title: album.name,\n slug: sanitizeSlug(album.slug ?? album.name),\n description: album.description,\n parentSourceId: folder.id,\n };\n}\n\nfunction* emitNestedAlbumAssets(\n album: SmugMugMockAlbum,\n exportedAt?: string,\n): Generator<NormalizedAsset> {\n for (let index = 0; index < album.images.length; index++) {\n const image = album.images[index]!;\n yield {\n type: \"asset\",\n source: sourceMeta(image.id, image.originalUrl, exportedAt),\n sourceId: image.id,\n sourceUrl: image.originalUrl,\n filename: image.fileName,\n mimeType: guessMime(image.fileName),\n caption: image.caption,\n keywords: image.keywords?.length ? image.keywords : undefined,\n exif: normalizeExif(image.exif),\n portfolioSourceId: album.id,\n sort: index,\n };\n }\n}\n\nasync function* enumerateNestedExport(\n doc: SmugMugMockExport,\n): AsyncGenerator<NormalizedEntity> {\n const exportedAt = doc.exportedAt;\n for (const folder of doc.folders) {\n yield* emitNestedFolderPortfolio(folder, exportedAt);\n for (const album of folder.albums) {\n yield* emitNestedAlbumPortfolio(folder, album, exportedAt);\n yield* emitNestedAlbumAssets(album, exportedAt);\n }\n }\n}\n\nasync function* enumerateFlatExport(doc: SmugMugFlatExport): AsyncGenerator<NormalizedEntity> {\n const exportedAt = doc.exportedAt;\n\n for (const folder of doc.Folders) {\n yield {\n type: \"portfolio\",\n source: sourceMeta(folder.sourceId, undefined, exportedAt),\n sourceId: folder.sourceId,\n title: folder.name,\n slug: sanitizeSlug(folder.slug ?? folder.name),\n description: folder.description,\n parentSourceId: folder.parentSourceId,\n } satisfies NormalizedPortfolio;\n }\n\n for (const album of doc.Albums) {\n yield {\n type: \"portfolio\",\n source: sourceMeta(album.sourceId, album.url, exportedAt),\n sourceId: album.sourceId,\n title: album.name,\n slug: sanitizeSlug(album.slug ?? album.name),\n description: album.description,\n parentSourceId: album.parentSourceId,\n } satisfies NormalizedPortfolio;\n }\n\n for (const image of doc.Images) {\n const filename = resolveFilename(image);\n yield {\n type: \"asset\",\n source: sourceMeta(image.sourceId, image.originalUrl, exportedAt),\n sourceId: image.sourceId,\n sourceUrl: resolveAssetUrl(image),\n filename,\n mimeType: guessMime(filename),\n caption: image.caption,\n keywords: image.keywords?.length ? image.keywords : undefined,\n exif: normalizeExif(image.exif),\n portfolioSourceId: image.portfolioSourceId,\n sort: image.sort ?? 0,\n } satisfies NormalizedAsset;\n }\n}\n\nasync function resolveSmugMugDocument(options: SmugMugParseOptions): Promise<SmugMugExportDocument> {\n if (options.data) return options.data;\n if (options.client) return options.client.crawlExport();\n if (options.credentials) {\n const client = new SmugMugApiClient({ credentials: options.credentials, ...options.clientOptions });\n return client.crawlExport();\n }\n return loadSmugMugExport(options);\n}\n\n/** Walk discovered SmugMug nodes — fixture JSON or live API crawl via injected credentials. */\nexport async function* enumerateSmugMugEntities(\n options: SmugMugParseOptions,\n): AsyncGenerator<NormalizedEntity> {\n const doc = await resolveSmugMugDocument(options);\n if (isSmugMugFlatExport(doc)) {\n yield* enumerateFlatExport(doc);\n return;\n }\n yield* enumerateNestedExport(doc);\n}\n\nexport function summarizeSmugMugExport(doc: SmugMugExportDocument): {\n folders: number;\n albums: number;\n assets: number;\n portfolios: number;\n} {\n if (isSmugMugFlatExport(doc)) {\n return {\n folders: doc.Folders.length,\n albums: doc.Albums.length,\n assets: doc.Images.length,\n portfolios: doc.Folders.length + doc.Albums.length,\n };\n }\n\n const folders = doc.folders.length;\n let albums = 0;\n let assets = 0;\n for (const folder of doc.folders) {\n albums += folder.albums.length;\n for (const album of folder.albums) {\n assets += album.images.length;\n }\n }\n return {\n folders,\n albums,\n assets,\n portfolios: folders + albums,\n };\n}\n\nexport async function validateSmugMugExportFile(filePath: string): Promise<{\n ok: boolean;\n issues: { code: string; message: string }[];\n summary: Record<string, number>;\n}> {\n const issues: { code: string; message: string }[] = [];\n let doc: SmugMugExportDocument;\n try {\n doc = await loadSmugMugExport({ filePath });\n } catch (error) {\n return {\n ok: false,\n issues: [\n {\n code: \"invalid_export\",\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n summary: {},\n };\n }\n\n if (isSmugMugFlatExport(doc)) {\n if (doc.Folders.length === 0 && doc.Albums.length === 0) {\n issues.push({ code: \"empty_export\", message: \"No folders or albums in export\" });\n }\n } else if (doc.folders.length === 0) {\n issues.push({ code: \"empty_export\", message: \"No folders in export\" });\n }\n\n const summary = summarizeSmugMugExport(doc);\n return {\n ok: issues.length === 0,\n issues,\n summary: {\n portfolios: summary.portfolios,\n assets: summary.assets,\n categories: summary.folders,\n posts: 0,\n pages: 0,\n tags: 0,\n },\n };\n}\n\n/** @deprecated Use validateSmugMugExportFile */\nexport const validateSmugMugMockFile = validateSmugMugExportFile;\n","import type { AdapterContext, MigrationAdapter, ValidationResult } from \"../../normalizer/types.js\";\nimport type { SmugMugClientOptions } from \"./api.js\";\nimport {\n SmugMugApiClient,\n readSmugMugCredentialsFromEnv,\n smugMugCredentialsSchema,\n} from \"./api.js\";\nimport {\n enumerateSmugMugEntities,\n summarizeSmugMugExport,\n validateSmugMugExportFile,\n} from \"./parse-node.js\";\nimport type { SmugMugExportDocument } from \"./types.js\";\n\ninterface SmugMugParseInput {\n path?: string;\n data?: SmugMugExportDocument;\n credentials?: ReturnType<typeof smugMugCredentialsSchema.parse>;\n client?: SmugMugApiClient;\n clientOptions?: Omit<SmugMugClientOptions, \"credentials\">;\n /** When true, read SMUGMUG_* env vars for live API crawl (no file path required). */\n live?: boolean;\n}\n\nfunction resolveInput(input: unknown): SmugMugParseInput {\n if (typeof input === \"string\") return { path: input };\n if (input && typeof input === \"object\") {\n const record = input as SmugMugParseInput;\n if (record.client || record.credentials || record.live) return record;\n if (record.data) return { data: record.data };\n if (record.path) return { path: record.path };\n }\n throw new Error(\n \"SmugMug adapter requires input path (string or { path }), { data }, { credentials }, { client }, or { live: true }\",\n );\n}\n\nfunction resolveLiveCredentials(input: SmugMugParseInput) {\n if (input.credentials) return input.credentials;\n if (input.live) return readSmugMugCredentialsFromEnv();\n return undefined;\n}\n\nexport const smugmugAdapter: MigrationAdapter = {\n platform: \"smugmug\",\n\n async validateInput(input: unknown): Promise<ValidationResult> {\n try {\n const resolved = resolveInput(input);\n const credentials = resolveLiveCredentials(resolved);\n\n if (resolved.data) {\n const summary = summarizeSmugMugExport(resolved.data);\n return {\n ok: true,\n issues: [],\n summary: {\n portfolios: summary.portfolios,\n assets: summary.assets,\n categories: summary.folders,\n posts: 0,\n pages: 0,\n tags: 0,\n },\n };\n }\n\n if (resolved.client || credentials) {\n const client =\n resolved.client ??\n new SmugMugApiClient({ credentials: credentials!, ...resolved.clientOptions });\n await client.validateCredentials();\n const doc = await client.crawlExport();\n const summary = summarizeSmugMugExport(doc);\n return {\n ok: true,\n issues: [],\n summary: {\n portfolios: summary.portfolios,\n assets: summary.assets,\n categories: summary.folders,\n posts: 0,\n pages: 0,\n tags: 0,\n },\n };\n }\n\n const result = await validateSmugMugExportFile(resolved.path!);\n return {\n ok: result.ok,\n issues: result.issues,\n summary: result.summary,\n };\n } catch (error) {\n return {\n ok: false,\n issues: [\n {\n code: \"invalid_input\",\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n },\n\n enumerateEntities(ctx: AdapterContext) {\n const resolved = resolveInput(ctx.input);\n const credentials = resolveLiveCredentials(resolved);\n return enumerateSmugMugEntities({\n filePath: resolved.path,\n data: resolved.data,\n client: resolved.client,\n credentials,\n clientOptions: resolved.clientOptions,\n });\n },\n};\n\nexport type { SmugMugExportDocument, SmugMugFlatExport, SmugMugMockExport } from \"./types.js\";\nexport {\n SmugMugApiClient,\n SMUGMUG_API_BASE,\n SMUGMUG_OAUTH_ENDPOINTS,\n buildSmugMugAuthorizationHeader,\n oauthPercentEncode,\n readSmugMugCredentialsFromEnv,\n signSmugMugOAuthRequest,\n smugMugCredentialsSchema,\n} from \"./api.js\";\nexport type { SmugMugClientOptions, SmugMugCredentials } from \"./api.js\";\nexport {\n enumerateSmugMugEntities,\n isSmugMugFlatExport,\n loadSmugMugExport,\n summarizeSmugMugExport,\n validateSmugMugExportFile,\n validateSmugMugMockFile,\n} from \"./parse-node.js\";\n","import type { AdapterContext, MigrationAdapter, ValidationResult } from \"../../normalizer/types.js\";\nimport {\n SquarespaceCollectionClient,\n type SquarespaceClientOptions,\n type SquarespaceCollectTarget,\n} from \"./collect.js\";\nimport {\n enumerateSquarespaceEntities,\n summarizeSquarespaceExport,\n validateSquarespaceExportFile,\n} from \"./parse-export.js\";\nimport type { SquarespaceExport } from \"./types.js\";\n\ninterface SquarespaceParseInput {\n path?: string;\n data?: SquarespaceExport;\n client?: SquarespaceCollectionClient;\n collectTargets?: SquarespaceCollectTarget[];\n clientOptions?: SquarespaceClientOptions;\n}\n\nfunction resolveInput(input: unknown): SquarespaceParseInput {\n if (typeof input === \"string\") return { path: input };\n if (input && typeof input === \"object\") {\n const record = input as SquarespaceParseInput;\n if (record.client || record.collectTargets) return record;\n if (record.data) return { data: record.data };\n if (record.path) return { path: record.path };\n }\n throw new Error(\n \"Squarespace adapter requires input path (string or { path }), { data }, { client, collectTargets }, or { collectTargets }\",\n );\n}\n\nexport const squarespaceAdapter: MigrationAdapter = {\n platform: \"squarespace\",\n\n async validateInput(input: unknown): Promise<ValidationResult> {\n try {\n const resolved = resolveInput(input);\n\n if (resolved.data) {\n const summary = summarizeSquarespaceExport(resolved.data);\n return {\n ok: true,\n issues: [],\n summary: {\n pages: summary.pages,\n posts: summary.posts,\n categories: summary.categories,\n tags: summary.tags,\n },\n };\n }\n\n if (resolved.client || resolved.collectTargets?.length) {\n if (!resolved.collectTargets?.length) {\n throw new Error(\"Squarespace live validation requires collectTargets\");\n }\n const client =\n resolved.client ?? new SquarespaceCollectionClient(resolved.clientOptions);\n const doc = await client.collectExport(resolved.collectTargets);\n const summary = summarizeSquarespaceExport(doc);\n return {\n ok: true,\n issues: [],\n summary: {\n pages: summary.pages,\n posts: summary.posts,\n categories: summary.categories,\n tags: summary.tags,\n },\n };\n }\n\n const result = await validateSquarespaceExportFile(resolved.path!);\n return {\n ok: result.ok,\n issues: result.issues,\n summary: result.summary,\n };\n } catch (error) {\n return {\n ok: false,\n issues: [\n {\n code: \"invalid_input\",\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n },\n\n enumerateEntities(ctx: AdapterContext) {\n const resolved = resolveInput(ctx.input);\n return enumerateSquarespaceEntities({\n filePath: resolved.path,\n data: resolved.data,\n client: resolved.client,\n collectTargets: resolved.collectTargets,\n clientOptions: resolved.clientOptions,\n });\n },\n};\n\nexport type { SquarespaceExport } from \"./types.js\";\nexport {\n SQUARESPACE_JSON_FORMAT,\n SquarespaceCollectionClient,\n buildJsonPrettyUrl,\n extractBlocksFromBodyHtml,\n inferBlockTypeFromClassName,\n mapJsonPrettyWire,\n mergeSquarespaceExportPartials,\n squarespaceClientOptionsSchema,\n} from \"./collect.js\";\nexport type { SquarespaceClientOptions, SquarespaceCollectTarget } from \"./collect.js\";\nexport {\n SUPPORTED_BLOCK_TYPES,\n UNSUPPORTED_BLOCK_TYPES,\n enumerateSquarespaceEntities,\n findUnsupportedBlockMarkers,\n flattenSquarespaceBlock,\n flattenSquarespaceBlocks,\n isSquarespaceExport,\n loadSquarespaceExport,\n summarizeSquarespaceExport,\n validateSquarespaceExportFile,\n} from \"./parse-export.js\";\n","import { z } from \"zod\";\n\nimport { sanitizeSlug } from \"../../lib/utility.js\";\nimport {\n mapWireListCategoriesResponse,\n mapWireListPostsResponse,\n mapWireListTagsResponse,\n} from \"./map-wire.js\";\nimport type { WixCategory, WixExport, WixPost, WixTag } from \"./types.js\";\n\n/** Wix REST API base — raw HTTP only; no `@wix/sdk`. */\nexport const WIX_API_BASE = \"https://www.wixapis.com\";\n\nexport const wixAuthContextSchema = z.object({\n /** Full Authorization header value (API key or Bearer token). */\n authorization: z.string().min(1),\n siteId: z.string().min(1),\n accountId: z.string().optional(),\n extraHeaders: z.record(z.string()).optional(),\n});\n\nexport type WixAuthContext = z.infer<typeof wixAuthContextSchema>;\n\nexport const wixClientOptionsSchema = z.object({\n auth: wixAuthContextSchema,\n pageSize: z.number().int().min(1).max(100).default(50),\n maxRetries: z.number().int().min(0).max(10).default(3),\n retryBaseDelayMs: z.number().int().min(0).default(500),\n maxRetryDelayMs: z.number().int().min(0).default(8000),\n requestIntervalMs: z.number().int().min(0).default(200),\n fetchImpl: z.custom<typeof fetch>().optional(),\n /** Include draft posts when the API key has permission. */\n includeDrafts: z.boolean().default(false),\n});\n\nexport type WixClientOptions = z.input<typeof wixClientOptionsSchema>;\n\ninterface WirePaging {\n count?: number;\n offset?: number;\n total?: number;\n tooManyToCount?: boolean;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction dedupeById<T extends { id: string }>(items: T[]): T[] {\n const seen = new Map<string, T>();\n for (const item of items) seen.set(item.id, item);\n return [...seen.values()];\n}\n\nfunction dedupeBySlug<T extends { slug: string }>(items: T[]): T[] {\n const seen = new Map<string, T>();\n for (const item of items) seen.set(item.slug, item);\n return [...seen.values()];\n}\n\nfunction pagingComplete(items: unknown[], paging: WirePaging | undefined, pageSize: number): boolean {\n if (!Array.isArray(items) || items.length === 0) return true;\n if (items.length < pageSize) return true;\n if (typeof paging?.total === \"number\" && typeof paging.offset === \"number\") {\n return paging.offset + items.length >= paging.total;\n }\n return false;\n}\n\n/** Fetch blog posts, categories, and tags via injected `fetch` + vault auth headers. */\nexport class WixCollectionClient {\n readonly auth: WixAuthContext;\n readonly pageSize: number;\n readonly maxRetries: number;\n readonly retryBaseDelayMs: number;\n readonly maxRetryDelayMs: number;\n readonly requestIntervalMs: number;\n readonly fetchImpl: typeof fetch;\n readonly includeDrafts: boolean;\n\n private lastRequestAt = 0;\n\n constructor(options: WixClientOptions) {\n const parsed = wixClientOptionsSchema.parse(options);\n this.auth = parsed.auth;\n this.pageSize = parsed.pageSize;\n this.maxRetries = parsed.maxRetries;\n this.retryBaseDelayMs = parsed.retryBaseDelayMs;\n this.maxRetryDelayMs = parsed.maxRetryDelayMs;\n this.requestIntervalMs = parsed.requestIntervalMs;\n this.fetchImpl = parsed.fetchImpl ?? fetch;\n this.includeDrafts = parsed.includeDrafts;\n }\n\n buildUrl(path: string, query?: Record<string, string | number | undefined>): string {\n const url = new URL(path.startsWith(\"http\") ? path : `${WIX_API_BASE}${path}`);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) continue;\n url.searchParams.set(key, String(value));\n }\n }\n return url.toString();\n }\n\n async fetchJson<T = unknown>(path: string, query?: Record<string, string | number | undefined>): Promise<T> {\n const response = await this.requestWithRetry(this.buildUrl(path, query));\n return response.json() as Promise<T>;\n }\n\n async listAllCategories(): Promise<WixCategory[]> {\n const categories: WixCategory[] = [];\n let offset = 0;\n\n while (true) {\n const wire = await this.fetchJson(\"/blog/v3/categories\", {\n \"paging.limit\": this.pageSize,\n \"paging.offset\": offset,\n fieldsets: \"URL\",\n });\n const batch = mapWireListCategoriesResponse(wire);\n categories.push(...batch);\n\n const paging = (wire as { pagingMetadata?: WirePaging }).pagingMetadata;\n if (pagingComplete(batch, paging, this.pageSize)) break;\n offset += batch.length;\n if (batch.length === 0) break;\n }\n\n return dedupeBySlug(categories);\n }\n\n async listAllTags(): Promise<WixTag[]> {\n const tags: WixTag[] = [];\n let offset = 0;\n\n while (true) {\n const wire = await this.fetchJson(\"/blog/v3/tags\", {\n \"paging.limit\": this.pageSize,\n \"paging.offset\": offset,\n });\n const batch = mapWireListTagsResponse(wire);\n tags.push(...batch);\n\n const paging = (wire as { pagingMetadata?: WirePaging }).pagingMetadata;\n if (pagingComplete(batch, paging, this.pageSize)) break;\n offset += batch.length;\n if (batch.length === 0) break;\n }\n\n return dedupeBySlug(tags);\n }\n\n async listAllPosts(lookup: {\n categorySlugsById: Map<string, string>;\n tagSlugsById: Map<string, string>;\n }): Promise<WixPost[]> {\n const posts: WixPost[] = [];\n let offset = 0;\n\n while (true) {\n const wire = await this.fetchJson(\"/blog/v3/posts\", {\n \"paging.limit\": this.pageSize,\n \"paging.offset\": offset,\n fieldsets: \"URL,RICH_CONTENT,SEO\",\n sort: \"PUBLISHED_DATE_DESC\",\n });\n const batch = mapWireListPostsResponse(wire, lookup);\n posts.push(...batch);\n\n const paging = (wire as { pagingMetadata?: WirePaging }).pagingMetadata;\n if (pagingComplete(batch, paging, this.pageSize)) break;\n offset += batch.length;\n if (batch.length === 0) break;\n }\n\n if (this.includeDrafts) {\n posts.push(...(await this.listDraftPosts(lookup)));\n }\n\n return dedupeById(posts);\n }\n\n private async listDraftPosts(lookup: {\n categorySlugsById: Map<string, string>;\n tagSlugsById: Map<string, string>;\n }): Promise<WixPost[]> {\n const posts: WixPost[] = [];\n let offset = 0;\n\n while (true) {\n const wire = await this.fetchJson(\"/blog/v3/draft-posts\", {\n \"paging.limit\": this.pageSize,\n \"paging.offset\": offset,\n fieldsets: \"URL,RICH_CONTENT,SEO\",\n });\n const batch = mapWireListPostsResponse(\n { posts: (wire as { draftPosts?: unknown[] }).draftPosts ?? [] },\n lookup,\n ).map((post) => ({ ...post, status: \"draft\" as const }));\n posts.push(...batch);\n\n const paging = (wire as { pagingMetadata?: WirePaging }).pagingMetadata;\n if (pagingComplete(batch, paging, this.pageSize)) break;\n offset += batch.length;\n if (batch.length === 0) break;\n }\n\n return posts;\n }\n\n async collectExport(): Promise<WixExport> {\n const categories = await this.listAllCategories();\n const tags = await this.listAllTags();\n\n const categorySlugsById = new Map(categories.map((category) => [category.id, category.slug]));\n const tagSlugsById = new Map(tags.map((tag) => [tag.id, tag.slug]));\n\n const posts = await this.listAllPosts({ categorySlugsById, tagSlugsById });\n\n return {\n exportVersion: 1,\n exportedAt: new Date().toISOString(),\n site: { siteId: this.auth.siteId },\n posts,\n pages: [],\n categories,\n tags,\n };\n }\n\n private buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n Authorization: this.auth.authorization,\n \"wix-site-id\": this.auth.siteId,\n ...(this.auth.extraHeaders ?? {}),\n };\n if (this.auth.accountId) {\n headers[\"wix-account-id\"] = this.auth.accountId;\n }\n return headers;\n }\n\n private async requestWithRetry(url: string): Promise<Response> {\n let attempt = 0;\n while (true) {\n await this.throttle();\n const response = await this.fetchImpl(url, {\n method: \"GET\",\n headers: this.buildHeaders(),\n });\n\n if (response.ok) return response;\n\n const retryable = response.status === 429 || response.status >= 500;\n if (!retryable || attempt >= this.maxRetries) {\n const detail = await response.text().catch(() => \"\");\n throw new Error(\n `Wix HTTP ${response.status}${detail ? `: ${detail.slice(0, 200)}` : \"\"}`,\n );\n }\n\n const retryAfter = Number.parseInt(response.headers.get(\"retry-after\") ?? \"\", 10);\n const delay = Number.isFinite(retryAfter)\n ? retryAfter * 1000\n : Math.min(this.maxRetryDelayMs, this.retryBaseDelayMs * 2 ** attempt);\n await sleep(delay);\n attempt += 1;\n }\n }\n\n private async throttle(): Promise<void> {\n if (this.requestIntervalMs <= 0) return;\n const elapsed = Date.now() - this.lastRequestAt;\n if (elapsed < this.requestIntervalMs) {\n await sleep(this.requestIntervalMs - elapsed);\n }\n this.lastRequestAt = Date.now();\n }\n}\n\n/** Map a collected wire fixture (already normalized to list-* response shapes) into WixExport. */\nexport function mergeWixWireFixtures(partials: {\n categories?: unknown;\n tags?: unknown;\n posts?: unknown;\n exportedAt?: string;\n site?: WixExport[\"site\"];\n}): WixExport {\n const categories = mapWireListCategoriesResponse(partials.categories ?? { categories: [] });\n const tags = mapWireListTagsResponse(partials.tags ?? { tags: [] });\n const categorySlugsById = new Map(categories.map((category) => [category.id, category.slug]));\n const tagSlugsById = new Map(tags.map((tag) => [tag.id, tag.slug]));\n const posts = mapWireListPostsResponse(partials.posts ?? { posts: [] }, {\n categorySlugsById,\n tagSlugsById,\n });\n\n return {\n exportVersion: 1,\n exportedAt: partials.exportedAt ?? new Date().toISOString(),\n site: partials.site,\n categories: dedupeBySlug(categories),\n tags: dedupeBySlug(tags),\n posts: dedupeById(posts),\n pages: [],\n };\n}\n\nexport function isWixExport(value: unknown): value is WixExport {\n if (!value || typeof value !== \"object\") return false;\n const record = value as WixExport;\n return (\n record.exportVersion === 1 &&\n (Array.isArray(record.posts) || Array.isArray(record.pages))\n );\n}\n\n/** Validate exportVersion 1 JSON with posts and/or pages arrays. */\nexport function assertWixExport(value: unknown): WixExport {\n if (!isWixExport(value)) {\n throw new Error(\"Invalid Wix export: expected exportVersion 1 with posts[] and/or pages[]\");\n }\n if ((value.posts?.length ?? 0) === 0 && (value.pages?.length ?? 0) === 0) {\n throw new Error(\"Invalid Wix export: no posts or pages\");\n }\n for (const post of value.posts ?? []) {\n if (!post.slug) post.slug = sanitizeSlug(post.title);\n }\n for (const page of value.pages ?? []) {\n if (!page.slug) page.slug = sanitizeSlug(page.title);\n }\n return value;\n}\n","interface RicosNode {\n type?: string;\n nodes?: RicosNode[];\n textData?: {\n text?: string;\n decorations?: Array<{ type?: string; linkData?: { link?: { url?: string } } }>;\n };\n headingData?: { level?: number };\n imageData?: {\n image?: { src?: { url?: string }; altText?: string };\n containerData?: { alignment?: string };\n };\n htmlData?: { html?: string; containerData?: unknown };\n linkData?: { link?: { url?: string } };\n buttonData?: { text?: string; link?: { url?: string } };\n blockquoteData?: unknown;\n codeBlockData?: { textStyle?: unknown };\n paragraphData?: unknown;\n bulletedListData?: unknown;\n orderedListData?: unknown;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nfunction renderTextNode(node: RicosNode): string {\n const text = node.textData?.text ?? \"\";\n let html = escapeHtml(text);\n for (const decoration of node.textData?.decorations ?? []) {\n switch (decoration.type) {\n case \"BOLD\":\n html = `<strong>${html}</strong>`;\n break;\n case \"ITALIC\":\n html = `<em>${html}</em>`;\n break;\n case \"UNDERLINE\":\n html = `<u>${html}</u>`;\n break;\n case \"LINK\": {\n const href = decoration.linkData?.link?.url;\n if (href) html = `<a href=\"${escapeHtml(href)}\">${html}</a>`;\n break;\n }\n default:\n break;\n }\n }\n return html;\n}\n\nfunction renderChildren(nodes: RicosNode[] | undefined): string {\n return (nodes ?? []).map((node) => renderRicosNode(node)).join(\"\");\n}\n\nfunction renderRicosNode(node: RicosNode): string {\n const type = (node.type ?? \"\").toUpperCase();\n\n switch (type) {\n case \"TEXT\":\n return renderTextNode(node);\n case \"PARAGRAPH\":\n return `<p>${renderChildren(node.nodes)}</p>`;\n case \"HEADING\": {\n const level = Math.min(6, Math.max(1, node.headingData?.level ?? 2));\n return `<h${level}>${renderChildren(node.nodes)}</h${level}>`;\n }\n case \"BULLETED_LIST\":\n return `<ul>${renderChildren(node.nodes)}</ul>`;\n case \"ORDERED_LIST\":\n return `<ol>${renderChildren(node.nodes)}</ol>`;\n case \"LIST_ITEM\":\n return `<li>${renderChildren(node.nodes)}</li>`;\n case \"BLOCKQUOTE\":\n return `<blockquote>${renderChildren(node.nodes)}</blockquote>`;\n case \"HTML\":\n return node.htmlData?.html ?? \"\";\n case \"IMAGE\": {\n const src = node.imageData?.image?.src?.url;\n if (!src) return \"\";\n const alt = node.imageData?.image?.altText\n ? ` alt=\"${escapeHtml(node.imageData.image.altText)}\"`\n : \"\";\n return `<figure><img src=\"${escapeHtml(src)}\"${alt} /></figure>`;\n }\n case \"BUTTON\": {\n const label = escapeHtml(node.buttonData?.text ?? \"Link\");\n const href = node.buttonData?.link?.url ?? node.linkData?.link?.url;\n if (!href) return `<span>${label}</span>`;\n return `<p><a href=\"${escapeHtml(href)}\">${label}</a></p>`;\n }\n case \"CODE_BLOCK\":\n return `<pre><code>${renderChildren(node.nodes)}</code></pre>`;\n case \"DIVIDER\":\n return \"<hr />\";\n default:\n return renderChildren(node.nodes);\n }\n}\n\n/** Convert Wix Ricos rich content JSON into static HTML for NormalizedPost.contentHtml. */\nexport function ricosToHtml(richContent: unknown): string {\n if (!richContent || typeof richContent !== \"object\") return \"\";\n const nodes = (richContent as { nodes?: RicosNode[] }).nodes;\n if (!Array.isArray(nodes) || nodes.length === 0) return \"\";\n return renderChildren(nodes);\n}\n","import { sanitizeSlug } from \"../../lib/utility.js\";\nimport { ricosToHtml } from \"./ricos-to-html.js\";\nimport type { WixCategory, WixPost, WixTag } from \"./types.js\";\n\ninterface WireRecord {\n [key: string]: unknown;\n}\n\ninterface WirePageUrl {\n base?: string;\n path?: string;\n}\n\nfunction isRecord(value: unknown): value is WireRecord {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction asRecord(value: unknown): WireRecord | undefined {\n return isRecord(value) ? value : undefined;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction asStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((entry): entry is string => typeof entry === \"string\");\n}\n\nexport function buildWixPageUrl(url: WirePageUrl | undefined): string | undefined {\n if (!url) return undefined;\n const base = asString(url.base);\n const path = asString(url.path);\n if (base && path) {\n return `${base.replace(/\\/$/, \"\")}${path.startsWith(\"/\") ? path : `/${path}`}`;\n }\n return base ?? path;\n}\n\nfunction seoField(seoData: unknown, prop: \"title\" | \"description\"): string | undefined {\n const tags = asRecord(seoData)?.tags;\n if (!Array.isArray(tags)) return undefined;\n for (const tag of tags) {\n const record = asRecord(tag);\n if (!record) continue;\n const props = asRecord(record.props);\n if (record.type === \"title\" && prop === \"title\") {\n return asString(props?.children) ?? asString(record.children);\n }\n if (record.type === \"meta\" && prop === \"description\" && props?.name === \"description\") {\n return asString(props.content);\n }\n }\n return undefined;\n}\n\nfunction postContentHtml(post: WireRecord): string {\n const richHtml = ricosToHtml(post.richContent);\n if (richHtml.trim()) return richHtml;\n const plain = asString(post.contentText);\n if (!plain) return \"\";\n return `<p>${plain.replace(/\\n\\n+/g, \"</p><p>\").replace(/\\n/g, \"<br />\")}</p>`;\n}\n\nexport function mapWireCategory(\n wire: unknown,\n exportedAt?: string,\n): WixCategory | undefined {\n const record = asRecord(wire);\n if (!record) return undefined;\n const id = asString(record.id);\n const name = asString(record.label) ?? asString(record.title);\n if (!id || !name) return undefined;\n const slug = sanitizeSlug(asString(record.slug) ?? name);\n if (!slug) return undefined;\n void exportedAt;\n return { id, name, slug };\n}\n\nexport function mapWireTag(wire: unknown): WixTag | undefined {\n const record = asRecord(wire);\n if (!record) return undefined;\n const id = asString(record.id);\n const name = asString(record.label) ?? asString(record.slug);\n if (!id || !name) return undefined;\n const slug = sanitizeSlug(asString(record.slug) ?? name);\n if (!slug) return undefined;\n return { id, name, slug };\n}\n\nexport function mapWirePost(\n wire: unknown,\n lookup: { categorySlugsById: Map<string, string>; tagSlugsById: Map<string, string> },\n): WixPost | undefined {\n const record = asRecord(wire);\n if (!record) return undefined;\n\n const id = asString(record.id);\n const title = asString(record.title) ?? \"Untitled\";\n if (!id) return undefined;\n\n const slug = sanitizeSlug(asString(record.slug) ?? title);\n const url = buildWixPageUrl(asRecord(record.url) as WirePageUrl | undefined);\n const heroImage = asRecord(record.heroImage);\n const featuredImageUrl = asString(heroImage?.url);\n\n const categorySlugs = asStringArray(record.categoryIds)\n .map((categoryId) => lookup.categorySlugsById.get(categoryId))\n .filter((slugValue): slugValue is string => !!slugValue);\n\n const tagSlugs = asStringArray(record.tagIds)\n .map((tagId) => lookup.tagSlugsById.get(tagId))\n .filter((slugValue): slugValue is string => !!slugValue);\n\n for (const hashtag of asStringArray(record.hashtags)) {\n const tagSlug = sanitizeSlug(hashtag);\n if (tagSlug && !tagSlugs.includes(tagSlug)) tagSlugs.push(tagSlug);\n }\n\n return {\n id,\n title,\n slug,\n url,\n excerpt: asString(record.excerpt),\n contentHtml: postContentHtml(record),\n publishedAt: asString(record.firstPublishedDate) ?? asString(record.lastPublishedDate),\n status: \"published\",\n categorySlugs,\n tagSlugs,\n featuredImageUrl,\n seoTitle: seoField(record.seoData, \"title\"),\n seoDescription: seoField(record.seoData, \"description\"),\n };\n}\n\nexport function mapWireListPostsResponse(\n wire: unknown,\n lookup: { categorySlugsById: Map<string, string>; tagSlugsById: Map<string, string> },\n): WixPost[] {\n const posts = asRecord(wire)?.posts;\n if (!Array.isArray(posts)) return [];\n return posts\n .map((entry) => mapWirePost(entry, lookup))\n .filter((post): post is WixPost => !!post);\n}\n\nexport function mapWireListCategoriesResponse(wire: unknown): WixCategory[] {\n const categories = asRecord(wire)?.categories;\n if (!Array.isArray(categories)) return [];\n return categories\n .map((entry) => mapWireCategory(entry))\n .filter((category): category is WixCategory => !!category);\n}\n\nexport function mapWireListTagsResponse(wire: unknown): WixTag[] {\n const tags = asRecord(wire)?.tags;\n if (!Array.isArray(tags)) return [];\n return tags\n .map((entry) => mapWireTag(entry))\n .filter((tag): tag is WixTag => !!tag);\n}\n","import * as cheerio from \"cheerio\";\nimport { readFile } from \"node:fs/promises\";\nimport { XMLParser } from \"fast-xml-parser\";\nimport { z } from \"zod\";\n\nimport { linkToPath, sanitizeSlug } from \"../../lib/utility.js\";\nimport type { WixPage, WixSnapshotGap, WixSnapshotTarget } from \"./types.js\";\n\nexport const MAIN_CONTENT_SELECTORS = [\n \"main\",\n \"article\",\n '[role=\"main\"]',\n \"#SITE_PAGES main\",\n \"#site-root main\",\n \"#PAGES_CONTAINER\",\n \"body\",\n] as const;\n\nexport const wixSnapshotClientOptionsSchema = z.object({\n fetchImpl: z.custom<typeof fetch>().optional(),\n maxRetries: z.number().int().min(0).max(5).default(2),\n retryBaseDelayMs: z.number().int().min(0).default(300),\n requestIntervalMs: z.number().int().min(0).default(150),\n});\n\nexport type WixSnapshotClientOptions = z.input<typeof wixSnapshotClientOptionsSchema>;\n\nexport interface WixSnapshotResult {\n pages: WixPage[];\n gaps: WixSnapshotGap[];\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction slugFromUrl(url: string, fallback: string): string {\n try {\n const segments = new URL(url).pathname.split(\"/\").filter(Boolean);\n const last = segments.at(-1);\n if (last) return sanitizeSlug(last);\n } catch {\n // fall through\n }\n return sanitizeSlug(fallback);\n}\n\nfunction looksLikeLoginWall($: cheerio.CheerioAPI, html: string): boolean {\n const lower = html.toLowerCase();\n if (lower.includes(\"members-login\") || lower.includes(\"login-bar\")) return true;\n if ($('input[type=\"password\"]').length > 0 && $('form[action*=\"login\"]').length > 0) return true;\n if ($('[data-testid=\"sign-in\"]').length > 0) return true;\n return false;\n}\n\nfunction pickMainRoot($: cheerio.CheerioAPI) {\n for (const selector of MAIN_CONTENT_SELECTORS) {\n const match = $(selector).first();\n if (match.length > 0) return match;\n }\n return $(\"body\");\n}\n\n/** Extract primary page copy from published HTML (cheerio only — no Puppeteer). */\nexport function extractMainContentHtml(html: string): {\n contentHtml: string;\n title?: string;\n empty: boolean;\n loginWall: boolean;\n} {\n const $ = cheerio.load(html, { xml: false });\n const loginWall = looksLikeLoginWall($, html);\n const title =\n $(\"title\").first().text().trim() ||\n $('meta[property=\"og:title\"]').attr(\"content\")?.trim() ||\n $(\"h1\").first().text().trim() ||\n undefined;\n\n const root = pickMainRoot($);\n root.find(\"script, style, noscript, nav, header, footer, iframe\").remove();\n\n const contentHtml = root.html()?.trim() ?? \"\";\n const textOnly = root.text().replace(/\\s+/g, \" \").trim();\n const empty = textOnly.length < 20;\n\n return { contentHtml, title, empty, loginWall };\n}\n\n/** Parse newline-delimited or comma-separated URL lists. */\nexport function parseUrlList(raw: string): string[] {\n return raw\n .split(/[\\n,]+/)\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0 && /^https?:\\/\\//i.test(entry));\n}\n\n/** Parse `<loc>` entries from a sitemap XML document. */\nexport function parseSitemapUrls(xml: string): string[] {\n const parser = new XMLParser({ ignoreAttributes: true, removeNSPrefix: true });\n const doc = parser.parse(xml) as {\n urlset?: { url?: Array<{ loc?: string }> | { loc?: string } };\n sitemapindex?: { sitemap?: Array<{ loc?: string }> | { loc?: string } };\n };\n\n const urls: string[] = [];\n const urlEntries = doc.urlset?.url;\n if (urlEntries) {\n const list = Array.isArray(urlEntries) ? urlEntries : [urlEntries];\n for (const entry of list) {\n if (entry.loc) urls.push(entry.loc.trim());\n }\n }\n\n const sitemapEntries = doc.sitemapindex?.sitemap;\n if (sitemapEntries) {\n const list = Array.isArray(sitemapEntries) ? sitemapEntries : [sitemapEntries];\n for (const entry of list) {\n if (entry.loc) urls.push(entry.loc.trim());\n }\n }\n\n return [...new Set(urls.filter((url) => /^https?:\\/\\//i.test(url)))];\n}\n\nexport async function loadUrlListFile(filePath: string): Promise<string[]> {\n const raw = await readFile(filePath, \"utf8\");\n if (raw.trim().startsWith(\"<\")) return parseSitemapUrls(raw);\n return parseUrlList(raw);\n}\n\nexport class WixPageSnapshotCollector {\n readonly fetchImpl: typeof fetch;\n readonly maxRetries: number;\n readonly retryBaseDelayMs: number;\n readonly requestIntervalMs: number;\n\n private lastRequestAt = 0;\n\n constructor(options: WixSnapshotClientOptions = {}) {\n const parsed = wixSnapshotClientOptionsSchema.parse(options);\n this.fetchImpl = parsed.fetchImpl ?? fetch;\n this.maxRetries = parsed.maxRetries;\n this.retryBaseDelayMs = parsed.retryBaseDelayMs;\n this.requestIntervalMs = parsed.requestIntervalMs;\n }\n\n async collectPages(targets: WixSnapshotTarget[]): Promise<WixSnapshotResult> {\n const pages: WixPage[] = [];\n const gaps: WixSnapshotGap[] = [];\n\n for (const target of targets) {\n let html: string;\n try {\n html = target.html ?? (await this.fetchHtml(target.url));\n } catch (error) {\n gaps.push({\n url: target.url,\n code: \"fetch_failed\",\n message: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n\n const extracted = extractMainContentHtml(html);\n if (extracted.loginWall) {\n gaps.push({\n url: target.url,\n code: \"login_wall\",\n message: \"Page appears to require authentication\",\n });\n continue;\n }\n\n if (extracted.empty) {\n gaps.push({\n url: target.url,\n code: \"empty_extract\",\n message: \"No meaningful content found in main/article containers\",\n });\n continue;\n }\n\n const title = target.title ?? extracted.title ?? \"Untitled\";\n const slug = target.slug ?? slugFromUrl(target.url, title);\n pages.push({\n id: `page:${slug}`,\n title,\n slug,\n url: target.url,\n contentHtml: extracted.contentHtml,\n isHomePage: target.isHomePage,\n status: \"published\",\n });\n }\n\n return { pages, gaps };\n }\n\n async collectFromUrlList(urls: string[]): Promise<WixSnapshotResult> {\n return this.collectPages(\n urls.map((url, index) => ({\n url,\n isHomePage: index === 0 && new URL(url).pathname === \"/\",\n })),\n );\n }\n\n private async fetchHtml(url: string): Promise<string> {\n let attempt = 0;\n while (true) {\n await this.throttle();\n const response = await this.fetchImpl(url, {\n method: \"GET\",\n headers: { Accept: \"text/html,application/xhtml+xml\" },\n });\n\n if (response.ok) {\n return response.text();\n }\n\n const retryable = response.status === 429 || response.status >= 500;\n if (!retryable || attempt >= this.maxRetries) {\n throw new Error(`Snapshot fetch HTTP ${response.status} for ${url}`);\n }\n\n await sleep(this.retryBaseDelayMs * 2 ** attempt);\n attempt += 1;\n }\n }\n\n private async throttle(): Promise<void> {\n if (this.requestIntervalMs <= 0) return;\n const elapsed = Date.now() - this.lastRequestAt;\n if (elapsed < this.requestIntervalMs) {\n await sleep(this.requestIntervalMs - elapsed);\n }\n this.lastRequestAt = Date.now();\n }\n}\n\nexport function mapSnapshotPageToSourcePath(page: WixPage): string | undefined {\n return linkToPath(page.url);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\n\nimport { XMLParser } from \"fast-xml-parser\";\n\nimport { discoverContentAssetUrls } from \"../../lib/media-urls.js\";\nimport { linkToPath, sanitizeSlug } from \"../../lib/utility.js\";\nimport type {\n NormalizedAsset,\n NormalizedCategory,\n NormalizedEntity,\n NormalizedPage,\n NormalizedPost,\n NormalizedTag,\n PublishStatus,\n SourceMetadata,\n ValidationIssue,\n} from \"../../normalizer/types.js\";\nimport { assertWixExport, WixCollectionClient, type WixClientOptions } from \"./api.js\";\nimport { WixPageSnapshotCollector, loadUrlListFile, type WixSnapshotClientOptions } from \"./snapshot.js\";\nimport type { WixExport, WixFeedFormat, WixPage, WixPost, WixSnapshotGap, WixSnapshotTarget } from \"./types.js\";\n\nexport interface WixParseOptions {\n filePath?: string;\n urlsFile?: string;\n data?: WixExport;\n client?: WixCollectionClient;\n clientOptions?: WixClientOptions;\n snapshotTargets?: WixSnapshotTarget[];\n snapshotOptions?: WixSnapshotClientOptions;\n exportedAt?: string;\n}\n\nconst PLATFORM = \"wix\" as const;\n\ninterface FeedCategory {\n \"@_domain\"?: string;\n \"@_term\"?: string;\n \"#text\"?: string;\n}\n\ninterface RssItem {\n title?: unknown;\n link?: unknown;\n guid?: unknown;\n pubDate?: unknown;\n published?: unknown;\n updated?: unknown;\n description?: unknown;\n category?: FeedCategory | FeedCategory[] | string | string[];\n content?: { encoded?: unknown } | string;\n encoded?: unknown;\n}\n\ninterface AtomLink {\n \"@_href\"?: string;\n \"@_rel\"?: string;\n}\n\ninterface AtomEntry {\n title?: unknown;\n link?: AtomLink | AtomLink[] | string;\n id?: unknown;\n published?: unknown;\n updated?: unknown;\n summary?: unknown;\n content?: { \"@_type\"?: string; \"#text\"?: unknown } | string;\n category?: FeedCategory | FeedCategory[] | string | string[];\n}\n\nexport interface WixFeedSummary {\n posts: number;\n categories: number;\n tags: number;\n assets: number;\n format: WixFeedFormat;\n}\n\nfunction asArray<T>(value: T | T[] | undefined): T[] {\n if (value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction textValue(value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"string\" || typeof value === \"number\") return String(value);\n if (typeof value === \"object\" && value !== null && \"#text\" in value) {\n return String((value as { \"#text\": unknown })[\"#text\"] ?? \"\");\n }\n return String(value);\n}\n\nfunction sourceMeta(id: string, url?: string, exportedAt?: string): SourceMetadata {\n return {\n platform: PLATFORM,\n id,\n url: url || undefined,\n path: linkToPath(url),\n exportedAt,\n };\n}\n\nfunction guessMime(filename: string): string | undefined {\n const ext = filename.split(\".\").pop()?.toLowerCase();\n const map: Record<string, string> = {\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n avif: \"image/avif\",\n };\n return ext ? map[ext] : undefined;\n}\n\nfunction parseXmlDocument(xml: string): unknown {\n const parser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: \"@_\",\n removeNSPrefix: true,\n trimValues: false,\n parseTagValue: false,\n });\n return parser.parse(xml);\n}\n\nexport function detectWixFeedFormat(xml: string): WixFeedFormat {\n const trimmed = xml.trim();\n if (trimmed.includes(\"<feed\") || trimmed.startsWith(\"<feed\")) return \"atom\";\n return \"rss\";\n}\n\nfunction getItemContentHtml(item: RssItem | AtomEntry): string {\n const content = (item as RssItem).content ?? (item as AtomEntry).content;\n if (content !== undefined) {\n if (typeof content === \"string\") return content;\n const block = content as { encoded?: unknown; \"#text\"?: unknown };\n if (block[\"#text\"] !== undefined) return textValue(block[\"#text\"]);\n if (block.encoded !== undefined) return textValue(block.encoded);\n }\n\n const rssItem = item as RssItem;\n if (rssItem.encoded !== undefined) return textValue(rssItem.encoded);\n\n return textValue(rssItem.description ?? (item as AtomEntry).summary);\n}\n\nfunction slugFromLink(link: string, title: string, fallbackId: string): string {\n try {\n const pathname = new URL(link).pathname;\n const segments = pathname.split(\"/\").filter(Boolean);\n const last = segments.at(-1);\n if (last) return sanitizeSlug(last);\n } catch {\n // fall through\n }\n return sanitizeSlug(title || fallbackId);\n}\n\nfunction itemLink(item: RssItem | AtomEntry): string {\n const rssLink = textValue((item as RssItem).link);\n if (rssLink) return rssLink;\n\n for (const link of asArray((item as AtomEntry).link)) {\n if (typeof link === \"string\" && link) return link;\n if (typeof link === \"object\" && link !== null) {\n const rel = link[\"@_rel\"];\n const href = link[\"@_href\"];\n if (href && (!rel || rel === \"alternate\")) return href;\n }\n }\n return \"\";\n}\n\nfunction itemSourceId(item: RssItem | AtomEntry, link: string, slug: string): string {\n const guid = textValue((item as RssItem).guid);\n if (guid) return guid;\n const atomId = textValue((item as AtomEntry).id);\n if (atomId) return atomId;\n if (link) return link;\n return slug;\n}\n\nfunction itemPublishedAt(item: RssItem | AtomEntry): string | undefined {\n const pubDate =\n textValue((item as RssItem).pubDate) ||\n textValue((item as AtomEntry).published) ||\n textValue((item as AtomEntry).updated) ||\n textValue((item as RssItem).published);\n return pubDate || undefined;\n}\n\nfunction normalizeCategoryLabel(category: FeedCategory | string): { domain?: string; label: string } {\n if (typeof category === \"string\") {\n return { label: category.trim() };\n }\n return {\n domain: category[\"@_domain\"]?.toLowerCase(),\n label: textValue(category[\"#text\"] ?? category[\"@_term\"]).trim(),\n };\n}\n\nfunction collectTaxonomiesFromItems(\n items: Array<RssItem | AtomEntry>,\n): { categories: Map<string, NormalizedCategory>; tags: Map<string, NormalizedTag> } {\n const categories = new Map<string, NormalizedCategory>();\n const tags = new Map<string, NormalizedTag>();\n\n for (const item of items) {\n for (const rawCategory of asArray(item.category)) {\n const { domain, label } = normalizeCategoryLabel(rawCategory);\n if (!label) continue;\n\n const slug = sanitizeSlug(label);\n if (!slug) continue;\n\n if (domain === \"tag\" || domain === \"post_tag\") {\n if (tags.has(slug)) continue;\n tags.set(slug, {\n type: \"tag\",\n source: sourceMeta(`tag:${slug}`),\n sourceId: `tag:${slug}`,\n name: label,\n slug,\n });\n continue;\n }\n\n if (categories.has(slug)) continue;\n categories.set(slug, {\n type: \"category\",\n source: sourceMeta(`cat:${slug}`),\n sourceId: `cat:${slug}`,\n name: label,\n slug,\n });\n }\n }\n\n return { categories, tags };\n}\n\nfunction collectCategorySlugs(item: RssItem | AtomEntry): string[] {\n const slugs: string[] = [];\n for (const rawCategory of asArray(item.category)) {\n const { domain, label } = normalizeCategoryLabel(rawCategory);\n if (!label || domain === \"tag\" || domain === \"post_tag\") continue;\n const slug = sanitizeSlug(label);\n if (slug) slugs.push(slug);\n }\n return slugs;\n}\n\nfunction collectTagSlugs(item: RssItem | AtomEntry): string[] {\n const slugs: string[] = [];\n for (const rawCategory of asArray(item.category)) {\n const { domain, label } = normalizeCategoryLabel(rawCategory);\n if (!label || (domain !== \"tag\" && domain !== \"post_tag\")) continue;\n const slug = sanitizeSlug(label);\n if (slug) slugs.push(slug);\n }\n return slugs;\n}\n\nfunction* collectInlineAssets(\n html: string,\n seenUrls: Set<string>,\n exportedAt?: string,\n): Generator<NormalizedAsset> {\n for (const src of discoverContentAssetUrls(html)) {\n if (seenUrls.has(src)) continue;\n seenUrls.add(src);\n\n let filename: string;\n try {\n filename = basename(new URL(src, \"http://local.invalid\").pathname) || \"inline-asset\";\n } catch {\n filename = \"inline-asset\";\n }\n\n yield {\n type: \"asset\",\n source: sourceMeta(`url:${src}`, src, exportedAt),\n sourceId: `url:${src}`,\n sourceUrl: src,\n filename,\n mimeType: guessMime(filename),\n };\n }\n}\n\nfunction mapPublishStatus(status: string | undefined): PublishStatus {\n switch ((status ?? \"published\").toLowerCase()) {\n case \"published\":\n return \"published\";\n case \"draft\":\n return \"draft\";\n default:\n return \"archived\";\n }\n}\n\nfunction* emitExportPost(\n post: WixPost,\n exportedAt: string | undefined,\n seenAssetUrls: Set<string>,\n): Generator<NormalizedEntity> {\n yield* collectInlineAssets(post.contentHtml, seenAssetUrls, exportedAt);\n\n let featuredAssetSourceId: string | undefined;\n if (post.featuredImageUrl) {\n featuredAssetSourceId = `featured:${post.id}`;\n if (!seenAssetUrls.has(post.featuredImageUrl)) {\n seenAssetUrls.add(post.featuredImageUrl);\n const filename = basename(new URL(post.featuredImageUrl).pathname) || `${post.id}-featured.jpg`;\n yield {\n type: \"asset\",\n source: sourceMeta(featuredAssetSourceId, post.featuredImageUrl, exportedAt),\n sourceId: featuredAssetSourceId,\n sourceUrl: post.featuredImageUrl,\n filename,\n mimeType: guessMime(filename),\n };\n }\n }\n\n yield {\n type: \"post\",\n source: sourceMeta(post.id, post.url, exportedAt),\n sourceId: post.id,\n title: post.title,\n slug: sanitizeSlug(post.slug),\n excerpt: post.excerpt,\n contentHtml: post.contentHtml,\n publishedAt: post.publishedAt,\n status: mapPublishStatus(post.status),\n categorySlugs: post.categorySlugs,\n tagSlugs: post.tagSlugs,\n featuredAssetSourceId,\n seoTitle: post.seoTitle,\n seoDescription: post.seoDescription,\n } satisfies NormalizedPost;\n}\n\nfunction* emitExportPage(\n page: WixPage,\n exportedAt: string | undefined,\n seenAssetUrls: Set<string>,\n): Generator<NormalizedEntity> {\n yield* collectInlineAssets(page.contentHtml, seenAssetUrls, exportedAt);\n\n yield {\n type: \"page\",\n source: sourceMeta(page.id, page.url, exportedAt),\n sourceId: page.id,\n title: page.title,\n slug: sanitizeSlug(page.slug),\n contentHtml: page.contentHtml,\n isHomePage: page.isHomePage,\n status: mapPublishStatus(page.status),\n seoTitle: page.seoTitle,\n seoDescription: page.seoDescription,\n } satisfies NormalizedPage;\n}\n\nexport async function* enumerateWixExportEntities(\n doc: WixExport,\n snapshotGaps?: WixSnapshotGap[],\n): AsyncGenerator<NormalizedEntity> {\n const exportedAt = doc.exportedAt;\n const seenAssetUrls = new Set<string>();\n\n for (const category of doc.categories ?? []) {\n yield {\n type: \"category\",\n source: sourceMeta(category.id, undefined, exportedAt),\n sourceId: category.id,\n name: category.name,\n slug: sanitizeSlug(category.slug),\n } satisfies NormalizedCategory;\n }\n\n for (const tag of doc.tags ?? []) {\n yield {\n type: \"tag\",\n source: sourceMeta(tag.id, undefined, exportedAt),\n sourceId: tag.id,\n name: tag.name,\n slug: sanitizeSlug(tag.slug),\n } satisfies NormalizedTag;\n }\n\n for (const page of doc.pages ?? []) {\n yield* emitExportPage(page, exportedAt, seenAssetUrls);\n }\n\n for (const post of doc.posts ?? []) {\n yield* emitExportPost(post, exportedAt, seenAssetUrls);\n }\n\n void snapshotGaps;\n}\n\nexport function summarizeWixExport(doc: WixExport): {\n posts: number;\n pages: number;\n categories: number;\n tags: number;\n assets: number;\n} {\n const seenAssetUrls = new Set<string>();\n let assets = 0;\n\n const countHtml = (html: string, featured?: string) => {\n if (featured && !seenAssetUrls.has(featured)) {\n seenAssetUrls.add(featured);\n assets += 1;\n }\n for (const src of discoverContentAssetUrls(html)) {\n if (seenAssetUrls.has(src)) continue;\n seenAssetUrls.add(src);\n assets += 1;\n }\n };\n\n for (const post of doc.posts ?? []) {\n countHtml(post.contentHtml, post.featuredImageUrl);\n }\n for (const page of doc.pages ?? []) {\n countHtml(page.contentHtml);\n }\n\n return {\n posts: doc.posts?.length ?? 0,\n pages: doc.pages?.length ?? 0,\n categories: doc.categories?.length ?? 0,\n tags: doc.tags?.length ?? 0,\n assets,\n };\n}\n\nfunction parseFeedItems(xml: string): { format: WixFeedFormat; items: Array<RssItem | AtomEntry> } {\n const format = detectWixFeedFormat(xml);\n const doc = parseXmlDocument(xml) as {\n rss?: { channel?: { item?: RssItem | RssItem[] } };\n feed?: { entry?: AtomEntry | AtomEntry[] };\n };\n\n if (format === \"atom\") {\n return { format, items: asArray(doc.feed?.entry) };\n }\n\n return { format, items: asArray(doc.rss?.channel?.item) };\n}\n\nexport async function loadWixFeed(filePath: string): Promise<{ format: WixFeedFormat; items: Array<RssItem | AtomEntry> }> {\n const xml = await readFile(filePath, \"utf8\");\n const parsed = parseFeedItems(xml);\n if (parsed.items.length === 0) {\n throw new Error(\"Invalid Wix feed: no entries found in RSS or Atom document\");\n }\n return parsed;\n}\n\nexport async function loadWixExport(options: WixParseOptions): Promise<WixExport> {\n if (options.data) return assertWixExport(options.data);\n\n if (options.client) {\n const doc = await options.client.collectExport();\n return assertWixExport(doc);\n }\n\n if (options.clientOptions) {\n const client = new WixCollectionClient(options.clientOptions);\n const doc = await client.collectExport();\n return assertWixExport(doc);\n }\n\n if (options.filePath) {\n const ext = extname(options.filePath).toLowerCase();\n if (ext === \".json\") {\n const raw: unknown = JSON.parse(await readFile(options.filePath, \"utf8\"));\n return assertWixExport(raw);\n }\n }\n\n throw new Error(\"Wix parser requires filePath (.json), data, client, or clientOptions\");\n}\n\nasync function resolveSnapshotTargets(options: WixParseOptions): Promise<WixSnapshotTarget[]> {\n if (options.snapshotTargets?.length) return options.snapshotTargets;\n const listPath = options.urlsFile ?? (\n options.filePath && extname(options.filePath).toLowerCase() === \".txt\" ? options.filePath : undefined\n );\n if (listPath) {\n const urls = await loadUrlListFile(listPath);\n return urls.map((url, index) => ({\n url,\n isHomePage: index === 0 && new URL(url).pathname === \"/\",\n }));\n }\n return [];\n}\n\nasync function attachSnapshotPages(\n doc: WixExport,\n options: WixParseOptions,\n): Promise<{ doc: WixExport; gaps: WixSnapshotGap[] }> {\n const targets = await resolveSnapshotTargets(options);\n if (targets.length === 0) return { doc, gaps: [] };\n\n const collector = new WixPageSnapshotCollector(options.snapshotOptions);\n const { pages, gaps } = await collector.collectPages(targets);\n return {\n doc: {\n ...doc,\n pages: [...(doc.pages ?? []), ...pages],\n },\n gaps,\n };\n}\n\nexport async function* enumerateWixEntities(options: WixParseOptions): AsyncGenerator<NormalizedEntity> {\n if (options.filePath && [\".xml\", \".rss\", \".atom\"].includes(extname(options.filePath).toLowerCase())) {\n yield* enumerateWixFeedEntities(options);\n const snapshotTargets = await resolveSnapshotTargets(options);\n if (snapshotTargets.length > 0) {\n const { doc, gaps } = await attachSnapshotPages(\n { exportVersion: 1, pages: [], posts: [] },\n { ...options, snapshotTargets },\n );\n yield* enumerateWixExportEntities(doc, gaps);\n }\n return;\n }\n\n if (options.filePath && extname(options.filePath).toLowerCase() === \".txt\" && !options.data && !options.client) {\n const { doc, gaps } = await attachSnapshotPages(\n { exportVersion: 1, pages: [], posts: [] },\n options,\n );\n yield* enumerateWixExportEntities(doc, gaps);\n return;\n }\n\n const snapshotTargets = await resolveSnapshotTargets(options);\n if (\n snapshotTargets.length > 0 &&\n !options.filePath &&\n !options.data &&\n !options.client &&\n !options.clientOptions\n ) {\n const { doc, gaps } = await attachSnapshotPages(\n { exportVersion: 1, pages: [], posts: [] },\n { ...options, snapshotTargets },\n );\n yield* enumerateWixExportEntities(doc, gaps);\n return;\n }\n\n const doc = await loadWixExport(options);\n const { doc: withSnapshots, gaps } = await attachSnapshotPages(doc, options);\n yield* enumerateWixExportEntities(withSnapshots, gaps);\n}\n\nasync function* enumerateWixFeedEntities(options: WixParseOptions): AsyncGenerator<NormalizedEntity> {\n if (!options.filePath) {\n throw new Error(\"Wix feed parser requires filePath\");\n }\n const { format, items } = await loadWixFeed(options.filePath);\n const { categories, tags } = collectTaxonomiesFromItems(items);\n const seenAssetUrls = new Set<string>();\n\n for (const category of categories.values()) {\n yield category;\n }\n for (const tag of tags.values()) {\n yield tag;\n }\n\n for (const item of items) {\n const title = textValue(item.title) || \"Untitled\";\n const link = itemLink(item);\n const sourceId = itemSourceId(item, link, sanitizeSlug(title));\n const slug = slugFromLink(link, title, sourceId);\n const contentHtml = getItemContentHtml(item);\n\n for (const asset of collectInlineAssets(contentHtml, seenAssetUrls, options.exportedAt)) {\n yield asset;\n }\n\n const post: NormalizedPost = {\n type: \"post\",\n source: sourceMeta(sourceId, link || undefined, options.exportedAt),\n sourceId,\n title,\n slug,\n excerpt: textValue((item as RssItem).description) || undefined,\n contentHtml,\n publishedAt: itemPublishedAt(item),\n status: \"published\" satisfies PublishStatus,\n categorySlugs: collectCategorySlugs(item),\n tagSlugs: collectTagSlugs(item),\n };\n\n yield post;\n }\n\n void format;\n}\n\nexport async function summarizeWixFeed(filePath: string): Promise<WixFeedSummary> {\n const { format, items } = await loadWixFeed(filePath);\n let posts = 0;\n let assets = 0;\n const { categories, tags } = collectTaxonomiesFromItems(items);\n const seenAssetUrls = new Set<string>();\n\n for (const item of items) {\n posts += 1;\n const contentHtml = getItemContentHtml(item);\n for (const src of discoverContentAssetUrls(contentHtml)) {\n if (seenAssetUrls.has(src)) continue;\n seenAssetUrls.add(src);\n assets += 1;\n }\n }\n\n return {\n format,\n posts,\n categories: categories.size,\n tags: tags.size,\n assets,\n };\n}\n\nexport async function validateWixExportFile(filePath: string): Promise<{\n ok: boolean;\n issues: ValidationIssue[];\n summary: Omit<WixFeedSummary, \"format\"> & { format?: WixFeedFormat };\n}> {\n try {\n const summary = await summarizeWixFeed(filePath);\n return {\n ok: true,\n issues: [],\n summary,\n };\n } catch (error) {\n return {\n ok: false,\n issues: [\n {\n code: \"invalid_wix_feed\",\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n summary: { posts: 0, categories: 0, tags: 0, assets: 0 },\n };\n }\n}\n\nexport function isWixFeedXml(xml: string): boolean {\n const trimmed = xml.trim();\n return trimmed.includes(\"<rss\") || trimmed.includes(\"<feed\");\n}\n","import type { AdapterContext, MigrationAdapter, ValidationResult } from \"../../normalizer/types.js\";\nimport { WixCollectionClient, type WixClientOptions } from \"./api.js\";\nimport {\n enumerateWixEntities,\n enumerateWixExportEntities,\n isWixFeedXml,\n loadWixExport,\n summarizeWixExport,\n summarizeWixFeed,\n validateWixExportFile,\n} from \"./parse-export.js\";\nimport type { WixExport, WixSnapshotTarget } from \"./types.js\";\n\ninterface WixParseInput {\n path?: string;\n urlsFile?: string;\n data?: WixExport;\n client?: WixCollectionClient;\n clientOptions?: WixClientOptions;\n snapshotTargets?: WixSnapshotTarget[];\n}\n\nfunction resolveInput(input: unknown): WixParseInput {\n if (typeof input === \"string\") return { path: input };\n if (input && typeof input === \"object\") {\n const record = input as WixParseInput & { urlsPath?: string };\n if (\n record.client ||\n record.clientOptions ||\n record.data ||\n record.snapshotTargets?.length\n ) {\n return record;\n }\n if (record.path || record.urlsFile || record.urlsPath) {\n return {\n path: record.path,\n urlsFile: record.urlsFile ?? record.urlsPath,\n };\n }\n }\n throw new Error(\n \"Wix adapter requires input path (string or { path }), { data }, { client }, { clientOptions }, or snapshot targets\",\n );\n}\n\nfunction toParseOptions(input: WixParseInput) {\n return {\n filePath: input.path,\n urlsFile: input.urlsFile,\n data: input.data,\n client: input.client,\n clientOptions: input.clientOptions,\n snapshotTargets: input.snapshotTargets,\n };\n}\n\nexport const wixAdapter: MigrationAdapter = {\n platform: \"wix\",\n\n async validateInput(input: unknown): Promise<ValidationResult> {\n try {\n const resolved = resolveInput(input);\n const options = toParseOptions(resolved);\n\n if (resolved.data) {\n const summary = summarizeWixExport(resolved.data);\n return {\n ok: true,\n issues: [],\n summary: {\n posts: summary.posts,\n pages: summary.pages,\n assets: summary.assets,\n categories: summary.categories,\n tags: summary.tags,\n },\n };\n }\n\n if (resolved.client || resolved.clientOptions) {\n const doc = await loadWixExport(options);\n const summary = summarizeWixExport(doc);\n return {\n ok: true,\n issues: [],\n summary: {\n posts: summary.posts,\n pages: summary.pages,\n assets: summary.assets,\n categories: summary.categories,\n tags: summary.tags,\n },\n };\n }\n\n if (resolved.path?.endsWith(\".json\")) {\n const doc = await loadWixExport(options);\n const summary = summarizeWixExport(doc);\n return {\n ok: true,\n issues: [],\n summary: {\n posts: summary.posts,\n pages: summary.pages,\n assets: summary.assets,\n categories: summary.categories,\n tags: summary.tags,\n },\n };\n }\n\n if (resolved.path && !resolved.path.endsWith(\".txt\")) {\n const result = await validateWixExportFile(resolved.path);\n return {\n ok: result.ok,\n issues: result.issues,\n summary: {\n posts: result.summary.posts,\n pages: 0,\n assets: result.summary.assets,\n categories: result.summary.categories,\n tags: result.summary.tags,\n },\n };\n }\n\n if (resolved.path?.endsWith(\".txt\") || resolved.urlsFile) {\n return {\n ok: true,\n issues: [],\n summary: { pages: 0, posts: 0, assets: 0, categories: 0, tags: 0 },\n };\n }\n\n throw new Error(\"Wix validation requires export.xml, export.json, url list, or API client options\");\n } catch (error) {\n return {\n ok: false,\n issues: [\n {\n code: \"invalid_input\",\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n },\n\n enumerateEntities(ctx: AdapterContext) {\n return enumerateWixEntities(toParseOptions(resolveInput(ctx.input)));\n },\n};\n\nexport {\n WIX_API_BASE,\n WixCollectionClient,\n assertWixExport,\n isWixExport,\n mergeWixWireFixtures,\n wixAuthContextSchema,\n wixClientOptionsSchema,\n} from \"./api.js\";\nexport type { WixAuthContext, WixClientOptions } from \"./api.js\";\nexport {\n detectWixFeedFormat,\n enumerateWixEntities,\n enumerateWixExportEntities,\n isWixFeedXml,\n loadWixExport,\n loadWixFeed,\n summarizeWixExport,\n summarizeWixFeed,\n validateWixExportFile,\n} from \"./parse-export.js\";\nexport {\n MAIN_CONTENT_SELECTORS,\n WixPageSnapshotCollector,\n extractMainContentHtml,\n loadUrlListFile,\n parseSitemapUrls,\n parseUrlList,\n wixSnapshotClientOptionsSchema,\n} from \"./snapshot.js\";\nexport type { WixSnapshotClientOptions, WixSnapshotResult } from \"./snapshot.js\";\nexport { ricosToHtml } from \"./ricos-to-html.js\";\nexport {\n buildWixPageUrl,\n mapWireCategory,\n mapWireListCategoriesResponse,\n mapWireListPostsResponse,\n mapWireListTagsResponse,\n mapWirePost,\n mapWireTag,\n} from \"./map-wire.js\";\nexport type {\n WixExport,\n WixFeedFormat,\n WixPage,\n WixPost,\n WixSnapshotGap,\n WixSnapshotTarget,\n} from \"./types.js\";\nexport type { WixParseOptions } from \"./parse-export.js\";\n","export { wordpressAdapter } from \"./wordpress/index.js\";\nexport {\n SmugMugApiClient,\n SMUGMUG_API_BASE,\n SMUGMUG_OAUTH_ENDPOINTS,\n buildSmugMugAuthorizationHeader,\n readSmugMugCredentialsFromEnv,\n signSmugMugOAuthRequest,\n smugmugAdapter,\n smugMugCredentialsSchema,\n} from \"./smugmug/index.js\";\nexport type { SmugMugClientOptions, SmugMugCredentials } from \"./smugmug/index.js\";\nexport { squarespaceAdapter } from \"./squarespace/index.js\";\nexport { wixAdapter, WixCollectionClient, WixPageSnapshotCollector } from \"./wix/index.js\";\nexport {\n SquarespaceCollectionClient,\n SQUARESPACE_JSON_FORMAT,\n buildJsonPrettyUrl,\n mapJsonPrettyWire,\n} from \"./squarespace/index.js\";\nexport type { SquarespaceClientOptions, SquarespaceCollectTarget } from \"./squarespace/index.js\";\n\nimport type { MigrationPlatform } from \"../normalizer/types.js\";\nimport { smugmugAdapter } from \"./smugmug/index.js\";\nimport { squarespaceAdapter } from \"./squarespace/index.js\";\nimport { wordpressAdapter } from \"./wordpress/index.js\";\n\nimport { wixAdapter } from \"./wix/index.js\";\n\nconst adapters = {\n wordpress: wordpressAdapter,\n smugmug: smugmugAdapter,\n squarespace: squarespaceAdapter,\n wix: wixAdapter,\n} as const;\n\nexport function getAdapter(platform: MigrationPlatform) {\n return adapters[platform];\n}\n"],"mappings":"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","names":["readFile","PLATFORM","sourceMeta","guessMime","readFile","resolveInput","z","z","sleep","readFile","XMLParser","z","z","sleep","XMLParser","readFile","readFile","basename","XMLParser","PLATFORM","asArray","textValue","sourceMeta","guessMime","XMLParser","collectInlineAssets","basename","mapPublishStatus","readFile","snapshotTargets","doc","gaps","resolveInput"]}