@artinstack/migrator 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/parsers/wordpress/parse-wxr.ts","../src/parsers/wordpress/index.ts","../src/parsers/smugmug/api.ts","../src/parsers/smugmug/parse-node.ts","../src/parsers/smugmug/index.ts","../src/parsers/squarespace/index.ts","../src/parsers/wix/api.ts","../src/parsers/wix/ricos-to-html.ts","../src/parsers/wix/map-wire.ts","../src/parsers/wix/snapshot.ts","../src/parsers/wix/parse-export.ts","../src/parsers/wix/index.ts","../src/parsers/index.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\n\nimport { XMLParser } from \"fast-xml-parser\";\n\nimport { 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\";\n\nconst PLATFORM = \"wordpress\" as const;\n\nexport interface WxrParseOptions {\n filePath: string;\n exportedAt?: string;\n}\n\ninterface WxrItem {\n title?: string;\n link?: string;\n encoded?: string;\n post_id?: string | number;\n post_date?: string;\n post_name?: string;\n status?: string;\n post_type?: string;\n attachment_url?: string;\n postmeta?: WxrPostMeta | WxrPostMeta[];\n category?: WxrCategory | WxrCategory[];\n}\n\ninterface WxrPostMeta {\n meta_key?: string;\n meta_value?: string | number;\n}\n\ninterface WxrCategory {\n \"@_domain\"?: string;\n \"@_nicename\"?: string;\n \"#text\"?: string;\n}\n\ninterface AttachmentIndexEntry {\n sourceUrl: string;\n filename: string;\n mimeType?: string;\n title?: string;\n}\n\nfunction asArray<T>(value: T | T[] | undefined): T[] {\n if (value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction textValue(value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"string\" || typeof value === \"number\") return String(value);\n if (typeof value === \"object\" && value !== null && \"#text\" in value) {\n return String((value as { \"#text\": unknown })[\"#text\"] ?? \"\");\n }\n return String(value);\n}\n\nfunction mapPublishStatus(wpStatus: string | undefined): PublishStatus {\n switch ((wpStatus ?? \"\").toLowerCase()) {\n case \"publish\":\n return \"published\";\n case \"draft\":\n case \"pending\":\n return \"draft\";\n default:\n return \"archived\";\n }\n}\n\nfunction getContentEncoded(item: WxrItem): string {\n const content = (item as { content?: { encoded?: string } | string }).content;\n if (content !== undefined) {\n if (typeof content === \"string\") return content;\n return textValue(content.encoded);\n }\n return textValue(item.encoded);\n}\n\nfunction sourceMeta(id: string, link?: string, exportedAt?: string): SourceMetadata {\n return {\n platform: PLATFORM,\n id,\n url: link || undefined,\n path: linkToPath(link),\n exportedAt,\n };\n}\n\nfunction getExcerpt(item: WxrItem): string {\n const excerpt = (item as { excerpt?: { encoded?: string } | string }).excerpt;\n if (!excerpt) return \"\";\n if (typeof excerpt === \"string\") return excerpt;\n return textValue(excerpt.encoded);\n}\n\nfunction getPostMeta(item: WxrItem, key: string): string | undefined {\n for (const meta of asArray(item.postmeta)) {\n if (textValue(meta.meta_key) === key) {\n return textValue(meta.meta_value);\n }\n }\n return undefined;\n}\n\nfunction parseItems(xml: string): WxrItem[] {\n const parser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: \"@_\",\n removeNSPrefix: true,\n trimValues: false,\n parseTagValue: false,\n });\n\n const doc = parser.parse(xml) as {\n rss?: { channel?: { item?: WxrItem | WxrItem[] } };\n };\n\n return asArray(doc.rss?.channel?.item);\n}\n\nfunction buildAttachmentIndex(items: WxrItem[]): Map<string, AttachmentIndexEntry> {\n const index = new Map<string, AttachmentIndexEntry>();\n\n for (const item of items) {\n if (textValue(item.post_type) !== \"attachment\") continue;\n const id = textValue(item.post_id);\n const url = textValue(item.attachment_url) || textValue(item.link);\n if (!id || !url) continue;\n\n const filename = basename(new URL(url, \"http://local.invalid\").pathname) || `attachment-${id}`;\n index.set(id, {\n sourceUrl: url,\n filename,\n mimeType: getPostMeta(item, \"_wp_attached_file\") ? undefined : guessMime(filename),\n title: textValue(item.title),\n });\n }\n\n return index;\n}\n\nfunction guessMime(filename: string): string | undefined {\n const ext = filename.split(\".\").pop()?.toLowerCase();\n const map: Record<string, string> = {\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n pdf: \"application/pdf\",\n };\n return ext ? map[ext] : undefined;\n}\n\nfunction collectTaxonomies(items: WxrItem[]): {\n categories: Map<string, NormalizedCategory>;\n tags: Map<string, NormalizedTag>;\n} {\n const categories = new Map<string, NormalizedCategory>();\n const tags = new Map<string, NormalizedTag>();\n\n for (const item of items) {\n const postType = textValue(item.post_type);\n if (postType !== \"post\" && postType !== \"page\") continue;\n\n for (const cat of asArray(item.category)) {\n const domain = cat[\"@_domain\"] ?? \"\";\n const nicename = sanitizeSlug(cat[\"@_nicename\"] ?? textValue(cat[\"#text\"]));\n const name = textValue(cat[\"#text\"]) || nicename;\n if (!nicename) continue;\n\n if (domain === \"category\") {\n if (!categories.has(nicename)) {\n categories.set(nicename, {\n type: \"category\",\n source: sourceMeta(`cat:${nicename}`),\n sourceId: `cat:${nicename}`,\n name,\n slug: nicename,\n });\n }\n } else if (domain === \"post_tag\") {\n if (!tags.has(nicename)) {\n tags.set(nicename, {\n type: \"tag\",\n source: sourceMeta(`tag:${nicename}`),\n sourceId: `tag:${nicename}`,\n name,\n slug: nicename,\n });\n }\n }\n }\n }\n\n return { categories, tags };\n}\n\nfunction collectInlineAssets(\n html: string,\n attachmentIndex: Map<string, AttachmentIndexEntry>,\n seenUrls: Set<string>,\n exportedAt?: string,\n): NormalizedAsset[] {\n const assets: NormalizedAsset[] = [];\n for (const src of discoverContentAssetUrls(html)) {\n if (seenUrls.has(src)) continue;\n seenUrls.add(src);\n\n let filename: string;\n try {\n filename = basename(new URL(src, \"http://local.invalid\").pathname) || \"inline-asset\";\n } catch {\n filename = \"inline-asset\";\n }\n\n assets.push({\n type: \"asset\",\n source: sourceMeta(`url:${src}`, src, exportedAt),\n sourceId: `url:${src}`,\n sourceUrl: src,\n filename,\n mimeType: guessMime(filename),\n });\n }\n\n // Resolve attachment-index URLs referenced in content if not already seen\n for (const [id, entry] of attachmentIndex) {\n if (seenUrls.has(entry.sourceUrl)) continue;\n // Only auto-include attachments referenced via wp-content in posts is handled by inline src\n void id;\n }\n\n return assets;\n}\n\nexport async function* enumerateWxrEntities(\n options: WxrParseOptions,\n): AsyncGenerator<NormalizedEntity> {\n const xml = await readFile(options.filePath, \"utf8\");\n const items = parseItems(xml);\n const attachmentIndex = buildAttachmentIndex(items);\n const { categories, tags } = collectTaxonomies(items);\n const seenAssetUrls = new Set<string>();\n const emittedAttachmentIds = new Set<string>();\n\n for (const category of categories.values()) {\n yield category;\n }\n for (const tag of tags.values()) {\n yield tag;\n }\n\n // Emit attachment assets\n for (const [id, entry] of attachmentIndex) {\n emittedAttachmentIds.add(id);\n seenAssetUrls.add(entry.sourceUrl);\n yield {\n type: \"asset\",\n source: sourceMeta(id, entry.sourceUrl, options.exportedAt),\n sourceId: id,\n sourceUrl: entry.sourceUrl,\n filename: entry.filename,\n mimeType: entry.mimeType,\n caption: entry.title,\n } satisfies NormalizedAsset;\n }\n\n for (const item of items) {\n const postType = textValue(item.post_type);\n if (postType !== \"post\" && postType !== \"page\") continue;\n\n const id = textValue(item.post_id);\n const link = textValue(item.link);\n const slug = sanitizeSlug(textValue(item.post_name) || textValue(item.title) || id);\n const rawHtml = getContentEncoded(item);\n\n for (const asset of collectInlineAssets(\n rawHtml,\n attachmentIndex,\n seenAssetUrls,\n options.exportedAt,\n )) {\n yield asset;\n }\n\n const categorySlugs: string[] = [];\n const tagSlugs: string[] = [];\n for (const cat of asArray(item.category)) {\n const domain = cat[\"@_domain\"] ?? \"\";\n const nicename = sanitizeSlug(cat[\"@_nicename\"] ?? textValue(cat[\"#text\"]));\n if (!nicename) continue;\n if (domain === \"category\") categorySlugs.push(nicename);\n if (domain === \"post_tag\") tagSlugs.push(nicename);\n }\n\n if (postType === \"post\") {\n const thumbnailId = getPostMeta(item, \"_thumbnail_id\");\n let featuredAssetSourceId: string | undefined;\n if (thumbnailId && attachmentIndex.has(thumbnailId)) {\n featuredAssetSourceId = thumbnailId;\n }\n\n const post: NormalizedPost = {\n type: \"post\",\n source: sourceMeta(id, link, options.exportedAt),\n sourceId: id,\n title: textValue(item.title) || slug,\n slug,\n excerpt: getExcerpt(item) || undefined,\n contentHtml: rawHtml,\n publishedAt: textValue(item.post_date) || undefined,\n status: mapPublishStatus(textValue(item.status)),\n categorySlugs: categorySlugs.length ? categorySlugs : undefined,\n tagSlugs: tagSlugs.length ? tagSlugs : undefined,\n sourceFeaturedMediaId: thumbnailId,\n featuredAssetSourceId,\n };\n yield post;\n } else {\n const isHomePage =\n getPostMeta(item, \"_wp_show_on_front\") === \"1\" ||\n getPostMeta(item, \"page_on_front\") === \"1\";\n\n const page: NormalizedPage = {\n type: \"page\",\n source: sourceMeta(id, link, options.exportedAt),\n sourceId: id,\n title: textValue(item.title) || slug,\n slug,\n contentHtml: rawHtml,\n isHomePage: isHomePage || undefined,\n status: mapPublishStatus(textValue(item.status)),\n };\n yield page;\n }\n }\n}\n\nexport async function validateWxrFile(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 xml: string;\n try {\n xml = await readFile(filePath, \"utf8\");\n } catch {\n return {\n ok: false,\n issues: [{ code: \"file_not_found\", message: `Cannot read file: ${filePath}` }],\n summary: {},\n };\n }\n\n const looksLikeWxr =\n xml.includes(\"<rss\") &&\n (xml.includes(\"wp:wxr_version\") ||\n xml.includes(\"xmlns:wp=\") ||\n xml.includes(\"WordPress eXtended RSS\"));\n if (!looksLikeWxr) {\n issues.push({ code: \"invalid_wxr\", message: \"File does not appear to be WordPress WXR\" });\n }\n\n const items = parseItems(xml);\n const summary = {\n posts: items.filter((i) => textValue(i.post_type) === \"post\").length,\n pages: items.filter((i) => textValue(i.post_type) === \"page\").length,\n assets: items.filter((i) => textValue(i.post_type) === \"attachment\").length,\n portfolios: 0,\n categories: 0,\n tags: 0,\n };\n\n const { categories, tags } = collectTaxonomies(items);\n summary.categories = categories.size;\n summary.tags = tags.size;\n\n return { ok: issues.length === 0, issues, summary };\n}\n","import type { AdapterContext, MigrationAdapter, ValidationResult } from \"../../normalizer/types.js\";\nimport { enumerateWxrEntities, validateWxrFile } from \"./parse-wxr.js\";\n\nfunction resolvePath(input: unknown): string {\n if (typeof input === \"string\") return input;\n if (input && typeof input === \"object\" && \"path\" in input) {\n return String((input as { path: string }).path);\n }\n throw new Error(\"WordPress adapter requires input path (string or { path })\");\n}\n\nexport const wordpressAdapter: MigrationAdapter = {\n platform: \"wordpress\",\n\n async validateInput(input: unknown): Promise<ValidationResult> {\n const path = resolvePath(input);\n const result = await validateWxrFile(path);\n return {\n ok: result.ok,\n issues: result.issues,\n summary: result.summary,\n };\n },\n\n enumerateEntities(ctx: AdapterContext) {\n const path = resolvePath(ctx.input);\n return enumerateWxrEntities({ filePath: path });\n },\n};\n","import { createHmac, randomBytes } from \"node:crypto\";\n\nimport { z } from \"zod\";\n\nimport type { SmugMugFlatAlbum, SmugMugFlatExport, SmugMugFlatFolder, SmugMugFlatImage } from \"./types.js\";\n\n/** SmugMug API v2 base (OAuth 1.0a). No secrets — inject credentials at runtime. */\nexport const SMUGMUG_API_HOST = \"api.smugmug.com\";\nexport const SMUGMUG_API_BASE = `https://${SMUGMUG_API_HOST}/api/v2`;\n\nexport const SMUGMUG_OAUTH_ENDPOINTS = {\n requestToken: \"https://api.smugmug.com/services/oauth/1.0a/getRequestToken\",\n authorize: \"https://api.smugmug.com/services/oauth/1.0a/authorize\",\n accessToken: \"https://api.smugmug.com/services/oauth/1.0a/getAccessToken\",\n} as const;\n\nexport const smugMugCredentialsSchema = z.object({\n consumerKey: z.string().min(1),\n consumerSecret: z.string().min(1),\n accessToken: z.string().min(1),\n accessTokenSecret: z.string().min(1),\n});\n\nexport type SmugMugCredentials = z.infer<typeof smugMugCredentialsSchema>;\n\nexport const smugMugClientOptionsSchema = z.object({\n credentials: smugMugCredentialsSchema,\n pageSize: z.number().int().min(1).max(500).default(100),\n maxRetries: z.number().int().min(0).max(10).default(3),\n retryBaseDelayMs: z.number().int().min(0).default(500),\n maxRetryDelayMs: z.number().int().min(0).default(8000),\n requestIntervalMs: z.number().int().min(0).default(200),\n fetchImpl: z.custom<typeof fetch>().optional(),\n});\n\nexport type SmugMugClientOptions = z.input<typeof smugMugClientOptionsSchema>;\n\nconst ALBUM_IMAGES_CONFIG = {\n expand: {\n AlbumImage: {\n expand: {\n Image: {\n filter: [\"FileName\", \"Caption\", \"KeywordsArray\"],\n filteruri: [\"ImageMetadata\", \"ImageSizeDetails\"],\n expand: {\n ImageMetadata: {\n filter: [\"ISO\", \"Aperture\", \"ApertureValue\", \"ShutterSpeed\", \"ExposureTime\", \"FocalLength\"],\n },\n ImageSizeDetails: {\n filter: [\"OriginalImageUrl\"],\n },\n },\n },\n },\n },\n },\n};\n\ninterface SmugMugPages {\n Total?: number;\n Start?: number;\n Count?: number;\n NextPage?: string;\n}\n\ninterface SmugMugApiEnvelope<T> {\n Response: T & { Pages?: SmugMugPages; Uri?: string };\n Code: number;\n Message: string;\n}\n\ninterface SmugMugUserWire {\n NickName?: string;\n Uri: string;\n Uris: { Node: string };\n}\n\ninterface SmugMugNodeWire {\n NodeID: string;\n Type: \"Folder\" | \"Album\" | \"Page\" | string;\n Name: string;\n Description?: string;\n UrlName?: string;\n WebUri?: string;\n Uri: string;\n Uris?: { Album?: string; ChildNodes?: string };\n}\n\ninterface SmugMugImageMetadataWire {\n ISO?: number | string;\n Aperture?: number | string;\n ApertureValue?: number | string;\n ShutterSpeed?: string;\n ExposureTime?: string;\n FocalLength?: number | string;\n}\n\ninterface SmugMugImageWire {\n FileName?: string;\n Caption?: string;\n KeywordsArray?: string[];\n ImageMetadata?: SmugMugImageMetadataWire;\n ImageSizeDetails?: { OriginalImageUrl?: string };\n}\n\ninterface SmugMugAlbumImageWire {\n ImageKey: string;\n Caption?: string;\n FileName?: string;\n WebUri?: string;\n Image?: SmugMugImageWire;\n LargestImage?: { Url?: string };\n ImageMetadata?: SmugMugImageMetadataWire;\n}\n\n/** RFC 3986 encoding used by OAuth 1.0a parameter normalization. */\nexport function oauthPercentEncode(value: string): string {\n return encodeURIComponent(value).replace(/[!'()*]/g, (char) =>\n `%${char.charCodeAt(0).toString(16).toUpperCase()}`,\n );\n}\n\nfunction normalizeRequestUrl(url: URL): string {\n const protocol = url.protocol.replace(/:$/, \"\").toLowerCase();\n const host = url.hostname.toLowerCase();\n const defaultPort = protocol === \"http\" ? \"80\" : \"443\";\n const port = url.port && url.port !== defaultPort ? `:${url.port}` : \"\";\n return `${protocol}://${host}${port}${url.pathname}`;\n}\n\nfunction sortedParameterString(params: Record<string, string>): string {\n return Object.keys(params)\n .sort((a, b) => (a === b ? 0 : a < b ? -1 : 1))\n .map((key) => `${oauthPercentEncode(key)}=${oauthPercentEncode(params[key]!)}`)\n .join(\"&\");\n}\n\nfunction collectSignatureParams(\n url: URL,\n oauthParams: Record<string, string>,\n bodyParams?: Record<string, string>,\n): Record<string, string> {\n const params: Record<string, string> = { ...oauthParams };\n url.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n if (bodyParams) {\n for (const [key, value] of Object.entries(bodyParams)) {\n params[key] = value;\n }\n }\n return params;\n}\n\n/** Build OAuth 1.0a HMAC-SHA1 signature for a SmugMug API request. */\nexport function signSmugMugOAuthRequest(input: {\n method: string;\n url: string;\n credentials: SmugMugCredentials;\n oauthParams: Record<string, string>;\n bodyParams?: Record<string, string>;\n}): string {\n const url = new URL(input.url);\n const parameterString = sortedParameterString(\n collectSignatureParams(url, input.oauthParams, input.bodyParams),\n );\n const signatureBase = [\n input.method.toUpperCase(),\n oauthPercentEncode(normalizeRequestUrl(url)),\n oauthPercentEncode(parameterString),\n ].join(\"&\");\n const signingKey = `${oauthPercentEncode(input.credentials.consumerSecret)}&${oauthPercentEncode(input.credentials.accessTokenSecret)}`;\n return createHmac(\"sha1\", signingKey).update(signatureBase).digest(\"base64\");\n}\n\nfunction buildOAuthParams(credentials: SmugMugCredentials, nonce: string, timestamp: string) {\n return {\n oauth_consumer_key: credentials.consumerKey,\n oauth_token: credentials.accessToken,\n oauth_signature_method: \"HMAC-SHA1\",\n oauth_timestamp: timestamp,\n oauth_nonce: nonce,\n oauth_version: \"1.0\",\n };\n}\n\nexport function buildSmugMugAuthorizationHeader(input: {\n method: string;\n url: string;\n credentials: SmugMugCredentials;\n nonce?: string;\n timestamp?: string;\n bodyParams?: Record<string, string>;\n}): string {\n const nonce = input.nonce ?? randomBytes(16).toString(\"hex\");\n const timestamp = input.timestamp ?? String(Math.floor(Date.now() / 1000));\n const oauthParams = buildOAuthParams(input.credentials, nonce, timestamp);\n const signature = signSmugMugOAuthRequest({\n method: input.method,\n url: input.url,\n credentials: input.credentials,\n oauthParams,\n bodyParams: input.bodyParams,\n });\n const headerParams = { ...oauthParams, oauth_signature: signature };\n const headerValue = Object.keys(headerParams)\n .sort()\n .map((key) => `${oauthPercentEncode(key)}=\"${oauthPercentEncode(headerParams[key as keyof typeof headerParams]!)}\"`)\n .join(\", \");\n return `OAuth ${headerValue}`;\n}\n\nexport function readSmugMugCredentialsFromEnv(\n env: Record<string, string | undefined> = process.env,\n): SmugMugCredentials {\n return smugMugCredentialsSchema.parse({\n consumerKey: env.SMUGMUG_CONSUMER_KEY,\n consumerSecret: env.SMUGMUG_CONSUMER_SECRET,\n accessToken: env.SMUGMUG_ACCESS_TOKEN,\n accessTokenSecret: env.SMUGMUG_ACCESS_TOKEN_SECRET,\n });\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction albumKeyFromUri(uri: string): string {\n const match = uri.match(/\\/album\\/([^/?!]+)/i);\n if (!match?.[1]) {\n throw new Error(`Unable to parse album key from URI: ${uri}`);\n }\n return match[1];\n}\n\nfunction nodeIdFromUri(uri: string): string {\n const match = uri.match(/\\/node\\/([^/?!]+)/i);\n if (!match?.[1]) {\n throw new Error(`Unable to parse node id from URI: ${uri}`);\n }\n return match[1];\n}\n\nfunction mapAlbumImage(\n albumImage: SmugMugAlbumImageWire,\n portfolioSourceId: string,\n sort: number,\n): SmugMugFlatImage {\n const image = albumImage.Image;\n const metadata = image?.ImageMetadata ?? albumImage.ImageMetadata;\n const originalUrl =\n image?.ImageSizeDetails?.OriginalImageUrl ?? albumImage.LargestImage?.Url ?? albumImage.WebUri;\n const fileName = image?.FileName ?? albumImage.FileName;\n return {\n sourceId: albumImage.ImageKey,\n portfolioSourceId,\n sort,\n fileName,\n originalUrl,\n caption: albumImage.Caption ?? image?.Caption,\n keywords: image?.KeywordsArray?.length ? image.KeywordsArray : undefined,\n exif: metadata\n ? {\n iso: metadata.ISO,\n aperture: metadata.Aperture ?? metadata.ApertureValue,\n shutter: metadata.ShutterSpeed ?? metadata.ExposureTime,\n focalLength: metadata.FocalLength,\n }\n : undefined,\n };\n}\n\n/** Signed SmugMug API client — recursively discovers folders, albums, and images. */\nexport class SmugMugApiClient {\n readonly credentials: SmugMugCredentials;\n readonly pageSize: number;\n readonly maxRetries: number;\n readonly retryBaseDelayMs: number;\n readonly maxRetryDelayMs: number;\n readonly requestIntervalMs: number;\n readonly fetchImpl: typeof fetch;\n\n private lastRequestAt = 0;\n\n constructor(options: SmugMugClientOptions) {\n const parsed = smugMugClientOptionsSchema.parse(options);\n this.credentials = parsed.credentials;\n this.pageSize = parsed.pageSize;\n this.maxRetries = parsed.maxRetries;\n this.retryBaseDelayMs = parsed.retryBaseDelayMs;\n this.maxRetryDelayMs = parsed.maxRetryDelayMs;\n this.requestIntervalMs = parsed.requestIntervalMs;\n this.fetchImpl = parsed.fetchImpl ?? fetch;\n }\n\n /** Validate credentials against `GET /user/!authuser`. */\n async validateCredentials(): Promise<{ nick?: string; rootNodeUri: string }> {\n const user = await this.getAuthUser();\n return { nick: user.NickName, rootNodeUri: user.Uris.Node };\n }\n\n /** Crawl the authenticated user's node tree into flat export tables for `parse-node.ts`. */\n async crawlExport(): Promise<SmugMugFlatExport> {\n const user = await this.getAuthUser();\n const folders: SmugMugFlatFolder[] = [];\n const albums: SmugMugFlatAlbum[] = [];\n const images: SmugMugFlatImage[] = [];\n\n await this.walkNode(user.Uris.Node, undefined, folders, albums, images);\n\n return {\n exportVersion: 1,\n exportedAt: new Date().toISOString(),\n Folders: folders,\n Albums: albums,\n Images: images,\n };\n }\n\n private async getAuthUser(): Promise<SmugMugUserWire> {\n const envelope = await this.requestJson<SmugMugUserWire>(`${SMUGMUG_API_BASE}/user/!authuser`);\n return envelope.Response;\n }\n\n private async walkNode(\n nodeUri: string,\n parentFolderId: string | undefined,\n folders: SmugMugFlatFolder[],\n albums: SmugMugFlatAlbum[],\n images: SmugMugFlatImage[],\n ): Promise<void> {\n const childrenPath = `${nodeUri}!children`;\n for await (const child of this.paginateNodes(childrenPath)) {\n if (child.Type === \"Page\") continue;\n\n if (child.Type === \"Folder\") {\n folders.push({\n sourceId: child.NodeID,\n name: child.Name,\n parentSourceId: parentFolderId,\n slug: child.UrlName,\n description: child.Description,\n });\n await this.walkNode(child.Uri, child.NodeID, folders, albums, images);\n continue;\n }\n\n if (child.Type === \"Album\") {\n albums.push({\n sourceId: child.NodeID,\n name: child.Name,\n parentSourceId: parentFolderId,\n slug: child.UrlName,\n description: child.Description,\n url: child.WebUri,\n });\n const albumUri = child.Uris?.Album;\n if (albumUri) {\n await this.collectAlbumImages(albumUri, child.NodeID, images);\n }\n }\n }\n }\n\n private async collectAlbumImages(\n albumUri: string,\n portfolioSourceId: string,\n images: SmugMugFlatImage[],\n ): Promise<void> {\n const albumKey = albumKeyFromUri(albumUri);\n const configQuery = `_config=${encodeURIComponent(JSON.stringify(ALBUM_IMAGES_CONFIG))}`;\n const initialPath = `${SMUGMUG_API_BASE}/album/${albumKey}!images?${configQuery}`;\n\n let sort = 0;\n for await (const albumImage of this.paginateAlbumImages(initialPath)) {\n images.push(mapAlbumImage(albumImage, portfolioSourceId, sort));\n sort += 1;\n }\n }\n\n private async *paginateNodes(path: string): AsyncGenerator<SmugMugNodeWire> {\n for await (const page of this.paginate<{ Node?: SmugMugNodeWire[] }>(path)) {\n for (const node of page.Node ?? []) {\n yield node;\n }\n }\n }\n\n private async *paginateAlbumImages(path: string): AsyncGenerator<SmugMugAlbumImageWire> {\n for await (const page of this.paginate<{ AlbumImage?: SmugMugAlbumImageWire[] }>(path)) {\n for (const albumImage of page.AlbumImage ?? []) {\n yield albumImage;\n }\n }\n }\n\n private async *paginate<T extends Record<string, unknown>>(\n initialPath: string,\n ): AsyncGenerator<T> {\n let nextPath: string | undefined = appendPagination(initialPath, this.pageSize, 1);\n while (nextPath) {\n const envelope: SmugMugApiEnvelope<T> = await this.requestJson<T>(nextPath);\n yield envelope.Response;\n nextPath = envelope.Response.Pages?.NextPage;\n }\n }\n\n private async requestJson<T>(pathOrUrl: string): Promise<SmugMugApiEnvelope<T>> {\n const url = toAbsoluteUrl(pathOrUrl);\n const response = await this.requestWithRetry(url);\n const body = (await response.json()) as SmugMugApiEnvelope<T>;\n if (body.Code !== 200) {\n throw new Error(`SmugMug API error ${body.Code}: ${body.Message}`);\n }\n return body;\n }\n\n private async requestWithRetry(url: URL): Promise<Response> {\n let attempt = 0;\n while (true) {\n await this.throttle();\n const authorization = buildSmugMugAuthorizationHeader({\n method: \"GET\",\n url: url.toString(),\n credentials: this.credentials,\n });\n const response = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n Authorization: authorization,\n },\n });\n\n if (response.ok) {\n return response;\n }\n\n const retryable = response.status === 429 || response.status >= 500;\n if (!retryable || attempt >= this.maxRetries) {\n const detail = await response.text().catch(() => \"\");\n throw new Error(\n `SmugMug HTTP ${response.status}${detail ? `: ${detail.slice(0, 200)}` : \"\"}`,\n );\n }\n\n const retryAfter = Number.parseInt(response.headers.get(\"retry-after\") ?? \"\", 10);\n const delay = Number.isFinite(retryAfter)\n ? retryAfter * 1000\n : Math.min(this.maxRetryDelayMs, this.retryBaseDelayMs * 2 ** attempt);\n await sleep(delay);\n attempt += 1;\n }\n }\n\n private async throttle(): Promise<void> {\n if (this.requestIntervalMs <= 0) return;\n const elapsed = Date.now() - this.lastRequestAt;\n if (elapsed < this.requestIntervalMs) {\n await sleep(this.requestIntervalMs - elapsed);\n }\n this.lastRequestAt = Date.now();\n }\n}\n\nfunction toAbsoluteUrl(pathOrUrl: string): URL {\n if (pathOrUrl.startsWith(\"http://\") || pathOrUrl.startsWith(\"https://\")) {\n return new URL(pathOrUrl);\n }\n if (pathOrUrl.startsWith(\"/\")) {\n return new URL(`https://${SMUGMUG_API_HOST}${pathOrUrl}`);\n }\n return new URL(pathOrUrl);\n}\n\nfunction appendPagination(pathOrUrl: string, count: number, start: number): string {\n const url = toAbsoluteUrl(pathOrUrl);\n url.searchParams.set(\"count\", String(count));\n url.searchParams.set(\"start\", String(start));\n return url.toString();\n}\n\n/** @internal Exported for crawl tests — resolves root node id from user node URI. */\nexport function smugMugRootNodeIdFromUserNodeUri(nodeUri: string): string {\n return nodeIdFromUri(nodeUri);\n}\n","import { readFile } from \"node:fs/promises\";\n\nimport { sanitizeSlug } from \"../../lib/utility.js\";\nimport type {\n NormalizedAsset,\n NormalizedAssetExif,\n NormalizedEntity,\n NormalizedPortfolio,\n SourceMetadata,\n} from \"../../normalizer/types.js\";\nimport { SmugMugApiClient, type SmugMugClientOptions, type SmugMugCredentials } from \"./api.js\";\nimport type {\n SmugMugExportDocument,\n SmugMugFlatExport,\n SmugMugFlatImage,\n SmugMugMockAlbum,\n SmugMugMockExport,\n SmugMugMockFolder,\n} from \"./types.js\";\n\nconst PLATFORM = \"smugmug\" as const;\nconst UNRESOLVED_URL_PREFIX = \"unspecified://smugmug/\";\n\nexport interface SmugMugParseOptions {\n filePath?: string;\n data?: SmugMugExportDocument;\n /** Pre-constructed signed API client (live crawl). */\n client?: SmugMugApiClient;\n /** OAuth credentials — builds a client when `client` is omitted. */\n credentials?: SmugMugCredentials;\n /** Optional tuning for credential-backed client. */\n clientOptions?: Omit<SmugMugClientOptions, \"credentials\">;\n}\n\nfunction sourceMeta(id: string, url?: string, exportedAt?: string): SourceMetadata {\n return {\n platform: PLATFORM,\n id,\n url,\n exportedAt,\n };\n}\n\nfunction guessMime(filename: string): string | undefined {\n const ext = filename.split(\".\").pop()?.toLowerCase();\n const map: Record<string, string> = {\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n tif: \"image/tiff\",\n tiff: \"image/tiff\",\n };\n return ext ? map[ext] : undefined;\n}\n\nfunction parseExifNumber(value: number | string | undefined): number | undefined {\n if (value === undefined) return undefined;\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n const parsed = Number.parseFloat(String(value).replace(/[^0-9.]/g, \"\"));\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction normalizeExif(\n exif: SmugMugFlatImage[\"exif\"] | SmugMugMockAlbum[\"images\"][0][\"exif\"],\n): NormalizedAssetExif | undefined {\n if (!exif || Object.keys(exif).length === 0) return undefined;\n const normalized: NormalizedAssetExif = {\n iso: parseExifNumber(exif.iso),\n aperture: parseExifNumber(exif.aperture),\n shutter: exif.shutter,\n focalLength: parseExifNumber(exif.focalLength),\n };\n if (\n normalized.iso === undefined &&\n normalized.aperture === undefined &&\n !normalized.shutter &&\n normalized.focalLength === undefined\n ) {\n return undefined;\n }\n return normalized;\n}\n\nexport function isSmugMugFlatExport(value: unknown): value is SmugMugFlatExport {\n if (!value || typeof value !== \"object\") return false;\n const record = value as SmugMugFlatExport;\n const version = record.exportVersion;\n return (\n (version === 1 || version === \"1\") &&\n Array.isArray(record.Folders) &&\n Array.isArray(record.Albums) &&\n Array.isArray(record.Images)\n );\n}\n\nfunction isSmugMugNestedExport(value: unknown): value is SmugMugMockExport {\n if (!value || typeof value !== \"object\") return false;\n const record = value as SmugMugMockExport;\n const version = record.exportVersion;\n return (version === 1 || version === \"1\") && Array.isArray(record.folders);\n}\n\nexport async function loadSmugMugExport(options: SmugMugParseOptions): Promise<SmugMugExportDocument> {\n if (options.data) return options.data;\n if (!options.filePath) {\n throw new Error(\"SmugMug parser requires filePath or data\");\n }\n const raw: unknown = JSON.parse(await readFile(options.filePath, \"utf8\"));\n if (isSmugMugFlatExport(raw) || isSmugMugNestedExport(raw)) {\n return raw;\n }\n throw new Error(\n \"Invalid SmugMug export: expected exportVersion 1 with folders[] (nested) or Folders/Albums/Images (flat)\",\n );\n}\n\nfunction resolveAssetUrl(image: SmugMugFlatImage): string {\n if (image.originalUrl) return image.originalUrl;\n return `${UNRESOLVED_URL_PREFIX}${image.sourceId}`;\n}\n\nfunction resolveFilename(image: SmugMugFlatImage): string {\n if (image.fileName) return image.fileName;\n return `${image.sourceId}.jpg`;\n}\n\nfunction* emitNestedFolderPortfolio(\n folder: SmugMugMockFolder,\n exportedAt?: string,\n): Generator<NormalizedPortfolio> {\n yield {\n type: \"portfolio\",\n source: sourceMeta(folder.id, undefined, exportedAt),\n sourceId: folder.id,\n title: folder.name,\n slug: sanitizeSlug(folder.slug ?? folder.name),\n description: folder.description,\n };\n}\n\nfunction* emitNestedAlbumPortfolio(\n folder: SmugMugMockFolder,\n album: SmugMugMockAlbum,\n exportedAt?: string,\n): Generator<NormalizedPortfolio> {\n yield {\n type: \"portfolio\",\n source: sourceMeta(album.id, album.url, exportedAt),\n sourceId: album.id,\n title: album.name,\n slug: sanitizeSlug(album.slug ?? album.name),\n description: album.description,\n parentSourceId: folder.id,\n };\n}\n\nfunction* emitNestedAlbumAssets(\n album: SmugMugMockAlbum,\n exportedAt?: string,\n): Generator<NormalizedAsset> {\n for (let index = 0; index < album.images.length; index++) {\n const image = album.images[index]!;\n yield {\n type: \"asset\",\n source: sourceMeta(image.id, image.originalUrl, exportedAt),\n sourceId: image.id,\n sourceUrl: image.originalUrl,\n filename: image.fileName,\n mimeType: guessMime(image.fileName),\n caption: image.caption,\n keywords: image.keywords?.length ? image.keywords : undefined,\n exif: normalizeExif(image.exif),\n portfolioSourceId: album.id,\n sort: index,\n };\n }\n}\n\nasync function* enumerateNestedExport(\n doc: SmugMugMockExport,\n): AsyncGenerator<NormalizedEntity> {\n const exportedAt = doc.exportedAt;\n for (const folder of doc.folders) {\n yield* emitNestedFolderPortfolio(folder, exportedAt);\n for (const album of folder.albums) {\n yield* emitNestedAlbumPortfolio(folder, album, exportedAt);\n yield* emitNestedAlbumAssets(album, exportedAt);\n }\n }\n}\n\nasync function* enumerateFlatExport(doc: SmugMugFlatExport): AsyncGenerator<NormalizedEntity> {\n const exportedAt = doc.exportedAt;\n\n for (const folder of doc.Folders) {\n yield {\n type: \"portfolio\",\n source: sourceMeta(folder.sourceId, undefined, exportedAt),\n sourceId: folder.sourceId,\n title: folder.name,\n slug: sanitizeSlug(folder.slug ?? folder.name),\n description: folder.description,\n parentSourceId: folder.parentSourceId,\n } satisfies NormalizedPortfolio;\n }\n\n for (const album of doc.Albums) {\n yield {\n type: \"portfolio\",\n source: sourceMeta(album.sourceId, album.url, exportedAt),\n sourceId: album.sourceId,\n title: album.name,\n slug: sanitizeSlug(album.slug ?? album.name),\n description: album.description,\n parentSourceId: album.parentSourceId,\n } satisfies NormalizedPortfolio;\n }\n\n for (const image of doc.Images) {\n const filename = resolveFilename(image);\n yield {\n type: \"asset\",\n source: sourceMeta(image.sourceId, image.originalUrl, exportedAt),\n sourceId: image.sourceId,\n sourceUrl: resolveAssetUrl(image),\n filename,\n mimeType: guessMime(filename),\n caption: image.caption,\n keywords: image.keywords?.length ? image.keywords : undefined,\n exif: normalizeExif(image.exif),\n portfolioSourceId: image.portfolioSourceId,\n sort: image.sort ?? 0,\n } satisfies NormalizedAsset;\n }\n}\n\nasync function resolveSmugMugDocument(options: SmugMugParseOptions): Promise<SmugMugExportDocument> {\n if (options.data) return options.data;\n if (options.client) return options.client.crawlExport();\n if (options.credentials) {\n const client = new SmugMugApiClient({ credentials: options.credentials, ...options.clientOptions });\n return client.crawlExport();\n }\n return loadSmugMugExport(options);\n}\n\n/** Walk discovered SmugMug nodes — fixture JSON or live API crawl via injected credentials. */\nexport async function* enumerateSmugMugEntities(\n options: SmugMugParseOptions,\n): AsyncGenerator<NormalizedEntity> {\n const doc = await resolveSmugMugDocument(options);\n if (isSmugMugFlatExport(doc)) {\n yield* enumerateFlatExport(doc);\n return;\n }\n yield* enumerateNestedExport(doc);\n}\n\nexport function summarizeSmugMugExport(doc: SmugMugExportDocument): {\n folders: number;\n albums: number;\n assets: number;\n portfolios: number;\n} {\n if (isSmugMugFlatExport(doc)) {\n return {\n folders: doc.Folders.length,\n albums: doc.Albums.length,\n assets: doc.Images.length,\n portfolios: doc.Folders.length + doc.Albums.length,\n };\n }\n\n const folders = doc.folders.length;\n let albums = 0;\n let assets = 0;\n for (const folder of doc.folders) {\n albums += folder.albums.length;\n for (const album of folder.albums) {\n assets += album.images.length;\n }\n }\n return {\n folders,\n albums,\n assets,\n portfolios: folders + albums,\n };\n}\n\nexport async function validateSmugMugExportFile(filePath: string): Promise<{\n ok: boolean;\n issues: { code: string; message: string }[];\n summary: Record<string, number>;\n}> {\n const issues: { code: string; message: string }[] = [];\n let doc: SmugMugExportDocument;\n try {\n doc = await loadSmugMugExport({ filePath });\n } catch (error) {\n return {\n ok: false,\n issues: [\n {\n code: \"invalid_export\",\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n summary: {},\n };\n }\n\n if (isSmugMugFlatExport(doc)) {\n if (doc.Folders.length === 0 && doc.Albums.length === 0) {\n issues.push({ code: \"empty_export\", message: \"No folders or albums in export\" });\n }\n } else if (doc.folders.length === 0) {\n issues.push({ code: \"empty_export\", message: \"No folders in export\" });\n }\n\n const summary = summarizeSmugMugExport(doc);\n return {\n ok: issues.length === 0,\n issues,\n summary: {\n portfolios: summary.portfolios,\n assets: summary.assets,\n categories: summary.folders,\n posts: 0,\n pages: 0,\n tags: 0,\n },\n };\n}\n\n/** @deprecated Use validateSmugMugExportFile */\nexport const validateSmugMugMockFile = validateSmugMugExportFile;\n","import type { AdapterContext, MigrationAdapter, ValidationResult } from \"../../normalizer/types.js\";\nimport type { SmugMugClientOptions } from \"./api.js\";\nimport {\n SmugMugApiClient,\n readSmugMugCredentialsFromEnv,\n smugMugCredentialsSchema,\n} from \"./api.js\";\nimport {\n enumerateSmugMugEntities,\n summarizeSmugMugExport,\n validateSmugMugExportFile,\n} from \"./parse-node.js\";\nimport type { SmugMugExportDocument } from \"./types.js\";\n\ninterface SmugMugParseInput {\n path?: string;\n data?: SmugMugExportDocument;\n credentials?: ReturnType<typeof smugMugCredentialsSchema.parse>;\n client?: SmugMugApiClient;\n clientOptions?: Omit<SmugMugClientOptions, \"credentials\">;\n /** When true, read SMUGMUG_* env vars for live API crawl (no file path required). */\n live?: boolean;\n}\n\nfunction resolveInput(input: unknown): SmugMugParseInput {\n if (typeof input === \"string\") return { path: input };\n if (input && typeof input === \"object\") {\n const record = input as SmugMugParseInput;\n if (record.client || record.credentials || record.live) return record;\n if (record.data) return { data: record.data };\n if (record.path) return { path: record.path };\n }\n throw new Error(\n \"SmugMug adapter requires input path (string or { path }), { data }, { credentials }, { client }, or { live: true }\",\n );\n}\n\nfunction resolveLiveCredentials(input: SmugMugParseInput) {\n if (input.credentials) return input.credentials;\n if (input.live) return readSmugMugCredentialsFromEnv();\n return undefined;\n}\n\nexport const smugmugAdapter: MigrationAdapter = {\n platform: \"smugmug\",\n\n async validateInput(input: unknown): Promise<ValidationResult> {\n try {\n const resolved = resolveInput(input);\n const credentials = resolveLiveCredentials(resolved);\n\n if (resolved.data) {\n const summary = summarizeSmugMugExport(resolved.data);\n return {\n ok: true,\n issues: [],\n summary: {\n portfolios: summary.portfolios,\n assets: summary.assets,\n categories: summary.folders,\n posts: 0,\n pages: 0,\n tags: 0,\n },\n };\n }\n\n if (resolved.client || credentials) {\n const client =\n resolved.client ??\n new SmugMugApiClient({ credentials: credentials!, ...resolved.clientOptions });\n await client.validateCredentials();\n const doc = await client.crawlExport();\n const summary = summarizeSmugMugExport(doc);\n return {\n ok: true,\n issues: [],\n summary: {\n portfolios: summary.portfolios,\n assets: summary.assets,\n categories: summary.folders,\n posts: 0,\n pages: 0,\n tags: 0,\n },\n };\n }\n\n const result = await validateSmugMugExportFile(resolved.path!);\n return {\n ok: result.ok,\n issues: result.issues,\n summary: result.summary,\n };\n } catch (error) {\n return {\n ok: false,\n issues: [\n {\n code: \"invalid_input\",\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n },\n\n enumerateEntities(ctx: AdapterContext) {\n const resolved = resolveInput(ctx.input);\n const credentials = resolveLiveCredentials(resolved);\n return enumerateSmugMugEntities({\n filePath: resolved.path,\n data: resolved.data,\n client: resolved.client,\n credentials,\n clientOptions: resolved.clientOptions,\n });\n },\n};\n\nexport type { SmugMugExportDocument, SmugMugFlatExport, SmugMugMockExport } from \"./types.js\";\nexport {\n SmugMugApiClient,\n SMUGMUG_API_BASE,\n SMUGMUG_OAUTH_ENDPOINTS,\n buildSmugMugAuthorizationHeader,\n oauthPercentEncode,\n readSmugMugCredentialsFromEnv,\n signSmugMugOAuthRequest,\n smugMugCredentialsSchema,\n} from \"./api.js\";\nexport type { SmugMugClientOptions, SmugMugCredentials } from \"./api.js\";\nexport {\n enumerateSmugMugEntities,\n isSmugMugFlatExport,\n loadSmugMugExport,\n summarizeSmugMugExport,\n validateSmugMugExportFile,\n validateSmugMugMockFile,\n} from \"./parse-node.js\";\n","import type { AdapterContext, MigrationAdapter, ValidationResult } from \"../../normalizer/types.js\";\nimport {\n SquarespaceCollectionClient,\n type SquarespaceClientOptions,\n type SquarespaceCollectTarget,\n} from \"./collect.js\";\nimport {\n enumerateSquarespaceEntities,\n summarizeSquarespaceExport,\n validateSquarespaceExportFile,\n} from \"./parse-export.js\";\nimport type { SquarespaceExport } from \"./types.js\";\n\ninterface SquarespaceParseInput {\n path?: string;\n data?: SquarespaceExport;\n client?: SquarespaceCollectionClient;\n collectTargets?: SquarespaceCollectTarget[];\n clientOptions?: SquarespaceClientOptions;\n}\n\nfunction resolveInput(input: unknown): SquarespaceParseInput {\n if (typeof input === \"string\") return { path: input };\n if (input && typeof input === \"object\") {\n const record = input as SquarespaceParseInput;\n if (record.client || record.collectTargets) return record;\n if (record.data) return { data: record.data };\n if (record.path) return { path: record.path };\n }\n throw new Error(\n \"Squarespace adapter requires input path (string or { path }), { data }, { client, collectTargets }, or { collectTargets }\",\n );\n}\n\nexport const squarespaceAdapter: MigrationAdapter = {\n platform: \"squarespace\",\n\n async validateInput(input: unknown): Promise<ValidationResult> {\n try {\n const resolved = resolveInput(input);\n\n if (resolved.data) {\n const summary = summarizeSquarespaceExport(resolved.data);\n return {\n ok: true,\n issues: [],\n summary: {\n pages: summary.pages,\n posts: summary.posts,\n categories: summary.categories,\n tags: summary.tags,\n },\n };\n }\n\n if (resolved.client || resolved.collectTargets?.length) {\n if (!resolved.collectTargets?.length) {\n throw new Error(\"Squarespace live validation requires collectTargets\");\n }\n const client =\n resolved.client ?? new SquarespaceCollectionClient(resolved.clientOptions);\n const doc = await client.collectExport(resolved.collectTargets);\n const summary = summarizeSquarespaceExport(doc);\n return {\n ok: true,\n issues: [],\n summary: {\n pages: summary.pages,\n posts: summary.posts,\n categories: summary.categories,\n tags: summary.tags,\n },\n };\n }\n\n const result = await validateSquarespaceExportFile(resolved.path!);\n return {\n ok: result.ok,\n issues: result.issues,\n summary: result.summary,\n };\n } catch (error) {\n return {\n ok: false,\n issues: [\n {\n code: \"invalid_input\",\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n },\n\n enumerateEntities(ctx: AdapterContext) {\n const resolved = resolveInput(ctx.input);\n return enumerateSquarespaceEntities({\n filePath: resolved.path,\n data: resolved.data,\n client: resolved.client,\n collectTargets: resolved.collectTargets,\n clientOptions: resolved.clientOptions,\n });\n },\n};\n\nexport type { SquarespaceExport } from \"./types.js\";\nexport {\n SQUARESPACE_JSON_FORMAT,\n SquarespaceCollectionClient,\n buildJsonPrettyUrl,\n extractBlocksFromBodyHtml,\n inferBlockTypeFromClassName,\n mapJsonPrettyWire,\n mergeSquarespaceExportPartials,\n squarespaceClientOptionsSchema,\n} from \"./collect.js\";\nexport type { SquarespaceClientOptions, SquarespaceCollectTarget } from \"./collect.js\";\nexport {\n SUPPORTED_BLOCK_TYPES,\n UNSUPPORTED_BLOCK_TYPES,\n enumerateSquarespaceEntities,\n findUnsupportedBlockMarkers,\n flattenSquarespaceBlock,\n flattenSquarespaceBlocks,\n isSquarespaceExport,\n loadSquarespaceExport,\n summarizeSquarespaceExport,\n validateSquarespaceExportFile,\n} from \"./parse-export.js\";\n","import { z } from \"zod\";\n\nimport { sanitizeSlug } from \"../../lib/utility.js\";\nimport {\n mapWireListCategoriesResponse,\n mapWireListPostsResponse,\n mapWireListTagsResponse,\n} from \"./map-wire.js\";\nimport type { WixCategory, WixExport, WixPost, WixTag } from \"./types.js\";\n\n/** Wix REST API base — raw HTTP only; no `@wix/sdk`. */\nexport const WIX_API_BASE = \"https://www.wixapis.com\";\n\nexport const wixAuthContextSchema = z.object({\n /** Full Authorization header value (API key or Bearer token). */\n authorization: z.string().min(1),\n siteId: z.string().min(1),\n accountId: z.string().optional(),\n extraHeaders: z.record(z.string()).optional(),\n});\n\nexport type WixAuthContext = z.infer<typeof wixAuthContextSchema>;\n\nexport const wixClientOptionsSchema = z.object({\n auth: wixAuthContextSchema,\n pageSize: z.number().int().min(1).max(100).default(50),\n maxRetries: z.number().int().min(0).max(10).default(3),\n retryBaseDelayMs: z.number().int().min(0).default(500),\n maxRetryDelayMs: z.number().int().min(0).default(8000),\n requestIntervalMs: z.number().int().min(0).default(200),\n fetchImpl: z.custom<typeof fetch>().optional(),\n /** Include draft posts when the API key has permission. */\n includeDrafts: z.boolean().default(false),\n});\n\nexport type WixClientOptions = z.input<typeof wixClientOptionsSchema>;\n\ninterface WirePaging {\n count?: number;\n offset?: number;\n total?: number;\n tooManyToCount?: boolean;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction dedupeById<T extends { id: string }>(items: T[]): T[] {\n const seen = new Map<string, T>();\n for (const item of items) seen.set(item.id, item);\n return [...seen.values()];\n}\n\nfunction dedupeBySlug<T extends { slug: string }>(items: T[]): T[] {\n const seen = new Map<string, T>();\n for (const item of items) seen.set(item.slug, item);\n return [...seen.values()];\n}\n\nfunction pagingComplete(items: unknown[], paging: WirePaging | undefined, pageSize: number): boolean {\n if (!Array.isArray(items) || items.length === 0) return true;\n if (items.length < pageSize) return true;\n if (typeof paging?.total === \"number\" && typeof paging.offset === \"number\") {\n return paging.offset + items.length >= paging.total;\n }\n return false;\n}\n\n/** Fetch blog posts, categories, and tags via injected `fetch` + vault auth headers. */\nexport class WixCollectionClient {\n readonly auth: WixAuthContext;\n readonly pageSize: number;\n readonly maxRetries: number;\n readonly retryBaseDelayMs: number;\n readonly maxRetryDelayMs: number;\n readonly requestIntervalMs: number;\n readonly fetchImpl: typeof fetch;\n readonly includeDrafts: boolean;\n\n private lastRequestAt = 0;\n\n constructor(options: WixClientOptions) {\n const parsed = wixClientOptionsSchema.parse(options);\n this.auth = parsed.auth;\n this.pageSize = parsed.pageSize;\n this.maxRetries = parsed.maxRetries;\n this.retryBaseDelayMs = parsed.retryBaseDelayMs;\n this.maxRetryDelayMs = parsed.maxRetryDelayMs;\n this.requestIntervalMs = parsed.requestIntervalMs;\n this.fetchImpl = parsed.fetchImpl ?? fetch;\n this.includeDrafts = parsed.includeDrafts;\n }\n\n buildUrl(path: string, query?: Record<string, string | number | undefined>): string {\n const url = new URL(path.startsWith(\"http\") ? path : `${WIX_API_BASE}${path}`);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) continue;\n url.searchParams.set(key, String(value));\n }\n }\n return url.toString();\n }\n\n async fetchJson<T = unknown>(path: string, query?: Record<string, string | number | undefined>): Promise<T> {\n const response = await this.requestWithRetry(this.buildUrl(path, query));\n return response.json() as Promise<T>;\n }\n\n async listAllCategories(): Promise<WixCategory[]> {\n const categories: WixCategory[] = [];\n let offset = 0;\n\n while (true) {\n const wire = await this.fetchJson(\"/blog/v3/categories\", {\n \"paging.limit\": this.pageSize,\n \"paging.offset\": offset,\n fieldsets: \"URL\",\n });\n const batch = mapWireListCategoriesResponse(wire);\n categories.push(...batch);\n\n const paging = (wire as { pagingMetadata?: WirePaging }).pagingMetadata;\n if (pagingComplete(batch, paging, this.pageSize)) break;\n offset += batch.length;\n if (batch.length === 0) break;\n }\n\n return dedupeBySlug(categories);\n }\n\n async listAllTags(): Promise<WixTag[]> {\n const tags: WixTag[] = [];\n let offset = 0;\n\n while (true) {\n const wire = await this.fetchJson(\"/blog/v3/tags\", {\n \"paging.limit\": this.pageSize,\n \"paging.offset\": offset,\n });\n const batch = mapWireListTagsResponse(wire);\n tags.push(...batch);\n\n const paging = (wire as { pagingMetadata?: WirePaging }).pagingMetadata;\n if (pagingComplete(batch, paging, this.pageSize)) break;\n offset += batch.length;\n if (batch.length === 0) break;\n }\n\n return dedupeBySlug(tags);\n }\n\n async listAllPosts(lookup: {\n categorySlugsById: Map<string, string>;\n tagSlugsById: Map<string, string>;\n }): Promise<WixPost[]> {\n const posts: WixPost[] = [];\n let offset = 0;\n\n while (true) {\n const wire = await this.fetchJson(\"/blog/v3/posts\", {\n \"paging.limit\": this.pageSize,\n \"paging.offset\": offset,\n fieldsets: \"URL,RICH_CONTENT,SEO\",\n sort: \"PUBLISHED_DATE_DESC\",\n });\n const batch = mapWireListPostsResponse(wire, lookup);\n posts.push(...batch);\n\n const paging = (wire as { pagingMetadata?: WirePaging }).pagingMetadata;\n if (pagingComplete(batch, paging, this.pageSize)) break;\n offset += batch.length;\n if (batch.length === 0) break;\n }\n\n if (this.includeDrafts) {\n posts.push(...(await this.listDraftPosts(lookup)));\n }\n\n return dedupeById(posts);\n }\n\n private async listDraftPosts(lookup: {\n categorySlugsById: Map<string, string>;\n tagSlugsById: Map<string, string>;\n }): Promise<WixPost[]> {\n const posts: WixPost[] = [];\n let offset = 0;\n\n while (true) {\n const wire = await this.fetchJson(\"/blog/v3/draft-posts\", {\n \"paging.limit\": this.pageSize,\n \"paging.offset\": offset,\n fieldsets: \"URL,RICH_CONTENT,SEO\",\n });\n const batch = mapWireListPostsResponse(\n { posts: (wire as { draftPosts?: unknown[] }).draftPosts ?? [] },\n lookup,\n ).map((post) => ({ ...post, status: \"draft\" as const }));\n posts.push(...batch);\n\n const paging = (wire as { pagingMetadata?: WirePaging }).pagingMetadata;\n if (pagingComplete(batch, paging, this.pageSize)) break;\n offset += batch.length;\n if (batch.length === 0) break;\n }\n\n return posts;\n }\n\n async collectExport(): Promise<WixExport> {\n const categories = await this.listAllCategories();\n const tags = await this.listAllTags();\n\n const categorySlugsById = new Map(categories.map((category) => [category.id, category.slug]));\n const tagSlugsById = new Map(tags.map((tag) => [tag.id, tag.slug]));\n\n const posts = await this.listAllPosts({ categorySlugsById, tagSlugsById });\n\n return {\n exportVersion: 1,\n exportedAt: new Date().toISOString(),\n site: { siteId: this.auth.siteId },\n posts,\n pages: [],\n categories,\n tags,\n };\n }\n\n private buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n Authorization: this.auth.authorization,\n \"wix-site-id\": this.auth.siteId,\n ...(this.auth.extraHeaders ?? {}),\n };\n if (this.auth.accountId) {\n headers[\"wix-account-id\"] = this.auth.accountId;\n }\n return headers;\n }\n\n private async requestWithRetry(url: string): Promise<Response> {\n let attempt = 0;\n while (true) {\n await this.throttle();\n const response = await this.fetchImpl(url, {\n method: \"GET\",\n headers: this.buildHeaders(),\n });\n\n if (response.ok) return response;\n\n const retryable = response.status === 429 || response.status >= 500;\n if (!retryable || attempt >= this.maxRetries) {\n const detail = await response.text().catch(() => \"\");\n throw new Error(\n `Wix HTTP ${response.status}${detail ? `: ${detail.slice(0, 200)}` : \"\"}`,\n );\n }\n\n const retryAfter = Number.parseInt(response.headers.get(\"retry-after\") ?? \"\", 10);\n const delay = Number.isFinite(retryAfter)\n ? retryAfter * 1000\n : Math.min(this.maxRetryDelayMs, this.retryBaseDelayMs * 2 ** attempt);\n await sleep(delay);\n attempt += 1;\n }\n }\n\n private async throttle(): Promise<void> {\n if (this.requestIntervalMs <= 0) return;\n const elapsed = Date.now() - this.lastRequestAt;\n if (elapsed < this.requestIntervalMs) {\n await sleep(this.requestIntervalMs - elapsed);\n }\n this.lastRequestAt = Date.now();\n }\n}\n\n/** Map a collected wire fixture (already normalized to list-* response shapes) into WixExport. */\nexport function mergeWixWireFixtures(partials: {\n categories?: unknown;\n tags?: unknown;\n posts?: unknown;\n exportedAt?: string;\n site?: WixExport[\"site\"];\n}): WixExport {\n const categories = mapWireListCategoriesResponse(partials.categories ?? { categories: [] });\n const tags = mapWireListTagsResponse(partials.tags ?? { tags: [] });\n const categorySlugsById = new Map(categories.map((category) => [category.id, category.slug]));\n const tagSlugsById = new Map(tags.map((tag) => [tag.id, tag.slug]));\n const posts = mapWireListPostsResponse(partials.posts ?? { posts: [] }, {\n categorySlugsById,\n tagSlugsById,\n });\n\n return {\n exportVersion: 1,\n exportedAt: partials.exportedAt ?? new Date().toISOString(),\n site: partials.site,\n categories: dedupeBySlug(categories),\n tags: dedupeBySlug(tags),\n posts: dedupeById(posts),\n pages: [],\n };\n}\n\nexport function isWixExport(value: unknown): value is WixExport {\n if (!value || typeof value !== \"object\") return false;\n const record = value as WixExport;\n return (\n record.exportVersion === 1 &&\n (Array.isArray(record.posts) || Array.isArray(record.pages))\n );\n}\n\n/** Validate exportVersion 1 JSON with posts and/or pages arrays. */\nexport function assertWixExport(value: unknown): WixExport {\n if (!isWixExport(value)) {\n throw new Error(\"Invalid Wix export: expected exportVersion 1 with posts[] and/or pages[]\");\n }\n if ((value.posts?.length ?? 0) === 0 && (value.pages?.length ?? 0) === 0) {\n throw new Error(\"Invalid Wix export: no posts or pages\");\n }\n for (const post of value.posts ?? []) {\n if (!post.slug) post.slug = sanitizeSlug(post.title);\n }\n for (const page of value.pages ?? []) {\n if (!page.slug) page.slug = sanitizeSlug(page.title);\n }\n return value;\n}\n","interface RicosNode {\n type?: string;\n nodes?: RicosNode[];\n textData?: {\n text?: string;\n decorations?: Array<{ type?: string; linkData?: { link?: { url?: string } } }>;\n };\n headingData?: { level?: number };\n imageData?: {\n image?: { src?: { url?: string }; altText?: string };\n containerData?: { alignment?: string };\n };\n htmlData?: { html?: string; containerData?: unknown };\n linkData?: { link?: { url?: string } };\n buttonData?: { text?: string; link?: { url?: string } };\n blockquoteData?: unknown;\n codeBlockData?: { textStyle?: unknown };\n paragraphData?: unknown;\n bulletedListData?: unknown;\n orderedListData?: unknown;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nfunction renderTextNode(node: RicosNode): string {\n const text = node.textData?.text ?? \"\";\n let html = escapeHtml(text);\n for (const decoration of node.textData?.decorations ?? []) {\n switch (decoration.type) {\n case \"BOLD\":\n html = `<strong>${html}</strong>`;\n break;\n case \"ITALIC\":\n html = `<em>${html}</em>`;\n break;\n case \"UNDERLINE\":\n html = `<u>${html}</u>`;\n break;\n case \"LINK\": {\n const href = decoration.linkData?.link?.url;\n if (href) html = `<a href=\"${escapeHtml(href)}\">${html}</a>`;\n break;\n }\n default:\n break;\n }\n }\n return html;\n}\n\nfunction renderChildren(nodes: RicosNode[] | undefined): string {\n return (nodes ?? []).map((node) => renderRicosNode(node)).join(\"\");\n}\n\nfunction renderRicosNode(node: RicosNode): string {\n const type = (node.type ?? \"\").toUpperCase();\n\n switch (type) {\n case \"TEXT\":\n return renderTextNode(node);\n case \"PARAGRAPH\":\n return `<p>${renderChildren(node.nodes)}</p>`;\n case \"HEADING\": {\n const level = Math.min(6, Math.max(1, node.headingData?.level ?? 2));\n return `<h${level}>${renderChildren(node.nodes)}</h${level}>`;\n }\n case \"BULLETED_LIST\":\n return `<ul>${renderChildren(node.nodes)}</ul>`;\n case \"ORDERED_LIST\":\n return `<ol>${renderChildren(node.nodes)}</ol>`;\n case \"LIST_ITEM\":\n return `<li>${renderChildren(node.nodes)}</li>`;\n case \"BLOCKQUOTE\":\n return `<blockquote>${renderChildren(node.nodes)}</blockquote>`;\n case \"HTML\":\n return node.htmlData?.html ?? \"\";\n case \"IMAGE\": {\n const src = node.imageData?.image?.src?.url;\n if (!src) return \"\";\n const alt = node.imageData?.image?.altText\n ? ` alt=\"${escapeHtml(node.imageData.image.altText)}\"`\n : \"\";\n return `<figure><img src=\"${escapeHtml(src)}\"${alt} /></figure>`;\n }\n case \"BUTTON\": {\n const label = escapeHtml(node.buttonData?.text ?? \"Link\");\n const href = node.buttonData?.link?.url ?? node.linkData?.link?.url;\n if (!href) return `<span>${label}</span>`;\n return `<p><a href=\"${escapeHtml(href)}\">${label}</a></p>`;\n }\n case \"CODE_BLOCK\":\n return `<pre><code>${renderChildren(node.nodes)}</code></pre>`;\n case \"DIVIDER\":\n return \"<hr />\";\n default:\n return renderChildren(node.nodes);\n }\n}\n\n/** Convert Wix Ricos rich content JSON into static HTML for NormalizedPost.contentHtml. */\nexport function ricosToHtml(richContent: unknown): string {\n if (!richContent || typeof richContent !== \"object\") return \"\";\n const nodes = (richContent as { nodes?: RicosNode[] }).nodes;\n if (!Array.isArray(nodes) || nodes.length === 0) return \"\";\n return renderChildren(nodes);\n}\n","import { sanitizeSlug } from \"../../lib/utility.js\";\nimport { ricosToHtml } from \"./ricos-to-html.js\";\nimport type { WixCategory, WixPost, WixTag } from \"./types.js\";\n\ninterface WireRecord {\n [key: string]: unknown;\n}\n\ninterface WirePageUrl {\n base?: string;\n path?: string;\n}\n\nfunction isRecord(value: unknown): value is WireRecord {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction asRecord(value: unknown): WireRecord | undefined {\n return isRecord(value) ? value : undefined;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction asStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((entry): entry is string => typeof entry === \"string\");\n}\n\nexport function buildWixPageUrl(url: WirePageUrl | undefined): string | undefined {\n if (!url) return undefined;\n const base = asString(url.base);\n const path = asString(url.path);\n if (base && path) {\n return `${base.replace(/\\/$/, \"\")}${path.startsWith(\"/\") ? path : `/${path}`}`;\n }\n return base ?? path;\n}\n\nfunction seoField(seoData: unknown, prop: \"title\" | \"description\"): string | undefined {\n const tags = asRecord(seoData)?.tags;\n if (!Array.isArray(tags)) return undefined;\n for (const tag of tags) {\n const record = asRecord(tag);\n if (!record) continue;\n const props = asRecord(record.props);\n if (record.type === \"title\" && prop === \"title\") {\n return asString(props?.children) ?? asString(record.children);\n }\n if (record.type === \"meta\" && prop === \"description\" && props?.name === \"description\") {\n return asString(props.content);\n }\n }\n return undefined;\n}\n\nfunction postContentHtml(post: WireRecord): string {\n const richHtml = ricosToHtml(post.richContent);\n if (richHtml.trim()) return richHtml;\n const plain = asString(post.contentText);\n if (!plain) return \"\";\n return `<p>${plain.replace(/\\n\\n+/g, \"</p><p>\").replace(/\\n/g, \"<br />\")}</p>`;\n}\n\nexport function mapWireCategory(\n wire: unknown,\n exportedAt?: string,\n): WixCategory | undefined {\n const record = asRecord(wire);\n if (!record) return undefined;\n const id = asString(record.id);\n const name = asString(record.label) ?? asString(record.title);\n if (!id || !name) return undefined;\n const slug = sanitizeSlug(asString(record.slug) ?? name);\n if (!slug) return undefined;\n void exportedAt;\n return { id, name, slug };\n}\n\nexport function mapWireTag(wire: unknown): WixTag | undefined {\n const record = asRecord(wire);\n if (!record) return undefined;\n const id = asString(record.id);\n const name = asString(record.label) ?? asString(record.slug);\n if (!id || !name) return undefined;\n const slug = sanitizeSlug(asString(record.slug) ?? name);\n if (!slug) return undefined;\n return { id, name, slug };\n}\n\nexport function mapWirePost(\n wire: unknown,\n lookup: { categorySlugsById: Map<string, string>; tagSlugsById: Map<string, string> },\n): WixPost | undefined {\n const record = asRecord(wire);\n if (!record) return undefined;\n\n const id = asString(record.id);\n const title = asString(record.title) ?? \"Untitled\";\n if (!id) return undefined;\n\n const slug = sanitizeSlug(asString(record.slug) ?? title);\n const url = buildWixPageUrl(asRecord(record.url) as WirePageUrl | undefined);\n const heroImage = asRecord(record.heroImage);\n const featuredImageUrl = asString(heroImage?.url);\n\n const categorySlugs = asStringArray(record.categoryIds)\n .map((categoryId) => lookup.categorySlugsById.get(categoryId))\n .filter((slugValue): slugValue is string => !!slugValue);\n\n const tagSlugs = asStringArray(record.tagIds)\n .map((tagId) => lookup.tagSlugsById.get(tagId))\n .filter((slugValue): slugValue is string => !!slugValue);\n\n for (const hashtag of asStringArray(record.hashtags)) {\n const tagSlug = sanitizeSlug(hashtag);\n if (tagSlug && !tagSlugs.includes(tagSlug)) tagSlugs.push(tagSlug);\n }\n\n return {\n id,\n title,\n slug,\n url,\n excerpt: asString(record.excerpt),\n contentHtml: postContentHtml(record),\n publishedAt: asString(record.firstPublishedDate) ?? asString(record.lastPublishedDate),\n status: \"published\",\n categorySlugs,\n tagSlugs,\n featuredImageUrl,\n seoTitle: seoField(record.seoData, \"title\"),\n seoDescription: seoField(record.seoData, \"description\"),\n };\n}\n\nexport function mapWireListPostsResponse(\n wire: unknown,\n lookup: { categorySlugsById: Map<string, string>; tagSlugsById: Map<string, string> },\n): WixPost[] {\n const posts = asRecord(wire)?.posts;\n if (!Array.isArray(posts)) return [];\n return posts\n .map((entry) => mapWirePost(entry, lookup))\n .filter((post): post is WixPost => !!post);\n}\n\nexport function mapWireListCategoriesResponse(wire: unknown): WixCategory[] {\n const categories = asRecord(wire)?.categories;\n if (!Array.isArray(categories)) return [];\n return categories\n .map((entry) => mapWireCategory(entry))\n .filter((category): category is WixCategory => !!category);\n}\n\nexport function mapWireListTagsResponse(wire: unknown): WixTag[] {\n const tags = asRecord(wire)?.tags;\n if (!Array.isArray(tags)) return [];\n return tags\n .map((entry) => mapWireTag(entry))\n .filter((tag): tag is WixTag => !!tag);\n}\n","import * as cheerio from \"cheerio\";\nimport { readFile } from \"node:fs/promises\";\nimport { XMLParser } from \"fast-xml-parser\";\nimport { z } from \"zod\";\n\nimport { linkToPath, sanitizeSlug } from \"../../lib/utility.js\";\nimport type { WixPage, WixSnapshotGap, WixSnapshotTarget } from \"./types.js\";\n\nexport const MAIN_CONTENT_SELECTORS = [\n \"main\",\n \"article\",\n '[role=\"main\"]',\n \"#SITE_PAGES main\",\n \"#site-root main\",\n \"#PAGES_CONTAINER\",\n \"body\",\n] as const;\n\nexport const wixSnapshotClientOptionsSchema = z.object({\n fetchImpl: z.custom<typeof fetch>().optional(),\n maxRetries: z.number().int().min(0).max(5).default(2),\n retryBaseDelayMs: z.number().int().min(0).default(300),\n requestIntervalMs: z.number().int().min(0).default(150),\n});\n\nexport type WixSnapshotClientOptions = z.input<typeof wixSnapshotClientOptionsSchema>;\n\nexport interface WixSnapshotResult {\n pages: WixPage[];\n gaps: WixSnapshotGap[];\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction slugFromUrl(url: string, fallback: string): string {\n try {\n const segments = new URL(url).pathname.split(\"/\").filter(Boolean);\n const last = segments.at(-1);\n if (last) return sanitizeSlug(last);\n } catch {\n // fall through\n }\n return sanitizeSlug(fallback);\n}\n\nfunction looksLikeLoginWall($: cheerio.CheerioAPI, html: string): boolean {\n const lower = html.toLowerCase();\n if (lower.includes(\"members-login\") || lower.includes(\"login-bar\")) return true;\n if ($('input[type=\"password\"]').length > 0 && $('form[action*=\"login\"]').length > 0) return true;\n if ($('[data-testid=\"sign-in\"]').length > 0) return true;\n return false;\n}\n\nfunction pickMainRoot($: cheerio.CheerioAPI) {\n for (const selector of MAIN_CONTENT_SELECTORS) {\n const match = $(selector).first();\n if (match.length > 0) return match;\n }\n return $(\"body\");\n}\n\n/** Extract primary page copy from published HTML (cheerio only — no Puppeteer). */\nexport function extractMainContentHtml(html: string): {\n contentHtml: string;\n title?: string;\n empty: boolean;\n loginWall: boolean;\n} {\n const $ = cheerio.load(html, { xml: false });\n const loginWall = looksLikeLoginWall($, html);\n const title =\n $(\"title\").first().text().trim() ||\n $('meta[property=\"og:title\"]').attr(\"content\")?.trim() ||\n $(\"h1\").first().text().trim() ||\n undefined;\n\n const root = pickMainRoot($);\n root.find(\"script, style, noscript, nav, header, footer, iframe\").remove();\n\n const contentHtml = root.html()?.trim() ?? \"\";\n const textOnly = root.text().replace(/\\s+/g, \" \").trim();\n const empty = textOnly.length < 20;\n\n return { contentHtml, title, empty, loginWall };\n}\n\n/** Parse newline-delimited or comma-separated URL lists. */\nexport function parseUrlList(raw: string): string[] {\n return raw\n .split(/[\\n,]+/)\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0 && /^https?:\\/\\//i.test(entry));\n}\n\n/** Parse `<loc>` entries from a sitemap XML document. */\nexport function parseSitemapUrls(xml: string): string[] {\n const parser = new XMLParser({ ignoreAttributes: true, removeNSPrefix: true });\n const doc = parser.parse(xml) as {\n urlset?: { url?: Array<{ loc?: string }> | { loc?: string } };\n sitemapindex?: { sitemap?: Array<{ loc?: string }> | { loc?: string } };\n };\n\n const urls: string[] = [];\n const urlEntries = doc.urlset?.url;\n if (urlEntries) {\n const list = Array.isArray(urlEntries) ? urlEntries : [urlEntries];\n for (const entry of list) {\n if (entry.loc) urls.push(entry.loc.trim());\n }\n }\n\n const sitemapEntries = doc.sitemapindex?.sitemap;\n if (sitemapEntries) {\n const list = Array.isArray(sitemapEntries) ? sitemapEntries : [sitemapEntries];\n for (const entry of list) {\n if (entry.loc) urls.push(entry.loc.trim());\n }\n }\n\n return [...new Set(urls.filter((url) => /^https?:\\/\\//i.test(url)))];\n}\n\nexport async function loadUrlListFile(filePath: string): Promise<string[]> {\n const raw = await readFile(filePath, \"utf8\");\n if (raw.trim().startsWith(\"<\")) return parseSitemapUrls(raw);\n return parseUrlList(raw);\n}\n\nexport class WixPageSnapshotCollector {\n readonly fetchImpl: typeof fetch;\n readonly maxRetries: number;\n readonly retryBaseDelayMs: number;\n readonly requestIntervalMs: number;\n\n private lastRequestAt = 0;\n\n constructor(options: WixSnapshotClientOptions = {}) {\n const parsed = wixSnapshotClientOptionsSchema.parse(options);\n this.fetchImpl = parsed.fetchImpl ?? fetch;\n this.maxRetries = parsed.maxRetries;\n this.retryBaseDelayMs = parsed.retryBaseDelayMs;\n this.requestIntervalMs = parsed.requestIntervalMs;\n }\n\n async collectPages(targets: WixSnapshotTarget[]): Promise<WixSnapshotResult> {\n const pages: WixPage[] = [];\n const gaps: WixSnapshotGap[] = [];\n\n for (const target of targets) {\n let html: string;\n try {\n html = target.html ?? (await this.fetchHtml(target.url));\n } catch (error) {\n gaps.push({\n url: target.url,\n code: \"fetch_failed\",\n message: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n\n const extracted = extractMainContentHtml(html);\n if (extracted.loginWall) {\n gaps.push({\n url: target.url,\n code: \"login_wall\",\n message: \"Page appears to require authentication\",\n });\n continue;\n }\n\n if (extracted.empty) {\n gaps.push({\n url: target.url,\n code: \"empty_extract\",\n message: \"No meaningful content found in main/article containers\",\n });\n continue;\n }\n\n const title = target.title ?? extracted.title ?? \"Untitled\";\n const slug = target.slug ?? slugFromUrl(target.url, title);\n pages.push({\n id: `page:${slug}`,\n title,\n slug,\n url: target.url,\n contentHtml: extracted.contentHtml,\n isHomePage: target.isHomePage,\n status: \"published\",\n });\n }\n\n return { pages, gaps };\n }\n\n async collectFromUrlList(urls: string[]): Promise<WixSnapshotResult> {\n return this.collectPages(\n urls.map((url, index) => ({\n url,\n isHomePage: index === 0 && new URL(url).pathname === \"/\",\n })),\n );\n }\n\n private async fetchHtml(url: string): Promise<string> {\n let attempt = 0;\n while (true) {\n await this.throttle();\n const response = await this.fetchImpl(url, {\n method: \"GET\",\n headers: { Accept: \"text/html,application/xhtml+xml\" },\n });\n\n if (response.ok) {\n return response.text();\n }\n\n const retryable = response.status === 429 || response.status >= 500;\n if (!retryable || attempt >= this.maxRetries) {\n throw new Error(`Snapshot fetch HTTP ${response.status} for ${url}`);\n }\n\n await sleep(this.retryBaseDelayMs * 2 ** attempt);\n attempt += 1;\n }\n }\n\n private async throttle(): Promise<void> {\n if (this.requestIntervalMs <= 0) return;\n const elapsed = Date.now() - this.lastRequestAt;\n if (elapsed < this.requestIntervalMs) {\n await sleep(this.requestIntervalMs - elapsed);\n }\n this.lastRequestAt = Date.now();\n }\n}\n\nexport function mapSnapshotPageToSourcePath(page: WixPage): string | undefined {\n return linkToPath(page.url);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\n\nimport { XMLParser } from \"fast-xml-parser\";\n\nimport { discoverContentAssetUrls } from \"../../lib/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 ValidationIssue,\n} from \"../../normalizer/types.js\";\nimport { assertWixExport, WixCollectionClient, type WixClientOptions } from \"./api.js\";\nimport { WixPageSnapshotCollector, loadUrlListFile, type WixSnapshotClientOptions } from \"./snapshot.js\";\nimport type { WixExport, WixFeedFormat, WixPage, WixPost, WixSnapshotGap, WixSnapshotTarget } from \"./types.js\";\n\nexport interface WixParseOptions {\n filePath?: string;\n urlsFile?: string;\n data?: WixExport;\n client?: WixCollectionClient;\n clientOptions?: WixClientOptions;\n snapshotTargets?: WixSnapshotTarget[];\n snapshotOptions?: WixSnapshotClientOptions;\n exportedAt?: string;\n}\n\nconst PLATFORM = \"wix\" as const;\n\ninterface FeedCategory {\n \"@_domain\"?: string;\n \"@_term\"?: string;\n \"#text\"?: string;\n}\n\ninterface RssItem {\n title?: unknown;\n link?: unknown;\n guid?: unknown;\n pubDate?: unknown;\n published?: unknown;\n updated?: unknown;\n description?: unknown;\n category?: FeedCategory | FeedCategory[] | string | string[];\n content?: { encoded?: unknown } | string;\n encoded?: unknown;\n}\n\ninterface AtomLink {\n \"@_href\"?: string;\n \"@_rel\"?: string;\n}\n\ninterface AtomEntry {\n title?: unknown;\n link?: AtomLink | AtomLink[] | string;\n id?: unknown;\n published?: unknown;\n updated?: unknown;\n summary?: unknown;\n content?: { \"@_type\"?: string; \"#text\"?: unknown } | string;\n category?: FeedCategory | FeedCategory[] | string | string[];\n}\n\nexport interface WixFeedSummary {\n posts: number;\n categories: number;\n tags: number;\n assets: number;\n format: WixFeedFormat;\n}\n\nfunction asArray<T>(value: T | T[] | undefined): T[] {\n if (value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction textValue(value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"string\" || typeof value === \"number\") return String(value);\n if (typeof value === \"object\" && value !== null && \"#text\" in value) {\n return String((value as { \"#text\": unknown })[\"#text\"] ?? \"\");\n }\n return String(value);\n}\n\nfunction sourceMeta(id: string, url?: string, exportedAt?: string): SourceMetadata {\n return {\n platform: PLATFORM,\n id,\n url: url || undefined,\n path: linkToPath(url),\n exportedAt,\n };\n}\n\nfunction guessMime(filename: string): string | undefined {\n const ext = filename.split(\".\").pop()?.toLowerCase();\n const map: Record<string, string> = {\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n avif: \"image/avif\",\n };\n return ext ? map[ext] : undefined;\n}\n\nfunction parseXmlDocument(xml: string): unknown {\n const parser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: \"@_\",\n removeNSPrefix: true,\n trimValues: false,\n parseTagValue: false,\n });\n return parser.parse(xml);\n}\n\nexport function detectWixFeedFormat(xml: string): WixFeedFormat {\n const trimmed = xml.trim();\n if (trimmed.includes(\"<feed\") || trimmed.startsWith(\"<feed\")) return \"atom\";\n return \"rss\";\n}\n\nfunction getItemContentHtml(item: RssItem | AtomEntry): string {\n const content = (item as RssItem).content ?? (item as AtomEntry).content;\n if (content !== undefined) {\n if (typeof content === \"string\") return content;\n const block = content as { encoded?: unknown; \"#text\"?: unknown };\n if (block[\"#text\"] !== undefined) return textValue(block[\"#text\"]);\n if (block.encoded !== undefined) return textValue(block.encoded);\n }\n\n const rssItem = item as RssItem;\n if (rssItem.encoded !== undefined) return textValue(rssItem.encoded);\n\n return textValue(rssItem.description ?? (item as AtomEntry).summary);\n}\n\nfunction slugFromLink(link: string, title: string, fallbackId: string): string {\n try {\n const pathname = new URL(link).pathname;\n const segments = pathname.split(\"/\").filter(Boolean);\n const last = segments.at(-1);\n if (last) return sanitizeSlug(last);\n } catch {\n // fall through\n }\n return sanitizeSlug(title || fallbackId);\n}\n\nfunction itemLink(item: RssItem | AtomEntry): string {\n const rssLink = textValue((item as RssItem).link);\n if (rssLink) return rssLink;\n\n for (const link of asArray((item as AtomEntry).link)) {\n if (typeof link === \"string\" && link) return link;\n if (typeof link === \"object\" && link !== null) {\n const rel = link[\"@_rel\"];\n const href = link[\"@_href\"];\n if (href && (!rel || rel === \"alternate\")) return href;\n }\n }\n return \"\";\n}\n\nfunction itemSourceId(item: RssItem | AtomEntry, link: string, slug: string): string {\n const guid = textValue((item as RssItem).guid);\n if (guid) return guid;\n const atomId = textValue((item as AtomEntry).id);\n if (atomId) return atomId;\n if (link) return link;\n return slug;\n}\n\nfunction itemPublishedAt(item: RssItem | AtomEntry): string | undefined {\n const pubDate =\n textValue((item as RssItem).pubDate) ||\n textValue((item as AtomEntry).published) ||\n textValue((item as AtomEntry).updated) ||\n textValue((item as RssItem).published);\n return pubDate || undefined;\n}\n\nfunction normalizeCategoryLabel(category: FeedCategory | string): { domain?: string; label: string } {\n if (typeof category === \"string\") {\n return { label: category.trim() };\n }\n return {\n domain: category[\"@_domain\"]?.toLowerCase(),\n label: textValue(category[\"#text\"] ?? category[\"@_term\"]).trim(),\n };\n}\n\nfunction collectTaxonomiesFromItems(\n items: Array<RssItem | AtomEntry>,\n): { categories: Map<string, NormalizedCategory>; tags: Map<string, NormalizedTag> } {\n const categories = new Map<string, NormalizedCategory>();\n const tags = new Map<string, NormalizedTag>();\n\n for (const item of items) {\n for (const rawCategory of asArray(item.category)) {\n const { domain, label } = normalizeCategoryLabel(rawCategory);\n if (!label) continue;\n\n const slug = sanitizeSlug(label);\n if (!slug) continue;\n\n if (domain === \"tag\" || domain === \"post_tag\") {\n if (tags.has(slug)) continue;\n tags.set(slug, {\n type: \"tag\",\n source: sourceMeta(`tag:${slug}`),\n sourceId: `tag:${slug}`,\n name: label,\n slug,\n });\n continue;\n }\n\n if (categories.has(slug)) continue;\n categories.set(slug, {\n type: \"category\",\n source: sourceMeta(`cat:${slug}`),\n sourceId: `cat:${slug}`,\n name: label,\n slug,\n });\n }\n }\n\n return { categories, tags };\n}\n\nfunction collectCategorySlugs(item: RssItem | AtomEntry): string[] {\n const slugs: string[] = [];\n for (const rawCategory of asArray(item.category)) {\n const { domain, label } = normalizeCategoryLabel(rawCategory);\n if (!label || domain === \"tag\" || domain === \"post_tag\") continue;\n const slug = sanitizeSlug(label);\n if (slug) slugs.push(slug);\n }\n return slugs;\n}\n\nfunction collectTagSlugs(item: RssItem | AtomEntry): string[] {\n const slugs: string[] = [];\n for (const rawCategory of asArray(item.category)) {\n const { domain, label } = normalizeCategoryLabel(rawCategory);\n if (!label || (domain !== \"tag\" && domain !== \"post_tag\")) continue;\n const slug = sanitizeSlug(label);\n if (slug) slugs.push(slug);\n }\n return slugs;\n}\n\nfunction* collectInlineAssets(\n html: string,\n seenUrls: Set<string>,\n exportedAt?: string,\n): Generator<NormalizedAsset> {\n for (const src of discoverContentAssetUrls(html)) {\n if (seenUrls.has(src)) continue;\n seenUrls.add(src);\n\n let filename: string;\n try {\n filename = basename(new URL(src, \"http://local.invalid\").pathname) || \"inline-asset\";\n } catch {\n filename = \"inline-asset\";\n }\n\n yield {\n type: \"asset\",\n source: sourceMeta(`url:${src}`, src, exportedAt),\n sourceId: `url:${src}`,\n sourceUrl: src,\n filename,\n mimeType: guessMime(filename),\n };\n }\n}\n\nfunction mapPublishStatus(status: string | undefined): PublishStatus {\n switch ((status ?? \"published\").toLowerCase()) {\n case \"published\":\n return \"published\";\n case \"draft\":\n return \"draft\";\n default:\n return \"archived\";\n }\n}\n\nfunction* emitExportPost(\n post: WixPost,\n exportedAt: string | undefined,\n seenAssetUrls: Set<string>,\n): Generator<NormalizedEntity> {\n yield* collectInlineAssets(post.contentHtml, seenAssetUrls, exportedAt);\n\n let featuredAssetSourceId: string | undefined;\n if (post.featuredImageUrl) {\n featuredAssetSourceId = `featured:${post.id}`;\n if (!seenAssetUrls.has(post.featuredImageUrl)) {\n seenAssetUrls.add(post.featuredImageUrl);\n const filename = basename(new URL(post.featuredImageUrl).pathname) || `${post.id}-featured.jpg`;\n yield {\n type: \"asset\",\n source: sourceMeta(featuredAssetSourceId, post.featuredImageUrl, exportedAt),\n sourceId: featuredAssetSourceId,\n sourceUrl: post.featuredImageUrl,\n filename,\n mimeType: guessMime(filename),\n };\n }\n }\n\n yield {\n type: \"post\",\n source: sourceMeta(post.id, post.url, exportedAt),\n sourceId: post.id,\n title: post.title,\n slug: sanitizeSlug(post.slug),\n excerpt: post.excerpt,\n contentHtml: post.contentHtml,\n publishedAt: post.publishedAt,\n status: mapPublishStatus(post.status),\n categorySlugs: post.categorySlugs,\n tagSlugs: post.tagSlugs,\n featuredAssetSourceId,\n seoTitle: post.seoTitle,\n seoDescription: post.seoDescription,\n } satisfies NormalizedPost;\n}\n\nfunction* emitExportPage(\n page: WixPage,\n exportedAt: string | undefined,\n seenAssetUrls: Set<string>,\n): Generator<NormalizedEntity> {\n yield* collectInlineAssets(page.contentHtml, seenAssetUrls, exportedAt);\n\n yield {\n type: \"page\",\n source: sourceMeta(page.id, page.url, exportedAt),\n sourceId: page.id,\n title: page.title,\n slug: sanitizeSlug(page.slug),\n contentHtml: page.contentHtml,\n isHomePage: page.isHomePage,\n status: mapPublishStatus(page.status),\n seoTitle: page.seoTitle,\n seoDescription: page.seoDescription,\n } satisfies NormalizedPage;\n}\n\nexport async function* enumerateWixExportEntities(\n doc: WixExport,\n snapshotGaps?: WixSnapshotGap[],\n): AsyncGenerator<NormalizedEntity> {\n const exportedAt = doc.exportedAt;\n const seenAssetUrls = new Set<string>();\n\n for (const category of doc.categories ?? []) {\n yield {\n type: \"category\",\n source: sourceMeta(category.id, undefined, exportedAt),\n sourceId: category.id,\n name: category.name,\n slug: sanitizeSlug(category.slug),\n } satisfies NormalizedCategory;\n }\n\n for (const tag of doc.tags ?? []) {\n yield {\n type: \"tag\",\n source: sourceMeta(tag.id, undefined, exportedAt),\n sourceId: tag.id,\n name: tag.name,\n slug: sanitizeSlug(tag.slug),\n } satisfies NormalizedTag;\n }\n\n for (const page of doc.pages ?? []) {\n yield* emitExportPage(page, exportedAt, seenAssetUrls);\n }\n\n for (const post of doc.posts ?? []) {\n yield* emitExportPost(post, exportedAt, seenAssetUrls);\n }\n\n void snapshotGaps;\n}\n\nexport function summarizeWixExport(doc: WixExport): {\n posts: number;\n pages: number;\n categories: number;\n tags: number;\n assets: number;\n} {\n const seenAssetUrls = new Set<string>();\n let assets = 0;\n\n const countHtml = (html: string, featured?: string) => {\n if (featured && !seenAssetUrls.has(featured)) {\n seenAssetUrls.add(featured);\n assets += 1;\n }\n for (const src of discoverContentAssetUrls(html)) {\n if (seenAssetUrls.has(src)) continue;\n seenAssetUrls.add(src);\n assets += 1;\n }\n };\n\n for (const post of doc.posts ?? []) {\n countHtml(post.contentHtml, post.featuredImageUrl);\n }\n for (const page of doc.pages ?? []) {\n countHtml(page.contentHtml);\n }\n\n return {\n posts: doc.posts?.length ?? 0,\n pages: doc.pages?.length ?? 0,\n categories: doc.categories?.length ?? 0,\n tags: doc.tags?.length ?? 0,\n assets,\n };\n}\n\nfunction parseFeedItems(xml: string): { format: WixFeedFormat; items: Array<RssItem | AtomEntry> } {\n const format = detectWixFeedFormat(xml);\n const doc = parseXmlDocument(xml) as {\n rss?: { channel?: { item?: RssItem | RssItem[] } };\n feed?: { entry?: AtomEntry | AtomEntry[] };\n };\n\n if (format === \"atom\") {\n return { format, items: asArray(doc.feed?.entry) };\n }\n\n return { format, items: asArray(doc.rss?.channel?.item) };\n}\n\nexport async function loadWixFeed(filePath: string): Promise<{ format: WixFeedFormat; items: Array<RssItem | AtomEntry> }> {\n const xml = await readFile(filePath, \"utf8\");\n const parsed = parseFeedItems(xml);\n if (parsed.items.length === 0) {\n throw new Error(\"Invalid Wix feed: no entries found in RSS or Atom document\");\n }\n return parsed;\n}\n\nexport async function loadWixExport(options: WixParseOptions): Promise<WixExport> {\n if (options.data) return assertWixExport(options.data);\n\n if (options.client) {\n const doc = await options.client.collectExport();\n return assertWixExport(doc);\n }\n\n if (options.clientOptions) {\n const client = new WixCollectionClient(options.clientOptions);\n const doc = await client.collectExport();\n return assertWixExport(doc);\n }\n\n if (options.filePath) {\n const ext = extname(options.filePath).toLowerCase();\n if (ext === \".json\") {\n const raw: unknown = JSON.parse(await readFile(options.filePath, \"utf8\"));\n return assertWixExport(raw);\n }\n }\n\n throw new Error(\"Wix parser requires filePath (.json), data, client, or clientOptions\");\n}\n\nasync function resolveSnapshotTargets(options: WixParseOptions): Promise<WixSnapshotTarget[]> {\n if (options.snapshotTargets?.length) return options.snapshotTargets;\n const listPath = options.urlsFile ?? (\n options.filePath && extname(options.filePath).toLowerCase() === \".txt\" ? options.filePath : undefined\n );\n if (listPath) {\n const urls = await loadUrlListFile(listPath);\n return urls.map((url, index) => ({\n url,\n isHomePage: index === 0 && new URL(url).pathname === \"/\",\n }));\n }\n return [];\n}\n\nasync function attachSnapshotPages(\n doc: WixExport,\n options: WixParseOptions,\n): Promise<{ doc: WixExport; gaps: WixSnapshotGap[] }> {\n const targets = await resolveSnapshotTargets(options);\n if (targets.length === 0) return { doc, gaps: [] };\n\n const collector = new WixPageSnapshotCollector(options.snapshotOptions);\n const { pages, gaps } = await collector.collectPages(targets);\n return {\n doc: {\n ...doc,\n pages: [...(doc.pages ?? []), ...pages],\n },\n gaps,\n };\n}\n\nexport async function* enumerateWixEntities(options: WixParseOptions): AsyncGenerator<NormalizedEntity> {\n if (options.filePath && [\".xml\", \".rss\", \".atom\"].includes(extname(options.filePath).toLowerCase())) {\n yield* enumerateWixFeedEntities(options);\n const snapshotTargets = await resolveSnapshotTargets(options);\n if (snapshotTargets.length > 0) {\n const { doc, gaps } = await attachSnapshotPages(\n { exportVersion: 1, pages: [], posts: [] },\n { ...options, snapshotTargets },\n );\n yield* enumerateWixExportEntities(doc, gaps);\n }\n return;\n }\n\n if (options.filePath && extname(options.filePath).toLowerCase() === \".txt\" && !options.data && !options.client) {\n const { doc, gaps } = await attachSnapshotPages(\n { exportVersion: 1, pages: [], posts: [] },\n options,\n );\n yield* enumerateWixExportEntities(doc, gaps);\n return;\n }\n\n const snapshotTargets = await resolveSnapshotTargets(options);\n if (\n snapshotTargets.length > 0 &&\n !options.filePath &&\n !options.data &&\n !options.client &&\n !options.clientOptions\n ) {\n const { doc, gaps } = await attachSnapshotPages(\n { exportVersion: 1, pages: [], posts: [] },\n { ...options, snapshotTargets },\n );\n yield* enumerateWixExportEntities(doc, gaps);\n return;\n }\n\n const doc = await loadWixExport(options);\n const { doc: withSnapshots, gaps } = await attachSnapshotPages(doc, options);\n yield* enumerateWixExportEntities(withSnapshots, gaps);\n}\n\nasync function* enumerateWixFeedEntities(options: WixParseOptions): AsyncGenerator<NormalizedEntity> {\n if (!options.filePath) {\n throw new Error(\"Wix feed parser requires filePath\");\n }\n const { format, items } = await loadWixFeed(options.filePath);\n const { categories, tags } = collectTaxonomiesFromItems(items);\n const seenAssetUrls = new Set<string>();\n\n for (const category of categories.values()) {\n yield category;\n }\n for (const tag of tags.values()) {\n yield tag;\n }\n\n for (const item of items) {\n const title = textValue(item.title) || \"Untitled\";\n const link = itemLink(item);\n const sourceId = itemSourceId(item, link, sanitizeSlug(title));\n const slug = slugFromLink(link, title, sourceId);\n const contentHtml = getItemContentHtml(item);\n\n for (const asset of collectInlineAssets(contentHtml, seenAssetUrls, options.exportedAt)) {\n yield asset;\n }\n\n const post: NormalizedPost = {\n type: \"post\",\n source: sourceMeta(sourceId, link || undefined, options.exportedAt),\n sourceId,\n title,\n slug,\n excerpt: textValue((item as RssItem).description) || undefined,\n contentHtml,\n publishedAt: itemPublishedAt(item),\n status: \"published\" satisfies PublishStatus,\n categorySlugs: collectCategorySlugs(item),\n tagSlugs: collectTagSlugs(item),\n };\n\n yield post;\n }\n\n void format;\n}\n\nexport async function summarizeWixFeed(filePath: string): Promise<WixFeedSummary> {\n const { format, items } = await loadWixFeed(filePath);\n let posts = 0;\n let assets = 0;\n const { categories, tags } = collectTaxonomiesFromItems(items);\n const seenAssetUrls = new Set<string>();\n\n for (const item of items) {\n posts += 1;\n const contentHtml = getItemContentHtml(item);\n for (const src of discoverContentAssetUrls(contentHtml)) {\n if (seenAssetUrls.has(src)) continue;\n seenAssetUrls.add(src);\n assets += 1;\n }\n }\n\n return {\n format,\n posts,\n categories: categories.size,\n tags: tags.size,\n assets,\n };\n}\n\nexport async function validateWixExportFile(filePath: string): Promise<{\n ok: boolean;\n issues: ValidationIssue[];\n summary: Omit<WixFeedSummary, \"format\"> & { format?: WixFeedFormat };\n}> {\n try {\n const summary = await summarizeWixFeed(filePath);\n return {\n ok: true,\n issues: [],\n summary,\n };\n } catch (error) {\n return {\n ok: false,\n issues: [\n {\n code: \"invalid_wix_feed\",\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n summary: { posts: 0, categories: 0, tags: 0, assets: 0 },\n };\n }\n}\n\nexport function isWixFeedXml(xml: string): boolean {\n const trimmed = xml.trim();\n return trimmed.includes(\"<rss\") || trimmed.includes(\"<feed\");\n}\n","import type { AdapterContext, MigrationAdapter, ValidationResult } from \"../../normalizer/types.js\";\nimport { WixCollectionClient, type WixClientOptions } from \"./api.js\";\nimport {\n enumerateWixEntities,\n enumerateWixExportEntities,\n isWixFeedXml,\n loadWixExport,\n summarizeWixExport,\n summarizeWixFeed,\n validateWixExportFile,\n} from \"./parse-export.js\";\nimport type { WixExport, WixSnapshotTarget } from \"./types.js\";\n\ninterface WixParseInput {\n path?: string;\n urlsFile?: string;\n data?: WixExport;\n client?: WixCollectionClient;\n clientOptions?: WixClientOptions;\n snapshotTargets?: WixSnapshotTarget[];\n}\n\nfunction resolveInput(input: unknown): WixParseInput {\n if (typeof input === \"string\") return { path: input };\n if (input && typeof input === \"object\") {\n const record = input as WixParseInput & { urlsPath?: string };\n if (\n record.client ||\n record.clientOptions ||\n record.data ||\n record.snapshotTargets?.length\n ) {\n return record;\n }\n if (record.path || record.urlsFile || record.urlsPath) {\n return {\n path: record.path,\n urlsFile: record.urlsFile ?? record.urlsPath,\n };\n }\n }\n throw new Error(\n \"Wix adapter requires input path (string or { path }), { data }, { client }, { clientOptions }, or snapshot targets\",\n );\n}\n\nfunction toParseOptions(input: WixParseInput) {\n return {\n filePath: input.path,\n urlsFile: input.urlsFile,\n data: input.data,\n client: input.client,\n clientOptions: input.clientOptions,\n snapshotTargets: input.snapshotTargets,\n };\n}\n\nexport const wixAdapter: MigrationAdapter = {\n platform: \"wix\",\n\n async validateInput(input: unknown): Promise<ValidationResult> {\n try {\n const resolved = resolveInput(input);\n const options = toParseOptions(resolved);\n\n if (resolved.data) {\n const summary = summarizeWixExport(resolved.data);\n return {\n ok: true,\n issues: [],\n summary: {\n posts: summary.posts,\n pages: summary.pages,\n assets: summary.assets,\n categories: summary.categories,\n tags: summary.tags,\n },\n };\n }\n\n if (resolved.client || resolved.clientOptions) {\n const doc = await loadWixExport(options);\n const summary = summarizeWixExport(doc);\n return {\n ok: true,\n issues: [],\n summary: {\n posts: summary.posts,\n pages: summary.pages,\n assets: summary.assets,\n categories: summary.categories,\n tags: summary.tags,\n },\n };\n }\n\n if (resolved.path?.endsWith(\".json\")) {\n const doc = await loadWixExport(options);\n const summary = summarizeWixExport(doc);\n return {\n ok: true,\n issues: [],\n summary: {\n posts: summary.posts,\n pages: summary.pages,\n assets: summary.assets,\n categories: summary.categories,\n tags: summary.tags,\n },\n };\n }\n\n if (resolved.path && !resolved.path.endsWith(\".txt\")) {\n const result = await validateWixExportFile(resolved.path);\n return {\n ok: result.ok,\n issues: result.issues,\n summary: {\n posts: result.summary.posts,\n pages: 0,\n assets: result.summary.assets,\n categories: result.summary.categories,\n tags: result.summary.tags,\n },\n };\n }\n\n if (resolved.path?.endsWith(\".txt\") || resolved.urlsFile) {\n return {\n ok: true,\n issues: [],\n summary: { pages: 0, posts: 0, assets: 0, categories: 0, tags: 0 },\n };\n }\n\n throw new Error(\"Wix validation requires export.xml, export.json, url list, or API client options\");\n } catch (error) {\n return {\n ok: false,\n issues: [\n {\n code: \"invalid_input\",\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n },\n\n enumerateEntities(ctx: AdapterContext) {\n return enumerateWixEntities(toParseOptions(resolveInput(ctx.input)));\n },\n};\n\nexport {\n WIX_API_BASE,\n WixCollectionClient,\n assertWixExport,\n isWixExport,\n mergeWixWireFixtures,\n wixAuthContextSchema,\n wixClientOptionsSchema,\n} from \"./api.js\";\nexport type { WixAuthContext, WixClientOptions } from \"./api.js\";\nexport {\n detectWixFeedFormat,\n enumerateWixEntities,\n enumerateWixExportEntities,\n isWixFeedXml,\n loadWixExport,\n loadWixFeed,\n summarizeWixExport,\n summarizeWixFeed,\n validateWixExportFile,\n} from \"./parse-export.js\";\nexport {\n MAIN_CONTENT_SELECTORS,\n WixPageSnapshotCollector,\n extractMainContentHtml,\n loadUrlListFile,\n parseSitemapUrls,\n parseUrlList,\n wixSnapshotClientOptionsSchema,\n} from \"./snapshot.js\";\nexport type { WixSnapshotClientOptions, WixSnapshotResult } from \"./snapshot.js\";\nexport { ricosToHtml } from \"./ricos-to-html.js\";\nexport {\n buildWixPageUrl,\n mapWireCategory,\n mapWireListCategoriesResponse,\n mapWireListPostsResponse,\n mapWireListTagsResponse,\n mapWirePost,\n mapWireTag,\n} from \"./map-wire.js\";\nexport type {\n WixExport,\n WixFeedFormat,\n WixPage,\n WixPost,\n WixSnapshotGap,\n WixSnapshotTarget,\n} from \"./types.js\";\nexport type { WixParseOptions } from \"./parse-export.js\";\n","export { wordpressAdapter } from \"./wordpress/index.js\";\nexport {\n SmugMugApiClient,\n SMUGMUG_API_BASE,\n SMUGMUG_OAUTH_ENDPOINTS,\n buildSmugMugAuthorizationHeader,\n readSmugMugCredentialsFromEnv,\n signSmugMugOAuthRequest,\n smugmugAdapter,\n smugMugCredentialsSchema,\n} from \"./smugmug/index.js\";\nexport type { SmugMugClientOptions, SmugMugCredentials } from \"./smugmug/index.js\";\nexport { squarespaceAdapter } from \"./squarespace/index.js\";\nexport { wixAdapter, WixCollectionClient, WixPageSnapshotCollector } from \"./wix/index.js\";\nexport {\n SquarespaceCollectionClient,\n SQUARESPACE_JSON_FORMAT,\n buildJsonPrettyUrl,\n mapJsonPrettyWire,\n} from \"./squarespace/index.js\";\nexport type { SquarespaceClientOptions, SquarespaceCollectTarget } from \"./squarespace/index.js\";\n\nimport type { MigrationPlatform } from \"../normalizer/types.js\";\nimport { smugmugAdapter } from \"./smugmug/index.js\";\nimport { squarespaceAdapter } from \"./squarespace/index.js\";\nimport { wordpressAdapter } from \"./wordpress/index.js\";\n\nimport { wixAdapter } from \"./wix/index.js\";\n\nconst adapters = {\n wordpress: wordpressAdapter,\n smugmug: smugmugAdapter,\n squarespace: squarespaceAdapter,\n wix: wixAdapter,\n} as const;\n\nexport function getAdapter(platform: MigrationPlatform) {\n return adapters[platform];\n}\n"],"mappings":"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","names":["readFile","PLATFORM","sourceMeta","guessMime","readFile","resolveInput","z","z","sleep","readFile","XMLParser","z","z","sleep","XMLParser","readFile","readFile","basename","XMLParser","PLATFORM","asArray","textValue","sourceMeta","guessMime","XMLParser","collectInlineAssets","basename","mapPublishStatus","readFile","snapshotTargets","doc","gaps","resolveInput"]}