@artinstack/migrator 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sinks/types.ts","../src/sinks/run-migration.ts","../src/sinks/conflicts.ts","../src/parsers/squarespace/parse-export.ts","../src/lib/utility.ts","../src/parsers/squarespace/collect.ts","../src/parsers/wordpress/builders/registry.ts","../src/parsers/wordpress/builders/shortcode-conflicts.ts","../src/sinks/filesystem.ts","../src/sinks/filesystem-sink.ts","../src/sinks/migration-report.ts","../src/sinks/storage-estimate.ts","../src/sinks/dry-run.ts"],"sourcesContent":["import type { Readable } from \"node:stream\";\n\nimport type {\n EntityKey,\n NormalizedAsset,\n NormalizedCategory,\n NormalizedPage,\n NormalizedPortfolio,\n NormalizedPost,\n NormalizedTag,\n PortfolioMediaLink,\n} from \"../normalizer/types.js\";\nimport type { RewriteInlineImagesOptions } from \"../transformers/rewrite-inline-images.js\";\n\nexport interface CreatePostResult {\n targetId: string;\n publicPath: string;\n}\n\nexport interface CreatePageResult {\n targetId: string;\n publicPath: string;\n}\n\nexport interface UploadAssetInput {\n asset: NormalizedAsset;\n /** Byte stream from source URL or local file. Optional for metadata-only sinks. */\n body?: Readable | ReadableStream<Uint8Array>;\n contentLength?: number;\n}\n\nexport interface UploadAssetResult {\n targetId: string;\n publicUrl?: string;\n}\n\nexport interface MigrationRedirect {\n fromPath: string;\n toPath: string;\n statusCode: number;\n}\n\nexport interface MigrationProgress {\n stage: string;\n progress: number;\n message?: string;\n}\n\n/**\n * Host-implemented write surface (e.g. ArtInStack PlatformMigrationSink).\n * This package defines the interface only — no Directus or platform imports.\n */\nexport interface MigrationSink {\n createCategory?(category: NormalizedCategory): Promise<{ targetId: string }>;\n createTag?(tag: NormalizedTag): Promise<{ targetId: string }>;\n uploadAsset(input: UploadAssetInput): Promise<UploadAssetResult>;\n createPortfolio?(portfolio: NormalizedPortfolio): Promise<{ targetId: string }>;\n createPost(post: NormalizedPost): Promise<CreatePostResult>;\n createPage(page: NormalizedPage): Promise<CreatePageResult>;\n linkPortfolioMedia?(link: PortfolioMediaLink): Promise<void>;\n writeRedirect?(redirect: MigrationRedirect): Promise<void>;\n reportProgress?(progress: MigrationProgress): Promise<void>;\n /** Optional lookup for idempotent re-runs. */\n findExisting?(key: EntityKey): Promise<string | undefined>;\n}\n\nexport interface ResolvedAssetStream {\n body: Readable | ReadableStream<Uint8Array>;\n contentLength?: number;\n}\n\nexport interface MigrationRunOptions {\n sink: MigrationSink;\n entities: AsyncIterable<import(\"../normalizer/types.js\").NormalizedEntity>;\n platform: import(\"../normalizer/types.js\").MigrationPlatform;\n /** Fetch source bytes before uploadAsset; omit for metadata-only sinks. */\n resolveAssetStream?: (asset: NormalizedAsset) => Promise<ResolvedAssetStream | null>;\n /** Rewrite post/page HTML after assets are uploaded. */\n rewriteInlineImages?: RewriteInlineImagesOptions;\n onEntityProcessed?: (key: EntityKey, result: \"done\" | \"failed\" | \"skipped\", error?: string) => void;\n}\n\nexport interface MigrationRunResult {\n processed: number;\n failed: number;\n skipped: number;\n}\n\nexport const MIGRATION_WRITE_STAGES = [\n \"taxonomy\",\n \"assets\",\n \"portfolios\",\n \"content\",\n \"bindings\",\n \"redirects\",\n] as const;\n\nexport type MigrationWriteStage = (typeof MIGRATION_WRITE_STAGES)[number];\n","import { Readable } from \"node:stream\";\n\nimport { collectEntities, type EntityBundle } from \"../normalizer/bundle.js\";\nimport { buildPortfolioMediaLinks } from \"../normalizer/portfolio-media.js\";\nimport { shouldProcessEntity } from \"../normalizer/idempotency.js\";\nimport { entityKey } from \"../normalizer/types.js\";\nimport type {\n EntityKey,\n NormalizedPage,\n NormalizedPost,\n} from \"../normalizer/types.js\";\nimport { normalizeAssetUrl } from \"../lib/content-asset-urls.js\";\nimport { createMigrationMediaRefReplaceWith } from \"../lib/migration-media-ref.js\";\nimport {\n rewriteInlineImages,\n type RewriteInlineImagesOptions,\n} from \"../transformers/rewrite-inline-images.js\";\nimport { buildRedirectMap } from \"./conflicts.js\";\nimport type {\n MigrationRunOptions,\n MigrationRunResult,\n MigrationWriteStage,\n UploadAssetResult,\n} from \"./types.js\";\n\nexport async function runMigration(options: MigrationRunOptions): Promise<MigrationRunResult> {\n const bundle = await collectEntities(options.entities);\n return runMigrationFromBundle(bundle, options);\n}\n\nexport async function runMigrationFromBundle(\n bundle: EntityBundle,\n options: MigrationRunOptions,\n): Promise<MigrationRunResult> {\n const { sink, platform, onEntityProcessed } = options;\n const checkpointEntities: import(\"../normalizer/idempotency.js\").TrackedEntity[] = [];\n const uploadedAssets = new Map<string, UploadAssetResult>();\n\n let processed = 0;\n let failed = 0;\n let skipped = 0;\n\n const track = async (\n stage: MigrationWriteStage,\n key: EntityKey,\n action: () => Promise<void>,\n ): Promise<void> => {\n if (!shouldProcessEntity(key, checkpointEntities)) {\n skipped += 1;\n onEntityProcessed?.(key, \"skipped\");\n return;\n }\n\n const existingTargetId = await sink.findExisting?.(key);\n if (existingTargetId) {\n if (stage === \"assets\" && key.entityType === \"asset\") {\n uploadedAssets.set(key.sourceId, { targetId: existingTargetId });\n }\n skipped += 1;\n onEntityProcessed?.(key, \"skipped\");\n return;\n }\n\n try {\n await sink.reportProgress?.({\n stage,\n progress: processed + failed + skipped,\n message: `${stage}:${key.entityType}:${key.sourceId}`,\n });\n await action();\n processed += 1;\n onEntityProcessed?.(key, \"done\");\n } catch (error) {\n failed += 1;\n const message = error instanceof Error ? error.message : String(error);\n onEntityProcessed?.(key, \"failed\", message);\n }\n };\n\n for (const category of bundle.categories) {\n const key = entityKey(category, platform);\n await track(\"taxonomy\", key, async () => {\n if (!sink.createCategory) return;\n await sink.createCategory(category);\n });\n }\n\n for (const tag of bundle.tags) {\n const key = entityKey(tag, platform);\n await track(\"taxonomy\", key, async () => {\n if (!sink.createTag) return;\n await sink.createTag(tag);\n });\n }\n\n for (const asset of bundle.media) {\n const key = entityKey(asset, platform);\n await track(\"assets\", key, async () => {\n const stream = options.resolveAssetStream ? await options.resolveAssetStream(asset) : null;\n const result = await sink.uploadAsset({\n asset,\n body: stream?.body ?? emptyBody(),\n contentLength: stream?.contentLength,\n });\n uploadedAssets.set(asset.sourceId, result);\n });\n }\n\n for (const portfolio of bundle.portfolios) {\n const key = entityKey(portfolio, platform);\n await track(\"portfolios\", key, async () => {\n if (!sink.createPortfolio) {\n throw new Error(\"Sink does not support portfolios\");\n }\n await sink.createPortfolio(portfolio);\n });\n }\n\n for (const post of bundle.posts) {\n const key = entityKey(post, platform);\n await track(\"content\", key, async () => {\n await sink.createPost(\n prepareContentEntity(post, options, uploadedAssets, bundle),\n );\n });\n }\n\n for (const page of bundle.pages) {\n const key = entityKey(page, platform);\n await track(\"content\", key, async () => {\n await sink.createPage(\n prepareContentEntity(page, options, uploadedAssets, bundle),\n );\n });\n }\n\n const portfolioLinks = buildPortfolioMediaLinks(bundle);\n for (const link of portfolioLinks) {\n const key: EntityKey = {\n platform,\n entityType: \"asset\",\n sourceId: `${link.portfolioSourceId}:${link.assetSourceId}`,\n };\n await track(\"bindings\", key, async () => {\n if (!sink.linkPortfolioMedia) return;\n await sink.linkPortfolioMedia(link);\n });\n }\n\n const redirects = buildRedirectMap(bundle);\n for (const redirect of redirects) {\n const key: EntityKey = {\n platform,\n entityType: \"page\",\n sourceId: `redirect:${redirect.fromPath}`,\n };\n await track(\"redirects\", key, async () => {\n if (!sink.writeRedirect) return;\n await sink.writeRedirect(redirect);\n });\n }\n\n return { processed, failed, skipped };\n}\n\nfunction prepareContentEntity<T extends NormalizedPost | NormalizedPage>(\n entity: T,\n options: MigrationRunOptions,\n uploadedAssets: Map<string, UploadAssetResult>,\n bundle: EntityBundle,\n): T {\n if (!options.rewriteInlineImages) return entity;\n\n const rewriteOptions = mergeRewriteOptions(bundle, options.rewriteInlineImages);\n const rewritten = rewriteInlineImages(entity.contentHtml, rewriteOptions, uploadedAssets);\n\n return {\n ...entity,\n contentHtml: rewritten.html,\n };\n}\n\nfunction mergeRewriteOptions(\n bundle: EntityBundle,\n options: RewriteInlineImagesOptions,\n): RewriteInlineImagesOptions {\n const urlToSourceId = new Map<string, string>();\n for (const asset of bundle.media) {\n urlToSourceId.set(asset.sourceUrl, asset.sourceId);\n const normalized = normalizeAssetUrl(asset.sourceUrl);\n if (normalized) urlToSourceId.set(normalized, asset.sourceId);\n }\n\n const replaceWith = options.replaceWith ?? createMigrationMediaRefReplaceWith();\n const requireUploaded = options.requireUploaded ?? Boolean(options.replaceWith);\n\n return {\n resolveAsset: (src) => {\n const resolved = options.resolveAsset(src);\n if (resolved) return resolved;\n const normalized = normalizeAssetUrl(src);\n const sourceAssetId =\n (normalized ? urlToSourceId.get(normalized) : undefined) ?? urlToSourceId.get(src);\n if (!sourceAssetId) return undefined;\n return { originalSrc: src, sourceAssetId };\n },\n replaceWith,\n requireUploaded,\n };\n}\n\nfunction emptyBody(): Readable {\n return Readable.from([]);\n}\n\nexport type { EntityKey };\n","import * as cheerio from \"cheerio\";\n\nimport type { EntityBundle } from \"../normalizer/bundle.js\";\nimport { discoverRawImgSrcs, normalizeAssetUrl } from \"../lib/content-asset-urls.js\";\nimport { isMigrationMediaRef } from \"../lib/migration-media-ref.js\";\nimport { findUnsupportedBlockMarkers } from \"../parsers/squarespace/parse-export.js\";\nimport { findWordPressShortcodeMarkers } from \"../parsers/wordpress/builders/shortcode-conflicts.js\";\nexport interface DuplicateSlugConflict {\n entityType: \"post\" | \"page\";\n slug: string;\n sourceIds: string[];\n}\n\nexport interface MissingFeaturedImageConflict {\n postSourceId: string;\n featuredMediaSourceId: string;\n reason: string;\n}\n\nexport interface StaleAssetUrlConflict {\n sourceId: string;\n url: string;\n reason: string;\n}\n\nexport interface InvalidHtmlConflict {\n entityType: \"post\" | \"page\";\n sourceId: string;\n issues: string[];\n}\n\nexport interface UnresolvedInlineImageConflict {\n postOrPageSourceId: string;\n src: string;\n}\n\nexport interface UnsupportedBlockConflict {\n entityType: \"post\" | \"page\";\n sourceId: string;\n blockType: string;\n blockId?: string;\n}\n\nexport interface RedirectLoopConflict {\n fromPath: string;\n toPath: string;\n blocked: boolean;\n}\n\nexport interface ConflictReport {\n duplicatePostSlugs: DuplicateSlugConflict[];\n duplicatePageSlugs: DuplicateSlugConflict[];\n missingFeaturedImages: MissingFeaturedImageConflict[];\n staleAssetUrls: StaleAssetUrlConflict[];\n invalidHtml: InvalidHtmlConflict[];\n unresolvedInlineImages: UnresolvedInlineImageConflict[];\n unsupportedBlocks: UnsupportedBlockConflict[];\n redirectLoops: RedirectLoopConflict[];\n}\n\nexport function emptyConflictReport(): ConflictReport {\n return {\n duplicatePostSlugs: [],\n duplicatePageSlugs: [],\n missingFeaturedImages: [],\n staleAssetUrls: [],\n invalidHtml: [],\n unresolvedInlineImages: [],\n unsupportedBlocks: [],\n redirectLoops: [],\n };\n}\n\nfunction findDuplicateSlugs(\n items: { sourceId: string; slug: string }[],\n entityType: \"post\" | \"page\",\n): DuplicateSlugConflict[] {\n const bySlug = new Map<string, string[]>();\n for (const item of items) {\n const list = bySlug.get(item.slug) ?? [];\n list.push(item.sourceId);\n bySlug.set(item.slug, list);\n }\n\n const conflicts: DuplicateSlugConflict[] = [];\n for (const [slug, sourceIds] of bySlug) {\n if (sourceIds.length > 1) {\n conflicts.push({ entityType, slug, sourceIds });\n }\n }\n return conflicts;\n}\n\nfunction analyzeHtml(html: string): string[] {\n const issues: string[] = [];\n if (/<script\\b/i.test(html)) {\n issues.push(\"script_tag_present\");\n }\n\n try {\n const $ = cheerio.load(html, { xml: false });\n $(\"p\").each((_, el) => {\n const inner = $(el).html() ?? \"\";\n if (inner.includes(\"<p\")) {\n issues.push(\"nested_paragraph\");\n }\n });\n } catch {\n issues.push(\"html_parse_error\");\n }\n\n return [...new Set(issues)];\n}\n\nfunction mediaUrlSet(bundle: EntityBundle): Set<string> {\n const urls = new Set<string>();\n for (const asset of bundle.media) {\n const normalized = normalizeAssetUrl(asset.sourceUrl);\n if (normalized) urls.add(normalized);\n urls.add(asset.sourceUrl);\n }\n return urls;\n}\n\nfunction findUnresolvedInlineImages(\n sourceId: string,\n contentHtml: string,\n mediaUrls: Set<string>,\n): UnresolvedInlineImageConflict[] {\n const conflicts: UnresolvedInlineImageConflict[] = [];\n for (const raw of discoverRawImgSrcs(contentHtml)) {\n if (isMigrationMediaRef(raw)) continue;\n const normalized = normalizeAssetUrl(raw);\n if (!normalized) continue;\n if (!mediaUrls.has(normalized) && !mediaUrls.has(raw)) {\n conflicts.push({ postOrPageSourceId: sourceId, src: raw });\n }\n }\n return conflicts;\n}\n\nfunction findUnsupportedBlocks(\n entityType: \"post\" | \"page\",\n sourceId: string,\n contentHtml: string,\n): UnsupportedBlockConflict[] {\n const conflicts: UnsupportedBlockConflict[] = [];\n\n for (const marker of findUnsupportedBlockMarkers(contentHtml)) {\n conflicts.push({\n entityType,\n sourceId,\n blockType: marker.blockType,\n blockId: marker.blockId,\n });\n }\n\n for (const marker of findWordPressShortcodeMarkers(contentHtml)) {\n conflicts.push({\n entityType,\n sourceId,\n blockType: marker.unresolvable\n ? `wordpress:unresolvable:${marker.shortcode}`\n : `wordpress:shortcode:${marker.shortcode}`,\n });\n }\n\n return conflicts;\n}\n\nexport function analyzeConflicts(\n bundle: EntityBundle,\n options?: {\n staleAssetUrls?: StaleAssetUrlConflict[];\n redirectLoops?: RedirectLoopConflict[];\n },\n): ConflictReport {\n const report = emptyConflictReport();\n const mediaUrls = mediaUrlSet(bundle);\n\n report.duplicatePostSlugs = findDuplicateSlugs(bundle.posts, \"post\");\n report.duplicatePageSlugs = findDuplicateSlugs(bundle.pages, \"page\");\n\n for (const post of bundle.posts) {\n if (post.sourceFeaturedMediaId && !post.featuredAssetSourceId) {\n report.missingFeaturedImages.push({\n postSourceId: post.sourceId,\n featuredMediaSourceId: post.sourceFeaturedMediaId,\n reason: \"attachment_not_in_export\",\n });\n }\n\n const htmlIssues = analyzeHtml(post.contentHtml);\n if (htmlIssues.length) {\n report.invalidHtml.push({\n entityType: \"post\",\n sourceId: post.sourceId,\n issues: htmlIssues,\n });\n }\n\n report.unresolvedInlineImages.push(\n ...findUnresolvedInlineImages(post.sourceId, post.contentHtml, mediaUrls),\n );\n report.unsupportedBlocks.push(\n ...findUnsupportedBlocks(\"post\", post.sourceId, post.contentHtml),\n );\n }\n\n for (const page of bundle.pages) {\n const htmlIssues = analyzeHtml(page.contentHtml);\n if (htmlIssues.length) {\n report.invalidHtml.push({\n entityType: \"page\",\n sourceId: page.sourceId,\n issues: htmlIssues,\n });\n }\n\n report.unresolvedInlineImages.push(\n ...findUnresolvedInlineImages(page.sourceId, page.contentHtml, mediaUrls),\n );\n report.unsupportedBlocks.push(\n ...findUnsupportedBlocks(\"page\", page.sourceId, page.contentHtml),\n );\n }\n\n if (options?.staleAssetUrls) {\n report.staleAssetUrls = options.staleAssetUrls;\n }\n if (options?.redirectLoops) {\n report.redirectLoops = options.redirectLoops;\n }\n\n return report;\n}\n\nexport function hasBlockingConflicts(report: ConflictReport): boolean {\n return report.duplicatePageSlugs.length > 0 || report.redirectLoops.some((r) => r.blocked);\n}\n\nexport function hasWarnings(report: ConflictReport): boolean {\n return (\n report.duplicatePostSlugs.length > 0 ||\n report.missingFeaturedImages.length > 0 ||\n report.staleAssetUrls.length > 0 ||\n report.invalidHtml.length > 0 ||\n report.unresolvedInlineImages.length > 0 ||\n report.unsupportedBlocks.length > 0\n );\n}\n\nexport function buildRedirectMap(bundle: EntityBundle): {\n fromPath: string;\n toPath: string;\n statusCode: number;\n}[] {\n const redirects: { fromPath: string; toPath: string; statusCode: number }[] = [];\n\n for (const post of bundle.posts) {\n const from = post.source.path;\n if (!from) continue;\n const to = `/blog/${post.slug}`;\n if (from.replace(/\\/$/, \"\") === to.replace(/\\/$/, \"\")) continue;\n redirects.push({ fromPath: from, toPath: to, statusCode: 301 });\n }\n\n for (const page of bundle.pages) {\n const from = page.source.path;\n if (!from) continue;\n const to = `/${page.slug}`;\n if (from.replace(/\\/$/, \"\") === to.replace(/\\/$/, \"\")) continue;\n redirects.push({ fromPath: from, toPath: to, statusCode: 301 });\n }\n\n return redirects;\n}\n\nexport function detectRedirectLoops(\n redirects: { fromPath: string; toPath: string }[],\n): RedirectLoopConflict[] {\n const loops: RedirectLoopConflict[] = [];\n for (const row of redirects) {\n if (row.fromPath.replace(/\\/$/, \"\") === row.toPath.replace(/\\/$/, \"\")) {\n loops.push({ fromPath: row.fromPath, toPath: row.toPath, blocked: true });\n }\n }\n return loops;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\n\nimport { discoverContentAssetUrls } from \"../../lib/content-asset-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} from \"../../normalizer/types.js\";\nimport {\n SquarespaceCollectionClient,\n type SquarespaceClientOptions,\n type SquarespaceCollectTarget,\n} from \"./collect.js\";\nimport type {\n SquarespaceBlock,\n SquarespaceExport,\n SquarespaceGalleryItem,\n SquarespacePage,\n SquarespacePost,\n} from \"./types.js\";\n\nconst PLATFORM = \"squarespace\" as const;\nconst UNSUPPORTED_ATTR = \"data-artinstack-unsupported-block\";\nconst BLOCK_ID_ATTR = \"data-artinstack-block-id\";\n\n/** Block types flattened to HTML without a conflict flag. */\nconst SUPPORTED_BLOCK_TYPES = new Set([\n \"html\",\n \"text\",\n \"markdown\",\n \"image\",\n \"gallery\",\n \"quote\",\n \"button\",\n \"video\",\n \"code\",\n \"spacer\",\n \"line\",\n \"horizontalrule\",\n \"hr\",\n]);\n\n/** Known Squarespace block types that cannot be migrated as static HTML snapshots. */\nconst UNSUPPORTED_BLOCK_TYPES = new Set([\n \"product\",\n \"products\",\n \"form\",\n \"newsletter\",\n \"donation\",\n \"calendar\",\n \"chart\",\n \"map\",\n \"music\",\n \"social\",\n \"summary\",\n \"archive\",\n \"acuity\",\n \"member-area\",\n \"digital-product\",\n \"folder\",\n \"index\",\n \"tock\",\n \"opentable\",\n \"soundcloud\",\n \"foursquare\",\n]);\n\nexport interface SquarespaceParseOptions {\n filePath?: string;\n data?: SquarespaceExport;\n /** Pre-constructed json-pretty collector (live crawl). */\n client?: SquarespaceCollectionClient;\n /** Shorthand targets when constructing a client inline. */\n collectTargets?: SquarespaceCollectTarget[];\n clientOptions?: SquarespaceClientOptions;\n}\n\nexport interface FlattenBlocksResult {\n contentHtml: string;\n assetUrls: string[];\n}\n\nfunction sourceMeta(id: string, url?: string, exportedAt?: string): SourceMetadata {\n return {\n platform: PLATFORM,\n id,\n url,\n path: linkToPath(url),\n exportedAt,\n };\n}\n\nfunction mapPublishStatus(status: string | undefined): PublishStatus {\n switch ((status ?? \"published\").toLowerCase()) {\n case \"published\":\n return \"published\";\n case \"draft\":\n case \"scheduled\":\n return \"draft\";\n default:\n return \"archived\";\n }\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 blockShell(type: string, inner: string, blockId?: string): string {\n const idAttr = blockId ? ` id=\"sqs-block-${blockId}\"` : \"\";\n return `<div class=\"sqs-block sqs-block-${type}\"${idAttr}>${inner}</div>`;\n}\n\nfunction unsupportedPlaceholder(type: string, blockId?: string): string {\n const idPart = blockId ? ` ${BLOCK_ID_ATTR}=\"${escapeHtml(blockId)}\"` : \"\";\n return `<div class=\"sqs-block sqs-block-unsupported\" ${UNSUPPORTED_ATTR}=\"${escapeHtml(type)}\"${idPart} aria-hidden=\"true\"></div>`;\n}\n\nfunction flattenGalleryItem(item: SquarespaceGalleryItem): string {\n const alt = item.altText ? ` alt=\"${escapeHtml(item.altText)}\"` : \"\";\n const caption = item.caption ? `<figcaption>${item.caption}</figcaption>` : \"\";\n return `<figure><img src=\"${escapeHtml(item.imageUrl)}\"${alt} />${caption}</figure>`;\n}\n\nexport function flattenSquarespaceBlock(block: SquarespaceBlock): FlattenBlocksResult {\n const type = block.type.toLowerCase();\n const blockId = block.id;\n const assetUrls: string[] = [];\n\n if (UNSUPPORTED_BLOCK_TYPES.has(type)) {\n return {\n contentHtml: unsupportedPlaceholder(type, blockId),\n assetUrls,\n };\n }\n\n if (!SUPPORTED_BLOCK_TYPES.has(type)) {\n return {\n contentHtml: unsupportedPlaceholder(type || \"unknown\", blockId),\n assetUrls,\n };\n }\n\n switch (type) {\n case \"html\":\n case \"text\":\n return {\n contentHtml: blockShell(type, block.html ?? block.value ?? \"\", blockId),\n assetUrls,\n };\n\n case \"markdown\":\n return {\n contentHtml: blockShell(\n type,\n block.html ?? `<div class=\"sqs-markdown\">${escapeHtml(block.value ?? \"\")}</div>`,\n blockId,\n ),\n assetUrls,\n };\n\n case \"image\": {\n const url = block.imageUrl ?? \"\";\n if (url) assetUrls.push(url);\n const alt = block.altText ? ` alt=\"${escapeHtml(block.altText)}\"` : \"\";\n const caption = block.caption ? `<figcaption>${block.caption}</figcaption>` : \"\";\n const inner = url\n ? `<figure><img src=\"${escapeHtml(url)}\"${alt} />${caption}</figure>`\n : \"\";\n return { contentHtml: blockShell(type, inner, blockId), assetUrls };\n }\n\n case \"gallery\": {\n const figures = (block.items ?? [])\n .map((item) => {\n assetUrls.push(item.imageUrl);\n return flattenGalleryItem(item);\n })\n .join(\"\");\n return {\n contentHtml: blockShell(type, `<div class=\"sqs-gallery\">${figures}</div>`, blockId),\n assetUrls,\n };\n }\n\n case \"quote\": {\n const inner = block.html ?? `<blockquote>${escapeHtml(block.value ?? \"\")}</blockquote>`;\n return { contentHtml: blockShell(type, inner, blockId), assetUrls };\n }\n\n case \"button\": {\n const href = block.url ?? \"#\";\n const label = escapeHtml(block.label ?? block.value ?? \"Learn more\");\n return {\n contentHtml: blockShell(\n type,\n `<p><a class=\"sqs-block-button\" href=\"${escapeHtml(href)}\">${label}</a></p>`,\n blockId,\n ),\n assetUrls,\n };\n }\n\n case \"video\": {\n const inner =\n block.embedHtml ??\n block.html ??\n (block.url ? `<p><a href=\"${escapeHtml(block.url)}\">Video</a></p>` : \"\");\n return { contentHtml: blockShell(type, inner, blockId), assetUrls };\n }\n\n case \"code\": {\n const inner =\n block.html ??\n `<pre><code>${escapeHtml(block.value ?? \"\")}</code></pre>`;\n return { contentHtml: blockShell(type, inner, blockId), assetUrls };\n }\n\n case \"spacer\":\n return {\n contentHtml: blockShell(type, `<div class=\"sqs-spacer\" aria-hidden=\"true\"></div>`, blockId),\n assetUrls,\n };\n\n case \"line\":\n case \"horizontalrule\":\n case \"hr\":\n return { contentHtml: blockShell(\"line\", \"<hr />\", blockId), assetUrls };\n\n default:\n return {\n contentHtml: unsupportedPlaceholder(type, blockId),\n assetUrls,\n };\n }\n}\n\nexport function flattenSquarespaceBlocks(blocks: SquarespaceBlock[]): FlattenBlocksResult {\n const parts: string[] = [];\n const assetUrls: string[] = [];\n for (const block of blocks) {\n const flattened = flattenSquarespaceBlock(block);\n parts.push(flattened.contentHtml);\n assetUrls.push(...flattened.assetUrls);\n }\n return {\n contentHtml: parts.join(\"\\n\"),\n assetUrls,\n };\n}\n\nfunction resolveContentHtml(\n entity: SquarespacePage | SquarespacePost,\n): FlattenBlocksResult {\n if (entity.blocks?.length) {\n return flattenSquarespaceBlocks(entity.blocks);\n }\n const html = entity.contentHtml ?? \"\";\n return {\n contentHtml: html,\n assetUrls: [...discoverContentAssetUrls(html)],\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 svg: \"image/svg+xml\",\n };\n return ext ? map[ext] : undefined;\n}\n\nfunction filenameFromUrl(url: string, fallback: string): string {\n try {\n return basename(new URL(url).pathname) || fallback;\n } catch {\n return basename(url.split(\"?\")[0] ?? \"\") || fallback;\n }\n}\n\nfunction assetFromUrl(\n url: string,\n exportedAt: string | undefined,\n index: number,\n): NormalizedAsset {\n const filename = filenameFromUrl(url, `asset-${index}.jpg`);\n const sourceId = `asset-${sanitizeSlug(filename)}-${index}`;\n return {\n type: \"asset\",\n source: sourceMeta(sourceId, url, exportedAt),\n sourceId,\n sourceUrl: url,\n filename,\n mimeType: guessMime(filename),\n };\n}\n\nexport function isSquarespaceExport(value: unknown): value is SquarespaceExport {\n if (!value || typeof value !== \"object\") return false;\n const record = value as SquarespaceExport;\n const version = record.exportVersion;\n return (version === 1 || version === \"1\") && Array.isArray(record.pages);\n}\n\nexport async function loadSquarespaceExport(\n options: SquarespaceParseOptions,\n): Promise<SquarespaceExport> {\n if (options.data) return options.data;\n if (options.client) {\n if (!options.collectTargets?.length) {\n throw new Error(\"Squarespace client.collectExport requires collectTargets\");\n }\n return options.client.collectExport(options.collectTargets);\n }\n if (options.collectTargets?.length) {\n const client = new SquarespaceCollectionClient(options.clientOptions);\n return client.collectExport(options.collectTargets);\n }\n if (!options.filePath) {\n throw new Error(\"Squarespace parser requires filePath, data, client, or collectTargets\");\n }\n const raw: unknown = JSON.parse(await readFile(options.filePath, \"utf8\"));\n if (isSquarespaceExport(raw)) return raw;\n throw new Error(\"Invalid Squarespace export: expected exportVersion 1 with pages[]\");\n}\n\nfunction* emitAssetsFromContent(\n contentHtml: string,\n explicitUrls: string[],\n exportedAt?: string,\n): Generator<NormalizedAsset> {\n const seen = new Set<string>();\n const urls = [...explicitUrls, ...discoverContentAssetUrls(contentHtml)];\n let index = 0;\n for (const url of urls) {\n if (seen.has(url)) continue;\n seen.add(url);\n yield assetFromUrl(url, exportedAt, index);\n index += 1;\n }\n}\n\nasync function* emitPage(page: SquarespacePage, exportedAt?: string): AsyncGenerator<NormalizedEntity> {\n const { contentHtml, assetUrls } = resolveContentHtml(page);\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,\n contentCss: page.contentCss,\n isHomePage: page.isHomePage,\n status: mapPublishStatus(page.status),\n seoTitle: page.seoTitle,\n seoDescription: page.seoDescription,\n } satisfies NormalizedPage;\n\n yield* emitAssetsFromContent(contentHtml, assetUrls, exportedAt);\n}\n\nasync function* emitPost(post: SquarespacePost, exportedAt?: string): AsyncGenerator<NormalizedEntity> {\n const { contentHtml, assetUrls } = resolveContentHtml(post);\n\n let featuredAssetSourceId: string | undefined;\n if (post.featuredImageUrl) {\n featuredAssetSourceId = `featured-${post.id}`;\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,\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 if (post.featuredImageUrl) {\n const filename = filenameFromUrl(post.featuredImageUrl, `${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 } satisfies NormalizedAsset;\n }\n\n yield* emitAssetsFromContent(contentHtml, assetUrls, exportedAt);\n}\n\n/** Parse Squarespace JSON export → normalizer DTOs (static HTML snapshots). */\nexport async function* enumerateSquarespaceEntities(\n options: SquarespaceParseOptions,\n): AsyncGenerator<NormalizedEntity> {\n const doc = await loadSquarespaceExport(options);\n const exportedAt = doc.exportedAt;\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* emitPage(page, exportedAt);\n }\n\n for (const post of doc.posts ?? []) {\n yield* emitPost(post, exportedAt);\n }\n}\n\nexport function summarizeSquarespaceExport(doc: SquarespaceExport): {\n pages: number;\n posts: number;\n categories: number;\n tags: number;\n} {\n return {\n pages: doc.pages.length,\n posts: doc.posts?.length ?? 0,\n categories: doc.categories?.length ?? 0,\n tags: doc.tags?.length ?? 0,\n };\n}\n\nexport async function validateSquarespaceExportFile(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: SquarespaceExport;\n try {\n doc = await loadSquarespaceExport({ 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 (doc.pages.length === 0 && (doc.posts?.length ?? 0) === 0) {\n issues.push({ code: \"empty_export\", message: \"No pages or posts in export\" });\n }\n\n const summary = summarizeSquarespaceExport(doc);\n return {\n ok: issues.length === 0,\n issues,\n summary: {\n pages: summary.pages,\n posts: summary.posts,\n categories: summary.categories,\n tags: summary.tags,\n portfolios: 0,\n assets: 0,\n },\n };\n}\n\n/** @internal Scan flattened HTML for unsupported block markers (used by conflict analysis). */\nexport function findUnsupportedBlockMarkers(html: string): { blockType: string; blockId?: string }[] {\n const markers: { blockType: string; blockId?: string }[] = [];\n const pattern =\n /data-artinstack-unsupported-block=\"([^\"]+)\"(?:\\s+data-artinstack-block-id=\"([^\"]*)\")?/g;\n for (const match of html.matchAll(pattern)) {\n markers.push({\n blockType: match[1] ?? \"unknown\",\n blockId: match[2] || undefined,\n });\n }\n return markers;\n}\n\nexport { SUPPORTED_BLOCK_TYPES, UNSUPPORTED_BLOCK_TYPES, UNSUPPORTED_ATTR, BLOCK_ID_ATTR };\n","/** Lowercase URL-safe slug from WordPress post_name or title. */\nexport function sanitizeSlug(raw: string): string {\n return raw\n .trim()\n .toLowerCase()\n .replace(/&[^;]+;/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 200);\n}\n\n/** Normalize absolute permalink to root-relative path. */\nexport function linkToPath(link: string | undefined): string | undefined {\n if (!link) return undefined;\n try {\n const url = new URL(link);\n const path = url.pathname;\n if (!path || path === \"/\") return \"/\";\n return path.endsWith(\"/\") ? path : `${path}/`;\n } catch {\n if (link.startsWith(\"/\")) {\n return link.endsWith(\"/\") ? link : `${link}/`;\n }\n return undefined;\n }\n}\n","import * as cheerio from \"cheerio\";\nimport { z } from \"zod\";\n\nimport { sanitizeSlug } from \"../../lib/utility.js\";\nimport type {\n SquarespaceBlock,\n SquarespaceCategory,\n SquarespaceExport,\n SquarespaceGalleryItem,\n SquarespacePage,\n SquarespacePost,\n SquarespaceTag,\n} from \"./types.js\";\n\nexport const SQUARESPACE_JSON_FORMAT = \"json-pretty\" as const;\nexport const SQUARESPACE_JSON_FORMAT_COMPACT = \"json\" as const;\n\nexport type SquarespaceJsonFormat =\n | typeof SQUARESPACE_JSON_FORMAT\n | typeof SQUARESPACE_JSON_FORMAT_COMPACT;\n\nexport const squarespaceClientOptionsSchema = z.object({\n format: z.enum([\"json\", \"json-pretty\"]).default(\"json-pretty\"),\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 SquarespaceClientOptions = z.input<typeof squarespaceClientOptionsSchema>;\n\nexport interface SquarespaceCollectTarget {\n /** Page or collection URL on the live Squarespace site (without format query). */\n url: string;\n /** `collection` paginates `items[]`; `page` fetches a single static page/item. */\n kind?: \"auto\" | \"page\" | \"collection\";\n isHomePage?: boolean;\n}\n\ninterface WireRecord {\n [key: string]: unknown;\n}\n\ninterface WirePagination {\n nextPage?: boolean;\n nextPageUrl?: 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 asStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((entry): entry is string => typeof entry === \"string\");\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/** Append Squarespace `?format=json-pretty` (or `json`) to a site URL. */\nexport function buildJsonPrettyUrl(\n pageUrl: string,\n format: SquarespaceJsonFormat = SQUARESPACE_JSON_FORMAT,\n): string {\n const url = new URL(pageUrl);\n url.searchParams.set(\"format\", format);\n return url.toString();\n}\n\nfunction mapWorkflowState(state: unknown): SquarespacePage[\"status\"] {\n if (state === 1 || state === \"1\") return \"published\";\n if (state === 2 || state === \"2\") return \"draft\";\n return \"published\";\n}\n\nfunction mapPublishOn(value: unknown): string | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return undefined;\n return new Date(value).toISOString();\n}\n\nfunction readSeo(seoData: unknown, field: \"title\" | \"description\"): string | undefined {\n const record = asRecord(seoData);\n if (!record) return undefined;\n const value = record[field];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\n/** Infer block type from Squarespace LayoutEngine / Fluid Engine class names. */\nexport function inferBlockTypeFromClassName(className: string): string {\n const match = className.match(/\\bsqs-block-([a-z0-9-]+)\\b/i);\n if (!match?.[1]) return \"html\";\n const raw = match[1].toLowerCase();\n if (raw === \"horizontalrule\") return \"line\";\n return raw.replace(/-block$/g, \"\");\n}\n\n/** Parse rendered `body` HTML into block entries when wire JSON has no structured blocks. */\nexport function extractBlocksFromBodyHtml(html: string): SquarespaceBlock[] {\n if (!html.trim()) return [];\n const $ = cheerio.load(html, { xml: false });\n const blocks: SquarespaceBlock[] = [];\n\n $(\".sqs-block\").each((_, element) => {\n const el = $(element);\n const className = el.attr(\"class\") ?? \"\";\n const type = inferBlockTypeFromClassName(className);\n const id = el.attr(\"id\")?.replace(/^block-/, \"\");\n const content = el.find(\".sqs-block-content\").first();\n const innerHtml = (content.length ? content.html() : el.html()) ?? \"\";\n\n if (type === \"image\") {\n const img = content.find(\"img\").first();\n const imageUrl = img.attr(\"data-src\") ?? img.attr(\"src\") ?? undefined;\n blocks.push({\n id,\n type,\n imageUrl,\n altText: img.attr(\"alt\") ?? undefined,\n caption: content.find(\"figcaption\").text() || undefined,\n html: innerHtml || undefined,\n });\n return;\n }\n\n if (type === \"gallery\") {\n const items: SquarespaceGalleryItem[] = [];\n content.find(\"img\").each((idx, imgEl) => {\n const img = $(imgEl);\n const imageUrl = img.attr(\"data-src\") ?? img.attr(\"src\");\n if (!imageUrl) return;\n items.push({\n id: img.attr(\"data-image-id\") ?? `gallery-${idx}`,\n imageUrl,\n altText: img.attr(\"alt\") ?? undefined,\n });\n });\n blocks.push({ id, type, items, html: innerHtml || undefined });\n return;\n }\n\n if (type === \"button\") {\n const anchor = content.find(\"a\").first();\n blocks.push({\n id,\n type,\n url: anchor.attr(\"href\") ?? undefined,\n label: anchor.text() || undefined,\n html: innerHtml || undefined,\n });\n return;\n }\n\n if (type === \"video\" || type === \"embed\") {\n const iframe = content.find(\"iframe\").first();\n blocks.push({\n id,\n type: type === \"embed\" ? \"embed\" : \"video\",\n embedHtml: iframe.length ? $.html(iframe) : innerHtml || undefined,\n html: innerHtml || undefined,\n });\n return;\n }\n\n blocks.push({\n id,\n type,\n html: innerHtml || undefined,\n value: type === \"markdown\" || type === \"quote\" ? content.text() : undefined,\n });\n });\n\n return blocks;\n}\n\nfunction mapWireBlocks(value: unknown): SquarespaceBlock[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const blocks: SquarespaceBlock[] = [];\n for (const entry of value) {\n const record = asRecord(entry);\n if (!record) continue;\n const type = String(record.type ?? record.blockType ?? \"html\");\n blocks.push({\n id: record.id ? String(record.id) : undefined,\n type,\n html: typeof record.html === \"string\" ? record.html : undefined,\n value: typeof record.value === \"string\" ? record.value : undefined,\n imageUrl:\n typeof record.imageUrl === \"string\"\n ? record.imageUrl\n : typeof record.assetUrl === \"string\"\n ? record.assetUrl\n : undefined,\n altText: typeof record.altText === \"string\" ? record.altText : undefined,\n caption: typeof record.caption === \"string\" ? record.caption : undefined,\n url: typeof record.url === \"string\" ? record.url : undefined,\n label: typeof record.label === \"string\" ? record.label : undefined,\n embedHtml: typeof record.embedHtml === \"string\" ? record.embedHtml : undefined,\n items: Array.isArray(record.items)\n ? record.items\n .map((item) => asRecord(item))\n .filter((item): item is WireRecord => !!item)\n .map((item) => ({\n id: item.id ? String(item.id) : undefined,\n imageUrl: String(item.imageUrl ?? item.assetUrl ?? \"\"),\n altText: typeof item.altText === \"string\" ? item.altText : undefined,\n caption: typeof item.caption === \"string\" ? item.caption : undefined,\n }))\n .filter((item) => item.imageUrl.length > 0)\n : undefined,\n });\n }\n return blocks.length > 0 ? blocks : undefined;\n}\n\nfunction mapStructuredBlocksFromItem(item: WireRecord): SquarespaceBlock[] | undefined {\n const direct = mapWireBlocks(item.blocks);\n if (direct?.length) return direct;\n\n const sections = item.sections;\n if (!Array.isArray(sections)) return undefined;\n\n const flattened: SquarespaceBlock[] = [];\n for (const section of sections) {\n const sectionRecord = asRecord(section);\n if (!sectionRecord) continue;\n const rows = sectionRecord.rows;\n if (!Array.isArray(rows)) continue;\n for (const row of rows) {\n const rowRecord = asRecord(row);\n if (!rowRecord) continue;\n const columns = rowRecord.columns;\n if (!Array.isArray(columns)) continue;\n for (const column of columns) {\n const columnRecord = asRecord(column);\n if (!columnRecord) continue;\n const blocks = mapWireBlocks(columnRecord.blocks);\n if (blocks) flattened.push(...blocks);\n }\n }\n }\n return flattened.length > 0 ? flattened : undefined;\n}\n\nfunction mapWireItemContent(item: WireRecord): Pick<SquarespacePage, \"blocks\" | \"contentHtml\"> {\n const structured = mapStructuredBlocksFromItem(item);\n if (structured?.length) {\n return { blocks: structured };\n }\n\n const body = typeof item.body === \"string\" ? item.body : undefined;\n if (!body) return { contentHtml: \"\" };\n\n const parsedBlocks = extractBlocksFromBodyHtml(body);\n if (parsedBlocks.length > 0) {\n return { blocks: parsedBlocks };\n }\n return { contentHtml: body };\n}\n\nfunction isBlogCollection(collection: WireRecord | undefined): boolean {\n if (!collection) return false;\n const ordering = String(collection.ordering ?? \"\").toLowerCase();\n if (ordering === \"chronological\" || ordering === \"calendar\") return true;\n const typeName = String(collection.typeName ?? collection.typeLabel ?? \"\").toLowerCase();\n return typeName.includes(\"blog\");\n}\n\nfunction isStaticPageItem(item: WireRecord, collection: WireRecord | undefined): boolean {\n const recordTypeLabel = String(item.recordTypeLabel ?? \"\").toLowerCase();\n if (recordTypeLabel.includes(\"page\")) return true;\n const collectionType = String(collection?.typeName ?? collection?.typeLabel ?? \"\").toLowerCase();\n return collectionType === \"page\" || collectionType.includes(\"page-collection\");\n}\n\nfunction mapWireItemToPost(item: WireRecord): SquarespacePost {\n const content = mapWireItemContent(item);\n return {\n id: String(item.id ?? item.systemDataId ?? item.urlId ?? \"\"),\n title: String(item.title ?? \"Untitled\"),\n slug: sanitizeSlug(String(item.urlId ?? item.title ?? item.id ?? \"post\")),\n url: typeof item.fullUrl === \"string\" ? item.fullUrl : undefined,\n excerpt: typeof item.excerpt === \"string\" ? item.excerpt : undefined,\n publishedAt: mapPublishOn(item.publishOn ?? item.addedOn),\n status: mapWorkflowState(item.workflowState),\n categorySlugs: asStringArray(item.categories).map((slug) => sanitizeSlug(slug)),\n tagSlugs: asStringArray(item.tags).map((slug) => sanitizeSlug(slug)),\n featuredImageUrl: typeof item.assetUrl === \"string\" ? item.assetUrl : undefined,\n seoTitle: readSeo(item.seoData, \"title\"),\n seoDescription: readSeo(item.seoData, \"description\"),\n ...content,\n };\n}\n\nfunction mapWireItemToPage(\n item: WireRecord,\n options?: { isHomePage?: boolean; fallbackUrl?: string },\n): SquarespacePage {\n const content = mapWireItemContent(item);\n return {\n id: String(item.id ?? item.urlId ?? \"\"),\n title: String(item.title ?? \"Untitled\"),\n slug: sanitizeSlug(String(item.urlId ?? item.title ?? item.id ?? \"page\")),\n url:\n typeof item.fullUrl === \"string\"\n ? item.fullUrl\n : options?.fallbackUrl,\n status: mapWorkflowState(item.workflowState),\n isHomePage: options?.isHomePage,\n seoTitle: readSeo(item.seoData, \"title\"),\n seoDescription: readSeo(item.seoData, \"description\"),\n ...content,\n };\n}\n\nfunction mapWireCategories(collection: WireRecord | undefined): SquarespaceCategory[] {\n if (!collection) return [];\n return asStringArray(collection.categories).map((name) => ({\n id: `cat-${sanitizeSlug(name)}`,\n name,\n slug: sanitizeSlug(name),\n }));\n}\n\nfunction mapWireTags(items: WireRecord[]): SquarespaceTag[] {\n const seen = new Map<string, SquarespaceTag>();\n for (const item of items) {\n for (const tag of asStringArray(item.tags)) {\n const slug = sanitizeSlug(tag);\n if (!seen.has(slug)) {\n seen.set(slug, { id: `tag-${slug}`, name: tag, slug });\n }\n }\n }\n return [...seen.values()];\n}\n\nfunction siteFromWire(wire: WireRecord): SquarespaceExport[\"site\"] {\n const website = asRecord(wire.website);\n if (!website) return undefined;\n const url =\n typeof website.authenticUrl === \"string\"\n ? website.authenticUrl\n : typeof website.baseUrl === \"string\"\n ? website.baseUrl\n : undefined;\n const title = typeof website.siteTitle === \"string\" ? website.siteTitle : undefined;\n if (!url && !title) return undefined;\n return { url, title };\n}\n\n/** Map one Squarespace `?format=json-pretty` response into export partials. */\nexport function mapJsonPrettyWire(\n wire: unknown,\n context?: { fetchedUrl?: string; isHomePage?: boolean },\n): Partial<SquarespaceExport> {\n if (!isRecord(wire)) {\n throw new Error(\"Invalid Squarespace json-pretty response\");\n }\n\n const collection = asRecord(wire.collection);\n const partial: Partial<SquarespaceExport> = {\n site: siteFromWire(wire),\n pages: [],\n posts: [],\n categories: mapWireCategories(collection),\n tags: [],\n };\n\n if (Array.isArray(wire.items)) {\n const itemRecords = wire.items\n .map((entry) => asRecord(entry))\n .filter((entry): entry is WireRecord => !!entry);\n\n partial.tags = mapWireTags(itemRecords);\n\n for (const item of itemRecords) {\n if (isStaticPageItem(item, collection)) {\n partial.pages!.push(\n mapWireItemToPage(item, { fallbackUrl: context?.fetchedUrl, isHomePage: context?.isHomePage }),\n );\n } else {\n partial.posts!.push(mapWireItemToPost(item));\n }\n }\n return partial;\n }\n\n const item = asRecord(wire.item);\n if (item) {\n if (isStaticPageItem(item, collection)) {\n partial.pages!.push(\n mapWireItemToPage(item, { fallbackUrl: context?.fetchedUrl, isHomePage: context?.isHomePage }),\n );\n } else {\n partial.posts!.push(mapWireItemToPost(item));\n partial.tags = mapWireTags([item]);\n }\n return partial;\n }\n\n if (collection && isBlogCollection(collection) === false) {\n partial.pages!.push(\n mapWireItemToPage(\n {\n id: collection.id ?? collection.urlId ?? collection.fullUrl,\n title: collection.title ?? collection.navigationTitle,\n urlId: collection.urlId,\n fullUrl: collection.fullUrl ?? context?.fetchedUrl,\n body: collection.description,\n workflowState: collection.draft ? 2 : 1,\n seoData: collection.seoData,\n },\n { fallbackUrl: context?.fetchedUrl, isHomePage: context?.isHomePage },\n ),\n );\n }\n\n return partial;\n}\n\nfunction dedupeById<T extends { id: string }>(items: T[]): T[] {\n const seen = new Map<string, T>();\n for (const item of items) {\n seen.set(item.id, item);\n }\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) {\n seen.set(item.slug, item);\n }\n return [...seen.values()];\n}\n\n/** Merge multiple mapped partial exports into one canonical `SquarespaceExport`. */\nexport function mergeSquarespaceExportPartials(\n partials: Partial<SquarespaceExport>[],\n): SquarespaceExport {\n const merged: SquarespaceExport = {\n exportVersion: 1,\n exportedAt: new Date().toISOString(),\n pages: [],\n posts: [],\n categories: [],\n tags: [],\n };\n\n for (const partial of partials) {\n if (partial.site) merged.site = { ...merged.site, ...partial.site };\n merged.pages.push(...(partial.pages ?? []));\n merged.posts!.push(...(partial.posts ?? []));\n merged.categories!.push(...(partial.categories ?? []));\n merged.tags!.push(...(partial.tags ?? []));\n }\n\n merged.pages = dedupeById(merged.pages);\n merged.posts = dedupeById(merged.posts ?? []);\n merged.categories = dedupeBySlug(merged.categories ?? []);\n merged.tags = dedupeBySlug(merged.tags ?? []);\n return merged;\n}\n\nfunction paginationFromWire(wire: unknown): WirePagination | undefined {\n return asRecord(wire)?.pagination as WirePagination | undefined;\n}\n\nfunction inferTargetKind(target: SquarespaceCollectTarget): \"page\" | \"collection\" {\n if (target.kind && target.kind !== \"auto\") return target.kind;\n try {\n const pathname = new URL(target.url).pathname;\n if (pathname === \"/\" || pathname.endsWith(\"/\")) return \"collection\";\n } catch {\n return \"page\";\n }\n return \"page\";\n}\n\n/** Fetch json-pretty pages/collections and assemble a canonical export document. */\nexport class SquarespaceCollectionClient {\n readonly format: SquarespaceJsonFormat;\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: SquarespaceClientOptions = {}) {\n const parsed = squarespaceClientOptionsSchema.parse(options);\n this.format = parsed.format;\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 buildJsonPrettyUrl(pageUrl: string): string {\n return buildJsonPrettyUrl(pageUrl, this.format);\n }\n\n async fetchWire(url: string): Promise<unknown> {\n const response = await this.requestWithRetry(this.buildJsonPrettyUrl(url));\n return response.json() as Promise<unknown>;\n }\n\n async collectExport(targets: SquarespaceCollectTarget[]): Promise<SquarespaceExport> {\n if (targets.length === 0) {\n throw new Error(\"Squarespace collector requires at least one target URL\");\n }\n\n const partials: Partial<SquarespaceExport>[] = [];\n for (const target of targets) {\n const kind = inferTargetKind(target);\n if (kind === \"collection\") {\n partials.push(...(await this.collectCollectionPages(target)));\n } else {\n const wire = await this.fetchWire(target.url);\n partials.push(\n mapJsonPrettyWire(wire, { fetchedUrl: target.url, isHomePage: target.isHomePage }),\n );\n }\n }\n\n return mergeSquarespaceExportPartials(partials);\n }\n\n private async collectCollectionPages(\n target: SquarespaceCollectTarget,\n ): Promise<Partial<SquarespaceExport>[]> {\n const partials: Partial<SquarespaceExport>[] = [];\n let nextUrl: string | undefined = target.url;\n\n while (nextUrl) {\n const wire = await this.fetchWire(nextUrl);\n partials.push(\n mapJsonPrettyWire(wire, { fetchedUrl: nextUrl, isHomePage: target.isHomePage }),\n );\n\n const pagination = paginationFromWire(wire);\n if (!pagination?.nextPage || !pagination.nextPageUrl) break;\n const base = new URL(target.url);\n nextUrl = new URL(pagination.nextPageUrl, `${base.origin}/`).toString();\n }\n\n return partials;\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: { Accept: \"application/json\" },\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 `Squarespace 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","export type BuilderHtmlTag = \"img\" | \"video\" | \"iframe\";\nexport type TextHtmlTag = \"p\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n\n/** Bucket 1 — shortcodes with asset URL params → standard HTML. */\nexport interface BuilderUrlRule {\n shortcodePrefix: string;\n urlParams: string[];\n tag: BuilderHtmlTag;\n}\n\n/** Bucket 1 — shortcodes with text params → semantic HTML. */\nexport interface BuilderTextRule {\n shortcodePrefix: string;\n fields: { param: string; tag: TextHtmlTag }[];\n}\n\n/** Bucket 1 — shortcodes with inner HTML (+ optional image param). */\nexport interface BuilderWrapperRule {\n shortcodePrefix: string;\n urlParams?: string[];\n}\n\n/** Bucket 1 — image-based icon modules (`icon_image` param) → linked `<img>`. */\nexport interface BuilderIconImageRule {\n shortcodePrefix: string;\n imageParam: string;\n hrefParam?: string;\n}\n\n/** Bucket 1 — dynamic embeds replaced with a static migration placeholder. */\nexport interface BuilderPlaceholderRule {\n shortcodePrefix: string;\n html: string;\n}\n\n/** Profile A — prefixed namespace tokens (Tatsu, Divi, WPBakery, …). */\nexport interface PrefixedLayoutMap {\n kind: \"prefixed\";\n sectionRegex: RegExp;\n sectionCloseRegex: RegExp;\n rowRegex: RegExp;\n rowCloseRegex: RegExp;\n columnRegex: RegExp;\n columnCloseRegex: RegExp;\n bgParamName?: string;\n colsParamName?: string;\n}\n\n/** Profile B — legacy Blox fractional column tokens (`one_third`, `one_half`, …). */\nexport interface FractionalLayoutMap {\n kind: \"fractional\";\n sectionRegex: RegExp;\n sectionCloseRegex: RegExp;\n rowRegex: RegExp;\n rowCloseRegex: RegExp;\n columnTokens: string[];\n columnOpenRegexes: RegExp[];\n columnCloseRegexes: RegExp[];\n columnWidths: Record<string, string>;\n bgParamName?: string;\n}\n\n/** Profile C — multiple tokens per layout role (Blox prefixed, WPBakery inner columns, …). */\nexport interface ExtendedPrefixedLayoutLevel {\n role: \"section\" | \"row\" | \"column\";\n tokens: string[];\n bgParamName?: string;\n colsParamName?: string;\n widthParamName?: string;\n}\n\nexport interface ExtendedPrefixedLayoutMap {\n kind: \"extended-prefixed\";\n levels: ExtendedPrefixedLayoutLevel[];\n}\n\nexport type StructuralLayoutMap =\n | PrefixedLayoutMap\n | FractionalLayoutMap\n | ExtendedPrefixedLayoutMap;\n\nfunction layoutEscapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction shortcodeOpenRegex(token: string): RegExp {\n return new RegExp(`\\\\[${layoutEscapeRegExp(token)}\\\\b([^\\\\]]*)\\\\]`, \"gi\");\n}\n\nfunction shortcodeCloseRegex(token: string): RegExp {\n return new RegExp(`\\\\[\\\\/${layoutEscapeRegExp(token)}\\\\b[^\\\\]]*\\\\]`, \"gi\");\n}\n\nconst FRACTIONAL_COLUMN_WIDTHS: Record<string, string> = {\n one_col: \"100%\",\n one_half: \"50%\",\n one_third: \"33.33%\",\n two_third: \"66.67%\",\n two_thirds: \"66.67%\",\n one_fourth: \"25%\",\n three_fourth: \"75%\",\n three_fourths: \"75%\",\n};\n\nexport function parseFractionalColumnWidth(token: string): string | undefined {\n return FRACTIONAL_COLUMN_WIDTHS[token];\n}\n\n/** Profile A — section/row/column share a static namespace prefix. */\nexport function prefixedLayoutMap(config: {\n section: string;\n row: string;\n column: string;\n bgParamName?: string;\n colsParamName?: string;\n}): PrefixedLayoutMap {\n return {\n kind: \"prefixed\",\n sectionRegex: shortcodeOpenRegex(config.section),\n sectionCloseRegex: shortcodeCloseRegex(config.section),\n rowRegex: shortcodeOpenRegex(config.row),\n rowCloseRegex: shortcodeCloseRegex(config.row),\n columnRegex: shortcodeOpenRegex(config.column),\n columnCloseRegex: shortcodeCloseRegex(config.column),\n bgParamName: config.bgParamName,\n colsParamName: config.colsParamName,\n };\n}\n\n/** Profile B — legacy Blox/Oshine mathematical column shortcodes. */\n/** Profile C — map several shortcode names per section/row/column role (longest token first). */\nexport function extendedPrefixedLayoutMap(\n levels: ExtendedPrefixedLayoutLevel[],\n): ExtendedPrefixedLayoutMap {\n return { kind: \"extended-prefixed\", levels };\n}\n\nexport function fractionalLayoutMap(config: {\n section: string;\n row: string;\n columns: string[];\n bgParamName?: string;\n}): FractionalLayoutMap {\n const columnWidths: Record<string, string> = {};\n for (const token of config.columns) {\n const width = parseFractionalColumnWidth(token);\n if (width) columnWidths[token] = width;\n }\n\n return {\n kind: \"fractional\",\n sectionRegex: shortcodeOpenRegex(config.section),\n sectionCloseRegex: shortcodeCloseRegex(config.section),\n rowRegex: shortcodeOpenRegex(config.row),\n rowCloseRegex: shortcodeCloseRegex(config.row),\n columnTokens: config.columns,\n columnOpenRegexes: config.columns.map(shortcodeOpenRegex),\n columnCloseRegexes: config.columns.map(shortcodeCloseRegex),\n columnWidths,\n bgParamName: config.bgParamName,\n };\n}\n\n/** Per builder-family registry entry — declarative map executed by the flatten engine. */\nexport interface BuilderThemeConfig {\n id: string;\n detect: RegExp;\n layoutMap?: StructuralLayoutMap;\n /** Additional layout maps applied after `layoutMap` (e.g. Blox prefixed + legacy fractional). */\n layoutMaps?: StructuralLayoutMap[];\n urlRules?: BuilderUrlRule[];\n textRules?: BuilderTextRule[];\n wrapperRules?: BuilderWrapperRule[];\n iconImageRules?: BuilderIconImageRule[];\n placeholderRules?: BuilderPlaceholderRule[];\n scaffoldingPrefixes?: string[];\n legacyScaffoldingTokens?: string[];\n}\n\n/** @deprecated Alias — families not themes. */\nexport type BuilderFamilyConfig = BuilderThemeConfig;\n\n/** Shortcodes that cannot become static HTML — reported in conflicts, never stripped. */\nexport const UNRESOLVABLE_SHORTCODE_PREFIXES = [\n \"portfolio\",\n \"recent_posts\",\n \"woocommerce_cart\",\n \"woocommerce_checkout\",\n \"woocommerce_my_account\",\n] as const;\n\nexport const WORDPRESS_BUILDER_REGISTRY: BuilderThemeConfig[] = [\n {\n id: \"tatsu\",\n detect: /\\[(?:\\/)?tatsu_/i,\n layoutMap: prefixedLayoutMap({\n section: \"tatsu_section\",\n row: \"tatsu_row\",\n column: \"tatsu_column\",\n bgParamName: \"bg_image\",\n colsParamName: \"layout\",\n }),\n wrapperRules: [\n { shortcodePrefix: \"tatsu_text\" },\n { shortcodePrefix: \"tatsu_inline_text\" },\n { shortcodePrefix: \"tatsu_text_with_shortcodes\" },\n ],\n urlRules: [\n { shortcodePrefix: \"tatsu_image\", urlParams: [\"image\", \"url\", \"src\"], tag: \"img\" },\n { shortcodePrefix: \"tatsu_single_image\", urlParams: [\"image\", \"url\", \"src\"], tag: \"img\" },\n { shortcodePrefix: \"tatsu_video\", urlParams: [\"video\", \"src\", \"url\"], tag: \"video\" },\n ],\n iconImageRules: [\n { shortcodePrefix: \"tatsu_icon\", imageParam: \"icon_image\", hrefParam: \"href\" },\n ],\n scaffoldingPrefixes: [\"tatsu_\"],\n },\n {\n id: \"divi\",\n detect: /\\[(?:\\/)?et_pb_/i,\n layoutMap: prefixedLayoutMap({\n section: \"et_pb_section\",\n row: \"et_pb_row\",\n column: \"et_pb_column\",\n bgParamName: \"background_image\",\n }),\n urlRules: [{ shortcodePrefix: \"et_pb_image\", urlParams: [\"src\", \"url\"], tag: \"img\" }],\n scaffoldingPrefixes: [\"et_pb_\"],\n },\n {\n id: \"wpbakery\",\n detect: /\\[(?:\\/)?vc_/i,\n layoutMap: extendedPrefixedLayoutMap([\n { role: \"section\", tokens: [\"vc_section\"], bgParamName: \"bg_image\" },\n { role: \"row\", tokens: [\"vc_row\"], colsParamName: \"layout\" },\n { role: \"column\", tokens: [\"vc_column_inner\", \"vc_column\"], widthParamName: \"width\" },\n ]),\n urlRules: [\n { shortcodePrefix: \"vc_single_image\", urlParams: [\"image\", \"src\", \"url\"], tag: \"img\" },\n ],\n scaffoldingPrefixes: [\"vc_\"],\n },\n {\n id: \"fusion\",\n detect: /\\[(?:\\/)?fusion_/i,\n layoutMap: prefixedLayoutMap({\n section: \"fusion_builder_container\",\n row: \"fusion_builder_row\",\n column: \"fusion_builder_column\",\n bgParamName: \"background_image\",\n }),\n scaffoldingPrefixes: [\"fusion_\"],\n },\n {\n id: \"beaver\",\n detect: /\\[(?:\\/)?fl_(?:row|col|builder)/i,\n layoutMap: extendedPrefixedLayoutMap([\n { role: \"row\", tokens: [\"fl_row\"] },\n { role: \"column\", tokens: [\"fl_col\"] },\n ]),\n scaffoldingPrefixes: [\"fl_\"],\n },\n {\n id: \"elementor\",\n detect: /\\[(?:\\/)?elementor[-_]/i,\n urlRules: [\n { shortcodePrefix: \"elementor-widget\", urlParams: [\"url\", \"src\", \"image\"], tag: \"img\" },\n ],\n scaffoldingPrefixes: [\"elementor_\"],\n },\n {\n id: \"oshine\",\n detect:\n /\\[(?:special_sub_title|special_heading5|blox_\\w+|grid_content|grids|testimonial\\b|portfolio\\b|recent_posts\\b|animate_icon\\w*|section\\b|row\\b|one_col|one_third|one_half|one_fourth|two_third|three_fourth|text\\b)/i,\n layoutMap: fractionalLayoutMap({\n section: \"section\",\n row: \"row\",\n columns: [\n \"one_col\",\n \"one_third\",\n \"two_third\",\n \"two_thirds\",\n \"one_half\",\n \"one_fourth\",\n \"three_fourth\",\n \"three_fourths\",\n ],\n bgParamName: \"bg_image\",\n }),\n layoutMaps: [\n extendedPrefixedLayoutMap([\n { role: \"section\", tokens: [\"blox_row\"], bgParamName: \"bg_image\" },\n { role: \"row\", tokens: [\"blox_row_inner\"], colsParamName: \"columns\" },\n {\n role: \"column\",\n tokens: [\"blox_column_inner\", \"blox_column\"],\n widthParamName: \"width\",\n },\n ]),\n ],\n textRules: [\n {\n shortcodePrefix: \"special_sub_title\",\n fields: [{ param: \"title_content\", tag: \"p\" }],\n },\n {\n shortcodePrefix: \"special_heading5\",\n fields: [\n { param: \"title_content\", tag: \"h2\" },\n { param: \"caption_content\", tag: \"h4\" },\n ],\n },\n ],\n wrapperRules: [\n { shortcodePrefix: \"grid_content\" },\n { shortcodePrefix: \"testimonial\", urlParams: [\"author_image\"] },\n { shortcodePrefix: \"blox_text\" },\n ],\n urlRules: [\n { shortcodePrefix: \"blox_image\", urlParams: [\"image\", \"img\", \"src\", \"url\"], tag: \"img\" },\n ],\n placeholderRules: [\n {\n shortcodePrefix: \"blox_gmap\",\n html: '<p data-unresolved-shortcode=\"blox_gmap\"><!-- Map embed removed during migration --></p>',\n },\n ],\n scaffoldingPrefixes: [\"blox_\", \"animate_icon\"],\n legacyScaffoldingTokens: [\"text\", \"icon\", \"linebreak\", \"grids\", \"testimonials\"],\n },\n];\n\n/** @deprecated Use urlRules on BuilderThemeConfig — kept for type migration clarity. */\nexport type BuilderContentRule = BuilderUrlRule;\n","import {\n UNRESOLVABLE_SHORTCODE_PREFIXES,\n} from \"./registry.js\";\n\nexport interface WordPressShortcodeMarker {\n shortcode: string;\n unresolvable: boolean;\n}\n\nconst SHORTCODE_PATTERN = /\\[(\\/?)([a-z][a-z0-9_-]*)\\b[^\\]]*\\]/gi;\n\nfunction isUnresolvable(name: string): boolean {\n const lower = name.toLowerCase();\n if (UNRESOLVABLE_SHORTCODE_PREFIXES.includes(lower as (typeof UNRESOLVABLE_SHORTCODE_PREFIXES)[number])) {\n return true;\n }\n return lower.startsWith(\"woocommerce_\");\n}\n\n/** Collect remaining WordPress shortcode tokens after builder flattening. */\nexport function findWordPressShortcodeMarkers(contentHtml: string): WordPressShortcodeMarker[] {\n if (!contentHtml.trim()) return [];\n\n const seen = new Set<string>();\n const markers: WordPressShortcodeMarker[] = [];\n\n for (const match of contentHtml.matchAll(SHORTCODE_PATTERN)) {\n const closing = match[1] === \"/\";\n const name = (match[2] ?? \"\").toLowerCase();\n if (!name || closing) continue;\n\n const key = name;\n if (seen.has(key)) continue;\n seen.add(key);\n\n markers.push({\n shortcode: name,\n unresolvable: isUnresolvable(name),\n });\n }\n\n return markers.sort((a, b) => a.shortcode.localeCompare(b.shortcode));\n}\n\nexport function hasUnresolvableShortcodes(contentHtml: string): boolean {\n return findWordPressShortcodeMarkers(contentHtml).some((m) => m.unresolvable);\n}\n\nexport { UNRESOLVABLE_SHORTCODE_PREFIXES };\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport type { EntityBundle } from \"../normalizer/bundle.js\";\nimport { buildPortfolioMediaLinks } from \"../normalizer/portfolio-media.js\";\nimport type { ConflictReport } from \"./conflicts.js\";\nimport type { MigrationReport } from \"./migration-report.js\";\n\nexport interface WriteFilesystemOptions {\n outDir: string;\n bundle: EntityBundle;\n conflicts?: ConflictReport;\n report?: MigrationReport;\n}\n\nasync function writeJson(path: string, data: unknown): Promise<void> {\n await writeFile(path, `${JSON.stringify(data, null, 2)}\\n`, \"utf8\");\n}\n\nexport async function writeFilesystemExport(options: WriteFilesystemOptions): Promise<void> {\n await mkdir(options.outDir, { recursive: true });\n\n await writeJson(join(options.outDir, \"posts.json\"), options.bundle.posts);\n await writeJson(join(options.outDir, \"pages.json\"), options.bundle.pages);\n await writeJson(join(options.outDir, \"media.json\"), options.bundle.media);\n await writeJson(join(options.outDir, \"portfolios.json\"), options.bundle.portfolios);\n await writeJson(\n join(options.outDir, \"portfolio-media.json\"),\n buildPortfolioMediaLinks(options.bundle),\n );\n await writeJson(join(options.outDir, \"categories.json\"), options.bundle.categories);\n await writeJson(join(options.outDir, \"tags.json\"), options.bundle.tags);\n\n if (options.conflicts) {\n await writeJson(join(options.outDir, \"conflicts.json\"), options.conflicts);\n }\n if (options.report) {\n await writeJson(join(options.outDir, \"migration-report.json\"), options.report);\n }\n}\n\nexport function bundleToCombinedJson(bundle: EntityBundle): Record<string, unknown> {\n return {\n posts: bundle.posts,\n pages: bundle.pages,\n media: bundle.media,\n portfolios: bundle.portfolios,\n portfolioMedia: buildPortfolioMediaLinks(bundle),\n categories: bundle.categories,\n tags: bundle.tags,\n };\n}\n","import type { EntityBundle } from \"../normalizer/bundle.js\";\nimport { emptyBundle } from \"../normalizer/bundle.js\";\nimport { buildPortfolioMediaLinks } from \"../normalizer/portfolio-media.js\";\nimport type {\n NormalizedAsset,\n NormalizedCategory,\n NormalizedPage,\n NormalizedPortfolio,\n NormalizedPost,\n NormalizedTag,\n PortfolioMediaLink,\n} from \"../normalizer/types.js\";\nimport type {\n CreatePageResult,\n CreatePostResult,\n MigrationRedirect,\n MigrationSink,\n UploadAssetInput,\n UploadAssetResult,\n} from \"./types.js\";\nimport { writeFilesystemExport, type WriteFilesystemOptions } from \"./filesystem.js\";\n\n/** Reference MigrationSink that accumulates entities and writes M0 JSON bundles. */\nexport class FilesystemMigrationSink implements MigrationSink {\n readonly bundle: EntityBundle = emptyBundle();\n readonly portfolioMediaLinks: PortfolioMediaLink[] = [];\n readonly redirects: MigrationRedirect[] = [];\n\n async createCategory(category: NormalizedCategory): Promise<{ targetId: string }> {\n this.bundle.categories.push(category);\n return { targetId: category.sourceId };\n }\n\n async createTag(tag: NormalizedTag): Promise<{ targetId: string }> {\n this.bundle.tags.push(tag);\n return { targetId: tag.sourceId };\n }\n\n async uploadAsset(input: UploadAssetInput): Promise<UploadAssetResult> {\n this.bundle.media.push(input.asset);\n return {\n targetId: input.asset.sourceId,\n publicUrl: input.asset.sourceUrl,\n };\n }\n\n async createPortfolio(portfolio: NormalizedPortfolio): Promise<{ targetId: string }> {\n this.bundle.portfolios.push(portfolio);\n return { targetId: portfolio.sourceId };\n }\n\n async createPost(post: NormalizedPost): Promise<CreatePostResult> {\n this.bundle.posts.push(post);\n return {\n targetId: post.sourceId,\n publicPath: post.source.path ?? `/${post.slug}`,\n };\n }\n\n async createPage(page: NormalizedPage): Promise<CreatePageResult> {\n this.bundle.pages.push(page);\n return {\n targetId: page.sourceId,\n publicPath: page.source.path ?? `/${page.slug}`,\n };\n }\n\n async linkPortfolioMedia(link: PortfolioMediaLink): Promise<void> {\n this.portfolioMediaLinks.push(link);\n }\n\n async writeRedirect(redirect: MigrationRedirect): Promise<void> {\n this.redirects.push(redirect);\n }\n\n async flush(options: WriteFilesystemOptions): Promise<void> {\n await writeFilesystemExport({\n ...options,\n bundle: this.bundle,\n });\n }\n}\n\nexport function createFilesystemMigrationSink(): FilesystemMigrationSink {\n return new FilesystemMigrationSink();\n}\n\n/** Verify sink-produced M2M links match bundle-derived index. */\nexport function portfolioMediaMatchesBundle(\n sink: FilesystemMigrationSink,\n): boolean {\n const expected = buildPortfolioMediaLinks(sink.bundle);\n if (expected.length !== sink.portfolioMediaLinks.length) return false;\n return expected.every((link, index) => {\n const actual = sink.portfolioMediaLinks[index];\n return (\n actual?.portfolioSourceId === link.portfolioSourceId &&\n actual?.assetSourceId === link.assetSourceId &&\n actual?.sort === link.sort\n );\n });\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport type { EntityBundle } from \"../normalizer/bundle.js\";\nimport { bundleCounts } from \"../normalizer/bundle.js\";\nimport type { MigrationPlatform } from \"../normalizer/types.js\";\nimport type { ConflictReport } from \"./conflicts.js\";\n\nexport type MigrationRunMode = \"dry-run\" | \"export\" | \"sink\" | \"worker\";\n\nexport interface MigrationReport {\n runId: string;\n platform: MigrationPlatform;\n mode: MigrationRunMode;\n startedAt: string;\n finishedAt: string;\n summary: {\n posts: number;\n pages: number;\n assets: number;\n portfolios: number;\n categories: number;\n tags: number;\n storageBytesEstimated?: number;\n };\n warnings: string[];\n errors: string[];\n conflicts: ConflictReport;\n redirectMap: { fromPath: string; toPath: string; statusCode: number }[];\n}\n\nexport function buildMigrationReport(input: {\n platform: MigrationPlatform;\n mode: MigrationRunMode;\n bundle: EntityBundle;\n conflicts: ConflictReport;\n redirectMap: { fromPath: string; toPath: string; statusCode: number }[];\n startedAt: Date;\n finishedAt?: Date;\n storageBytesEstimated?: number;\n warnings?: string[];\n errors?: string[];\n runId?: string;\n}): MigrationReport {\n const counts = bundleCounts(input.bundle);\n return {\n runId: input.runId ?? randomUUID(),\n platform: input.platform,\n mode: input.mode,\n startedAt: input.startedAt.toISOString(),\n finishedAt: (input.finishedAt ?? new Date()).toISOString(),\n summary: {\n ...counts,\n storageBytesEstimated: input.storageBytesEstimated,\n },\n warnings: input.warnings ?? [],\n errors: input.errors ?? [],\n conflicts: input.conflicts,\n redirectMap: input.redirectMap,\n };\n}\n","import type { NormalizedAsset } from \"../normalizer/types.js\";\n\nexport const FALLBACK_ASSET_BYTES = 4 * 1024 * 1024; // 4 MB\n\nexport interface AssetSizeResult {\n sourceId: string;\n url: string;\n bytes: number;\n source: \"head\" | \"fallback\";\n error?: string;\n}\n\nexport interface StorageEstimate {\n totalBytes: number;\n assets: AssetSizeResult[];\n}\n\nexport interface EstimateStorageOptions {\n assets: NormalizedAsset[];\n /** When true, skip network and use fallback for all assets. */\n offline?: boolean;\n fetchFn?: typeof fetch;\n}\n\nexport async function estimateStorage(\n options: EstimateStorageOptions,\n): Promise<StorageEstimate> {\n const fetchFn = options.fetchFn ?? fetch;\n const results: AssetSizeResult[] = [];\n\n for (const asset of options.assets) {\n if (options.offline) {\n results.push({\n sourceId: asset.sourceId,\n url: asset.sourceUrl,\n bytes: FALLBACK_ASSET_BYTES,\n source: \"fallback\",\n error: \"offline_mode\",\n });\n continue;\n }\n\n try {\n const response = await fetchFn(asset.sourceUrl, {\n method: \"HEAD\",\n signal: AbortSignal.timeout(8000),\n });\n\n if (response.ok) {\n const length = response.headers.get(\"content-length\");\n const bytes = length ? Number.parseInt(length, 10) : FALLBACK_ASSET_BYTES;\n results.push({\n sourceId: asset.sourceId,\n url: asset.sourceUrl,\n bytes: Number.isFinite(bytes) ? bytes : FALLBACK_ASSET_BYTES,\n source: \"head\",\n });\n } else {\n results.push({\n sourceId: asset.sourceId,\n url: asset.sourceUrl,\n bytes: FALLBACK_ASSET_BYTES,\n source: \"fallback\",\n error: `http_${response.status}`,\n });\n }\n } catch (error) {\n results.push({\n sourceId: asset.sourceId,\n url: asset.sourceUrl,\n bytes: FALLBACK_ASSET_BYTES,\n source: \"fallback\",\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n const totalBytes = results.reduce((sum, r) => sum + r.bytes, 0);\n return { totalBytes, assets: results };\n}\n\nexport function staleUrlsFromEstimate(estimate: StorageEstimate) {\n return estimate.assets\n .filter((a) => a.source === \"fallback\" && a.error && a.error !== \"offline_mode\")\n .map((a) => ({\n sourceId: a.sourceId,\n url: a.url,\n reason: a.error ?? \"unknown\",\n }));\n}\n","import { collectEntities, type EntityBundle } from \"../normalizer/bundle.js\";\nimport type { MigrationAdapter, MigrationPlatform } from \"../normalizer/types.js\";\nimport {\n analyzeConflicts,\n buildRedirectMap,\n detectRedirectLoops,\n hasBlockingConflicts,\n hasWarnings,\n type ConflictReport,\n} from \"./conflicts.js\";\nimport { buildMigrationReport, type MigrationReport } from \"./migration-report.js\";\nimport { estimateStorage, staleUrlsFromEstimate } from \"./storage-estimate.js\";\n\nexport interface DryRunOptions {\n adapter: MigrationAdapter;\n input: unknown;\n platform: MigrationPlatform;\n offlineStorageEstimate?: boolean;\n fetchFn?: typeof fetch;\n}\n\nexport interface DryRunResult {\n bundle: EntityBundle;\n conflicts: ConflictReport;\n report: MigrationReport;\n exitCode: 0 | 1 | 2;\n}\n\nexport async function runDryRun(options: DryRunOptions): Promise<DryRunResult> {\n const startedAt = new Date();\n const bundle = await collectEntities(\n options.adapter.enumerateEntities({ input: options.input }),\n );\n\n const estimate = await estimateStorage({\n assets: bundle.media,\n offline: options.offlineStorageEstimate,\n fetchFn: options.fetchFn,\n });\n\n const redirectMap = buildRedirectMap(bundle);\n const redirectLoops = detectRedirectLoops(redirectMap);\n const staleAssetUrls = staleUrlsFromEstimate(estimate);\n\n const conflicts = analyzeConflicts(bundle, { staleAssetUrls, redirectLoops });\n\n const warnings: string[] = [];\n if (staleAssetUrls.length > 0) {\n warnings.push(`${staleAssetUrls.length} asset URL(s) unreachable; used 4 MB fallback each`);\n }\n if (conflicts.duplicatePostSlugs.length > 0) {\n warnings.push(\n `${conflicts.duplicatePostSlugs.length} duplicate post slug group(s); host may auto-suffix`,\n );\n }\n\n const report = buildMigrationReport({\n platform: options.platform,\n mode: \"dry-run\",\n bundle,\n conflicts,\n redirectMap,\n startedAt,\n storageBytesEstimated: estimate.totalBytes,\n warnings,\n });\n\n let exitCode: 0 | 1 | 2 = 0;\n if (hasBlockingConflicts(conflicts)) exitCode = 1;\n else if (hasWarnings(conflicts) || warnings.length > 0) exitCode = 2;\n\n return { bundle, conflicts, report, exitCode };\n}\n"],"mappings":"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","names":["cheerio","item"]}
@@ -1,3 +1,8 @@
1
+ import {
2
+ isMigrationMediaRef,
3
+ parseMigrationMediaRef
4
+ } from "./chunk-BOYB6XRA.js";
5
+
1
6
  // src/transformers/html-to-grapes/index.ts
2
7
  import * as cheerio from "cheerio";
3
8
 
@@ -835,6 +840,79 @@ function validateTiptapDoc(doc, options = {}) {
835
840
  return { ok: true, issues: [] };
836
841
  }
837
842
 
843
+ // src/transformers/expand-migration-media-refs.ts
844
+ import * as cheerio3 from "cheerio";
845
+ var BACKGROUND_IMAGE_URL_PATTERN = /background(?:-image)?\s*:[^;]*?url\s*\(\s*(['"]?)([^'")]+)\1\s*\)/gi;
846
+ function tryExpandRef(value, resolvePublicUrl, unresolved) {
847
+ if (!isMigrationMediaRef(value)) return void 0;
848
+ const sourceId = parseMigrationMediaRef(value);
849
+ if (!sourceId) {
850
+ unresolved.add(value);
851
+ return void 0;
852
+ }
853
+ const publicUrl = resolvePublicUrl(sourceId);
854
+ if (!publicUrl) {
855
+ unresolved.add(value);
856
+ return void 0;
857
+ }
858
+ return publicUrl;
859
+ }
860
+ function expandBackgroundUrlsInStyle(style, resolvePublicUrl, unresolved) {
861
+ return style.replace(BACKGROUND_IMAGE_URL_PATTERN, (full, quote, rawUrl) => {
862
+ const expanded = tryExpandRef(rawUrl.trim(), resolvePublicUrl, unresolved);
863
+ if (!expanded) return full;
864
+ const urlCall = quote ? `url(${quote}${expanded}${quote})` : `url(${expanded})`;
865
+ return full.replace(/url\s*\(\s*(['"]?)([^'")]+)\1\s*\)/i, urlCall);
866
+ });
867
+ }
868
+ function expandSrcset(srcset, resolvePublicUrl, unresolved) {
869
+ return srcset.split(",").map((entry) => {
870
+ const trimmed = entry.trim();
871
+ if (!trimmed) return entry;
872
+ const [urlPart, descriptor] = trimmed.split(/\s+/, 2);
873
+ const expanded = tryExpandRef(urlPart ?? "", resolvePublicUrl, unresolved);
874
+ if (!expanded) return entry;
875
+ return descriptor ? `${expanded} ${descriptor}` : expanded;
876
+ }).join(", ");
877
+ }
878
+ function expandMigrationMediaRefs(html, resolvePublicUrl) {
879
+ if (!html.trim()) {
880
+ return { html, unresolved: [] };
881
+ }
882
+ const $ = cheerio3.load(html, { xml: false });
883
+ const unresolved = /* @__PURE__ */ new Set();
884
+ $("img").each((_, element) => {
885
+ const img = $(element);
886
+ const src = img.attr("src")?.trim();
887
+ if (src) {
888
+ const expanded = tryExpandRef(src, resolvePublicUrl, unresolved);
889
+ if (expanded) img.attr("src", expanded);
890
+ }
891
+ const srcset = img.attr("srcset")?.trim();
892
+ if (srcset) {
893
+ img.attr("srcset", expandSrcset(srcset, resolvePublicUrl, unresolved));
894
+ }
895
+ });
896
+ $("[data-bg-image]").each((_, element) => {
897
+ const node = $(element);
898
+ const bgImage = node.attr("data-bg-image")?.trim();
899
+ if (!bgImage) return;
900
+ const expanded = tryExpandRef(bgImage, resolvePublicUrl, unresolved);
901
+ if (expanded) node.attr("data-bg-image", expanded);
902
+ });
903
+ $("[style]").each((_, element) => {
904
+ const node = $(element);
905
+ const style = node.attr("style");
906
+ if (!style?.includes("background")) return;
907
+ const rewritten = expandBackgroundUrlsInStyle(style, resolvePublicUrl, unresolved);
908
+ if (rewritten !== style) node.attr("style", rewritten);
909
+ });
910
+ return {
911
+ html: $.root().html() ?? html,
912
+ unresolved: [...unresolved]
913
+ };
914
+ }
915
+
838
916
  export {
839
917
  cssToStyles,
840
918
  htmlToGrapes,
@@ -846,6 +924,7 @@ export {
846
924
  tiptapMarkSchema,
847
925
  tiptapNodeSchema,
848
926
  tiptapDocSchema,
849
- validateTiptapDoc
927
+ validateTiptapDoc,
928
+ expandMigrationMediaRefs
850
929
  };
851
- //# sourceMappingURL=chunk-CIOYDRY5.js.map
930
+ //# sourceMappingURL=chunk-S4XYG4SM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/transformers/html-to-grapes/index.ts","../src/transformers/css-to-styles/index.ts","../src/transformers/html-to-grapes/walk.ts","../src/transformers/html-to-tiptap/index.ts","../src/transformers/html-to-tiptap/walk.ts","../src/transformers/validate-snapshot.ts","../src/transformers/validate-tiptap-doc.ts","../src/transformers/expand-migration-media-refs.ts"],"sourcesContent":["import * as cheerio from \"cheerio\";\n\nimport { cssToStyles } from \"../css-to-styles/index.js\";\nimport type { GrapesProjectSnapshot, HtmlToGrapesOptions } from \"./types.js\";\nimport { walkHtmlToComponents } from \"./walk.js\";\n\nexport type {\n GrapesComponent,\n GrapesProjectSnapshot,\n GrapesStyleRule,\n HtmlToGrapesOptions,\n LayoutKind,\n LayoutTypeMap,\n} from \"./types.js\";\n\n/** Cheerio HTML walk → Grapes `content` + root `styles`. */\nexport function htmlToGrapes(html: string, options: HtmlToGrapesOptions = {}): GrapesProjectSnapshot {\n const trimmed = html.trim();\n if (!trimmed) {\n return { content: [], styles: [] };\n }\n\n const $ = cheerio.load(trimmed, { xml: false });\n const styleBlocks: string[] = [];\n\n $(\"style\").each((_, element) => {\n styleBlocks.push($(element).html() ?? \"\");\n $(element).remove();\n });\n\n const contentCss = styleBlocks.join(\"\\n\").trim();\n const styles = cssToStyles(contentCss);\n const content = walkHtmlToComponents($, options);\n const contentHtml = serializeContentHtml($);\n\n return {\n content,\n styles,\n ...(contentHtml ? { contentHtml } : {}),\n ...(contentCss ? { contentCss } : {}),\n };\n}\n\nfunction serializeContentHtml($: cheerio.CheerioAPI): string | undefined {\n const body = $(\"body\");\n if (body.length) {\n const html = body.html()?.trim();\n return html || undefined;\n }\n\n const rootHtml = $.root().html()?.trim();\n return rootHtml || undefined;\n}\n","import type { GrapesStyleRule } from \"../html-to-grapes/types.js\";\n\nfunction stripCssComments(css: string): string {\n return css.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\");\n}\n\nfunction parseDeclarations(block: string): Record<string, string> {\n const style: Record<string, string> = {};\n for (const declaration of block.split(\";\")) {\n const trimmed = declaration.trim();\n if (!trimmed) continue;\n const separator = trimmed.indexOf(\":\");\n if (separator === -1) continue;\n const property = trimmed.slice(0, separator).trim();\n const value = trimmed.slice(separator + 1).trim();\n if (!property || !value) continue;\n style[property] = value;\n }\n return style;\n}\n\n/** Parse `<style>` blocks and class rules into Grapes root `styles[]`. */\nexport function cssToStyles(css: string): GrapesStyleRule[] {\n const cleaned = stripCssComments(css);\n const rules: GrapesStyleRule[] = [];\n const rulePattern = /([^{]+)\\{([^}]*)\\}/g;\n\n for (const match of cleaned.matchAll(rulePattern)) {\n const selectorText = match[1]?.trim() ?? \"\";\n const declarationBlock = match[2] ?? \"\";\n if (!selectorText || selectorText.startsWith(\"@\")) continue;\n\n const style = parseDeclarations(declarationBlock);\n if (Object.keys(style).length === 0) continue;\n\n const selectors = selectorText\n .split(\",\")\n .map((selector) => selector.trim())\n .filter(Boolean);\n\n if (selectors.length === 0) continue;\n rules.push({ selectors, style });\n }\n\n return rules;\n}\n","import type { Cheerio, CheerioAPI } from \"cheerio\";\nimport type { AnyNode } from \"domhandler\";\n\nimport type { GrapesComponent, HtmlToGrapesOptions, LayoutKind } from \"./types.js\";\n\ntype CheerioSelection = Cheerio<AnyNode>;\n\nconst INLINE_TAGS = new Set([\n \"a\",\n \"abbr\",\n \"b\",\n \"br\",\n \"cite\",\n \"code\",\n \"del\",\n \"em\",\n \"i\",\n \"img\",\n \"ins\",\n \"mark\",\n \"q\",\n \"s\",\n \"small\",\n \"span\",\n \"strong\",\n \"sub\",\n \"sup\",\n \"u\",\n \"wbr\",\n]);\n\nconst VOID_TAGS = new Set([\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\n\nconst TEXT_CONTAINER_TAGS = new Set([\n \"blockquote\",\n \"figcaption\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"label\",\n \"li\",\n \"p\",\n \"pre\",\n \"td\",\n \"th\",\n]);\n\nconst SKIP_TAGS = new Set([\"script\", \"style\", \"noscript\", \"template\"]);\n\nconst DEFAULT_TYPES: Record<string, string> = {\n a: \"link\",\n img: \"image\",\n};\n\nconst LAYOUT_DATA_ATTR = \"data-layout\";\n\nconst DEFAULT_LAYOUT_TYPE_MAP: Record<LayoutKind, string> = {\n section: \"section\",\n row: \"row\",\n column: \"column\",\n};\n\nfunction parseLayoutKind(attributes: Record<string, string> | undefined): LayoutKind | undefined {\n const value = attributes?.[LAYOUT_DATA_ATTR];\n if (value === \"section\" || value === \"row\" || value === \"column\") return value;\n return undefined;\n}\n\nfunction resolveLayoutComponentType(kind: LayoutKind, options: HtmlToGrapesOptions): string {\n return options.layoutTypeMap?.[kind] ?? DEFAULT_LAYOUT_TYPE_MAP[kind];\n}\n\nfunction layoutAttributesForComponent(\n attributes: Record<string, string> | undefined,\n): Record<string, string> | undefined {\n if (!attributes) return undefined;\n const { [LAYOUT_DATA_ATTR]: _layout, ...rest } = attributes;\n return Object.keys(rest).length > 0 ? rest : undefined;\n}\n\nfunction tagNameOf($el: CheerioSelection): string | undefined {\n const raw = $el.prop(\"tagName\");\n return typeof raw === \"string\" ? raw.toLowerCase() : undefined;\n}\n\nfunction applyElementMeta(\n component: GrapesComponent,\n meta: Pick<GrapesComponent, \"attributes\" | \"classes\">,\n): GrapesComponent {\n if (meta.attributes) component.attributes = meta.attributes;\n if (meta.classes) component.classes = meta.classes;\n return component;\n}\n\nfunction pickElementMeta($el: CheerioSelection): Pick<GrapesComponent, \"attributes\" | \"classes\"> {\n const attributes: Record<string, string> = {};\n const classes: string[] = [];\n\n if (typeof $el.attr() === \"object\") {\n for (const [key, value] of Object.entries($el.attr() ?? {})) {\n if (key === \"class\") {\n classes.push(...value.split(/\\s+/).filter(Boolean));\n continue;\n }\n attributes[key] = value;\n }\n }\n\n return {\n attributes: Object.keys(attributes).length > 0 ? attributes : undefined,\n classes: classes.length > 0 ? classes : undefined,\n };\n}\n\nfunction resolveComponentType(\n tagName: string,\n classes: string[] | undefined,\n options: HtmlToGrapesOptions,\n fallback = \"default\",\n): string {\n if (options.componentMap && classes) {\n for (const className of classes) {\n const mapped = options.componentMap[className];\n if (mapped) return mapped;\n }\n }\n const tagMapped = options.tagMap?.[tagName];\n if (tagMapped) return tagMapped;\n return DEFAULT_TYPES[tagName] ?? fallback;\n}\n\nfunction hasOnlyInlineContent($: CheerioAPI, $el: CheerioSelection): boolean {\n let inlineOnly = true;\n\n $el.contents().each((_, node) => {\n if (!inlineOnly) return;\n const $child = $(node);\n if ($child.get(0)?.type === \"text\") return;\n const childTag = tagNameOf($child);\n if (!childTag || !INLINE_TAGS.has(childTag)) {\n inlineOnly = false;\n return;\n }\n if (!hasOnlyInlineContent($, $child)) {\n inlineOnly = false;\n }\n });\n\n return inlineOnly;\n}\n\nfunction walkChildren(\n $: CheerioAPI,\n $el: CheerioSelection,\n options: HtmlToGrapesOptions,\n): GrapesComponent[] {\n const components: GrapesComponent[] = [];\n\n $el.contents().each((_, node) => {\n const walked = walkNode($, $(node), options);\n if (!walked) return;\n if (Array.isArray(walked)) {\n components.push(...walked);\n } else {\n components.push(walked);\n }\n });\n\n return components;\n}\n\nfunction walkNode(\n $: CheerioAPI,\n $el: CheerioSelection,\n options: HtmlToGrapesOptions,\n): GrapesComponent | GrapesComponent[] | null {\n const node = $el.get(0);\n if (!node) return null;\n\n if (node.type === \"text\") {\n const text = \"data\" in node ? String(node.data ?? \"\") : \"\";\n if (!text.trim()) return null;\n return { type: \"textnode\", content: text };\n }\n\n if (node.type !== \"tag\") return null;\n\n const tagName = tagNameOf($el);\n if (!tagName || SKIP_TAGS.has(tagName)) return null;\n\n const meta = pickElementMeta($el);\n\n const layoutKind = parseLayoutKind(meta.attributes);\n if (layoutKind) {\n const components = walkChildren($, $el, options);\n const component = applyElementMeta(\n {\n type: resolveLayoutComponentType(layoutKind, options),\n tagName,\n },\n {\n attributes: layoutAttributesForComponent(meta.attributes),\n classes: meta.classes,\n },\n );\n if (components.length > 0) {\n component.components = components;\n }\n return component;\n }\n\n if (VOID_TAGS.has(tagName)) {\n return applyElementMeta(\n {\n type: resolveComponentType(tagName, meta.classes, options),\n tagName,\n void: true,\n },\n meta,\n );\n }\n\n if (TEXT_CONTAINER_TAGS.has(tagName) && hasOnlyInlineContent($, $el)) {\n return applyElementMeta(\n {\n type: resolveComponentType(tagName, meta.classes, options, \"text\"),\n tagName,\n content: $el.html() ?? \"\",\n },\n meta,\n );\n }\n\n if (INLINE_TAGS.has(tagName)) {\n return applyElementMeta(\n {\n type: \"text\",\n content: $.html($el) ?? \"\",\n },\n meta,\n );\n }\n\n const components = walkChildren($, $el, options);\n const component = applyElementMeta(\n {\n type: resolveComponentType(tagName, meta.classes, options),\n tagName,\n },\n meta,\n );\n\n if (components.length > 0) {\n component.components = components;\n }\n\n return component;\n}\n\nfunction appendWalked(\n content: GrapesComponent[],\n walked: GrapesComponent | GrapesComponent[] | null,\n): void {\n if (!walked) return;\n if (Array.isArray(walked)) {\n content.push(...walked);\n return;\n }\n content.push(walked);\n}\n\nfunction walkNodes(\n $: CheerioAPI,\n $nodes: CheerioSelection,\n content: GrapesComponent[],\n options: HtmlToGrapesOptions,\n): void {\n $nodes.each((_, node) => {\n appendWalked(content, walkNode($, $(node), options));\n });\n}\n\nexport function walkHtmlToComponents(\n $: CheerioAPI,\n options: HtmlToGrapesOptions = {},\n): GrapesComponent[] {\n const content: GrapesComponent[] = [];\n const body = $(\"body\");\n\n if (body.length) {\n walkNodes($, body.contents(), content, options);\n return content;\n }\n\n const children = $.root().children();\n if (children.length) {\n walkNodes($, children, content, options);\n } else {\n walkNodes($, $.root().contents(), content, options);\n }\n\n return content;\n}\n","import * as cheerio from \"cheerio\";\n\nimport type { HtmlToTiptapOptions, TiptapDoc } from \"./types.js\";\nimport { prepareHtmlForTiptap, walkHtmlToTiptapDoc } from \"./walk.js\";\n\nexport type { HtmlToTiptapOptions, TiptapDoc, TiptapMark, TiptapNode } from \"./types.js\";\n\n/** Cheerio HTML walk → Tiptap / ProseMirror `doc` JSON for blog `content_json`. */\nexport function htmlToTiptap(html: string, options: HtmlToTiptapOptions = {}): TiptapDoc {\n const trimmed = html.trim();\n if (!trimmed) {\n return { type: \"doc\", content: [{ type: \"paragraph\" }] };\n }\n\n const $ = cheerio.load(trimmed, { xml: false });\n prepareHtmlForTiptap($);\n return walkHtmlToTiptapDoc($, options);\n}\n","import type { Cheerio, CheerioAPI } from \"cheerio\";\nimport type { AnyNode, Element } from \"domhandler\";\n\nimport type { HtmlToTiptapOptions, TiptapDoc, TiptapMark, TiptapNode } from \"./types.js\";\n\ntype CheerioSelection = Cheerio<AnyNode>;\n\nconst SKIP_TAGS = new Set([\"script\", \"style\", \"noscript\", \"template\"]);\nconst HEADING_TAGS = new Set([\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"]);\nconst UNWRAP_TAGS = new Set([\n \"article\",\n \"aside\",\n \"div\",\n \"figure\",\n \"footer\",\n \"header\",\n \"main\",\n \"nav\",\n \"section\",\n \"span\",\n]);\n\nconst INLINE_TAGS = new Set([\n \"a\",\n \"abbr\",\n \"b\",\n \"br\",\n \"cite\",\n \"code\",\n \"del\",\n \"em\",\n \"i\",\n \"ins\",\n \"mark\",\n \"q\",\n \"s\",\n \"small\",\n \"strong\",\n \"sub\",\n \"sup\",\n \"u\",\n \"wbr\",\n]);\n\nconst LAYOUT_ATTR = \"data-layout\";\n\nfunction tagNameOf($el: CheerioSelection): string | undefined {\n const raw = $el.prop(\"tagName\");\n return typeof raw === \"string\" ? raw.toLowerCase() : undefined;\n}\n\nfunction headingLevel(tagName: string): number {\n const level = Number.parseInt(tagName.slice(1), 10);\n return Number.isFinite(level) ? level : 1;\n}\n\nfunction isLayoutMarker($el: CheerioSelection, options: HtmlToTiptapOptions): boolean {\n if (options.unwrapLayoutMarkers === false) return false;\n return $el.attr(LAYOUT_ATTR) !== undefined;\n}\n\nfunction hasOnlyInlineContent($: CheerioAPI, $el: CheerioSelection): boolean {\n let inlineOnly = true;\n\n $el.contents().each((_, node) => {\n if (!inlineOnly) return;\n const $child = $(node);\n if ($child.get(0)?.type === \"text\") return;\n const childTag = tagNameOf($child);\n if (!childTag || childTag === \"br\" || childTag === \"img\") return;\n if (!INLINE_TAGS.has(childTag)) {\n inlineOnly = false;\n return;\n }\n if (!hasOnlyInlineContent($, $child)) {\n inlineOnly = false;\n }\n });\n\n return inlineOnly;\n}\n\nfunction hasBlockChild($: CheerioAPI, $el: CheerioSelection): boolean {\n let hasBlock = false;\n $el.contents().each((_, node) => {\n if (hasBlock) return;\n const $child = $(node);\n if ($child.get(0)?.type === \"text\") return;\n const childTag = tagNameOf($child);\n if (!childTag) return;\n if (\n HEADING_TAGS.has(childTag) ||\n childTag === \"p\" ||\n childTag === \"ul\" ||\n childTag === \"ol\" ||\n childTag === \"blockquote\" ||\n childTag === \"pre\" ||\n childTag === \"hr\" ||\n childTag === \"img\" ||\n childTag === \"table\" ||\n isLayoutMarker($child, { unwrapLayoutMarkers: true }) ||\n (UNWRAP_TAGS.has(childTag) && hasBlockChild($, $child))\n ) {\n hasBlock = true;\n }\n });\n return hasBlock;\n}\n\nfunction textNode(text: string, marks: TiptapMark[] = []): TiptapNode {\n const node: TiptapNode = { type: \"text\", text };\n if (marks.length > 0) node.marks = marks;\n return node;\n}\n\nfunction paragraph(content: TiptapNode[]): TiptapNode {\n return content.length > 0 ? { type: \"paragraph\", content } : { type: \"paragraph\" };\n}\n\nfunction appendMarks(existing: TiptapMark[], added: TiptapMark): TiptapMark[] {\n if (existing.some((mark) => mark.type === added.type)) return existing;\n return [...existing, added];\n}\n\nfunction marksForTag(tagName: string, $el: CheerioSelection): TiptapMark[] {\n switch (tagName) {\n case \"strong\":\n case \"b\":\n return [{ type: \"bold\" }];\n case \"em\":\n case \"i\":\n return [{ type: \"italic\" }];\n case \"s\":\n case \"del\":\n case \"strike\":\n return [{ type: \"strike\" }];\n case \"u\":\n return [{ type: \"underline\" }];\n case \"code\":\n return [{ type: \"code\" }];\n case \"a\": {\n const href = $el.attr(\"href\");\n if (!href) return [];\n const attrs: Record<string, string> = { href };\n const target = $el.attr(\"target\");\n if (target) attrs.target = target;\n const rel = $el.attr(\"rel\");\n if (rel) attrs.rel = rel;\n return [{ type: \"link\", attrs }];\n }\n default:\n return [];\n }\n}\n\nfunction imageNode($el: CheerioSelection): TiptapNode | null {\n const src = $el.attr(\"src\");\n if (!src) return null;\n const attrs: Record<string, unknown> = { src };\n const alt = $el.attr(\"alt\");\n if (alt !== undefined) attrs.alt = alt;\n const title = $el.attr(\"title\");\n if (title) attrs.title = title;\n return { type: \"image\", attrs };\n}\n\nfunction parseInlineContent(\n $: CheerioAPI,\n $el: CheerioSelection,\n marks: TiptapMark[] = [],\n): TiptapNode[] {\n const rootTag = tagNameOf($el);\n if (rootTag && INLINE_TAGS.has(rootTag) && rootTag !== \"br\") {\n marks = marksForTag(rootTag, $el).reduce((acc, mark) => appendMarks(acc, mark), marks);\n }\n\n const nodes: TiptapNode[] = [];\n\n $el.contents().each((_, node) => {\n if (node.type === \"text\") {\n const text = String(node.data ?? \"\");\n if (text) nodes.push(textNode(text, marks));\n return;\n }\n\n if (node.type !== \"tag\") return;\n\n const $child = $(node);\n const tagName = tagNameOf($child);\n if (!tagName || SKIP_TAGS.has(tagName)) return;\n\n if (tagName === \"br\") {\n nodes.push({ type: \"hardBreak\" });\n return;\n }\n\n if (tagName === \"img\") {\n return;\n }\n\n const childMarks = marksForTag(tagName, $child);\n const combinedMarks = childMarks.reduce((acc, mark) => appendMarks(acc, mark), [...marks]);\n nodes.push(...parseInlineContent($, $child, combinedMarks));\n });\n\n return nodes;\n}\n\n/** Parse a block container that holds inline content (p, heading, etc.). Splits on nested block/img. */\nfunction parseMixedBlockContent(\n $: CheerioAPI,\n $el: CheerioSelection,\n options: HtmlToTiptapOptions,\n): TiptapNode[] {\n const blocks: TiptapNode[] = [];\n let inlineBuffer: TiptapNode[] = [];\n\n function flushInline(): void {\n if (inlineBuffer.length === 0) return;\n blocks.push(paragraph(inlineBuffer));\n inlineBuffer = [];\n }\n\n $el.contents().each((_, node) => {\n if (node.type === \"text\") {\n const text = String(node.data ?? \"\");\n if (text) inlineBuffer.push(textNode(text));\n return;\n }\n\n if (node.type !== \"tag\") return;\n\n const $child = $(node);\n const tagName = tagNameOf($child);\n if (!tagName || SKIP_TAGS.has(tagName)) return;\n\n if (tagName === \"br\") {\n inlineBuffer.push({ type: \"hardBreak\" });\n return;\n }\n\n if (tagName === \"img\") {\n flushInline();\n const image = imageNode($child);\n if (image) blocks.push(image);\n return;\n }\n\n if (INLINE_TAGS.has(tagName)) {\n inlineBuffer.push(...parseInlineContent($, $child));\n return;\n }\n\n flushInline();\n blocks.push(...walkBlockNodes($, $child, options));\n });\n\n flushInline();\n return blocks;\n}\n\nfunction walkListItem($: CheerioAPI, $el: CheerioSelection, options: HtmlToTiptapOptions): TiptapNode {\n const blocks = walkBlockNodes($, $el, options);\n if (blocks.length === 0) {\n return { type: \"listItem\", content: [{ type: \"paragraph\" }] };\n }\n\n const normalized: TiptapNode[] = [];\n for (const block of blocks) {\n if (\n block.type === \"paragraph\" ||\n block.type === \"image\" ||\n block.type === \"blockquote\" ||\n block.type === \"bulletList\" ||\n block.type === \"orderedList\"\n ) {\n normalized.push(block);\n continue;\n }\n normalized.push(paragraph(block.content ?? []));\n }\n\n return { type: \"listItem\", content: normalized };\n}\n\nfunction walkBlockNode(\n $: CheerioAPI,\n $el: CheerioSelection,\n options: HtmlToTiptapOptions,\n): TiptapNode[] {\n const node = $el.get(0);\n if (!node) return [];\n\n if (node.type === \"text\") {\n const text = String(node.data ?? \"\").trim();\n return text ? [paragraph([textNode(text)])] : [];\n }\n\n if (node.type !== \"tag\") return [];\n\n const tagName = tagNameOf($el);\n if (!tagName || SKIP_TAGS.has(tagName)) return [];\n\n if (isLayoutMarker($el, options)) {\n return walkBlockNodes($, $el, options);\n }\n\n if (UNWRAP_TAGS.has(tagName)) {\n if (hasBlockChild($, $el)) {\n return walkBlockNodes($, $el, options);\n }\n if (hasOnlyInlineContent($, $el)) {\n const inline = parseInlineContent($, $el);\n return inline.length > 0 ? [paragraph(inline)] : [];\n }\n return walkBlockNodes($, $el, options);\n }\n\n if (HEADING_TAGS.has(tagName)) {\n const content = parseInlineContent($, $el);\n if (content.length === 0) return [];\n return [{ type: \"heading\", attrs: { level: headingLevel(tagName) }, content }];\n }\n\n if (tagName === \"p\") {\n return parseMixedBlockContent($, $el, options);\n }\n\n if (tagName === \"ul\") {\n const items: TiptapNode[] = [];\n $el.children(\"li\").each((_, li) => {\n items.push(walkListItem($, $(li), options));\n });\n return items.length > 0 ? [{ type: \"bulletList\", content: items }] : [];\n }\n\n if (tagName === \"ol\") {\n const items: TiptapNode[] = [];\n $el.children(\"li\").each((_, li) => {\n items.push(walkListItem($, $(li), options));\n });\n return items.length > 0 ? [{ type: \"orderedList\", content: items }] : [];\n }\n\n if (tagName === \"li\") {\n return [walkListItem($, $el, options)];\n }\n\n if (tagName === \"blockquote\") {\n const blocks = walkBlockNodes($, $el, options);\n if (blocks.length === 0) return [];\n return [{ type: \"blockquote\", content: blocks }];\n }\n\n if (tagName === \"pre\") {\n const code = $el.find(\"code\").first();\n const text = (code.length ? code.text() : $el.text()).replace(/\\n$/, \"\");\n if (!text) return [];\n return [{ type: \"codeBlock\", content: [textNode(text)] }];\n }\n\n if (tagName === \"hr\") {\n return [{ type: \"horizontalRule\" }];\n }\n\n if (tagName === \"img\") {\n const image = imageNode($el);\n return image ? [image] : [];\n }\n\n if (tagName === \"table\") {\n const rows: string[] = [];\n $el.find(\"tr\").each((_, tr) => {\n const cells: string[] = [];\n $(tr)\n .find(\"th, td\")\n .each((__, cell) => {\n const text = $(cell).text().trim();\n if (text) cells.push(text);\n });\n if (cells.length > 0) rows.push(cells.join(\" | \"));\n });\n return rows.map((row) => paragraph([textNode(row)]));\n }\n\n return walkBlockNodes($, $el, options);\n}\n\nfunction walkBlockNodes(\n $: CheerioAPI,\n $el: CheerioSelection,\n options: HtmlToTiptapOptions,\n): TiptapNode[] {\n const blocks: TiptapNode[] = [];\n\n $el.contents().each((_, node) => {\n blocks.push(...walkBlockNode($, $(node), options));\n });\n\n return blocks;\n}\n\nfunction normalizeDocContent(content: TiptapNode[]): TiptapNode[] {\n const normalized: TiptapNode[] = [];\n\n for (const block of content) {\n if (block.type === \"paragraph\" && (!block.content || block.content.length === 0)) {\n continue;\n }\n normalized.push(block);\n }\n\n return normalized;\n}\n\nexport function walkHtmlToTiptapDoc(\n $: CheerioAPI,\n options: HtmlToTiptapOptions = {},\n): TiptapDoc {\n const resolved: HtmlToTiptapOptions = {\n unwrapLayoutMarkers: options.unwrapLayoutMarkers ?? true,\n };\n\n let content: TiptapNode[] = [];\n const body = $(\"body\");\n\n if (body.length) {\n content = walkBlockNodes($, body, resolved);\n } else {\n const children = $.root().children();\n if (children.length) {\n content = walkBlockNodes($, children, resolved);\n } else {\n content = walkBlockNodes($, $.root(), resolved);\n }\n }\n\n content = normalizeDocContent(content);\n if (content.length === 0) {\n content = [{ type: \"paragraph\" }];\n }\n\n return { type: \"doc\", content };\n}\n\n/** Strip layout/style noise before walking (mutates loaded DOM). */\nexport function prepareHtmlForTiptap($: CheerioAPI): void {\n $(\"style, script, noscript, template\").remove();\n}\n\nexport function isElementNode(node: AnyNode): node is Element {\n return node.type === \"tag\";\n}\n","import { z } from \"zod\";\n\nimport type { ValidationIssue, ValidationResult } from \"../normalizer/types.js\";\nimport type { GrapesComponent, GrapesProjectSnapshot } from \"./html-to-grapes/types.js\";\n\nexport const grapesStyleRuleSchema = z.object({\n selectors: z.array(z.string().min(1)).min(1),\n style: z.record(z.string(), z.string()),\n});\n\nexport const grapesComponentSchema: z.ZodType<GrapesComponent> = z.lazy(() =>\n z.object({\n type: z.string().min(1),\n tagName: z.string().optional(),\n attributes: z.record(z.string(), z.string()).optional(),\n classes: z.array(z.string()).optional(),\n components: z.array(grapesComponentSchema).optional(),\n content: z.string().optional(),\n void: z.boolean().optional(),\n }),\n);\n\nexport const grapesProjectSnapshotSchema = z.object({\n content: z.array(grapesComponentSchema),\n styles: z.array(grapesStyleRuleSchema),\n contentHtml: z.string().optional(),\n contentCss: z.string().optional(),\n});\n\nexport interface ValidateGrapesProjectSnapshotOptions {\n /** When set, every component `type` in the tree must be in this allowlist. */\n allowedComponentTypes?: string[];\n}\n\nfunction zodIssuesToValidationIssues(issues: z.ZodIssue[]): ValidationIssue[] {\n return issues.map((issue) => ({\n code: issue.code,\n message: issue.message,\n path: issue.path.length > 0 ? issue.path.join(\".\") : undefined,\n }));\n}\n\nfunction collectComponentTypes(components: GrapesComponent[]): string[] {\n const types: string[] = [];\n for (const component of components) {\n types.push(component.type);\n if (component.components?.length) {\n types.push(...collectComponentTypes(component.components));\n }\n }\n return types;\n}\n\nfunction validateAllowedComponentTypes(\n snapshot: GrapesProjectSnapshot,\n allowedComponentTypes: string[],\n): ValidationIssue[] {\n const allowlist = new Set(allowedComponentTypes);\n const issues: ValidationIssue[] = [];\n\n for (const componentType of collectComponentTypes(snapshot.content)) {\n if (!allowlist.has(componentType)) {\n issues.push({\n code: \"invalid_component_type\",\n message: `Component type \"${componentType}\" is not in allowedComponentTypes`,\n path: \"content\",\n });\n }\n }\n\n return issues;\n}\n\n/**\n * Opt-in structural check for a Grapes project snapshot (not a full Grapes editor project file).\n * Does not validate host-specific component registries unless `allowedComponentTypes` is passed.\n */\nexport function validateGrapesProjectSnapshot(\n snapshot: unknown,\n options: ValidateGrapesProjectSnapshotOptions = {},\n): ValidationResult {\n const result = grapesProjectSnapshotSchema.safeParse(snapshot);\n if (!result.success) {\n return { ok: false, issues: zodIssuesToValidationIssues(result.error.issues) };\n }\n\n if (options.allowedComponentTypes?.length) {\n const typeIssues = validateAllowedComponentTypes(result.data, options.allowedComponentTypes);\n if (typeIssues.length > 0) {\n return { ok: false, issues: typeIssues };\n }\n }\n\n return { ok: true, issues: [] };\n}\n","import { z } from \"zod\";\n\nimport type { ValidationIssue, ValidationResult } from \"../normalizer/types.js\";\nimport type { TiptapDoc, TiptapNode } from \"./html-to-tiptap/types.js\";\n\nexport const tiptapMarkSchema = z.object({\n type: z.string().min(1),\n attrs: z.record(z.string(), z.string()).optional(),\n});\n\nexport const tiptapNodeSchema: z.ZodType<TiptapNode> = z.lazy(() =>\n z.union([\n z.object({\n type: z.literal(\"text\"),\n text: z.string(),\n marks: z.array(tiptapMarkSchema).optional(),\n }),\n z.object({\n type: z.string().min(1),\n attrs: z.record(z.unknown()).optional(),\n content: z.array(tiptapNodeSchema).optional(),\n marks: z.array(tiptapMarkSchema).optional(),\n }),\n ]),\n);\n\nexport const tiptapDocSchema = z.object({\n type: z.literal(\"doc\"),\n content: z.array(tiptapNodeSchema),\n});\n\nexport interface ValidateTiptapDocOptions {\n /** When set, every node `type` in the tree must be in this allowlist. */\n allowedNodeTypes?: string[];\n /** When set, every mark `type` must be in this allowlist. */\n allowedMarkTypes?: string[];\n}\n\nfunction zodIssuesToValidationIssues(issues: z.ZodIssue[]): ValidationIssue[] {\n return issues.map((issue) => ({\n code: issue.code,\n message: issue.message,\n path: issue.path.length > 0 ? issue.path.join(\".\") : undefined,\n }));\n}\n\nfunction collectNodeTypes(nodes: TiptapNode[]): string[] {\n const types: string[] = [];\n for (const node of nodes) {\n types.push(node.type);\n if (node.content?.length) {\n types.push(...collectNodeTypes(node.content));\n }\n }\n return types;\n}\n\nfunction collectMarkTypes(nodes: TiptapNode[]): string[] {\n const types: string[] = [];\n for (const node of nodes) {\n if (node.marks?.length) {\n types.push(...node.marks.map((mark) => mark.type));\n }\n if (node.content?.length) {\n types.push(...collectMarkTypes(node.content));\n }\n }\n return types;\n}\n\nfunction validateAllowedTypes(\n doc: TiptapDoc,\n allowedNodeTypes: string[] | undefined,\n allowedMarkTypes: string[] | undefined,\n): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n if (allowedNodeTypes) {\n const allowlist = new Set(allowedNodeTypes);\n for (const nodeType of collectNodeTypes(doc.content)) {\n if (!allowlist.has(nodeType)) {\n issues.push({\n code: \"invalid_node_type\",\n message: `Node type \"${nodeType}\" is not in allowedNodeTypes`,\n path: \"content\",\n });\n }\n }\n }\n\n if (allowedMarkTypes) {\n const allowlist = new Set(allowedMarkTypes);\n for (const markType of collectMarkTypes(doc.content)) {\n if (!allowlist.has(markType)) {\n issues.push({\n code: \"invalid_mark_type\",\n message: `Mark type \"${markType}\" is not in allowedMarkTypes`,\n path: \"content\",\n });\n }\n }\n }\n\n return issues;\n}\n\n/** Opt-in structural check for a Tiptap / ProseMirror document. */\nexport function validateTiptapDoc(\n doc: unknown,\n options: ValidateTiptapDocOptions = {},\n): ValidationResult {\n const parsed = tiptapDocSchema.safeParse(doc);\n if (!parsed.success) {\n return { ok: false, issues: zodIssuesToValidationIssues(parsed.error.issues) };\n }\n\n const typeIssues = validateAllowedTypes(\n parsed.data,\n options.allowedNodeTypes,\n options.allowedMarkTypes,\n );\n if (typeIssues.length > 0) {\n return { ok: false, issues: typeIssues };\n }\n\n return { ok: true, issues: [] };\n}\n","import * as cheerio from \"cheerio\";\n\nimport { isMigrationMediaRef, parseMigrationMediaRef } from \"../lib/migration-media-ref.js\";\n\nexport interface ExpandMigrationMediaRefsResult {\n html: string;\n unresolved: string[];\n}\n\n/** Inline CSS `background` / `background-image: url(…)` (quoted or bare). */\nconst BACKGROUND_IMAGE_URL_PATTERN =\n /background(?:-image)?\\s*:[^;]*?url\\s*\\(\\s*(['\"]?)([^'\")]+)\\1\\s*\\)/gi;\n\nfunction tryExpandRef(\n value: string,\n resolvePublicUrl: (sourceId: string) => string | undefined,\n unresolved: Set<string>,\n): string | undefined {\n if (!isMigrationMediaRef(value)) return undefined;\n const sourceId = parseMigrationMediaRef(value);\n if (!sourceId) {\n unresolved.add(value);\n return undefined;\n }\n const publicUrl = resolvePublicUrl(sourceId);\n if (!publicUrl) {\n unresolved.add(value);\n return undefined;\n }\n return publicUrl;\n}\n\nfunction expandBackgroundUrlsInStyle(\n style: string,\n resolvePublicUrl: (sourceId: string) => string | undefined,\n unresolved: Set<string>,\n): string {\n return style.replace(BACKGROUND_IMAGE_URL_PATTERN, (full, quote: string, rawUrl: string) => {\n const expanded = tryExpandRef(rawUrl.trim(), resolvePublicUrl, unresolved);\n if (!expanded) return full;\n\n const urlCall = quote ? `url(${quote}${expanded}${quote})` : `url(${expanded})`;\n return full.replace(/url\\s*\\(\\s*(['\"]?)([^'\")]+)\\1\\s*\\)/i, urlCall);\n });\n}\n\nfunction expandSrcset(\n srcset: string,\n resolvePublicUrl: (sourceId: string) => string | undefined,\n unresolved: Set<string>,\n): string {\n return srcset\n .split(\",\")\n .map((entry) => {\n const trimmed = entry.trim();\n if (!trimmed) return entry;\n const [urlPart, descriptor] = trimmed.split(/\\s+/, 2);\n const expanded = tryExpandRef(urlPart ?? \"\", resolvePublicUrl, unresolved);\n if (!expanded) return entry;\n return descriptor ? `${expanded} ${descriptor}` : expanded;\n })\n .join(\", \");\n}\n\n/**\n * Expand OSS-14 `artinstack-migration://asset/…` refs to host CDN URLs.\n * Lookup (`migration_entities` → `publicUrl`) is host-supplied via `resolvePublicUrl`.\n */\nexport function expandMigrationMediaRefs(\n html: string,\n resolvePublicUrl: (sourceId: string) => string | undefined,\n): ExpandMigrationMediaRefsResult {\n if (!html.trim()) {\n return { html, unresolved: [] };\n }\n\n const $ = cheerio.load(html, { xml: false });\n const unresolved = new Set<string>();\n\n $(\"img\").each((_, element) => {\n const img = $(element);\n const src = img.attr(\"src\")?.trim();\n if (src) {\n const expanded = tryExpandRef(src, resolvePublicUrl, unresolved);\n if (expanded) img.attr(\"src\", expanded);\n }\n\n const srcset = img.attr(\"srcset\")?.trim();\n if (srcset) {\n img.attr(\"srcset\", expandSrcset(srcset, resolvePublicUrl, unresolved));\n }\n });\n\n $(\"[data-bg-image]\").each((_, element) => {\n const node = $(element);\n const bgImage = node.attr(\"data-bg-image\")?.trim();\n if (!bgImage) return;\n const expanded = tryExpandRef(bgImage, resolvePublicUrl, unresolved);\n if (expanded) node.attr(\"data-bg-image\", expanded);\n });\n\n $(\"[style]\").each((_, element) => {\n const node = $(element);\n const style = node.attr(\"style\");\n if (!style?.includes(\"background\")) return;\n const rewritten = expandBackgroundUrlsInStyle(style, resolvePublicUrl, unresolved);\n if (rewritten !== style) node.attr(\"style\", rewritten);\n });\n\n return {\n html: $.root().html() ?? html,\n unresolved: [...unresolved],\n };\n}\n"],"mappings":"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","names":["components","component","cheerio","SKIP_TAGS","INLINE_TAGS","tagNameOf","hasOnlyInlineContent","z","zodIssuesToValidationIssues","cheerio"]}
package/dist/cli/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  createWpContentGatewayRewrite,
4
4
  getAdapter
5
- } from "../chunk-XQVKA54A.js";
5
+ } from "../chunk-KF7G7DM6.js";
6
6
  import {
7
7
  analyzeConflicts,
8
8
  buildMigrationReport,
@@ -17,11 +17,11 @@ import {
17
17
  runMigration,
18
18
  staleUrlsFromEstimate,
19
19
  writeFilesystemExport
20
- } from "../chunk-IPYHS5R2.js";
20
+ } from "../chunk-MDSY3FEZ.js";
21
21
  import {
22
22
  collectEntities
23
23
  } from "../chunk-HI7JHWZU.js";
24
- import "../chunk-EXYXTAZM.js";
24
+ import "../chunk-BOYB6XRA.js";
25
25
  import "../chunk-XYP3VYDH.js";
26
26
 
27
27
  // src/cli/index.ts