payload-wordpress-migrator 0.0.22

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 (162) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +586 -0
  3. package/dist/components/BeforeDashboardClient.d.ts +14 -0
  4. package/dist/components/BeforeDashboardClient.js +225 -0
  5. package/dist/components/BeforeDashboardClient.js.map +1 -0
  6. package/dist/components/BeforeDashboardClient.module.css +175 -0
  7. package/dist/components/BeforeDashboardServer.d.ts +1 -0
  8. package/dist/components/BeforeDashboardServer.js +29 -0
  9. package/dist/components/BeforeDashboardServer.js.map +1 -0
  10. package/dist/components/ContentTypeSelect.d.ts +4 -0
  11. package/dist/components/ContentTypeSelect.js +147 -0
  12. package/dist/components/ContentTypeSelect.js.map +1 -0
  13. package/dist/components/FieldMappingConfiguration.d.ts +5 -0
  14. package/dist/components/FieldMappingConfiguration.js +361 -0
  15. package/dist/components/FieldMappingConfiguration.js.map +1 -0
  16. package/dist/components/FieldMappingConfiguration.module.css +75 -0
  17. package/dist/components/MigrationDashboardClient.d.ts +6 -0
  18. package/dist/components/MigrationDashboardClient.js +49 -0
  19. package/dist/components/MigrationDashboardClient.js.map +1 -0
  20. package/dist/components/MigrationDashboardClient.module.css +749 -0
  21. package/dist/components/SimpleFieldMapping.d.ts +5 -0
  22. package/dist/components/SimpleFieldMapping.js +437 -0
  23. package/dist/components/SimpleFieldMapping.js.map +1 -0
  24. package/dist/components/dashboard/JobActionButtons.d.ts +8 -0
  25. package/dist/components/dashboard/JobActionButtons.js +91 -0
  26. package/dist/components/dashboard/JobActionButtons.js.map +1 -0
  27. package/dist/components/dashboard/JobsTable.d.ts +6 -0
  28. package/dist/components/dashboard/JobsTable.js +86 -0
  29. package/dist/components/dashboard/JobsTable.js.map +1 -0
  30. package/dist/components/dashboard/LogViewer.d.ts +3 -0
  31. package/dist/components/dashboard/LogViewer.js +35 -0
  32. package/dist/components/dashboard/LogViewer.js.map +1 -0
  33. package/dist/components/dashboard/SiteConfigPanel.d.ts +12 -0
  34. package/dist/components/dashboard/SiteConfigPanel.js +205 -0
  35. package/dist/components/dashboard/SiteConfigPanel.js.map +1 -0
  36. package/dist/components/dashboard/StatsOverview.d.ts +5 -0
  37. package/dist/components/dashboard/StatsOverview.js +72 -0
  38. package/dist/components/dashboard/StatsOverview.js.map +1 -0
  39. package/dist/components/dashboard/index.d.ts +7 -0
  40. package/dist/components/dashboard/index.js +7 -0
  41. package/dist/components/dashboard/index.js.map +1 -0
  42. package/dist/components/dashboard/types.d.ts +46 -0
  43. package/dist/components/dashboard/types.js +2 -0
  44. package/dist/components/dashboard/types.js.map +1 -0
  45. package/dist/components/dashboard/useMigrationDashboard.d.ts +15 -0
  46. package/dist/components/dashboard/useMigrationDashboard.js +584 -0
  47. package/dist/components/dashboard/useMigrationDashboard.js.map +1 -0
  48. package/dist/exports/client.d.ts +4 -0
  49. package/dist/exports/client.js +5 -0
  50. package/dist/exports/client.js.map +1 -0
  51. package/dist/exports/rsc.d.ts +1 -0
  52. package/dist/exports/rsc.js +2 -0
  53. package/dist/exports/rsc.js.map +1 -0
  54. package/dist/index.d.ts +101 -0
  55. package/dist/index.js +443 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/utils/content/blocks.d.ts +6 -0
  58. package/dist/utils/content/blocks.js +93 -0
  59. package/dist/utils/content/blocks.js.map +1 -0
  60. package/dist/utils/content/fieldMapping.d.ts +9 -0
  61. package/dist/utils/content/fieldMapping.js +218 -0
  62. package/dist/utils/content/fieldMapping.js.map +1 -0
  63. package/dist/utils/content/index.d.ts +4 -0
  64. package/dist/utils/content/index.js +4 -0
  65. package/dist/utils/content/index.js.map +1 -0
  66. package/dist/utils/content/transformer.d.ts +5 -0
  67. package/dist/utils/content/transformer.js +323 -0
  68. package/dist/utils/content/transformer.js.map +1 -0
  69. package/dist/utils/endpoints/handlers.d.ts +9 -0
  70. package/dist/utils/endpoints/handlers.js +201 -0
  71. package/dist/utils/endpoints/handlers.js.map +1 -0
  72. package/dist/utils/endpoints/index.d.ts +2 -0
  73. package/dist/utils/endpoints/index.js +2 -0
  74. package/dist/utils/endpoints/index.js.map +1 -0
  75. package/dist/utils/fields/analyzer.d.ts +7 -0
  76. package/dist/utils/fields/analyzer.js +502 -0
  77. package/dist/utils/fields/analyzer.js.map +1 -0
  78. package/dist/utils/fields/index.d.ts +2 -0
  79. package/dist/utils/fields/index.js +2 -0
  80. package/dist/utils/fields/index.js.map +1 -0
  81. package/dist/utils/helpers/auth.d.ts +9 -0
  82. package/dist/utils/helpers/auth.js +50 -0
  83. package/dist/utils/helpers/auth.js.map +1 -0
  84. package/dist/utils/helpers/cache.d.ts +11 -0
  85. package/dist/utils/helpers/cache.js +47 -0
  86. package/dist/utils/helpers/cache.js.map +1 -0
  87. package/dist/utils/helpers/concurrency.d.ts +2 -0
  88. package/dist/utils/helpers/concurrency.js +26 -0
  89. package/dist/utils/helpers/concurrency.js.map +1 -0
  90. package/dist/utils/helpers/index.d.ts +8 -0
  91. package/dist/utils/helpers/index.js +8 -0
  92. package/dist/utils/helpers/index.js.map +1 -0
  93. package/dist/utils/helpers/objectHelpers.d.ts +3 -0
  94. package/dist/utils/helpers/objectHelpers.js +22 -0
  95. package/dist/utils/helpers/objectHelpers.js.map +1 -0
  96. package/dist/utils/helpers/rateLimiter.d.ts +10 -0
  97. package/dist/utils/helpers/rateLimiter.js +29 -0
  98. package/dist/utils/helpers/rateLimiter.js.map +1 -0
  99. package/dist/utils/helpers/responses.d.ts +3 -0
  100. package/dist/utils/helpers/responses.js +23 -0
  101. package/dist/utils/helpers/responses.js.map +1 -0
  102. package/dist/utils/helpers/wpHelpers.d.ts +6 -0
  103. package/dist/utils/helpers/wpHelpers.js +29 -0
  104. package/dist/utils/helpers/wpHelpers.js.map +1 -0
  105. package/dist/utils/lexical/constants.d.ts +37 -0
  106. package/dist/utils/lexical/constants.js +58 -0
  107. package/dist/utils/lexical/constants.js.map +1 -0
  108. package/dist/utils/lexical/htmlParser.d.ts +20 -0
  109. package/dist/utils/lexical/htmlParser.js +253 -0
  110. package/dist/utils/lexical/htmlParser.js.map +1 -0
  111. package/dist/utils/lexical/htmlToLexicalConverter.d.ts +55 -0
  112. package/dist/utils/lexical/htmlToLexicalConverter.js +999 -0
  113. package/dist/utils/lexical/htmlToLexicalConverter.js.map +1 -0
  114. package/dist/utils/lexical/index.d.ts +5 -0
  115. package/dist/utils/lexical/index.js +4 -0
  116. package/dist/utils/lexical/index.js.map +1 -0
  117. package/dist/utils/lexical/nodeFactories.d.ts +21 -0
  118. package/dist/utils/lexical/nodeFactories.js +91 -0
  119. package/dist/utils/lexical/nodeFactories.js.map +1 -0
  120. package/dist/utils/lexical/preprocessor.d.ts +4 -0
  121. package/dist/utils/lexical/preprocessor.js +302 -0
  122. package/dist/utils/lexical/preprocessor.js.map +1 -0
  123. package/dist/utils/media/download.d.ts +7 -0
  124. package/dist/utils/media/download.js +85 -0
  125. package/dist/utils/media/download.js.map +1 -0
  126. package/dist/utils/media/extraction.d.ts +12 -0
  127. package/dist/utils/media/extraction.js +58 -0
  128. package/dist/utils/media/extraction.js.map +1 -0
  129. package/dist/utils/media/import.d.ts +7 -0
  130. package/dist/utils/media/import.js +146 -0
  131. package/dist/utils/media/import.js.map +1 -0
  132. package/dist/utils/media/index.d.ts +6 -0
  133. package/dist/utils/media/index.js +6 -0
  134. package/dist/utils/media/index.js.map +1 -0
  135. package/dist/utils/media/upload.d.ts +4 -0
  136. package/dist/utils/media/upload.js +46 -0
  137. package/dist/utils/media/upload.js.map +1 -0
  138. package/dist/utils/media/validation.d.ts +8 -0
  139. package/dist/utils/media/validation.js +60 -0
  140. package/dist/utils/media/validation.js.map +1 -0
  141. package/dist/utils/migration/index.d.ts +3 -0
  142. package/dist/utils/migration/index.js +3 -0
  143. package/dist/utils/migration/index.js.map +1 -0
  144. package/dist/utils/migration/jobCrud.d.ts +4 -0
  145. package/dist/utils/migration/jobCrud.js +380 -0
  146. package/dist/utils/migration/jobCrud.js.map +1 -0
  147. package/dist/utils/migration/orchestrator.d.ts +5 -0
  148. package/dist/utils/migration/orchestrator.js +756 -0
  149. package/dist/utils/migration/orchestrator.js.map +1 -0
  150. package/dist/utils/types.d.ts +201 -0
  151. package/dist/utils/types.js +14 -0
  152. package/dist/utils/types.js.map +1 -0
  153. package/dist/utils/wordpress/client.d.ts +61 -0
  154. package/dist/utils/wordpress/client.js +365 -0
  155. package/dist/utils/wordpress/client.js.map +1 -0
  156. package/dist/utils/wordpress/index.d.ts +2 -0
  157. package/dist/utils/wordpress/index.js +2 -0
  158. package/dist/utils/wordpress/index.js.map +1 -0
  159. package/dist/utils/wordpressApi.d.ts +11 -0
  160. package/dist/utils/wordpressApi.js +25 -0
  161. package/dist/utils/wordpressApi.js.map +1 -0
  162. package/package.json +155 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preprocessor.js","sources":["../../../src/utils/lexical/preprocessor.ts"],"sourcesContent":["/** WordPress HTML preprocessing, Lexical structure validation, and Gutenberg block parsing. */\n\nimport type { LexicalRoot } from '../types.js'\n\nimport { convertHtmlToLexical as enhancedConvertHtmlToLexical } from './htmlToLexicalConverter.js'\nimport { createSafeLexicalFallback, createSafeLexicalRoot, createSafeParagraph } from './nodeFactories.js'\n\nconst preprocessWordPressHtml = (html: string): string => {\n try {\n return (\n html\n .replace(/&#8217;/g, \"'\")\n .replace(/&#8211;/g, '–')\n .replace(/&#8220;/g, '\"')\n .replace(/&#8221;/g, '\"')\n .replace(/<p>\\s*(<li[^>]*>)/gi, '$1')\n .replace(/(<\\/li>)\\s*<\\/p>/gi, '$1')\n .replace(/<p>\\s*<(blockquote|div|h[1-6]|ul|ol|li)/gi, '<$1')\n .replace(/<\\/(blockquote|div|h[1-6]|ul|ol|li)>\\s*<\\/p>/gi, '</$1>')\n .replace(/<img([^>]*?)\\/>/gi, '<img$1 />')\n .replace(/<p>\\s*<\\/p>/gi, '<p> </p>')\n .replace(/>\\s+</g, '><')\n .replace(/\\s+/g, ' ')\n .trim()\n )\n } catch (error) {\n console.warn('HTML preprocessing failed:', error)\n return html\n }\n}\n\nconst processParagraphContent = (paragraph: any): any | any[] => {\n if (!paragraph.children || !Array.isArray(paragraph.children)) {\n return paragraph\n }\n\n const totalTextLength = paragraph.children\n .filter((child: any) => child.type === 'text')\n .reduce((total: number, child: any) => total + (child.text?.length || 0), 0)\n\n if (totalTextLength > 2000) {\n return splitLongParagraph(paragraph)\n }\n\n const cleanedTextChildren = paragraph.children.filter((textNode: any) => {\n if (textNode.type === 'text' && (!textNode.text || textNode.text.trim() === '')) {\n return false\n }\n return true\n })\n\n if (cleanedTextChildren.length === 0) {\n return createSafeParagraph(' ')\n }\n\n return {\n ...paragraph,\n children: cleanedTextChildren,\n }\n}\n\n// Split paragraphs exceeding 1500 chars at the best natural break point.\n// WordPress content often has very long paragraphs (e.g., imported from Word)\n// that cause rendering and editing performance issues in the Lexical editor.\nconst splitLongParagraph = (paragraph: any): any[] => {\n const children = paragraph.children\n const result: any[] = []\n let currentParagraph = createSafeParagraph('')\n let currentLength = 0\n const maxLength = 1500\n\n for (const child of children) {\n if (child.type === 'text' && child.text) {\n const text = child.text\n\n if (currentLength + text.length > maxLength && currentLength > 0) {\n const splitPoint = findBestSplitPoint(text)\n\n if (splitPoint > 0) {\n const firstPart = text.substring(0, splitPoint).trim()\n const secondPart = text.substring(splitPoint).trim()\n\n if (firstPart) {\n currentParagraph.children.push({\n ...child,\n text: firstPart,\n })\n }\n\n if (currentParagraph.children.length > 0) {\n result.push(currentParagraph)\n }\n\n currentParagraph = createSafeParagraph('')\n if (secondPart) {\n currentParagraph.children.push({\n ...child,\n text: secondPart,\n })\n currentLength = secondPart.length\n } else {\n currentLength = 0\n }\n } else {\n currentParagraph.children.push(child)\n result.push(currentParagraph)\n currentParagraph = createSafeParagraph('')\n currentLength = 0\n }\n } else {\n currentParagraph.children.push(child)\n currentLength += text.length\n }\n } else {\n currentParagraph.children.push(child)\n }\n }\n\n if (currentParagraph.children.length > 0) {\n result.push(currentParagraph)\n }\n\n return result.length > 0 ? result : [createSafeParagraph()]\n}\n\n// Search for the best split point in the 50–200 char range (or half the text length,\n// whichever is smaller). The range prevents splits that are too early (<50 chars would\n// create tiny fragments) or too late (>200 chars would defeat the purpose).\n// Priority order ensures the most natural reading break:\n// 1. Period + space (\"end of sentence. Next\") — strongest sentence boundary\n// 2. Any sentence-ending punctuation + whitespace (.!?) — catches questions/exclamations\n// 3. Newline or double space — explicit formatting breaks\n// 4. Regular space — last resort word boundary\n// Returns 0 if no suitable split point is found (text stays in current paragraph).\nconst findBestSplitPoint = (text: string): number => {\n const maxSearch = Math.min(200, Math.floor(text.length / 2))\n\n for (let i = maxSearch; i > 50; i--) {\n if (text[i] === '.' && text[i + 1] === ' ') {\n return i + 1\n }\n }\n\n for (let i = maxSearch; i > 50; i--) {\n if (/[.!?]\\s/.test(text.substring(i, i + 2))) {\n return i + 2\n }\n }\n\n for (let i = maxSearch; i > 50; i--) {\n if (text[i] === '\\n' || text.substring(i, i + 2) === ' ') {\n return i + 1\n }\n }\n\n for (let i = maxSearch; i > 50; i--) {\n if (text[i] === ' ') {\n return i + 1\n }\n }\n\n return 0\n}\n\nconst validateLexicalStructure = (content: any): boolean => {\n try {\n if (!content || !content.root) {\n console.warn('Validation failed: missing content or root')\n return false\n }\n\n const root = content.root\n if (root.type !== 'root' || !Array.isArray(root.children)) {\n console.warn('Validation failed: invalid root structure', {\n childrenCount: root.children?.length,\n hasChildren: Array.isArray(root.children),\n rootType: root.type,\n })\n return false\n }\n\n for (let i = 0; i < root.children.length; i++) {\n const child = root.children[i]\n\n if (!validateLexicalNode(child)) {\n console.warn(`Validation failed at child ${i + 1}:`, {\n childFields: child?.fields?.blockType,\n childType: child?.type,\n })\n return false\n }\n }\n\n return true\n } catch (error) {\n console.error('Lexical structure validation error:', error)\n return false\n }\n}\n\nconst validateLexicalNode = (node: any): boolean => {\n if (!node || typeof node !== 'object' || !node.type) {\n console.warn('Node validation failed: missing type or invalid structure', {\n hasType: !!node?.type,\n node: typeof node,\n })\n return false\n }\n\n if (node.type === 'text') {\n const isValid =\n typeof node.text === 'string' &&\n typeof node.format === 'number' &&\n typeof node.version === 'number'\n if (!isValid) {\n console.warn('Text node validation failed:', {\n format: typeof node.format,\n text: typeof node.text,\n version: typeof node.version,\n })\n }\n return isValid\n }\n\n if (node.type === 'block') {\n const isValid =\n typeof node.fields === 'object' &&\n node.fields !== null &&\n typeof node.fields.blockType === 'string' &&\n typeof node.version === 'number'\n if (!isValid) {\n console.warn('Block node validation failed:', {\n blockType: typeof node.fields?.blockType,\n blockTypeValue: node.fields?.blockType,\n hasFields: typeof node.fields === 'object' && node.fields !== null,\n version: typeof node.version,\n })\n }\n return isValid\n }\n\n if (['heading', 'link', 'list', 'listitem', 'paragraph', 'quote'].includes(node.type)) {\n if (!Array.isArray(node.children)) {\n console.warn('Element node validation failed: children not array', {\n type: node.type,\n childrenType: typeof node.children,\n })\n return false\n }\n\n for (const child of node.children) {\n if (!validateLexicalNode(child)) {\n console.warn('Element node validation failed: invalid child', { parentType: node.type })\n return false\n }\n }\n }\n\n return true\n}\n\nexport const convertHtmlToLexical = (htmlContent: string): LexicalRoot => {\n try {\n if (!htmlContent || typeof htmlContent !== 'string') {\n console.warn('Invalid HTML content provided for conversion:', typeof htmlContent)\n return createSafeLexicalRoot()\n }\n\n const trimmedContent = htmlContent.trim()\n if (trimmedContent === '' || trimmedContent.length === 0) {\n return createSafeLexicalRoot()\n }\n\n const preprocessedContent = preprocessWordPressHtml(trimmedContent)\n\n const lexicalContent = enhancedConvertHtmlToLexical(preprocessedContent)\n\n const hasMediaBlocks = lexicalContent?.root?.children?.some(\n (child: any) => child.type === 'block' && child.fields?.blockType === 'mediaBlock',\n )\n\n if (hasMediaBlocks) {\n if (lexicalContent?.root?.children && Array.isArray(lexicalContent.root.children)) {\n return lexicalContent\n }\n }\n\n if (!validateLexicalStructure(lexicalContent)) {\n console.warn('Enhanced conversion result failed validation, falling back to safe conversion')\n return createSafeLexicalFallback(trimmedContent)\n }\n\n const cleanedChildren = lexicalContent.root.children\n .map((child: any) => {\n if (!child || typeof child !== 'object' || !child.type) {\n console.warn('Invalid child node found, replacing with safe paragraph')\n return createSafeParagraph('Content validation error')\n }\n\n if (child.type === 'paragraph' && child.children) {\n const processedParagraph = processParagraphContent(child)\n return processedParagraph\n }\n\n return child\n })\n .flat()\n .filter((child: any) => child !== null && child !== undefined)\n\n const finalChildren = cleanedChildren.length > 0 ? cleanedChildren : [createSafeParagraph()]\n\n const validatedContent: LexicalRoot = {\n root: {\n type: 'root',\n children: finalChildren,\n direction: 'ltr',\n format: '',\n indent: 0,\n version: 1,\n },\n }\n\n if (!validateLexicalStructure(validatedContent)) {\n console.error('Final Lexical structure validation failed, using fallback')\n return createSafeLexicalFallback(trimmedContent)\n }\n\n return validatedContent\n } catch (error) {\n console.error('HTML to Lexical conversion failed:', error)\n console.error('Original content length:', htmlContent?.length || 0)\n console.error('Content preview:', htmlContent?.substring(0, 200) || 'N/A')\n\n return createSafeLexicalFallback(htmlContent)\n }\n}\n\nexport const parseGutenbergBlocks = (content: string) => {\n try {\n const blocks = []\n const blockRegex =\n /<!-- wp:([^/\\s]+)(?:\\s+(\\{[^}]*\\}))?\\s*\\/?-->([\\s\\S]*?)(?:<!-- \\/wp:\\1 -->|$)/g\n let match\n\n while ((match = blockRegex.exec(content)) !== null) {\n const [, blockType, attributes, blockContent] = match\n blocks.push({\n blockName: blockType,\n blockType: blockType.replace('/', '_'),\n content: blockContent?.trim() || '',\n ...(attributes ? JSON.parse(attributes) : {}),\n })\n }\n\n return blocks.length > 0 ? blocks : [{ blockType: 'paragraph', content }]\n } catch (error) {\n console.warn('Failed to parse Gutenberg blocks:', error)\n return [{ blockType: 'paragraph', content }]\n }\n}\n"],"names":["preprocessWordPressHtml","html","replace","trim","error","console","warn","processParagraphContent","paragraph","children","Array","isArray","totalTextLength","filter","child","type","reduce","total","text","length","splitLongParagraph","cleanedTextChildren","textNode","createSafeParagraph","result","currentParagraph","currentLength","maxLength","splitPoint","findBestSplitPoint","firstPart","substring","secondPart","push","maxSearch","Math","min","floor","i","test","validateLexicalStructure","content","root","childrenCount","hasChildren","rootType","validateLexicalNode","childFields","fields","blockType","childType","node","hasType","isValid","format","version","blockTypeValue","hasFields","includes","childrenType","parentType","convertHtmlToLexical","htmlContent","createSafeLexicalRoot","trimmedContent","preprocessedContent","lexicalContent","enhancedConvertHtmlToLexical","hasMediaBlocks","some","createSafeLexicalFallback","cleanedChildren","map","processedParagraph","flat","undefined","finalChildren","validatedContent","direction","indent","parseGutenbergBlocks","blocks","blockRegex","match","exec","attributes","blockContent","blockName","JSON","parse"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** Download media files from WordPress with SSL certificate and file size handling. */
2
+ export declare const downloadWordPressMediaFile: (sourceUrl: string, maxFileSize?: number, allowSelfSignedCerts?: boolean) => Promise<{
3
+ buffer: Buffer;
4
+ filename: string;
5
+ mimeType: string;
6
+ size: number;
7
+ }>;
@@ -0,0 +1,85 @@
1
+ /** Download media files from WordPress with SSL certificate and file size handling. */ const downloadWordPressMediaFile = async (sourceUrl, maxFileSize, allowSelfSignedCerts)=>{
2
+ try {
3
+ let response;
4
+ try {
5
+ response = await fetch(sourceUrl);
6
+ } catch (fetchError) {
7
+ if (allowSelfSignedCerts && (fetchError.cause?.code === 'DEPTH_ZERO_SELF_SIGNED_CERT' || fetchError.cause?.code === 'SELF_SIGNED_CERT_IN_CHAIN' || fetchError.message?.includes('certificate'))) {
8
+ if (process.env.NODE_ENV === 'production') {
9
+ console.warn('WARNING: Downloading media with relaxed SSL verification in production. ' + 'Consider using a valid SSL certificate instead.');
10
+ }
11
+ console.warn(`SSL certificate issue detected for ${sourceUrl}. Attempting download with relaxed SSL verification (allowSelfSignedCerts=true).`);
12
+ const https = await import('https');
13
+ const { default: fetch1 } = await import('node-fetch');
14
+ const agent = new https.Agent({
15
+ rejectUnauthorized: false
16
+ });
17
+ response = await fetch1(sourceUrl, {
18
+ agent
19
+ });
20
+ } else {
21
+ const errorMessage = fetchError.cause?.code ? `${fetchError.message} (${fetchError.cause.code})` : fetchError.message;
22
+ if (fetchError.cause?.code === 'DEPTH_ZERO_SELF_SIGNED_CERT' || fetchError.cause?.code === 'SELF_SIGNED_CERT_IN_CHAIN') {
23
+ throw new Error(`${errorMessage}. Consider setting allowSelfSignedCerts: true in plugin configuration for development environments.`);
24
+ }
25
+ throw fetchError;
26
+ }
27
+ }
28
+ if (!response.ok) {
29
+ throw new Error(`Failed to download media file: ${response.status} ${response.statusText}`);
30
+ }
31
+ const maxSize = maxFileSize || 10 * 1024 * 1024 // Default 10MB
32
+ ;
33
+ // Fast-path: reject immediately if Content-Length exceeds limit
34
+ const contentLength = response.headers.get('content-length');
35
+ if (contentLength && parseInt(contentLength) > maxSize) {
36
+ throw new Error(`File size (${contentLength} bytes) exceeds maximum allowed size (${maxSize} bytes)`);
37
+ }
38
+ const contentType = response.headers.get('content-type') || 'application/octet-stream';
39
+ // Stream with size tracking — abort mid-download if file exceeds limit
40
+ let buffer;
41
+ const reader = response.body?.getReader?.();
42
+ if (reader) {
43
+ const chunks = [];
44
+ let totalSize = 0;
45
+ try {
46
+ while(true){
47
+ const { done, value } = await reader.read();
48
+ if (done) break;
49
+ totalSize += value.length;
50
+ if (totalSize > maxSize) {
51
+ reader.cancel();
52
+ throw new Error(`File size exceeds maximum allowed size (${maxSize} bytes). Downloaded ${totalSize} bytes before aborting.`);
53
+ }
54
+ chunks.push(Buffer.from(value));
55
+ }
56
+ } catch (streamError) {
57
+ reader.cancel?.();
58
+ throw streamError;
59
+ }
60
+ buffer = Buffer.concat(chunks);
61
+ } else {
62
+ // Fallback for node-fetch SSL path (no Web Streams getReader)
63
+ const arrayBuffer = await response.arrayBuffer();
64
+ buffer = Buffer.from(arrayBuffer);
65
+ if (buffer.length > maxSize) {
66
+ throw new Error(`File size (${buffer.length} bytes) exceeds maximum allowed size (${maxSize} bytes)`);
67
+ }
68
+ }
69
+ const urlParts = new URL(sourceUrl);
70
+ const pathParts = urlParts.pathname.split('/');
71
+ const filename = pathParts[pathParts.length - 1] || 'unknown-file';
72
+ return {
73
+ buffer,
74
+ filename,
75
+ mimeType: contentType,
76
+ size: buffer.length
77
+ };
78
+ } catch (error) {
79
+ console.error(`Error downloading media file from ${sourceUrl}:`, error);
80
+ throw error;
81
+ }
82
+ };
83
+
84
+ export { downloadWordPressMediaFile };
85
+ //# sourceMappingURL=download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.js","sources":["../../../src/utils/media/download.ts"],"sourcesContent":["/** Download media files from WordPress with SSL certificate and file size handling. */\n\nexport const downloadWordPressMediaFile = async (\n sourceUrl: string,\n maxFileSize?: number,\n allowSelfSignedCerts?: boolean,\n): Promise<{ buffer: Buffer; filename: string; mimeType: string; size: number }> => {\n try {\n let response: Response\n try {\n response = await fetch(sourceUrl)\n } catch (fetchError: any) {\n if (\n allowSelfSignedCerts &&\n (fetchError.cause?.code === 'DEPTH_ZERO_SELF_SIGNED_CERT' ||\n fetchError.cause?.code === 'SELF_SIGNED_CERT_IN_CHAIN' ||\n fetchError.message?.includes('certificate'))\n ) {\n if (process.env.NODE_ENV === 'production') {\n console.warn(\n 'WARNING: Downloading media with relaxed SSL verification in production. ' +\n 'Consider using a valid SSL certificate instead.',\n )\n }\n\n console.warn(\n `SSL certificate issue detected for ${sourceUrl}. Attempting download with relaxed SSL verification (allowSelfSignedCerts=true).`,\n )\n\n const https = await import('https')\n const { default: fetch } = await import('node-fetch')\n\n const agent = new https.Agent({\n rejectUnauthorized: false,\n })\n\n response = (await fetch(sourceUrl, { agent })) as any\n } else {\n const errorMessage = fetchError.cause?.code\n ? `${fetchError.message} (${fetchError.cause.code})`\n : fetchError.message\n\n if (\n fetchError.cause?.code === 'DEPTH_ZERO_SELF_SIGNED_CERT' ||\n fetchError.cause?.code === 'SELF_SIGNED_CERT_IN_CHAIN'\n ) {\n throw new Error(\n `${errorMessage}. Consider setting allowSelfSignedCerts: true in plugin configuration for development environments.`,\n )\n }\n\n throw fetchError\n }\n }\n\n if (!response.ok) {\n throw new Error(`Failed to download media file: ${response.status} ${response.statusText}`)\n }\n\n const maxSize = maxFileSize || 10 * 1024 * 1024 // Default 10MB\n\n // Fast-path: reject immediately if Content-Length exceeds limit\n const contentLength = response.headers.get('content-length')\n if (contentLength && parseInt(contentLength) > maxSize) {\n throw new Error(\n `File size (${contentLength} bytes) exceeds maximum allowed size (${maxSize} bytes)`,\n )\n }\n\n const contentType = response.headers.get('content-type') || 'application/octet-stream'\n\n // Stream with size tracking — abort mid-download if file exceeds limit\n let buffer: Buffer\n const reader = (response.body as any)?.getReader?.()\n if (reader) {\n const chunks: Buffer[] = []\n let totalSize = 0\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n totalSize += value.length\n if (totalSize > maxSize) {\n reader.cancel()\n throw new Error(\n `File size exceeds maximum allowed size (${maxSize} bytes). Downloaded ${totalSize} bytes before aborting.`,\n )\n }\n chunks.push(Buffer.from(value))\n }\n } catch (streamError) {\n reader.cancel?.()\n throw streamError\n }\n buffer = Buffer.concat(chunks)\n } else {\n // Fallback for node-fetch SSL path (no Web Streams getReader)\n const arrayBuffer = await response.arrayBuffer()\n buffer = Buffer.from(arrayBuffer)\n if (buffer.length > maxSize) {\n throw new Error(\n `File size (${buffer.length} bytes) exceeds maximum allowed size (${maxSize} bytes)`,\n )\n }\n }\n\n const urlParts = new URL(sourceUrl)\n const pathParts = urlParts.pathname.split('/')\n const filename = pathParts[pathParts.length - 1] || 'unknown-file'\n\n return {\n buffer,\n filename,\n mimeType: contentType,\n size: buffer.length,\n }\n } catch (error) {\n console.error(`Error downloading media file from ${sourceUrl}:`, error)\n throw error\n }\n}\n"],"names":["downloadWordPressMediaFile","sourceUrl","maxFileSize","allowSelfSignedCerts","response","fetch","fetchError","cause","code","message","includes","process","env","NODE_ENV","console","warn","https","default","agent","Agent","rejectUnauthorized","errorMessage","Error","ok","status","statusText","maxSize","contentLength","headers","get","parseInt","contentType","buffer","reader","body","getReader","chunks","totalSize","done","value","read","length","cancel","push","Buffer","from","streamError","concat","arrayBuffer","urlParts","URL","pathParts","pathname","split","filename","mimeType","size","error"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /** Extract media references from WordPress embedded data and HTML content. */
2
+ import type { WordPressItem } from '../types.js';
3
+ export declare const extractFeaturedMedia: (wpItem: WordPressItem) => WordPressItem | {
4
+ id: number;
5
+ needsFetch: true;
6
+ } | null;
7
+ export declare const fetchFeaturedMediaById: (mediaId: number, wpApiUrl: string, headers: Record<string, string>) => Promise<WordPressItem | null>;
8
+ export declare const extractContentMedia: (htmlContent: string) => Array<{
9
+ alt?: string;
10
+ src: string;
11
+ title?: string;
12
+ }>;
@@ -0,0 +1,58 @@
1
+ /** Extract media references from WordPress embedded data and HTML content. */ const extractFeaturedMedia = (wpItem)=>{
2
+ try {
3
+ if (wpItem._embedded && wpItem._embedded['wp:featuredmedia'] && wpItem._embedded['wp:featuredmedia'].length > 0) {
4
+ return wpItem._embedded['wp:featuredmedia'][0];
5
+ }
6
+ if (wpItem.featured_media && wpItem.featured_media !== 0) {
7
+ return {
8
+ id: wpItem.featured_media,
9
+ needsFetch: true
10
+ };
11
+ }
12
+ return null;
13
+ } catch (error) {
14
+ console.warn('Error extracting featured media:', error);
15
+ return null;
16
+ }
17
+ };
18
+ const fetchFeaturedMediaById = async (mediaId, wpApiUrl, headers)=>{
19
+ try {
20
+ const response = await fetch(`${wpApiUrl}/media/${mediaId}`, {
21
+ headers
22
+ });
23
+ if (!response.ok) {
24
+ console.warn(`Failed to fetch media ${mediaId}: ${response.status} ${response.statusText}`);
25
+ return null;
26
+ }
27
+ const mediaItem = await response.json();
28
+ return mediaItem;
29
+ } catch (error) {
30
+ console.error(`Error fetching featured media ${mediaId}:`, error);
31
+ return null;
32
+ }
33
+ };
34
+ const extractContentMedia = (htmlContent)=>{
35
+ const mediaItems = [];
36
+ try {
37
+ const imgRegex = /<img[^>]*\ssrc="([^"]+)"[^>]*>/gi;
38
+ let match;
39
+ while((match = imgRegex.exec(htmlContent)) !== null){
40
+ const [fullMatch, src] = match;
41
+ if (src && src.includes('wp-content/uploads')) {
42
+ const altMatch = fullMatch.match(/\salt="([^"]*)"/i);
43
+ const titleMatch = fullMatch.match(/\stitle="([^"]*)"/i);
44
+ mediaItems.push({
45
+ alt: altMatch ? altMatch[1].trim() : '',
46
+ src: src.trim(),
47
+ title: titleMatch ? titleMatch[1].trim() : ''
48
+ });
49
+ }
50
+ }
51
+ } catch (error) {
52
+ console.warn('Error extracting content media:', error);
53
+ }
54
+ return mediaItems;
55
+ };
56
+
57
+ export { extractContentMedia, extractFeaturedMedia, fetchFeaturedMediaById };
58
+ //# sourceMappingURL=extraction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extraction.js","sources":["../../../src/utils/media/extraction.ts"],"sourcesContent":["/** Extract media references from WordPress embedded data and HTML content. */\n\nimport type { WordPressItem } from '../types.js'\n\nexport const extractFeaturedMedia = (wpItem: WordPressItem): WordPressItem | { id: number; needsFetch: true } | null => {\n try {\n if (\n wpItem._embedded &&\n wpItem._embedded['wp:featuredmedia'] &&\n wpItem._embedded['wp:featuredmedia'].length > 0\n ) {\n return wpItem._embedded['wp:featuredmedia'][0] as WordPressItem\n }\n\n if (wpItem.featured_media && wpItem.featured_media !== 0) {\n return { id: wpItem.featured_media, needsFetch: true }\n }\n\n return null\n } catch (error) {\n console.warn('Error extracting featured media:', error)\n return null\n }\n}\n\nexport const fetchFeaturedMediaById = async (\n mediaId: number,\n wpApiUrl: string,\n headers: Record<string, string>,\n): Promise<WordPressItem | null> => {\n try {\n const response = await fetch(`${wpApiUrl}/media/${mediaId}`, { headers })\n\n if (!response.ok) {\n console.warn(`Failed to fetch media ${mediaId}: ${response.status} ${response.statusText}`)\n return null\n }\n\n const mediaItem = await response.json()\n return mediaItem\n } catch (error) {\n console.error(`Error fetching featured media ${mediaId}:`, error)\n return null\n }\n}\n\nexport const extractContentMedia = (\n htmlContent: string,\n): Array<{ alt?: string; src: string; title?: string }> => {\n const mediaItems: Array<{ alt?: string; src: string; title?: string }> = []\n\n try {\n const imgRegex = /<img[^>]*\\ssrc=\"([^\"]+)\"[^>]*>/gi\n let match\n\n while ((match = imgRegex.exec(htmlContent)) !== null) {\n const [fullMatch, src] = match\n\n if (src && src.includes('wp-content/uploads')) {\n const altMatch = fullMatch.match(/\\salt=\"([^\"]*)\"/i)\n const titleMatch = fullMatch.match(/\\stitle=\"([^\"]*)\"/i)\n\n mediaItems.push({\n alt: altMatch ? altMatch[1].trim() : '',\n src: src.trim(),\n title: titleMatch ? titleMatch[1].trim() : '',\n })\n }\n }\n } catch (error) {\n console.warn('Error extracting content media:', error)\n }\n\n return mediaItems\n}\n"],"names":["extractFeaturedMedia","wpItem","_embedded","length","featured_media","id","needsFetch","error","console","warn","fetchFeaturedMediaById","mediaId","wpApiUrl","headers","response","fetch","ok","status","statusText","mediaItem","json","extractContentMedia","htmlContent","mediaItems","imgRegex","match","exec","fullMatch","src","includes","altMatch","titleMatch","push","alt","trim","title"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** High-level media import orchestration: download, deduplicate, and upload media items. */
2
+ import type { Payload } from 'payload';
3
+ import type { PayloadWordPressMigratorConfig } from '../../index.js';
4
+ import type { LexicalRoot, WordPressItem } from '../types.js';
5
+ export declare const importMediaItem: (mediaItem: WordPressItem, payload: Payload, pluginOptions: PayloadWordPressMigratorConfig, mediaCollection?: string) => Promise<null | string>;
6
+ export declare const importMediaFromUrl: (mediaUrl: string, payload: Payload, pluginOptions: PayloadWordPressMigratorConfig, mediaCollection: string, altText?: string, title?: string, caption?: unknown) => Promise<null | string>;
7
+ export declare const processMediaBlocksInContent: (content: LexicalRoot | undefined, payload: Payload, pluginOptions?: PayloadWordPressMigratorConfig) => Promise<LexicalRoot | undefined>;
@@ -0,0 +1,146 @@
1
+ import { downloadWordPressMediaFile } from './download.js';
2
+ import { uploadMediaToPayload } from './upload.js';
3
+ import { checkMigrationFields, isMediaTypeAllowed } from './validation.js';
4
+
5
+ const importMediaItem = async (mediaItem, payload, pluginOptions, mediaCollection = 'media')=>{
6
+ try {
7
+ if (!pluginOptions?.enableMediaDownload) {
8
+ return null;
9
+ }
10
+ if (!mediaItem.source_url) {
11
+ console.warn(`Media item ${mediaItem.id} has no source_url, cannot download`);
12
+ return null;
13
+ }
14
+ if (!isMediaTypeAllowed(mediaItem.mime_type || '', pluginOptions.allowedMediaTypes)) {
15
+ console.warn(`Skipping media file: MIME type ${mediaItem.mime_type} not allowed`);
16
+ return null;
17
+ }
18
+ const hasMigrationFields = await checkMigrationFields(payload, mediaCollection);
19
+ if (hasMigrationFields) {
20
+ try {
21
+ const existingMedia = await payload.find({
22
+ collection: mediaCollection,
23
+ limit: 1,
24
+ where: {
25
+ 'migratedFromWordPress.wpPostId': {
26
+ equals: mediaItem.id
27
+ }
28
+ }
29
+ });
30
+ if (existingMedia.docs.length > 0) {
31
+ return String(existingMedia.docs[0].id);
32
+ }
33
+ } catch (error) {
34
+ console.warn(`Error checking for existing media item ${mediaItem.id}:`, error);
35
+ }
36
+ }
37
+ const fileData = await downloadWordPressMediaFile(mediaItem.source_url, pluginOptions.maxMediaFileSize, pluginOptions.allowSelfSignedCerts);
38
+ let alt = mediaItem.alt_text || '';
39
+ if (!alt) {
40
+ const urlParts = new URL(mediaItem.source_url);
41
+ const pathParts = urlParts.pathname.split('/');
42
+ const filename = pathParts[pathParts.length - 1] || 'unknown-file';
43
+ alt = filename.replace(/\.[^/.]+$/, '').replace(/[-_]/g, ' ');
44
+ }
45
+ alt = alt.trim();
46
+ if (!alt) {
47
+ const urlParts = new URL(mediaItem.source_url);
48
+ const pathParts = urlParts.pathname.split('/');
49
+ const filename = pathParts[pathParts.length - 1] || 'unknown-file';
50
+ alt = filename.replace(/\.[^/.]+$/, '') || 'imported-media';
51
+ }
52
+ const mediaMetadata = {
53
+ altText: alt,
54
+ description: mediaItem.description?.rendered || '',
55
+ originalUrl: mediaItem.source_url,
56
+ title: mediaItem.title?.rendered || 'Imported Media',
57
+ wpPostId: mediaItem.id
58
+ };
59
+ const uploadedMedia = await uploadMediaToPayload(payload, mediaCollection, fileData, mediaMetadata, hasMigrationFields);
60
+ return String(uploadedMedia.id);
61
+ } catch (error) {
62
+ console.error(`Failed to import media item ${mediaItem.id}:`, error);
63
+ return null;
64
+ }
65
+ };
66
+ const importMediaFromUrl = async (mediaUrl, payload, pluginOptions, mediaCollection, altText = '', title = '', caption = null)=>{
67
+ try {
68
+ if (!pluginOptions?.enableMediaDownload) {
69
+ return null;
70
+ }
71
+ const urlParts = new URL(mediaUrl);
72
+ const pathParts = urlParts.pathname.split('/');
73
+ const filename = pathParts[pathParts.length - 1] || 'unknown-file';
74
+ try {
75
+ const existingMedia = await payload.find({
76
+ collection: mediaCollection,
77
+ limit: 1,
78
+ where: {
79
+ filename: {
80
+ equals: filename
81
+ }
82
+ }
83
+ });
84
+ if (existingMedia.docs.length > 0) {
85
+ return String(existingMedia.docs[0].id);
86
+ }
87
+ } catch (error) {
88
+ // Ignore errors in duplicate checking for URL-based imports
89
+ }
90
+ const fileData = await downloadWordPressMediaFile(mediaUrl, pluginOptions.maxMediaFileSize, pluginOptions.allowSelfSignedCerts);
91
+ let alt = altText || '';
92
+ if (!alt) {
93
+ alt = filename.replace(/\.[^/.]+$/, '').replace(/[-_]/g, ' ');
94
+ }
95
+ alt = alt.trim();
96
+ if (!alt) {
97
+ alt = filename.replace(/\.[^/.]+$/, '') || 'imported-image';
98
+ }
99
+ const mediaMetadata = {
100
+ altText: alt,
101
+ caption,
102
+ originalUrl: mediaUrl,
103
+ title,
104
+ wpPostId: null
105
+ };
106
+ const hasMigrationFields = await checkMigrationFields(payload, mediaCollection);
107
+ const uploadedMedia = await uploadMediaToPayload(payload, mediaCollection, fileData, mediaMetadata, hasMigrationFields);
108
+ return String(uploadedMedia.id);
109
+ } catch (error) {
110
+ console.error(`Failed to import media from URL: ${mediaUrl}`, error);
111
+ return null;
112
+ }
113
+ };
114
+ const processMediaBlocksInContent = async (content, payload, pluginOptions)=>{
115
+ if (!content?.root?.children || !payload || !pluginOptions?.enableMediaDownload) {
116
+ return content;
117
+ }
118
+ const processNode = async (node)=>{
119
+ if (node.type === 'block' && node.fields?.blockType === 'mediaBlock' && node.fields?.__migrationMeta?.needsMediaImport) {
120
+ const migrationData = node.fields.__migrationMeta;
121
+ try {
122
+ const mediaId = await importMediaFromUrl(migrationData.originalSrc, payload, pluginOptions, 'media', migrationData.alt || '', migrationData.title || '', migrationData.caption);
123
+ if (mediaId) {
124
+ node.fields.media = mediaId;
125
+ }
126
+ delete node.fields.__migrationMeta;
127
+ } catch (error) {
128
+ console.warn(`Failed to import media for MediaBlock: ${migrationData.originalSrc}`, error);
129
+ delete node.fields.__migrationMeta;
130
+ }
131
+ }
132
+ if (node.children && Array.isArray(node.children)) {
133
+ const results = await Promise.allSettled(node.children.map(processNode));
134
+ node.children = results.filter((r)=>r.status === 'fulfilled').map((r)=>r.value);
135
+ }
136
+ return node;
137
+ };
138
+ if (content.root.children && Array.isArray(content.root.children)) {
139
+ const results = await Promise.allSettled(content.root.children.map(processNode));
140
+ content.root.children = results.filter((r)=>r.status === 'fulfilled').map((r)=>r.value);
141
+ }
142
+ return content;
143
+ };
144
+
145
+ export { importMediaFromUrl, importMediaItem, processMediaBlocksInContent };
146
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sources":["../../../src/utils/media/import.ts"],"sourcesContent":["/** High-level media import orchestration: download, deduplicate, and upload media items. */\n\nimport type { Payload } from 'payload'\n\nimport type { PayloadWordPressMigratorConfig } from '../../index.js'\nimport type { LexicalRoot, WordPressItem } from '../types.js'\n\nimport { downloadWordPressMediaFile } from './download.js'\nimport { uploadMediaToPayload } from './upload.js'\nimport { checkMigrationFields, isMediaTypeAllowed } from './validation.js'\n\nexport const importMediaItem = async (\n mediaItem: WordPressItem,\n payload: Payload,\n pluginOptions: PayloadWordPressMigratorConfig,\n mediaCollection: string = 'media',\n): Promise<null | string> => {\n try {\n if (!pluginOptions?.enableMediaDownload) {\n return null\n }\n\n if (!mediaItem.source_url) {\n console.warn(`Media item ${mediaItem.id} has no source_url, cannot download`)\n return null\n }\n\n if (!isMediaTypeAllowed(mediaItem.mime_type || '', pluginOptions.allowedMediaTypes)) {\n console.warn(`Skipping media file: MIME type ${mediaItem.mime_type} not allowed`)\n return null\n }\n\n const hasMigrationFields = await checkMigrationFields(payload, mediaCollection)\n\n if (hasMigrationFields) {\n try {\n const existingMedia = await payload.find({\n collection: mediaCollection,\n limit: 1,\n where: {\n 'migratedFromWordPress.wpPostId': {\n equals: mediaItem.id,\n },\n },\n })\n\n if (existingMedia.docs.length > 0) {\n return String(existingMedia.docs[0].id)\n }\n } catch (error) {\n console.warn(`Error checking for existing media item ${mediaItem.id}:`, error)\n }\n }\n\n const fileData = await downloadWordPressMediaFile(\n mediaItem.source_url,\n pluginOptions.maxMediaFileSize,\n pluginOptions.allowSelfSignedCerts,\n )\n\n let alt = mediaItem.alt_text || ''\n\n if (!alt) {\n const urlParts = new URL(mediaItem.source_url)\n const pathParts = urlParts.pathname.split('/')\n const filename = pathParts[pathParts.length - 1] || 'unknown-file'\n alt = filename.replace(/\\.[^/.]+$/, '').replace(/[-_]/g, ' ')\n }\n\n alt = alt.trim()\n if (!alt) {\n const urlParts = new URL(mediaItem.source_url)\n const pathParts = urlParts.pathname.split('/')\n const filename = pathParts[pathParts.length - 1] || 'unknown-file'\n alt = filename.replace(/\\.[^/.]+$/, '') || 'imported-media'\n }\n\n const mediaMetadata = {\n altText: alt,\n description: mediaItem.description?.rendered || '',\n originalUrl: mediaItem.source_url,\n title: mediaItem.title?.rendered || 'Imported Media',\n wpPostId: mediaItem.id,\n }\n\n const uploadedMedia = await uploadMediaToPayload(\n payload,\n mediaCollection,\n fileData,\n mediaMetadata,\n hasMigrationFields,\n )\n\n return String(uploadedMedia.id)\n } catch (error) {\n console.error(`Failed to import media item ${mediaItem.id}:`, error)\n return null\n }\n}\n\nexport const importMediaFromUrl = async (\n mediaUrl: string,\n payload: Payload,\n pluginOptions: PayloadWordPressMigratorConfig,\n mediaCollection: string,\n altText: string = '',\n title: string = '',\n caption: unknown = null,\n): Promise<null | string> => {\n try {\n if (!pluginOptions?.enableMediaDownload) {\n return null\n }\n\n const urlParts = new URL(mediaUrl)\n const pathParts = urlParts.pathname.split('/')\n const filename = pathParts[pathParts.length - 1] || 'unknown-file'\n\n try {\n const existingMedia = await payload.find({\n collection: mediaCollection,\n limit: 1,\n where: {\n filename: {\n equals: filename,\n },\n },\n })\n\n if (existingMedia.docs.length > 0) {\n return String(existingMedia.docs[0].id)\n }\n } catch (error) {\n // Ignore errors in duplicate checking for URL-based imports\n }\n\n const fileData = await downloadWordPressMediaFile(\n mediaUrl,\n pluginOptions.maxMediaFileSize,\n pluginOptions.allowSelfSignedCerts,\n )\n\n let alt = altText || ''\n\n if (!alt) {\n alt = filename.replace(/\\.[^/.]+$/, '').replace(/[-_]/g, ' ')\n }\n\n alt = alt.trim()\n if (!alt) {\n alt = filename.replace(/\\.[^/.]+$/, '') || 'imported-image'\n }\n\n const mediaMetadata = {\n altText: alt,\n caption,\n originalUrl: mediaUrl,\n title,\n wpPostId: null,\n }\n\n const hasMigrationFields = await checkMigrationFields(payload, mediaCollection)\n\n const uploadedMedia = await uploadMediaToPayload(\n payload,\n mediaCollection,\n fileData,\n mediaMetadata,\n hasMigrationFields,\n )\n\n return String(uploadedMedia.id)\n } catch (error) {\n console.error(`Failed to import media from URL: ${mediaUrl}`, error)\n return null\n }\n}\n\nexport const processMediaBlocksInContent = async (\n content: LexicalRoot | undefined,\n payload: Payload,\n pluginOptions?: PayloadWordPressMigratorConfig,\n): Promise<LexicalRoot | undefined> => {\n if (!content?.root?.children || !payload || !pluginOptions?.enableMediaDownload) {\n return content\n }\n\n const processNode = async (node: any): Promise<any> => {\n if (\n node.type === 'block' &&\n node.fields?.blockType === 'mediaBlock' &&\n node.fields?.__migrationMeta?.needsMediaImport\n ) {\n const migrationData = node.fields.__migrationMeta\n\n try {\n const mediaId = await importMediaFromUrl(\n migrationData.originalSrc,\n payload,\n pluginOptions,\n 'media',\n migrationData.alt || '',\n migrationData.title || '',\n migrationData.caption,\n )\n\n if (mediaId) {\n node.fields.media = mediaId\n }\n\n delete node.fields.__migrationMeta\n } catch (error) {\n console.warn(`Failed to import media for MediaBlock: ${migrationData.originalSrc}`, error)\n delete node.fields.__migrationMeta\n }\n }\n\n if (node.children && Array.isArray(node.children)) {\n const results = await Promise.allSettled(node.children.map(processNode))\n node.children = results\n .filter((r): r is PromiseFulfilledResult<unknown> => r.status === 'fulfilled')\n .map(r => r.value)\n }\n\n return node\n }\n\n if (content.root.children && Array.isArray(content.root.children)) {\n const results = await Promise.allSettled(content.root.children.map(processNode))\n content.root.children = results\n .filter((r): r is PromiseFulfilledResult<unknown> => r.status === 'fulfilled')\n .map(r => r.value)\n }\n\n return content\n}\n"],"names":["importMediaItem","mediaItem","payload","pluginOptions","mediaCollection","enableMediaDownload","source_url","console","warn","id","isMediaTypeAllowed","mime_type","allowedMediaTypes","hasMigrationFields","checkMigrationFields","existingMedia","find","collection","limit","where","equals","docs","length","String","error","fileData","downloadWordPressMediaFile","maxMediaFileSize","allowSelfSignedCerts","alt","alt_text","urlParts","URL","pathParts","pathname","split","filename","replace","trim","mediaMetadata","altText","description","rendered","originalUrl","title","wpPostId","uploadedMedia","uploadMediaToPayload","importMediaFromUrl","mediaUrl","caption","processMediaBlocksInContent","content","root","children","processNode","node","type","fields","blockType","__migrationMeta","needsMediaImport","migrationData","mediaId","originalSrc","media","Array","isArray","results","Promise","allSettled","map","filter","r","status","value"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /** Barrel re-export of all media utility sub-modules. */
2
+ export { downloadWordPressMediaFile } from './download.js';
3
+ export { extractContentMedia, extractFeaturedMedia, fetchFeaturedMediaById } from './extraction.js';
4
+ export { importMediaFromUrl, importMediaItem, processMediaBlocksInContent } from './import.js';
5
+ export { uploadMediaToPayload } from './upload.js';
6
+ export { checkMigrationFields, isMediaTypeAllowed, testMediaDownload } from './validation.js';
@@ -0,0 +1,6 @@
1
+ export { downloadWordPressMediaFile } from './download.js';
2
+ export { extractContentMedia, extractFeaturedMedia, fetchFeaturedMediaById } from './extraction.js';
3
+ export { importMediaFromUrl, importMediaItem, processMediaBlocksInContent } from './import.js';
4
+ export { uploadMediaToPayload } from './upload.js';
5
+ export { checkMigrationFields, isMediaTypeAllowed, testMediaDownload } from './validation.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,4 @@
1
+ /** Upload media files to PayloadCMS with metadata and migration tracking. */
2
+ import type { Payload } from 'payload';
3
+ import type { FileData, MediaMetadata } from '../types.js';
4
+ export declare const uploadMediaToPayload: (payload: Payload, mediaCollection: string, fileData: FileData, mediaMetadata: MediaMetadata, hasMigrationFields?: boolean) => Promise<Record<string, unknown>>;
@@ -0,0 +1,46 @@
1
+ /** Upload media files to PayloadCMS with metadata and migration tracking. */ const uploadMediaToPayload = async (payload, mediaCollection, fileData, mediaMetadata, hasMigrationFields = true)=>{
2
+ try {
3
+ let alt = mediaMetadata.altText || '';
4
+ if (!alt) {
5
+ alt = fileData.filename.replace(/\.[^/.]+$/, '').replace(/[-_]/g, ' ');
6
+ }
7
+ alt = alt.trim();
8
+ if (!alt) {
9
+ alt = fileData.filename.replace(/\.[^/.]+$/, '') || 'imported-image';
10
+ }
11
+ const createData = {
12
+ alt,
13
+ description: mediaMetadata.description || '',
14
+ title: mediaMetadata.title || fileData.filename
15
+ };
16
+ if (mediaMetadata.caption) {
17
+ createData.caption = mediaMetadata.caption;
18
+ }
19
+ if (hasMigrationFields) {
20
+ createData.migratedFromWordPress = {
21
+ migrationDate: new Date(),
22
+ originalUrl: mediaMetadata.originalUrl,
23
+ wpPostId: mediaMetadata.wpPostId,
24
+ wpPostType: 'media'
25
+ };
26
+ }
27
+ const fileObject = {
28
+ name: fileData.filename,
29
+ data: fileData.buffer,
30
+ mimetype: fileData.mimeType,
31
+ size: fileData.size
32
+ };
33
+ const uploadedMedia = await payload.create({
34
+ collection: mediaCollection,
35
+ data: createData,
36
+ file: fileObject
37
+ });
38
+ return uploadedMedia;
39
+ } catch (error) {
40
+ payload.logger.error(`Error uploading media file ${fileData.filename}: ${error}`);
41
+ throw error;
42
+ }
43
+ };
44
+
45
+ export { uploadMediaToPayload };
46
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sources":["../../../src/utils/media/upload.ts"],"sourcesContent":["/** Upload media files to PayloadCMS with metadata and migration tracking. */\n\nimport type { Payload } from 'payload'\n\nimport type { FileData, MediaMetadata } from '../types.js'\n\nexport const uploadMediaToPayload = async (\n payload: Payload,\n mediaCollection: string,\n fileData: FileData,\n mediaMetadata: MediaMetadata,\n hasMigrationFields: boolean = true,\n): Promise<Record<string, unknown>> => {\n try {\n let alt = mediaMetadata.altText || ''\n if (!alt) {\n alt = fileData.filename.replace(/\\.[^/.]+$/, '').replace(/[-_]/g, ' ')\n }\n\n alt = alt.trim()\n if (!alt) {\n alt = fileData.filename.replace(/\\.[^/.]+$/, '') || 'imported-image'\n }\n\n const createData: any = {\n alt,\n description: mediaMetadata.description || '',\n title: mediaMetadata.title || fileData.filename,\n }\n\n if (mediaMetadata.caption) {\n createData.caption = mediaMetadata.caption\n }\n\n if (hasMigrationFields) {\n createData.migratedFromWordPress = {\n migrationDate: new Date(),\n originalUrl: mediaMetadata.originalUrl,\n wpPostId: mediaMetadata.wpPostId,\n wpPostType: 'media',\n }\n }\n\n const fileObject = {\n name: fileData.filename,\n data: fileData.buffer,\n mimetype: fileData.mimeType,\n size: fileData.size,\n }\n\n const uploadedMedia = await payload.create({\n collection: mediaCollection,\n data: createData,\n file: fileObject,\n })\n\n return uploadedMedia\n } catch (error) {\n payload.logger.error(`Error uploading media file ${fileData.filename}: ${error}`)\n throw error\n }\n}\n"],"names":["uploadMediaToPayload","payload","mediaCollection","fileData","mediaMetadata","hasMigrationFields","alt","altText","filename","replace","trim","createData","description","title","caption","migratedFromWordPress","migrationDate","Date","originalUrl","wpPostId","wpPostType","fileObject","name","data","buffer","mimetype","mimeType","size","uploadedMedia","create","collection","file","error","logger"],"mappings":"AAAA,8EAMO,MAAMA,oBAAAA,GAAuB,OAClCC,SACAC,eAAAA,EACAC,QAAAA,EACAC,aAAAA,EACAC,kBAAAA,GAA8B,IAAI,GAAA;IAElC,IAAI;QACF,IAAIC,GAAAA,GAAMF,aAAAA,CAAcG,OAAO,IAAI,EAAA;AACnC,QAAA,IAAI,CAACD,GAAAA,EAAK;YACRA,GAAAA,GAAMH,QAAAA,CAASK,QAAQ,CAACC,OAAO,CAAC,WAAA,EAAa,EAAA,CAAA,CAAIA,OAAO,CAAC,OAAA,EAAS,GAAA,CAAA;AACpE,QAAA;AAEAH,QAAAA,GAAAA,GAAMA,IAAII,IAAI,EAAA;AACd,QAAA,IAAI,CAACJ,GAAAA,EAAK;AACRA,YAAAA,GAAAA,GAAMH,SAASK,QAAQ,CAACC,OAAO,CAAC,aAAa,EAAA,CAAA,IAAO,gBAAA;AACtD,QAAA;AAEA,QAAA,MAAME,UAAAA,GAAkB;AACtBL,YAAAA,GAAAA;YACAM,WAAAA,EAAaR,aAAAA,CAAcQ,WAAW,IAAI,EAAA;AAC1CC,YAAAA,KAAAA,EAAOT,aAAAA,CAAcS,KAAK,IAAIV,QAAAA,CAASK;AACzC,SAAA;QAEA,IAAIJ,aAAAA,CAAcU,OAAO,EAAE;YACzBH,UAAAA,CAAWG,OAAO,GAAGV,aAAAA,CAAcU,OAAO;AAC5C,QAAA;AAEA,QAAA,IAAIT,kBAAAA,EAAoB;AACtBM,YAAAA,UAAAA,CAAWI,qBAAqB,GAAG;AACjCC,gBAAAA,aAAAA,EAAe,IAAIC,IAAAA,EAAAA;AACnBC,gBAAAA,WAAAA,EAAad,cAAcc,WAAW;AACtCC,gBAAAA,QAAAA,EAAUf,cAAce,QAAQ;gBAChCC,UAAAA,EAAY;AACd,aAAA;AACF,QAAA;AAEA,QAAA,MAAMC,UAAAA,GAAa;AACjBC,YAAAA,IAAAA,EAAMnB,SAASK,QAAQ;AACvBe,YAAAA,IAAAA,EAAMpB,SAASqB,MAAM;AACrBC,YAAAA,QAAAA,EAAUtB,SAASuB,QAAQ;AAC3BC,YAAAA,IAAAA,EAAMxB,SAASwB;AACjB,SAAA;AAEA,QAAA,MAAMC,aAAAA,GAAgB,MAAM3B,OAAAA,CAAQ4B,MAAM,CAAC;YACzCC,UAAAA,EAAY5B,eAAAA;YACZqB,IAAAA,EAAMZ,UAAAA;YACNoB,IAAAA,EAAMV;AACR,SAAA,CAAA;QAEA,OAAOO,aAAAA;AACT,IAAA,CAAA,CAAE,OAAOI,KAAAA,EAAO;AACd/B,QAAAA,OAAAA,CAAQgC,MAAM,CAACD,KAAK,CAAC,CAAC,2BAA2B,EAAE7B,QAAAA,CAASK,QAAQ,CAAC,EAAE,EAAEwB,KAAAA,CAAAA,CAAO,CAAA;QAChF,MAAMA,KAAAA;AACR,IAAA;AACF;;;;"}
@@ -0,0 +1,8 @@
1
+ /** Media type validation and migration field checks for PayloadCMS collections. */
2
+ export declare const isMediaTypeAllowed: (mimeType: string, allowedTypes?: string[]) => boolean;
3
+ export declare const testMediaDownload: (sourceUrl: string, maxFileSize?: number) => Promise<{
4
+ error?: string;
5
+ fileInfo?: any;
6
+ success: boolean;
7
+ }>;
8
+ export declare const checkMigrationFields: (payload: any, collectionSlug: string) => Promise<boolean>;
@@ -0,0 +1,60 @@
1
+ import { downloadWordPressMediaFile } from './download.js';
2
+
3
+ const isMediaTypeAllowed = (mimeType, allowedTypes)=>{
4
+ if (!allowedTypes || allowedTypes.length === 0) {
5
+ const defaultAllowed = [
6
+ 'image/jpeg',
7
+ 'image/jpg',
8
+ 'image/png',
9
+ 'image/gif',
10
+ 'image/webp',
11
+ 'image/svg+xml',
12
+ 'application/pdf',
13
+ 'video/mp4',
14
+ 'video/webm',
15
+ 'audio/mpeg',
16
+ 'audio/wav',
17
+ 'audio/ogg'
18
+ ];
19
+ return defaultAllowed.includes(mimeType.toLowerCase());
20
+ }
21
+ return allowedTypes.includes(mimeType.toLowerCase());
22
+ };
23
+ const testMediaDownload = async (sourceUrl, maxFileSize)=>{
24
+ try {
25
+ const fileData = await downloadWordPressMediaFile(sourceUrl, maxFileSize);
26
+ return {
27
+ fileInfo: {
28
+ filename: fileData.filename,
29
+ mimeType: fileData.mimeType,
30
+ size: fileData.size
31
+ },
32
+ success: true
33
+ };
34
+ } catch (error) {
35
+ return {
36
+ error: error instanceof Error ? error.message : String(error),
37
+ success: false
38
+ };
39
+ }
40
+ };
41
+ const checkMigrationFields = async (payload, collectionSlug)=>{
42
+ try {
43
+ await payload.find({
44
+ collection: collectionSlug,
45
+ limit: 1,
46
+ where: {
47
+ 'migratedFromWordPress.wpPostId': {
48
+ exists: true
49
+ }
50
+ }
51
+ });
52
+ return true;
53
+ } catch (error) {
54
+ console.warn(`Collection '${collectionSlug}' does not have WordPress migration fields. Please add the collection to your plugin configuration to enable duplicate detection and proper migration tracking.`);
55
+ return false;
56
+ }
57
+ };
58
+
59
+ export { checkMigrationFields, isMediaTypeAllowed, testMediaDownload };
60
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sources":["../../../src/utils/media/validation.ts"],"sourcesContent":["/** Media type validation and migration field checks for PayloadCMS collections. */\n\nimport { downloadWordPressMediaFile } from './download.js'\n\nexport const isMediaTypeAllowed = (mimeType: string, allowedTypes?: string[]): boolean => {\n if (!allowedTypes || allowedTypes.length === 0) {\n const defaultAllowed = [\n 'image/jpeg',\n 'image/jpg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n 'application/pdf',\n 'video/mp4',\n 'video/webm',\n 'audio/mpeg',\n 'audio/wav',\n 'audio/ogg',\n ]\n return defaultAllowed.includes(mimeType.toLowerCase())\n }\n\n return allowedTypes.includes(mimeType.toLowerCase())\n}\n\nexport const testMediaDownload = async (\n sourceUrl: string,\n maxFileSize?: number,\n): Promise<{ error?: string; fileInfo?: any; success: boolean }> => {\n try {\n const fileData = await downloadWordPressMediaFile(sourceUrl, maxFileSize)\n return {\n fileInfo: {\n filename: fileData.filename,\n mimeType: fileData.mimeType,\n size: fileData.size,\n },\n success: true,\n }\n } catch (error) {\n return {\n error: error instanceof Error ? error.message : String(error),\n success: false,\n }\n }\n}\n\nexport const checkMigrationFields = async (\n payload: any,\n collectionSlug: string,\n): Promise<boolean> => {\n try {\n await payload.find({\n collection: collectionSlug,\n limit: 1,\n where: {\n 'migratedFromWordPress.wpPostId': {\n exists: true,\n },\n },\n })\n return true\n } catch (error) {\n console.warn(\n `Collection '${collectionSlug}' does not have WordPress migration fields. Please add the collection to your plugin configuration to enable duplicate detection and proper migration tracking.`,\n )\n return false\n }\n}\n"],"names":["isMediaTypeAllowed","mimeType","allowedTypes","length","defaultAllowed","includes","toLowerCase","testMediaDownload","sourceUrl","maxFileSize","fileData","downloadWordPressMediaFile","fileInfo","filename","size","success","error","Error","message","String","checkMigrationFields","payload","collectionSlug","find","collection","limit","where","exists","console","warn"],"mappings":";;AAIO,MAAMA,kBAAAA,GAAqB,CAACC,QAAAA,EAAkBC,YAAAA,GAAAA;AACnD,IAAA,IAAI,CAACA,YAAAA,IAAgBA,YAAAA,CAAaC,MAAM,KAAK,CAAA,EAAG;AAC9C,QAAA,MAAMC,cAAAA,GAAiB;AACrB,YAAA,YAAA;AACA,YAAA,WAAA;AACA,YAAA,WAAA;AACA,YAAA,WAAA;AACA,YAAA,YAAA;AACA,YAAA,eAAA;AACA,YAAA,iBAAA;AACA,YAAA,WAAA;AACA,YAAA,YAAA;AACA,YAAA,YAAA;AACA,YAAA,WAAA;AACA,YAAA;AACD,SAAA;AACD,QAAA,OAAOA,cAAAA,CAAeC,QAAQ,CAACJ,QAAAA,CAASK,WAAW,EAAA,CAAA;AACrD,IAAA;AAEA,IAAA,OAAOJ,YAAAA,CAAaG,QAAQ,CAACJ,QAAAA,CAASK,WAAW,EAAA,CAAA;AACnD;AAEO,MAAMC,iBAAAA,GAAoB,OAC/BC,SAAAA,EACAC,WAAAA,GAAAA;IAEA,IAAI;QACF,MAAMC,QAAAA,GAAW,MAAMC,0BAAAA,CAA2BH,SAAAA,EAAWC,WAAAA,CAAAA;QAC7D,OAAO;YACLG,QAAAA,EAAU;AACRC,gBAAAA,QAAAA,EAAUH,SAASG,QAAQ;AAC3BZ,gBAAAA,QAAAA,EAAUS,SAAST,QAAQ;AAC3Ba,gBAAAA,IAAAA,EAAMJ,SAASI;AACjB,aAAA;YACAC,OAAAA,EAAS;AACX,SAAA;AACF,IAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;QACd,OAAO;AACLA,YAAAA,KAAAA,EAAOA,KAAAA,YAAiBC,KAAAA,GAAQD,KAAAA,CAAME,OAAO,GAAGC,MAAAA,CAAOH,KAAAA,CAAAA;YACvDD,OAAAA,EAAS;AACX,SAAA;AACF,IAAA;AACF;AAEO,MAAMK,oBAAAA,GAAuB,OAClCC,OAAAA,EACAC,cAAAA,GAAAA;IAEA,IAAI;QACF,MAAMD,OAAAA,CAAQE,IAAI,CAAC;YACjBC,UAAAA,EAAYF,cAAAA;YACZG,KAAAA,EAAO,CAAA;YACPC,KAAAA,EAAO;gBACL,gCAAA,EAAkC;oBAChCC,MAAAA,EAAQ;AACV;AACF;AACF,SAAA,CAAA;QACA,OAAO,IAAA;AACT,IAAA,CAAA,CAAE,OAAOX,KAAAA,EAAO;AACdY,QAAAA,OAAAA,CAAQC,IAAI,CACV,CAAC,YAAY,EAAEP,cAAAA,CAAe,+JAA+J,CAAC,CAAA;QAEhM,OAAO,KAAA;AACT,IAAA;AACF;;;;"}
@@ -0,0 +1,3 @@
1
+ /** Barrel re-export of migration job lifecycle modules. */
2
+ export { migrationJobHandler } from './jobCrud.js';
3
+ export { processMigrationJob } from './orchestrator.js';
@@ -0,0 +1,3 @@
1
+ export { migrationJobHandler } from './jobCrud.js';
2
+ export { processMigrationJob } from './orchestrator.js';
3
+ //# sourceMappingURL=index.js.map