@artinstack/migrator 0.1.10 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/{bundle-Do-9ikQv.d.ts → bundle-CysqqLij.d.ts} +1 -1
  2. package/dist/chunk-J7EUSPEA.js +667 -0
  3. package/dist/chunk-J7EUSPEA.js.map +1 -0
  4. package/dist/{chunk-3YJFSTYR.js → chunk-MUFGDYGI.js} +2 -1
  5. package/dist/chunk-MUFGDYGI.js.map +1 -0
  6. package/dist/{chunk-LC7CGWDN.js → chunk-PFUXPS7A.js} +1 -1
  7. package/dist/chunk-PFUXPS7A.js.map +1 -0
  8. package/dist/{chunk-YLVPZ4M3.js → chunk-Q44KGFIH.js} +28 -524
  9. package/dist/chunk-Q44KGFIH.js.map +1 -0
  10. package/dist/chunk-QFJXNEXG.js +355 -0
  11. package/dist/chunk-QFJXNEXG.js.map +1 -0
  12. package/dist/{chunk-3A2PA4P3.js → chunk-VRRYN6NS.js} +4 -232
  13. package/dist/chunk-VRRYN6NS.js.map +1 -0
  14. package/dist/{chunk-S4SUJT2D.js → chunk-WCAHVNWW.js} +98 -3
  15. package/dist/chunk-WCAHVNWW.js.map +1 -0
  16. package/dist/cli/index.js +5 -4
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/index.d.ts +3 -3
  19. package/dist/index.js +7 -6
  20. package/dist/normalizer/index.d.ts +10 -4
  21. package/dist/normalizer/index.js +2 -2
  22. package/dist/sinks/index.d.ts +2 -2
  23. package/dist/sinks/index.js +3 -3
  24. package/dist/transformers/index.d.ts +1 -1
  25. package/dist/transformers/index.js +3 -2
  26. package/dist/{types-TCHy3Oko.d.ts → types-CLNmloya.d.ts} +2 -0
  27. package/package.json +1 -1
  28. package/dist/chunk-3A2PA4P3.js.map +0 -1
  29. package/dist/chunk-3YJFSTYR.js.map +0 -1
  30. package/dist/chunk-BONZ3U3I.js +0 -124
  31. package/dist/chunk-BONZ3U3I.js.map +0 -1
  32. package/dist/chunk-LC7CGWDN.js.map +0 -1
  33. package/dist/chunk-S4SUJT2D.js.map +0 -1
  34. package/dist/chunk-YLVPZ4M3.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { writeFile } from \"node:fs/promises\";\nimport { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { getAdapter } from \"../parsers/index.js\";\nimport type { MigrationPlatform } from \"../normalizer/types.js\";\nimport {\n analyzeConflicts,\n buildMigrationReport,\n buildRedirectMap,\n bundleToCombinedJson,\n createFilesystemMigrationSink,\n detectRedirectLoops,\n hasBlockingConflicts,\n hasWarnings,\n runDryRun,\n resolveAdapterImportSummary,\n runMigration,\n writeFilesystemExport,\n} from \"../sinks/index.js\";\nimport { collectEntities } from \"../normalizer/bundle.js\";\nimport { createWpContentGatewayRewrite } from \"../lib/media-urls.js\";\nimport { estimateStorage, staleUrlsFromEstimate } from \"../sinks/storage-estimate.js\";\n\nconst PLATFORMS: MigrationPlatform[] = [\"wordpress\", \"smugmug\", \"squarespace\", \"wix\"];\nconst SINKS = [\"filesystem\"] as const;\n\nfunction printUsage(): void {\n console.log(`artinstack-migrate — platform content migration CLI\n\nUsage:\n artinstack-migrate <platform> <export-file> [options]\n artinstack-migrate validate <platform> <export-file>\n\nPlatforms: ${PLATFORMS.join(\", \")}\n\nOptions:\n --out <dir> Write grouped JSON files to directory\n --sink <name> Run through MigrationSink (supported: ${SINKS.join(\", \")})\n --format json Write combined JSON to stdout\n --dry-run Parse and analyze without writing content files\n --report <dir> With --dry-run, write conflicts.json + migration-report.json\n --offline Skip network HEAD requests (4 MB fallback per asset)\n --urls <file> Wix W2: newline URL list or sitemap.xml for static page snapshots\n --rewrite-gateway <url> WordPress: API gateway base (requires --rewrite-public)\n --rewrite-public <url> WordPress: public origin for /wp-content/ asset paths\n\nExamples:\n artinstack-migrate wordpress export.xml --dry-run --report ./preview/\n artinstack-migrate wordpress export.xml --rewrite-gateway https://gateway.example/prod --rewrite-public https://www.example.com --dry-run --report ./preview/\n artinstack-migrate wix feed.xml --urls ./sitemap-urls.txt --dry-run\n artinstack-migrate wordpress export.xml --out ./output\n artinstack-migrate wordpress export.xml --sink filesystem --out ./output\n pnpm cli wordpress fixtures/wordpress/long-form-journal.xml --dry-run\n`);\n}\n\nfunction printDryRunStatus(exitCode: 0 | 1 | 2, reportDir?: string): void {\n const dest = reportDir ? ` Reports written to ${reportDir}.` : \"\";\n if (exitCode === 0) {\n console.error(`Dry run complete.${dest}`);\n } else if (exitCode === 2) {\n console.error(`Dry run complete with warnings (exit 2).${dest}`);\n } else {\n console.error(`Dry run found blocking conflicts (exit 1).${dest}`);\n }\n}\n\nfunction parseArgs(argv: string[]): {\n command: string | undefined;\n platform: MigrationPlatform | undefined;\n inputPath: string | undefined;\n urlsPath: string | undefined;\n outDir: string | undefined;\n reportDir: string | undefined;\n sinkName: string | undefined;\n dryRun: boolean;\n formatJson: boolean;\n offline: boolean;\n rewriteGateway: string | undefined;\n rewritePublic: string | undefined;\n} {\n const args = [...argv];\n let command: string | undefined;\n let platform: MigrationPlatform | undefined;\n let inputPath: string | undefined;\n let urlsPath: string | undefined;\n let outDir: string | undefined;\n let reportDir: string | undefined;\n let sinkName: string | undefined;\n let dryRun = false;\n let formatJson = false;\n let offline = false;\n let rewriteGateway: string | undefined;\n let rewritePublic: string | undefined;\n\n const first = args[0];\n if (first === \"validate\") {\n command = \"validate\";\n platform = args[1] as MigrationPlatform;\n inputPath = args[2];\n for (let i = 3; i < args.length; i++) {\n if (args[i] === \"--urls\" && args[i + 1]) urlsPath = args[++i];\n }\n } else if (first && PLATFORMS.includes(first as MigrationPlatform)) {\n command = \"migrate\";\n platform = first as MigrationPlatform;\n inputPath = args[1];\n for (let i = 2; i < args.length; i++) {\n const flag = args[i];\n if (flag === \"--dry-run\") dryRun = true;\n else if (flag === \"--format\" && args[i + 1] === \"json\") formatJson = true;\n else if (flag === \"--offline\") offline = true;\n else if (flag === \"--out\" && args[i + 1]) {\n outDir = args[++i];\n } else if (flag === \"--report\" && args[i + 1]) {\n reportDir = args[++i];\n } else if (flag === \"--sink\" && args[i + 1]) {\n sinkName = args[++i];\n } else if (flag === \"--urls\" && args[i + 1]) {\n urlsPath = args[++i];\n } else if (flag === \"--rewrite-gateway\" && args[i + 1]) {\n rewriteGateway = args[++i];\n } else if (flag === \"--rewrite-public\" && args[i + 1]) {\n rewritePublic = args[++i];\n }\n }\n } else {\n command = first;\n }\n\n return { command, platform, inputPath, urlsPath, outDir, reportDir, sinkName, dryRun, formatJson, offline, rewriteGateway, rewritePublic };\n}\n\nfunction buildAdapterInput(\n platform: MigrationPlatform,\n inputPath: string,\n urlsPath: string | undefined,\n rewriteGateway: string | undefined,\n rewritePublic: string | undefined,\n): unknown {\n if (rewriteGateway || rewritePublic) {\n if (platform !== \"wordpress\") {\n throw new Error(\"--rewrite-gateway and --rewrite-public are WordPress-only options\");\n }\n if (!rewriteGateway || !rewritePublic) {\n throw new Error(\"Both --rewrite-gateway and --rewrite-public are required together\");\n }\n }\n\n if (platform === \"wordpress\") {\n return {\n path: inputPath,\n ...(rewriteGateway && rewritePublic\n ? { originUrlRewrite: createWpContentGatewayRewrite(rewriteGateway, rewritePublic) }\n : {}),\n };\n }\n\n return {\n path: inputPath,\n ...(urlsPath ? { urlsFile: urlsPath } : {}),\n };\n}\n\nfunction migrationExitCode(hasBlockers: boolean, hasWarn: boolean): 0 | 1 | 2 {\n if (hasBlockers) return 1;\n if (hasWarn) return 2;\n return 0;\n}\n\nasync function main(): Promise<void> {\n const { command, platform, inputPath, urlsPath, outDir, reportDir, sinkName, dryRun, formatJson, offline, rewriteGateway, rewritePublic } =\n parseArgs(process.argv.slice(2));\n\n if (!command || command === \"--help\" || command === \"-h\") {\n printUsage();\n process.exit(0);\n }\n\n if (command === \"validate\") {\n if (!platform || !PLATFORMS.includes(platform) || !inputPath) {\n console.error(\"Usage: artinstack-migrate validate <platform> <export-file>\");\n process.exit(1);\n }\n const adapter = getAdapter(platform);\n const result = await adapter.validateInput({\n path: inputPath,\n ...(urlsPath ? { urlsFile: urlsPath } : {}),\n });\n console.log(JSON.stringify(result, null, 2));\n process.exit(result.ok ? 0 : 1);\n }\n\n if (command === \"migrate\") {\n if (!platform || !inputPath) {\n printUsage();\n process.exit(1);\n }\n\n if (sinkName && !SINKS.includes(sinkName as (typeof SINKS)[number])) {\n console.error(`Unknown sink: ${sinkName}. Supported: ${SINKS.join(\", \")}`);\n process.exit(1);\n }\n\n const adapter = getAdapter(platform);\n let input: unknown;\n try {\n input = buildAdapterInput(platform, inputPath, urlsPath, rewriteGateway, rewritePublic);\n } catch (error) {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n }\n\n if (dryRun) {\n const result = await runDryRun({\n adapter,\n input,\n platform,\n offlineStorageEstimate: offline,\n });\n\n if (reportDir) {\n await mkdir(reportDir, { recursive: true });\n await writeFile(\n join(reportDir, \"conflicts.json\"),\n `${JSON.stringify(result.conflicts, null, 2)}\\n`,\n );\n await writeFile(\n join(reportDir, \"migration-report.json\"),\n `${JSON.stringify(result.report, null, 2)}\\n`,\n );\n } else {\n console.log(JSON.stringify(result.report, null, 2));\n }\n\n printDryRunStatus(result.exitCode, reportDir);\n process.exit(result.exitCode);\n }\n\n const startedAt = new Date();\n\n if (sinkName === \"filesystem\") {\n if (!outDir) {\n console.error(\"Filesystem sink requires --out <dir>\");\n process.exit(1);\n }\n\n const sink = createFilesystemMigrationSink();\n const runResult = await runMigration({\n sink,\n platform,\n entities: adapter.enumerateEntities({ input }),\n });\n\n const bundle = sink.bundle;\n const wxrImportSummary = await resolveAdapterImportSummary(adapter, input);\n const estimate = await estimateStorage({\n assets: bundle.media,\n offline,\n });\n const redirectMap = buildRedirectMap(bundle);\n const conflicts = analyzeConflicts(bundle, {\n staleAssetUrls: staleUrlsFromEstimate(estimate),\n redirectLoops: detectRedirectLoops(redirectMap),\n wxrImportSummary,\n });\n const report = buildMigrationReport({\n platform,\n mode: \"sink\",\n bundle,\n conflicts,\n redirectMap,\n startedAt,\n storageBytesEstimated: estimate.totalBytes,\n warnings:\n runResult.failed > 0\n ? [`${runResult.failed} entity write(s) failed during sink migration`]\n : [],\n });\n\n await sink.flush({ outDir, bundle, conflicts, report });\n console.error(`Wrote sink export to ${outDir}`);\n\n const exitCode = migrationExitCode(\n hasBlockingConflicts(conflicts) || runResult.failed > 0,\n hasWarnings(conflicts),\n );\n process.exit(exitCode);\n }\n\n const bundle = await collectEntities(adapter.enumerateEntities({ input }));\n const wxrImportSummary = await resolveAdapterImportSummary(adapter, input);\n\n const estimate = await estimateStorage({\n assets: bundle.media,\n offline,\n });\n const redirectMap = buildRedirectMap(bundle);\n const conflicts = analyzeConflicts(bundle, {\n staleAssetUrls: staleUrlsFromEstimate(estimate),\n wxrImportSummary,\n });\n\n const report = buildMigrationReport({\n platform,\n mode: \"export\",\n bundle,\n conflicts,\n redirectMap,\n startedAt,\n storageBytesEstimated: estimate.totalBytes,\n });\n\n if (formatJson) {\n console.log(JSON.stringify({ ...bundleToCombinedJson(bundle), conflicts, report }, null, 2));\n process.exit(0);\n }\n\n if (!outDir) {\n console.error(\"Specify --out <dir>, --format json, --dry-run, or --sink filesystem --out <dir>\");\n process.exit(1);\n }\n\n await writeFilesystemExport({\n outDir,\n bundle,\n conflicts,\n report,\n });\n\n console.error(`Wrote export to ${outDir}`);\n process.exit(0);\n }\n\n console.error(`Unknown command: ${command}`);\n printUsage();\n process.exit(1);\n}\n\nmain().catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n});\n"],"mappings":"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","names":["bundle","wxrImportSummary","estimate","redirectMap","conflicts","report"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { writeFile } from \"node:fs/promises\";\nimport { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { getAdapter } from \"../parsers/index.js\";\nimport type { MigrationPlatform } from \"../normalizer/types.js\";\nimport {\n analyzeConflicts,\n buildMigrationReport,\n buildRedirectMap,\n bundleToCombinedJson,\n createFilesystemMigrationSink,\n detectRedirectLoops,\n hasBlockingConflicts,\n hasWarnings,\n runDryRun,\n resolveAdapterImportSummary,\n runMigration,\n writeFilesystemExport,\n} from \"../sinks/index.js\";\nimport { collectEntities } from \"../normalizer/bundle.js\";\nimport { createWpContentGatewayRewrite } from \"../lib/media-urls.js\";\nimport { estimateStorage, staleUrlsFromEstimate } from \"../sinks/storage-estimate.js\";\n\nconst PLATFORMS: MigrationPlatform[] = [\"wordpress\", \"smugmug\", \"squarespace\", \"wix\"];\nconst SINKS = [\"filesystem\"] as const;\n\nfunction printUsage(): void {\n console.log(`artinstack-migrate — platform content migration CLI\n\nUsage:\n artinstack-migrate <platform> <export-file> [options]\n artinstack-migrate validate <platform> <export-file>\n\nPlatforms: ${PLATFORMS.join(\", \")}\n\nOptions:\n --out <dir> Write grouped JSON files to directory\n --sink <name> Run through MigrationSink (supported: ${SINKS.join(\", \")})\n --format json Write combined JSON to stdout\n --dry-run Parse and analyze without writing content files\n --report <dir> With --dry-run, write conflicts.json + migration-report.json\n --offline Skip network HEAD requests (4 MB fallback per asset)\n --urls <file> Wix W2: newline URL list or sitemap.xml for static page snapshots\n --rewrite-gateway <url> WordPress: API gateway base (requires --rewrite-public)\n --rewrite-public <url> WordPress: public origin for /wp-content/ asset paths\n\nExamples:\n artinstack-migrate wordpress export.xml --dry-run --report ./preview/\n artinstack-migrate wordpress export.xml --rewrite-gateway https://gateway.example/prod --rewrite-public https://www.example.com --dry-run --report ./preview/\n artinstack-migrate wix feed.xml --urls ./sitemap-urls.txt --dry-run\n artinstack-migrate wordpress export.xml --out ./output\n artinstack-migrate wordpress export.xml --sink filesystem --out ./output\n pnpm cli wordpress fixtures/wordpress/long-form-journal.xml --dry-run\n`);\n}\n\nfunction printDryRunStatus(exitCode: 0 | 1 | 2, reportDir?: string): void {\n const dest = reportDir ? ` Reports written to ${reportDir}.` : \"\";\n if (exitCode === 0) {\n console.error(`Dry run complete.${dest}`);\n } else if (exitCode === 2) {\n console.error(`Dry run complete with warnings (exit 2).${dest}`);\n } else {\n console.error(`Dry run found blocking conflicts (exit 1).${dest}`);\n }\n}\n\nfunction parseArgs(argv: string[]): {\n command: string | undefined;\n platform: MigrationPlatform | undefined;\n inputPath: string | undefined;\n urlsPath: string | undefined;\n outDir: string | undefined;\n reportDir: string | undefined;\n sinkName: string | undefined;\n dryRun: boolean;\n formatJson: boolean;\n offline: boolean;\n rewriteGateway: string | undefined;\n rewritePublic: string | undefined;\n} {\n const args = [...argv];\n let command: string | undefined;\n let platform: MigrationPlatform | undefined;\n let inputPath: string | undefined;\n let urlsPath: string | undefined;\n let outDir: string | undefined;\n let reportDir: string | undefined;\n let sinkName: string | undefined;\n let dryRun = false;\n let formatJson = false;\n let offline = false;\n let rewriteGateway: string | undefined;\n let rewritePublic: string | undefined;\n\n const first = args[0];\n if (first === \"validate\") {\n command = \"validate\";\n platform = args[1] as MigrationPlatform;\n inputPath = args[2];\n for (let i = 3; i < args.length; i++) {\n if (args[i] === \"--urls\" && args[i + 1]) urlsPath = args[++i];\n }\n } else if (first && PLATFORMS.includes(first as MigrationPlatform)) {\n command = \"migrate\";\n platform = first as MigrationPlatform;\n inputPath = args[1];\n for (let i = 2; i < args.length; i++) {\n const flag = args[i];\n if (flag === \"--dry-run\") dryRun = true;\n else if (flag === \"--format\" && args[i + 1] === \"json\") formatJson = true;\n else if (flag === \"--offline\") offline = true;\n else if (flag === \"--out\" && args[i + 1]) {\n outDir = args[++i];\n } else if (flag === \"--report\" && args[i + 1]) {\n reportDir = args[++i];\n } else if (flag === \"--sink\" && args[i + 1]) {\n sinkName = args[++i];\n } else if (flag === \"--urls\" && args[i + 1]) {\n urlsPath = args[++i];\n } else if (flag === \"--rewrite-gateway\" && args[i + 1]) {\n rewriteGateway = args[++i];\n } else if (flag === \"--rewrite-public\" && args[i + 1]) {\n rewritePublic = args[++i];\n }\n }\n } else {\n command = first;\n }\n\n return { command, platform, inputPath, urlsPath, outDir, reportDir, sinkName, dryRun, formatJson, offline, rewriteGateway, rewritePublic };\n}\n\nfunction buildAdapterInput(\n platform: MigrationPlatform,\n inputPath: string,\n urlsPath: string | undefined,\n rewriteGateway: string | undefined,\n rewritePublic: string | undefined,\n): unknown {\n if (rewriteGateway || rewritePublic) {\n if (platform !== \"wordpress\") {\n throw new Error(\"--rewrite-gateway and --rewrite-public are WordPress-only options\");\n }\n if (!rewriteGateway || !rewritePublic) {\n throw new Error(\"Both --rewrite-gateway and --rewrite-public are required together\");\n }\n }\n\n if (platform === \"wordpress\") {\n return {\n path: inputPath,\n ...(rewriteGateway && rewritePublic\n ? { originUrlRewrite: createWpContentGatewayRewrite(rewriteGateway, rewritePublic) }\n : {}),\n };\n }\n\n return {\n path: inputPath,\n ...(urlsPath ? { urlsFile: urlsPath } : {}),\n };\n}\n\nfunction migrationExitCode(hasBlockers: boolean, hasWarn: boolean): 0 | 1 | 2 {\n if (hasBlockers) return 1;\n if (hasWarn) return 2;\n return 0;\n}\n\nasync function main(): Promise<void> {\n const { command, platform, inputPath, urlsPath, outDir, reportDir, sinkName, dryRun, formatJson, offline, rewriteGateway, rewritePublic } =\n parseArgs(process.argv.slice(2));\n\n if (!command || command === \"--help\" || command === \"-h\") {\n printUsage();\n process.exit(0);\n }\n\n if (command === \"validate\") {\n if (!platform || !PLATFORMS.includes(platform) || !inputPath) {\n console.error(\"Usage: artinstack-migrate validate <platform> <export-file>\");\n process.exit(1);\n }\n const adapter = getAdapter(platform);\n const result = await adapter.validateInput({\n path: inputPath,\n ...(urlsPath ? { urlsFile: urlsPath } : {}),\n });\n console.log(JSON.stringify(result, null, 2));\n process.exit(result.ok ? 0 : 1);\n }\n\n if (command === \"migrate\") {\n if (!platform || !inputPath) {\n printUsage();\n process.exit(1);\n }\n\n if (sinkName && !SINKS.includes(sinkName as (typeof SINKS)[number])) {\n console.error(`Unknown sink: ${sinkName}. Supported: ${SINKS.join(\", \")}`);\n process.exit(1);\n }\n\n const adapter = getAdapter(platform);\n let input: unknown;\n try {\n input = buildAdapterInput(platform, inputPath, urlsPath, rewriteGateway, rewritePublic);\n } catch (error) {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n }\n\n if (dryRun) {\n const result = await runDryRun({\n adapter,\n input,\n platform,\n offlineStorageEstimate: offline,\n });\n\n if (reportDir) {\n await mkdir(reportDir, { recursive: true });\n await writeFile(\n join(reportDir, \"conflicts.json\"),\n `${JSON.stringify(result.conflicts, null, 2)}\\n`,\n );\n await writeFile(\n join(reportDir, \"migration-report.json\"),\n `${JSON.stringify(result.report, null, 2)}\\n`,\n );\n } else {\n console.log(JSON.stringify(result.report, null, 2));\n }\n\n printDryRunStatus(result.exitCode, reportDir);\n process.exit(result.exitCode);\n }\n\n const startedAt = new Date();\n\n if (sinkName === \"filesystem\") {\n if (!outDir) {\n console.error(\"Filesystem sink requires --out <dir>\");\n process.exit(1);\n }\n\n const sink = createFilesystemMigrationSink();\n const runResult = await runMigration({\n sink,\n platform,\n entities: adapter.enumerateEntities({ input }),\n });\n\n const bundle = sink.bundle;\n const wxrImportSummary = await resolveAdapterImportSummary(adapter, input);\n const estimate = await estimateStorage({\n assets: bundle.media,\n offline,\n });\n const redirectMap = buildRedirectMap(bundle);\n const conflicts = analyzeConflicts(bundle, {\n staleAssetUrls: staleUrlsFromEstimate(estimate),\n redirectLoops: detectRedirectLoops(redirectMap),\n wxrImportSummary,\n });\n const report = buildMigrationReport({\n platform,\n mode: \"sink\",\n bundle,\n conflicts,\n redirectMap,\n startedAt,\n storageBytesEstimated: estimate.totalBytes,\n warnings:\n runResult.failed > 0\n ? [`${runResult.failed} entity write(s) failed during sink migration`]\n : [],\n });\n\n await sink.flush({ outDir, bundle, conflicts, report });\n console.error(`Wrote sink export to ${outDir}`);\n\n const exitCode = migrationExitCode(\n hasBlockingConflicts(conflicts) || runResult.failed > 0,\n hasWarnings(conflicts),\n );\n process.exit(exitCode);\n }\n\n const bundle = await collectEntities(adapter.enumerateEntities({ input }));\n const wxrImportSummary = await resolveAdapterImportSummary(adapter, input);\n\n const estimate = await estimateStorage({\n assets: bundle.media,\n offline,\n });\n const redirectMap = buildRedirectMap(bundle);\n const conflicts = analyzeConflicts(bundle, {\n staleAssetUrls: staleUrlsFromEstimate(estimate),\n wxrImportSummary,\n });\n\n const report = buildMigrationReport({\n platform,\n mode: \"export\",\n bundle,\n conflicts,\n redirectMap,\n startedAt,\n storageBytesEstimated: estimate.totalBytes,\n });\n\n if (formatJson) {\n console.log(JSON.stringify({ ...bundleToCombinedJson(bundle), conflicts, report }, null, 2));\n process.exit(0);\n }\n\n if (!outDir) {\n console.error(\"Specify --out <dir>, --format json, --dry-run, or --sink filesystem --out <dir>\");\n process.exit(1);\n }\n\n await writeFilesystemExport({\n outDir,\n bundle,\n conflicts,\n report,\n });\n\n console.error(`Wrote export to ${outDir}`);\n process.exit(0);\n }\n\n console.error(`Unknown command: ${command}`);\n printUsage();\n process.exit(1);\n}\n\nmain().catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n});\n"],"mappings":"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","names":["bundle","wxrImportSummary","estimate","redirectMap","conflicts","report"]}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { M as MigrationAdapter, g as MigrationPlatform } from './types-TCHy3Oko.js';
2
- export { A as AdapterContext, E as EntityKey, h as EntityType, i as MigrationCursor, b as NormalizedAsset, j as NormalizedAssetExif, d as NormalizedCategory, f as NormalizedEntity, a as NormalizedPage, c as NormalizedPortfolio, N as NormalizedPost, e as NormalizedTag, P as PortfolioMediaLink, k as PublishStatus, S as SourceMetadata, V as ValidationIssue, l as ValidationResult, W as WxrImportSummary, m as entityKey } from './types-TCHy3Oko.js';
1
+ import { M as MigrationAdapter, g as MigrationPlatform } from './types-CLNmloya.js';
2
+ export { A as AdapterContext, E as EntityKey, h as EntityType, i as MigrationCursor, b as NormalizedAsset, j as NormalizedAssetExif, d as NormalizedCategory, f as NormalizedEntity, a as NormalizedPage, c as NormalizedPortfolio, N as NormalizedPost, e as NormalizedTag, P as PortfolioMediaLink, k as PublishStatus, S as SourceMetadata, V as ValidationIssue, l as ValidationResult, W as WxrImportSummary, m as entityKey } from './types-CLNmloya.js';
3
3
  export { EntityState, MigrationCheckpoint, TrackedEntity, buildPortfolioMediaLinks, isTerminalState, normalizedAssetExifSchema, normalizedAssetSchema, normalizedCategorySchema, normalizedEntitySchema, normalizedPageSchema, normalizedPortfolioSchema, normalizedPostSchema, normalizedTagSchema, shouldProcessEntity, sourceMetadataSchema, validateNormalizedAsset, validateNormalizedCategory, validateNormalizedEntity, validateNormalizedPage, validateNormalizedPortfolio, validateNormalizedPost, validateNormalizedTag } from './normalizer/index.js';
4
- export { B as BundleCounts, E as EntityBundle, b as bundleCounts, c as collectEntities, e as emptyBundle } from './bundle-Do-9ikQv.js';
4
+ export { B as BundleCounts, E as EntityBundle, b as bundleCounts, c as collectEntities, e as emptyBundle } from './bundle-CysqqLij.js';
5
5
  export { AssetDiscoverySummary, ConflictReport, DryRunOptions, DryRunResult, FALLBACK_ASSET_BYTES, FilesystemMigrationSink, MIGRATION_WRITE_STAGES, MigrationRedirect, MigrationReport, MigrationRunMode, MigrationRunOptions, MigrationRunResult, MigrationSink, MigrationWriteStage, StorageEstimate, UploadAssetInput, UploadAssetResult, WriteFilesystemOptions, analyzeConflicts, buildMigrationReport, buildRedirectMap, bundleToCombinedJson, createFilesystemMigrationSink, detectRedirectLoops, emptyConflictReport, estimateStorage, hasBlockingConflicts, hasWarnings, portfolioMediaMatchesBundle, resolveAdapterImportSummary, runDryRun, runMigration, runMigrationFromBundle, staleUrlsFromEstimate, summarizeAssetDiscovery, writeFilesystemExport } from './sinks/index.js';
6
6
  export { R as RewriteInlineImageRef, a as RewriteInlineImagesOptions, b as RewriteInlineImagesResult, S as StampMigrationMediaRefsOptions, U as UploadedAssetRef, r as rewriteInlineImages, s as stampMigrationMediaRefs } from './rewrite-inline-images-BsgSquzV.js';
7
7
  export { ExpandMigrationMediaRefsResult, GrapesComponent, GrapesProjectSnapshot, GrapesStyleRule, HtmlToGrapesOptions, HtmlToTiptapOptions, LayoutKind, LayoutTypeMap, TiptapDoc, TiptapMark, TiptapNode, ValidateGrapesProjectSnapshotOptions, ValidateTiptapDocOptions, cssToStyles, expandMigrationMediaRefs, grapesComponentSchema, grapesProjectSnapshotSchema, grapesStyleRuleSchema, htmlToGrapes, htmlToTiptap, tiptapDocSchema, tiptapMarkSchema, tiptapNodeSchema, validateGrapesProjectSnapshot, validateTiptapDoc } from './transformers/index.js';
package/dist/index.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  squarespaceAdapter,
14
14
  wixAdapter,
15
15
  wordpressAdapter
16
- } from "./chunk-YLVPZ4M3.js";
16
+ } from "./chunk-Q44KGFIH.js";
17
17
  import {
18
18
  normalizedAssetExifSchema,
19
19
  normalizedAssetSchema,
@@ -31,7 +31,7 @@ import {
31
31
  validateNormalizedPortfolio,
32
32
  validateNormalizedPost,
33
33
  validateNormalizedTag
34
- } from "./chunk-3YJFSTYR.js";
34
+ } from "./chunk-MUFGDYGI.js";
35
35
  import {
36
36
  FALLBACK_ASSET_BYTES,
37
37
  FilesystemMigrationSink,
@@ -58,7 +58,7 @@ import {
58
58
  staleUrlsFromEstimate,
59
59
  summarizeAssetDiscovery,
60
60
  writeFilesystemExport
61
- } from "./chunk-3A2PA4P3.js";
61
+ } from "./chunk-VRRYN6NS.js";
62
62
  import {
63
63
  buildPortfolioMediaLinks,
64
64
  bundleCounts,
@@ -67,7 +67,7 @@ import {
67
67
  entityKey,
68
68
  isTerminalState,
69
69
  shouldProcessEntity
70
- } from "./chunk-LC7CGWDN.js";
70
+ } from "./chunk-PFUXPS7A.js";
71
71
  import {
72
72
  cssToStyles,
73
73
  expandMigrationMediaRefs,
@@ -81,11 +81,12 @@ import {
81
81
  tiptapNodeSchema,
82
82
  validateGrapesProjectSnapshot,
83
83
  validateTiptapDoc
84
- } from "./chunk-S4SUJT2D.js";
84
+ } from "./chunk-WCAHVNWW.js";
85
+ import "./chunk-J7EUSPEA.js";
85
86
  import {
86
87
  rewriteInlineImages,
87
88
  stampMigrationMediaRefs
88
- } from "./chunk-BONZ3U3I.js";
89
+ } from "./chunk-QFJXNEXG.js";
89
90
  import "./chunk-EJTWYEAX.js";
90
91
  import {
91
92
  linkToPath,
@@ -1,7 +1,7 @@
1
- import { i as MigrationCursor, E as EntityKey, P as PortfolioMediaLink, l as ValidationResult } from '../types-TCHy3Oko.js';
2
- export { A as AdapterContext, h as EntityType, M as MigrationAdapter, g as MigrationPlatform, b as NormalizedAsset, j as NormalizedAssetExif, d as NormalizedCategory, f as NormalizedEntity, a as NormalizedPage, c as NormalizedPortfolio, N as NormalizedPost, e as NormalizedTag, k as PublishStatus, S as SourceMetadata, V as ValidationIssue, W as WxrImportSummary, m as entityKey } from '../types-TCHy3Oko.js';
3
- import { E as EntityBundle } from '../bundle-Do-9ikQv.js';
4
- export { B as BundleCounts, b as bundleCounts, c as collectEntities, e as emptyBundle } from '../bundle-Do-9ikQv.js';
1
+ import { i as MigrationCursor, E as EntityKey, P as PortfolioMediaLink, l as ValidationResult } from '../types-CLNmloya.js';
2
+ export { A as AdapterContext, h as EntityType, M as MigrationAdapter, g as MigrationPlatform, b as NormalizedAsset, j as NormalizedAssetExif, d as NormalizedCategory, f as NormalizedEntity, a as NormalizedPage, c as NormalizedPortfolio, N as NormalizedPost, e as NormalizedTag, k as PublishStatus, S as SourceMetadata, V as ValidationIssue, W as WxrImportSummary, m as entityKey } from '../types-CLNmloya.js';
3
+ import { E as EntityBundle } from '../bundle-CysqqLij.js';
4
+ export { B as BundleCounts, b as bundleCounts, c as collectEntities, e as emptyBundle } from '../bundle-CysqqLij.js';
5
5
  import { z } from 'zod';
6
6
 
7
7
  /** Portable entity state for resume / idempotency (not Directus field names). */
@@ -148,6 +148,7 @@ declare const normalizedPageSchema: z.ZodObject<{
148
148
  contentHtml: z.ZodString;
149
149
  contentCss: z.ZodOptional<z.ZodString>;
150
150
  isHomePage: z.ZodOptional<z.ZodBoolean>;
151
+ isPortfolioPage: z.ZodOptional<z.ZodBoolean>;
151
152
  status: z.ZodEnum<["draft", "published", "archived"]>;
152
153
  seoTitle: z.ZodOptional<z.ZodString>;
153
154
  seoDescription: z.ZodOptional<z.ZodString>;
@@ -169,6 +170,7 @@ declare const normalizedPageSchema: z.ZodObject<{
169
170
  seoDescription?: string | undefined;
170
171
  contentCss?: string | undefined;
171
172
  isHomePage?: boolean | undefined;
173
+ isPortfolioPage?: boolean | undefined;
172
174
  }, {
173
175
  type: "page";
174
176
  status: "draft" | "published" | "archived";
@@ -187,6 +189,7 @@ declare const normalizedPageSchema: z.ZodObject<{
187
189
  seoDescription?: string | undefined;
188
190
  contentCss?: string | undefined;
189
191
  isHomePage?: boolean | undefined;
192
+ isPortfolioPage?: boolean | undefined;
190
193
  }>;
191
194
  declare const normalizedAssetExifSchema: z.ZodObject<{
192
195
  iso: z.ZodOptional<z.ZodNumber>;
@@ -557,6 +560,7 @@ declare const normalizedEntitySchema: z.ZodDiscriminatedUnion<"type", [z.ZodObje
557
560
  contentHtml: z.ZodString;
558
561
  contentCss: z.ZodOptional<z.ZodString>;
559
562
  isHomePage: z.ZodOptional<z.ZodBoolean>;
563
+ isPortfolioPage: z.ZodOptional<z.ZodBoolean>;
560
564
  status: z.ZodEnum<["draft", "published", "archived"]>;
561
565
  seoTitle: z.ZodOptional<z.ZodString>;
562
566
  seoDescription: z.ZodOptional<z.ZodString>;
@@ -578,6 +582,7 @@ declare const normalizedEntitySchema: z.ZodDiscriminatedUnion<"type", [z.ZodObje
578
582
  seoDescription?: string | undefined;
579
583
  contentCss?: string | undefined;
580
584
  isHomePage?: boolean | undefined;
585
+ isPortfolioPage?: boolean | undefined;
581
586
  }, {
582
587
  type: "page";
583
588
  status: "draft" | "published" | "archived";
@@ -596,6 +601,7 @@ declare const normalizedEntitySchema: z.ZodDiscriminatedUnion<"type", [z.ZodObje
596
601
  seoDescription?: string | undefined;
597
602
  contentCss?: string | undefined;
598
603
  isHomePage?: boolean | undefined;
604
+ isPortfolioPage?: boolean | undefined;
599
605
  }>, z.ZodObject<{
600
606
  type: z.ZodLiteral<"asset">;
601
607
  source: z.ZodObject<{
@@ -15,7 +15,7 @@ import {
15
15
  validateNormalizedPortfolio,
16
16
  validateNormalizedPost,
17
17
  validateNormalizedTag
18
- } from "../chunk-3YJFSTYR.js";
18
+ } from "../chunk-MUFGDYGI.js";
19
19
  import {
20
20
  buildPortfolioMediaLinks,
21
21
  bundleCounts,
@@ -24,7 +24,7 @@ import {
24
24
  entityKey,
25
25
  isTerminalState,
26
26
  shouldProcessEntity
27
- } from "../chunk-LC7CGWDN.js";
27
+ } from "../chunk-PFUXPS7A.js";
28
28
  export {
29
29
  buildPortfolioMediaLinks,
30
30
  bundleCounts,
@@ -1,8 +1,8 @@
1
- import { d as NormalizedCategory, e as NormalizedTag, b as NormalizedAsset, c as NormalizedPortfolio, N as NormalizedPost, a as NormalizedPage, P as PortfolioMediaLink, E as EntityKey, f as NormalizedEntity, g as MigrationPlatform, W as WxrImportSummary, M as MigrationAdapter } from '../types-TCHy3Oko.js';
1
+ import { d as NormalizedCategory, e as NormalizedTag, b as NormalizedAsset, c as NormalizedPortfolio, N as NormalizedPost, a as NormalizedPage, P as PortfolioMediaLink, E as EntityKey, f as NormalizedEntity, g as MigrationPlatform, W as WxrImportSummary, M as MigrationAdapter } from '../types-CLNmloya.js';
2
2
  import { Readable } from 'node:stream';
3
3
  import { a as RewriteInlineImagesOptions } from '../rewrite-inline-images-BsgSquzV.js';
4
4
  export { b as RewriteInlineImagesResult, r as rewriteInlineImages } from '../rewrite-inline-images-BsgSquzV.js';
5
- import { E as EntityBundle } from '../bundle-Do-9ikQv.js';
5
+ import { E as EntityBundle } from '../bundle-CysqqLij.js';
6
6
  import '../media-urls-u49RCyPn.js';
7
7
 
8
8
  interface CreatePostResult {
@@ -20,11 +20,11 @@ import {
20
20
  staleUrlsFromEstimate,
21
21
  summarizeAssetDiscovery,
22
22
  writeFilesystemExport
23
- } from "../chunk-3A2PA4P3.js";
24
- import "../chunk-LC7CGWDN.js";
23
+ } from "../chunk-VRRYN6NS.js";
24
+ import "../chunk-PFUXPS7A.js";
25
25
  import {
26
26
  rewriteInlineImages
27
- } from "../chunk-BONZ3U3I.js";
27
+ } from "../chunk-QFJXNEXG.js";
28
28
  import "../chunk-XRCF73DA.js";
29
29
  import "../chunk-S4GMDRGX.js";
30
30
  export {
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { l as ValidationResult } from '../types-TCHy3Oko.js';
2
+ import { l as ValidationResult } from '../types-CLNmloya.js';
3
3
  export { R as RewriteInlineImageRef, a as RewriteInlineImagesOptions, b as RewriteInlineImagesResult, S as StampMigrationMediaRefsOptions, U as UploadedAssetRef, r as rewriteInlineImages, s as stampMigrationMediaRefs } from '../rewrite-inline-images-BsgSquzV.js';
4
4
  export { d as buildMigrationMediaUrlIndex } from '../media-urls-u49RCyPn.js';
5
5
 
@@ -11,11 +11,12 @@ import {
11
11
  tiptapNodeSchema,
12
12
  validateGrapesProjectSnapshot,
13
13
  validateTiptapDoc
14
- } from "../chunk-S4SUJT2D.js";
14
+ } from "../chunk-WCAHVNWW.js";
15
+ import "../chunk-J7EUSPEA.js";
15
16
  import {
16
17
  rewriteInlineImages,
17
18
  stampMigrationMediaRefs
18
- } from "../chunk-BONZ3U3I.js";
19
+ } from "../chunk-QFJXNEXG.js";
19
20
  import {
20
21
  buildMigrationMediaUrlIndex
21
22
  } from "../chunk-S4GMDRGX.js";
@@ -39,6 +39,8 @@ interface NormalizedPage {
39
39
  contentHtml: string;
40
40
  contentCss?: string;
41
41
  isHomePage?: boolean;
42
+ /** Site portfolio listing shell (distinct from portfolio CPT singles). */
43
+ isPortfolioPage?: boolean;
42
44
  status: PublishStatus;
43
45
  seoTitle?: string;
44
46
  seoDescription?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@artinstack/migrator",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "description": "Stateless content normalizer and migration framework — WordPress, SmugMug, Squarespace → platform-agnostic schema",
5
5
  "license": "MIT",
6
6
  "author": "ArtInStack",