@artinstack/migrator 0.1.14 → 0.1.15
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.
- package/dist/{chunk-X4TJQWZF.js → chunk-BM7HUMZM.js} +24 -3
- package/dist/{chunk-X4TJQWZF.js.map → chunk-BM7HUMZM.js.map} +1 -1
- package/dist/{chunk-S4GMDRGX.js → chunk-DZI5C6KR.js} +82 -12
- package/dist/chunk-DZI5C6KR.js.map +1 -0
- package/dist/{chunk-5TRCJONX.js → chunk-GVAKKEWX.js} +3 -3
- package/dist/{chunk-HUSXCKPI.js → chunk-LQFNO26V.js} +23 -2
- package/dist/chunk-LQFNO26V.js.map +1 -0
- package/dist/{chunk-ZKIAIP3B.js → chunk-TCAZ73UK.js} +10 -6
- package/dist/chunk-TCAZ73UK.js.map +1 -0
- package/dist/{chunk-S55525RD.js → chunk-ZK3LH7PO.js} +3 -3
- package/dist/cli/index.js +5 -5
- package/dist/index.d.ts +2 -2
- package/dist/index.js +10 -6
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.js +5 -1
- package/dist/{media-urls-u49RCyPn.d.ts → media-urls-ScJvYI7b.d.ts} +11 -7
- package/dist/{rewrite-inline-images-BsgSquzV.d.ts → rewrite-inline-images-escjz3gT.d.ts} +2 -2
- package/dist/sinks/index.d.ts +3 -3
- package/dist/sinks/index.js +3 -3
- package/dist/transformers/index.d.ts +2 -2
- package/dist/transformers/index.js +4 -4
- package/package.json +1 -1
- package/dist/chunk-HUSXCKPI.js.map +0 -1
- package/dist/chunk-S4GMDRGX.js.map +0 -1
- package/dist/chunk-ZKIAIP3B.js.map +0 -1
- /package/dist/{chunk-5TRCJONX.js.map → chunk-GVAKKEWX.js.map} +0 -0
- /package/dist/{chunk-S55525RD.js.map → chunk-ZK3LH7PO.js.map} +0 -0
|
@@ -11,7 +11,7 @@ declare function rewriteOriginUrlsInText(text: string, config: OriginUrlRewriteC
|
|
|
11
11
|
/** Build a rule that rewrites API-gateway `/prod/wp-content/` paths to a public origin. */
|
|
12
12
|
declare function createWpContentGatewayRewrite(gatewayBase: string, publicOrigin: string): OriginUrlRewriteConfig;
|
|
13
13
|
interface ContentAssetDiscovery {
|
|
14
|
-
/** Network-resolvable image paths (`<img>`,
|
|
14
|
+
/** Network-resolvable image and self-hosted video paths (`<img>`, `<video>`, `data-video-url`, …). */
|
|
15
15
|
urls: string[];
|
|
16
16
|
/**
|
|
17
17
|
* WordPress attachment post ids referenced in content without an inline URL in this
|
|
@@ -25,6 +25,10 @@ declare function discoverRawImgSrcs(content: string): string[];
|
|
|
25
25
|
declare function normalizeAssetUrl(raw: string): string | undefined;
|
|
26
26
|
/** Heuristic: URL likely points at a raster/vector image asset, not a page link. */
|
|
27
27
|
declare function isLikelyImageUrl(url: string): boolean;
|
|
28
|
+
/** Heuristic: URL likely points at a self-hosted video asset (mp4/webm/ogg/mov), not a page or embed. */
|
|
29
|
+
declare function isLikelyVideoUrl(url: string): boolean;
|
|
30
|
+
/** Image or self-hosted video URL suitable for vault ingest (not oEmbed / page links). */
|
|
31
|
+
declare function isLikelyContentAssetUrl(url: string): boolean;
|
|
28
32
|
/**
|
|
29
33
|
* Ordered featured-image candidates when `_thumbnail_id` is missing — heroes
|
|
30
34
|
* (`data-bg-image`, CSS backgrounds, `bg_image=`) before inline assets; within
|
|
@@ -35,15 +39,15 @@ declare function discoverFeaturedAssetCandidateUrls(content: string): string[];
|
|
|
35
39
|
/** Best featured-image URL from post/page HTML when attachment id is unavailable. */
|
|
36
40
|
declare function resolveFeaturedContentAssetUrl(content: string): string | undefined;
|
|
37
41
|
/**
|
|
38
|
-
* Generic content-discovery pass: collect resolvable image URLs and attachment ids
|
|
42
|
+
* Generic content-discovery pass: collect resolvable image/video URLs and attachment ids
|
|
39
43
|
* that still need an index / REST / crawl resolution step.
|
|
40
44
|
*/
|
|
41
45
|
declare function discoverContentAssets(content: string): ContentAssetDiscovery;
|
|
42
46
|
/**
|
|
43
|
-
* Generic content-discovery pass: collect image URLs from HTML
|
|
44
|
-
* section hero markers (`data-bg-image`),
|
|
45
|
-
* shortcode/builder attributes
|
|
46
|
-
*
|
|
47
|
+
* Generic content-discovery pass: collect image and self-hosted video URLs from HTML
|
|
48
|
+
* `<img>` / `<video>` / `<source>`, section hero markers (`data-bg-image`, `data-video-url`),
|
|
49
|
+
* inline CSS backgrounds, and common shortcode/builder attributes without parsing
|
|
50
|
+
* builder-specific structure (Tatsu, Elementor, etc.).
|
|
47
51
|
*/
|
|
48
52
|
declare function discoverContentAssetUrls(content: string): string[];
|
|
49
53
|
/** @deprecated Use discoverContentAssetUrls — kept for call-site clarity during transition. */
|
|
@@ -85,4 +89,4 @@ declare function buildContentMediaUrlIndex(entries: Iterable<{
|
|
|
85
89
|
sourceId: string;
|
|
86
90
|
}>, originUrlRewrite?: OriginUrlRewriteConfig): Map<string, string>;
|
|
87
91
|
|
|
88
|
-
export { type CanonicalInlineAssetUrl as C, MIGRATION_MEDIA_REF_SCHEME as M, type OriginUrlRewriteConfig as O, type ContentAssetDiscovery as a, type OriginUrlRewriteRule as b, buildContentMediaUrlIndex as c, buildMigrationMediaUrlIndex as d, canonicalizeInlineAssetUrl as e, createMigrationMediaRefReplaceWith as f, createWpContentGatewayRewrite as g, discoverContentAssetUrls as h, discoverContentAssets as i, discoverFeaturedAssetCandidateUrls as j, discoverRawImgSrcs as k, extractInlineImageSrcs as l, formatMigrationMediaRef as m,
|
|
92
|
+
export { type CanonicalInlineAssetUrl as C, MIGRATION_MEDIA_REF_SCHEME as M, type OriginUrlRewriteConfig as O, type ContentAssetDiscovery as a, type OriginUrlRewriteRule as b, buildContentMediaUrlIndex as c, buildMigrationMediaUrlIndex as d, canonicalizeInlineAssetUrl as e, createMigrationMediaRefReplaceWith as f, createWpContentGatewayRewrite as g, discoverContentAssetUrls as h, discoverContentAssets as i, discoverFeaturedAssetCandidateUrls as j, discoverRawImgSrcs as k, extractInlineImageSrcs as l, formatMigrationMediaRef as m, isLikelyContentAssetUrl as n, isLikelyImageUrl as o, isLikelyVideoUrl as p, isMigrationMediaRef as q, normalizeAssetUrl as r, parseMigrationMediaRef as s, resolveFeaturedContentAssetUrl as t, resolveMigrationMediaSourceId as u, rewriteOriginUrlsInText as v };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { O as OriginUrlRewriteConfig } from './media-urls-
|
|
1
|
+
import { O as OriginUrlRewriteConfig } from './media-urls-ScJvYI7b.js';
|
|
2
2
|
|
|
3
3
|
interface RewriteInlineImageRef {
|
|
4
4
|
originalSrc: string;
|
|
@@ -26,7 +26,7 @@ interface RewriteInlineImagesResult {
|
|
|
26
26
|
referencedSources: string[];
|
|
27
27
|
unresolved: string[];
|
|
28
28
|
}
|
|
29
|
-
/** Rewrite `<img src>` / `srcset`, `data-bg-image`, and inline CSS backgrounds
|
|
29
|
+
/** Rewrite `<img src>` / `srcset`, `data-bg-image`, `data-video-url`, `<video>` / `<source src>`, and inline CSS backgrounds. */
|
|
30
30
|
declare function rewriteInlineImages(html: string, options: RewriteInlineImagesOptions, uploadedBySourceId: Map<string, UploadedAssetRef>): RewriteInlineImagesResult;
|
|
31
31
|
interface StampMigrationMediaRefsOptions {
|
|
32
32
|
/** Pre-built url/pathname → sourceId map (from attachments + inline assets). */
|
package/dist/sinks/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { d as NormalizedCategory, e as NormalizedTag, b as NormalizedAsset, c as NormalizedPortfolio, N as NormalizedPost, a as NormalizedPage, l as PortfolioMediaLink, E as EntityKey, f as NormalizedEntity, g as MigrationPlatform, W as WxrImportSummary, M as MigrationAdapter } from '../types-Bicgdp4Z.js';
|
|
2
2
|
import { Readable } from 'node:stream';
|
|
3
|
-
import { a as RewriteInlineImagesOptions } from '../rewrite-inline-images-
|
|
4
|
-
export { b as RewriteInlineImagesResult, r as rewriteInlineImages } from '../rewrite-inline-images-
|
|
3
|
+
import { a as RewriteInlineImagesOptions } from '../rewrite-inline-images-escjz3gT.js';
|
|
4
|
+
export { b as RewriteInlineImagesResult, r as rewriteInlineImages } from '../rewrite-inline-images-escjz3gT.js';
|
|
5
5
|
import { E as EntityBundle } from '../bundle-BgoXkWMy.js';
|
|
6
|
-
import '../media-urls-
|
|
6
|
+
import '../media-urls-ScJvYI7b.js';
|
|
7
7
|
|
|
8
8
|
interface CreatePostResult {
|
|
9
9
|
targetId: string;
|
package/dist/sinks/index.js
CHANGED
|
@@ -20,13 +20,13 @@ import {
|
|
|
20
20
|
staleUrlsFromEstimate,
|
|
21
21
|
summarizeAssetDiscovery,
|
|
22
22
|
writeFilesystemExport
|
|
23
|
-
} from "../chunk-
|
|
23
|
+
} from "../chunk-GVAKKEWX.js";
|
|
24
24
|
import "../chunk-PD5AZX3B.js";
|
|
25
25
|
import {
|
|
26
26
|
rewriteInlineImages
|
|
27
|
-
} from "../chunk-
|
|
27
|
+
} from "../chunk-LQFNO26V.js";
|
|
28
28
|
import "../chunk-XRCF73DA.js";
|
|
29
|
-
import "../chunk-
|
|
29
|
+
import "../chunk-DZI5C6KR.js";
|
|
30
30
|
export {
|
|
31
31
|
FALLBACK_ASSET_BYTES,
|
|
32
32
|
FilesystemMigrationSink,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { n as ValidationResult } from '../types-Bicgdp4Z.js';
|
|
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-
|
|
4
|
-
export { d as buildMigrationMediaUrlIndex } from '../media-urls-
|
|
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-escjz3gT.js';
|
|
4
|
+
export { d as buildMigrationMediaUrlIndex } from '../media-urls-ScJvYI7b.js';
|
|
5
5
|
|
|
6
6
|
type LayoutKind = "section" | "row" | "column";
|
|
7
7
|
/** Map OSS-2 `data-layout` markers to Grapes component types (host may override). */
|
|
@@ -11,15 +11,15 @@ import {
|
|
|
11
11
|
tiptapNodeSchema,
|
|
12
12
|
validateGrapesProjectSnapshot,
|
|
13
13
|
validateTiptapDoc
|
|
14
|
-
} from "../chunk-
|
|
15
|
-
import "../chunk-
|
|
14
|
+
} from "../chunk-BM7HUMZM.js";
|
|
15
|
+
import "../chunk-ZK3LH7PO.js";
|
|
16
16
|
import {
|
|
17
17
|
rewriteInlineImages,
|
|
18
18
|
stampMigrationMediaRefs
|
|
19
|
-
} from "../chunk-
|
|
19
|
+
} from "../chunk-LQFNO26V.js";
|
|
20
20
|
import {
|
|
21
21
|
buildMigrationMediaUrlIndex
|
|
22
|
-
} from "../chunk-
|
|
22
|
+
} from "../chunk-DZI5C6KR.js";
|
|
23
23
|
export {
|
|
24
24
|
buildMigrationMediaUrlIndex,
|
|
25
25
|
cssToStyles,
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/transformers/rewrite-inline-images.ts","../src/parsers/wordpress/builders/registry.ts"],"sourcesContent":["import * as cheerio from \"cheerio\";\n\nimport {\n buildMigrationMediaUrlIndex,\n createMigrationMediaRefReplaceWith,\n isMigrationMediaRef,\n normalizeAssetUrl,\n resolveMigrationMediaSourceId,\n type OriginUrlRewriteConfig,\n} from \"../lib/media-urls.js\";\n\nexport interface RewriteInlineImageRef {\n originalSrc: string;\n sourceAssetId?: string;\n}\n\nexport interface UploadedAssetRef {\n targetId: string;\n publicUrl?: string;\n}\n\nexport interface RewriteInlineImagesOptions {\n resolveAsset: (src: string) => RewriteInlineImageRef | undefined;\n /**\n * Replace a resolved source id with a migration ref or CDN URL.\n * When omitted, defaults to OSS-14 `artinstack-migration://asset/…` refs.\n */\n replaceWith?: (ref: RewriteInlineImageRef, uploaded?: UploadedAssetRef) => string;\n /**\n * When true, skip URLs that cannot be matched to an uploaded vault target.\n * Default: false when using migration refs; true when a custom `replaceWith` is supplied.\n */\n requireUploaded?: boolean;\n}\n\nexport interface RewriteInlineImagesResult {\n html: string;\n referencedSources: string[];\n unresolved: string[];\n}\n\n/** Inline CSS `background` / `background-image: url(…)` (quoted or bare). */\nconst BACKGROUND_IMAGE_URL_PATTERN =\n /background(?:-image)?\\s*:[^;]*?url\\s*\\(\\s*(['\"]?)([^'\")]+)\\1\\s*\\)/gi;\n\nfunction resolveRewriteOptions(\n options: RewriteInlineImagesOptions,\n): Required<Pick<RewriteInlineImagesOptions, \"replaceWith\" | \"requireUploaded\">> {\n const replaceWith = options.replaceWith ?? createMigrationMediaRefReplaceWith();\n const requireUploaded = options.requireUploaded ?? Boolean(options.replaceWith);\n return { replaceWith, requireUploaded };\n}\n\nfunction tryRewriteUrl(\n src: string,\n options: RewriteInlineImagesOptions,\n uploadedBySourceId: Map<string, UploadedAssetRef>,\n referencedSources: Set<string>,\n unresolved: Set<string>,\n): string | undefined {\n const normalized = normalizeAssetUrl(src);\n if (!normalized) return undefined;\n\n if (isMigrationMediaRef(normalized)) {\n referencedSources.add(normalized);\n return normalized;\n }\n\n referencedSources.add(normalized);\n const ref = options.resolveAsset(normalized);\n if (!ref?.sourceAssetId) {\n unresolved.add(normalized);\n return undefined;\n }\n\n const { replaceWith, requireUploaded } = resolveRewriteOptions(options);\n const uploaded = uploadedBySourceId.get(ref.sourceAssetId);\n if (requireUploaded && !uploaded) {\n unresolved.add(normalized);\n return undefined;\n }\n\n return replaceWith(ref, uploaded);\n}\n\nfunction rewriteBackgroundUrlsInStyle(\n style: string,\n options: RewriteInlineImagesOptions,\n uploadedBySourceId: Map<string, UploadedAssetRef>,\n referencedSources: Set<string>,\n unresolved: Set<string>,\n): string {\n return style.replace(BACKGROUND_IMAGE_URL_PATTERN, (full, quote: string, rawUrl: string) => {\n const replaced = tryRewriteUrl(rawUrl.trim(), options, uploadedBySourceId, referencedSources, unresolved);\n if (!replaced) return full;\n\n const urlCall = quote\n ? `url(${quote}${replaced}${quote})`\n : `url(${replaced})`;\n return full.replace(/url\\s*\\(\\s*(['\"]?)([^'\")]+)\\1\\s*\\)/i, urlCall);\n });\n}\n\nfunction rewriteSrcset(\n srcset: string,\n options: RewriteInlineImagesOptions,\n uploadedBySourceId: Map<string, UploadedAssetRef>,\n referencedSources: Set<string>,\n unresolved: Set<string>,\n): string {\n return srcset\n .split(\",\")\n .map((entry) => {\n const trimmed = entry.trim();\n if (!trimmed) return entry;\n const [urlPart, descriptor] = trimmed.split(/\\s+/, 2);\n const replaced = tryRewriteUrl(urlPart ?? \"\", options, uploadedBySourceId, referencedSources, unresolved);\n if (!replaced) return entry;\n return descriptor ? `${replaced} ${descriptor}` : replaced;\n })\n .join(\", \");\n}\n\n/** Rewrite `<img src>` / `srcset`, `data-bg-image`, and inline CSS backgrounds using uploaded asset targets. */\nexport function rewriteInlineImages(\n html: string,\n options: RewriteInlineImagesOptions,\n uploadedBySourceId: Map<string, UploadedAssetRef>,\n): RewriteInlineImagesResult {\n if (!html.trim()) {\n return { html, referencedSources: [], unresolved: [] };\n }\n\n const $ = cheerio.load(html, { xml: false });\n const referencedSources = new Set<string>();\n const unresolved = new Set<string>();\n\n $(\"img\").each((_, element) => {\n const img = $(element);\n const src = img.attr(\"src\")?.trim();\n if (src && !src.startsWith(\"data:\")) {\n const replaced = tryRewriteUrl(src, options, uploadedBySourceId, referencedSources, unresolved);\n if (replaced) img.attr(\"src\", replaced);\n }\n\n const srcset = img.attr(\"srcset\")?.trim();\n if (srcset) {\n img.attr(\"srcset\", rewriteSrcset(srcset, options, uploadedBySourceId, referencedSources, unresolved));\n }\n });\n\n $(\"[data-bg-image]\").each((_, element) => {\n const node = $(element);\n const bgImage = node.attr(\"data-bg-image\")?.trim();\n if (!bgImage || bgImage.startsWith(\"data:\")) return;\n const replaced = tryRewriteUrl(bgImage, options, uploadedBySourceId, referencedSources, unresolved);\n if (replaced) node.attr(\"data-bg-image\", replaced);\n });\n\n $(\"[style]\").each((_, element) => {\n const node = $(element);\n const style = node.attr(\"style\");\n if (!style?.includes(\"background\")) return;\n const rewritten = rewriteBackgroundUrlsInStyle(\n style,\n options,\n uploadedBySourceId,\n referencedSources,\n unresolved,\n );\n if (rewritten !== style) node.attr(\"style\", rewritten);\n });\n\n return {\n html: $.root().html() ?? html,\n referencedSources: [...referencedSources],\n unresolved: [...unresolved],\n };\n}\n\nexport interface StampMigrationMediaRefsOptions {\n /** Pre-built url/pathname → sourceId map (from attachments + inline assets). */\n urlToSourceId: Map<string, string>;\n /** Canonicalize lookup keys during stamp (OSS-15). */\n originUrlRewrite?: OriginUrlRewriteConfig;\n replaceWith?: RewriteInlineImagesOptions[\"replaceWith\"];\n requireUploaded?: boolean;\n}\n\n/**\n * OSS-14 — replace resolved `wp-content/uploads` URLs with `artinstack-migration://asset/…`\n * refs. Does not invent refs for unknown URLs (left unchanged + listed in `unresolved`).\n */\nexport function stampMigrationMediaRefs(\n html: string,\n options: StampMigrationMediaRefsOptions,\n): RewriteInlineImagesResult {\n return rewriteInlineImages(\n html,\n {\n resolveAsset: (src) => {\n const sourceAssetId = resolveMigrationMediaSourceId(\n src,\n options.urlToSourceId,\n options.originUrlRewrite,\n );\n if (!sourceAssetId) return undefined;\n return { originalSrc: src, sourceAssetId };\n },\n replaceWith: options.replaceWith,\n requireUploaded: options.requireUploaded ?? false,\n },\n new Map(),\n );\n}\n\n/** Build a url index from attachment rows and/or normalized assets. */\nexport { buildMigrationMediaUrlIndex };\n","export type BuilderHtmlTag = \"img\" | \"video\" | \"iframe\";\nexport type TextHtmlTag = \"p\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n\n/** Bucket 1 — shortcodes with asset URL params → standard HTML. */\nexport interface BuilderUrlRule {\n shortcodePrefix: string;\n urlParams: string[];\n tag: BuilderHtmlTag;\n}\n\n/** Bucket 1 — shortcodes with text params → semantic HTML. */\nexport interface BuilderTextRule {\n shortcodePrefix: string;\n fields: { param: string; tag: TextHtmlTag }[];\n}\n\n/** Bucket 1 — shortcodes with inner HTML (+ optional image param). */\nexport interface BuilderWrapperRule {\n shortcodePrefix: string;\n urlParams?: string[];\n}\n\n/** Bucket 1 — image-based icon modules (`icon_image` param) → linked `<img>`. */\nexport interface BuilderIconImageRule {\n shortcodePrefix: string;\n imageParam: string;\n hrefParam?: string;\n}\n\n/** Bucket 1 — dynamic embeds replaced with a static migration placeholder. */\nexport interface BuilderPlaceholderRule {\n shortcodePrefix: string;\n html: string;\n}\n\n/** Profile A — prefixed namespace tokens (Tatsu, Divi, WPBakery, …). */\nexport interface PrefixedLayoutMap {\n kind: \"prefixed\";\n sectionRegex: RegExp;\n sectionCloseRegex: RegExp;\n rowRegex: RegExp;\n rowCloseRegex: RegExp;\n columnRegex: RegExp;\n columnCloseRegex: RegExp;\n bgParamName?: string;\n colsParamName?: string;\n}\n\n/** Profile B — legacy Blox fractional column tokens (`one_third`, `one_half`, …). */\nexport interface FractionalLayoutMap {\n kind: \"fractional\";\n sectionRegex: RegExp;\n sectionCloseRegex: RegExp;\n rowRegex: RegExp;\n rowCloseRegex: RegExp;\n columnTokens: string[];\n columnOpenRegexes: RegExp[];\n columnCloseRegexes: RegExp[];\n columnWidths: Record<string, string>;\n bgParamName?: string;\n}\n\n/** Profile C — multiple tokens per layout role (Blox prefixed, WPBakery inner columns, …). */\nexport interface ExtendedPrefixedLayoutLevel {\n role: \"section\" | \"row\" | \"column\";\n tokens: string[];\n bgParamName?: string;\n colsParamName?: string;\n widthParamName?: string;\n}\n\nexport interface ExtendedPrefixedLayoutMap {\n kind: \"extended-prefixed\";\n levels: ExtendedPrefixedLayoutLevel[];\n}\n\nexport type StructuralLayoutMap =\n | PrefixedLayoutMap\n | FractionalLayoutMap\n | ExtendedPrefixedLayoutMap;\n\nfunction layoutEscapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction shortcodeOpenRegex(token: string): RegExp {\n return new RegExp(`\\\\[${layoutEscapeRegExp(token)}\\\\b([^\\\\]]*)\\\\]`, \"gi\");\n}\n\nfunction shortcodeCloseRegex(token: string): RegExp {\n return new RegExp(`\\\\[\\\\/${layoutEscapeRegExp(token)}\\\\b[^\\\\]]*\\\\]`, \"gi\");\n}\n\nconst FRACTIONAL_COLUMN_WIDTHS: Record<string, string> = {\n one_col: \"100%\",\n one_half: \"50%\",\n one_third: \"33.33%\",\n two_third: \"66.67%\",\n two_thirds: \"66.67%\",\n one_fourth: \"25%\",\n three_fourth: \"75%\",\n three_fourths: \"75%\",\n};\n\nexport function parseFractionalColumnWidth(token: string): string | undefined {\n return FRACTIONAL_COLUMN_WIDTHS[token];\n}\n\n/** Profile A — section/row/column share a static namespace prefix. */\nexport function prefixedLayoutMap(config: {\n section: string;\n row: string;\n column: string;\n bgParamName?: string;\n colsParamName?: string;\n}): PrefixedLayoutMap {\n return {\n kind: \"prefixed\",\n sectionRegex: shortcodeOpenRegex(config.section),\n sectionCloseRegex: shortcodeCloseRegex(config.section),\n rowRegex: shortcodeOpenRegex(config.row),\n rowCloseRegex: shortcodeCloseRegex(config.row),\n columnRegex: shortcodeOpenRegex(config.column),\n columnCloseRegex: shortcodeCloseRegex(config.column),\n bgParamName: config.bgParamName,\n colsParamName: config.colsParamName,\n };\n}\n\n/** Profile B — legacy Blox/Oshine mathematical column shortcodes. */\n/** Profile C — map several shortcode names per section/row/column role (longest token first). */\nexport function extendedPrefixedLayoutMap(\n levels: ExtendedPrefixedLayoutLevel[],\n): ExtendedPrefixedLayoutMap {\n return { kind: \"extended-prefixed\", levels };\n}\n\nexport function fractionalLayoutMap(config: {\n section: string;\n row: string;\n columns: string[];\n bgParamName?: string;\n}): FractionalLayoutMap {\n const columnWidths: Record<string, string> = {};\n for (const token of config.columns) {\n const width = parseFractionalColumnWidth(token);\n if (width) columnWidths[token] = width;\n }\n\n return {\n kind: \"fractional\",\n sectionRegex: shortcodeOpenRegex(config.section),\n sectionCloseRegex: shortcodeCloseRegex(config.section),\n rowRegex: shortcodeOpenRegex(config.row),\n rowCloseRegex: shortcodeCloseRegex(config.row),\n columnTokens: config.columns,\n columnOpenRegexes: config.columns.map(shortcodeOpenRegex),\n columnCloseRegexes: config.columns.map(shortcodeCloseRegex),\n columnWidths,\n bgParamName: config.bgParamName,\n };\n}\n\n/** Per builder-family registry entry — declarative map executed by the flatten engine. */\nexport interface BuilderThemeConfig {\n id: string;\n detect: RegExp;\n layoutMap?: StructuralLayoutMap;\n /** Additional layout maps applied after `layoutMap` (e.g. Blox prefixed + legacy fractional). */\n layoutMaps?: StructuralLayoutMap[];\n urlRules?: BuilderUrlRule[];\n textRules?: BuilderTextRule[];\n wrapperRules?: BuilderWrapperRule[];\n iconImageRules?: BuilderIconImageRule[];\n placeholderRules?: BuilderPlaceholderRule[];\n scaffoldingPrefixes?: string[];\n legacyScaffoldingTokens?: string[];\n}\n\n/** @deprecated Alias — families not themes. */\nexport type BuilderFamilyConfig = BuilderThemeConfig;\n\n// ---------------------------------------------------------------------------\n// Widget registry (OSS-12 / OSS-16) — cross-builder; not BuilderThemeConfig\n// ---------------------------------------------------------------------------\n\n/** Keeps empty widget stubs from collapsing during cheerio text sweeps. */\nexport const WP_WIDGET_PLACEHOLDER = \"\\u200B\";\n\nexport interface WordPressContactFormWidgetRule {\n /** Shortcode tag name (e.g. `contact-form-7`). */\n tag: string;\n /** Value for `data-wp-form-source`. */\n source: string;\n /** Attribute holding the form id (e.g. `id`). */\n idParam: string;\n}\n\n/** Declarative widget tables consumed by `flattenWordPressWidgets()` in flatten.ts. */\nexport interface WordPressWidgetRegistry {\n mapShortcodePrefixes: readonly string[];\n contactFormRules: readonly WordPressContactFormWidgetRule[];\n videoShortcodePrefixes: readonly string[];\n /** Core / plugin portfolio dynamic shortcode tag. */\n portfolioShortcode: string;\n /** Builder blog roll modules (Tatsu/Oshine `[blog]`, etc.). */\n blogShortcodeTags: readonly string[];\n /** Testimonials carousel/list wrapper shortcodes (Oshine `[testimonials]`, etc.). */\n testimonialsWrapperTags: readonly string[];\n /** Inner testimonial item shortcode tag. */\n testimonialItemTag: string;\n /** In-body RevSlider / MasterSlider shortcodes → slider widget stub (alias only). */\n sliderShortcodeTags: readonly string[];\n /** WordPress core gallery shortcode tag (`ids=` split handled in engine). */\n galleryShortcode: string;\n /** Builder/plugin gallery shortcodes with explicit `ids=` attachment lists (OSS-12). */\n idGalleryShortcodes: readonly string[];\n}\n\nexport const WORDPRESS_WIDGET_REGISTRY: WordPressWidgetRegistry = {\n mapShortcodePrefixes: [\n \"blox_gmap\",\n \"tatsu_gmap\",\n \"tatsu_map\",\n \"et_pb_map\",\n \"vc_gmaps\",\n \"vc_map\",\n ],\n contactFormRules: [\n { tag: \"contact-form-7\", source: \"contact-form-7\", idParam: \"id\" },\n { tag: \"contact_form\", source: \"contact-form-7\", idParam: \"id\" },\n { tag: \"gravityform\", source: \"gravityforms\", idParam: \"id\" },\n { tag: \"ninja_form\", source: \"ninja-forms\", idParam: \"id\" },\n { tag: \"wpforms\", source: \"wpforms\", idParam: \"id\" },\n ],\n videoShortcodePrefixes: [\n \"youtube\",\n \"vimeo\",\n \"embed\",\n \"tatsu_video\",\n \"et_pb_video\",\n \"vc_video\",\n ],\n portfolioShortcode: \"portfolio\",\n blogShortcodeTags: [\"blog\", \"recent_posts\"],\n testimonialsWrapperTags: [\"testimonials\"],\n testimonialItemTag: \"testimonial\",\n sliderShortcodeTags: [\"rev_slider\", \"masterslider\"],\n galleryShortcode: \"gallery\",\n idGalleryShortcodes: [\"oshine_gallery\", \"vc_gallery\", \"nggallery\"],\n};\n\n/** Shortcodes that cannot become static HTML — reported in conflicts, never stripped. */\nexport const UNRESOLVABLE_SHORTCODE_PREFIXES = [\n \"woocommerce_cart\",\n \"woocommerce_checkout\",\n \"woocommerce_my_account\",\n] as const;\n\nexport const WORDPRESS_BUILDER_REGISTRY: BuilderThemeConfig[] = [\n {\n id: \"tatsu\",\n detect: /\\[(?:\\/)?tatsu_/i,\n layoutMap: prefixedLayoutMap({\n section: \"tatsu_section\",\n row: \"tatsu_row\",\n column: \"tatsu_column\",\n bgParamName: \"bg_image\",\n colsParamName: \"layout\",\n }),\n wrapperRules: [\n { shortcodePrefix: \"tatsu_text\" },\n { shortcodePrefix: \"tatsu_inline_text\" },\n { shortcodePrefix: \"tatsu_text_with_shortcodes\" },\n { shortcodePrefix: \"tatsu_icon_group\" },\n ],\n urlRules: [\n { shortcodePrefix: \"tatsu_image\", urlParams: [\"image\", \"url\", \"src\"], tag: \"img\" },\n { shortcodePrefix: \"tatsu_single_image\", urlParams: [\"image\", \"url\", \"src\"], tag: \"img\" },\n ],\n iconImageRules: [\n { shortcodePrefix: \"tatsu_icon\", imageParam: \"icon_image\", hrefParam: \"href\" },\n ],\n scaffoldingPrefixes: [\"tatsu_\"],\n },\n {\n id: \"divi\",\n detect: /\\[(?:\\/)?et_pb_/i,\n layoutMap: prefixedLayoutMap({\n section: \"et_pb_section\",\n row: \"et_pb_row\",\n column: \"et_pb_column\",\n bgParamName: \"background_image\",\n }),\n urlRules: [{ shortcodePrefix: \"et_pb_image\", urlParams: [\"src\", \"url\"], tag: \"img\" }],\n scaffoldingPrefixes: [\"et_pb_\"],\n },\n {\n id: \"wpbakery\",\n detect: /\\[(?:\\/)?vc_/i,\n layoutMap: extendedPrefixedLayoutMap([\n { role: \"section\", tokens: [\"vc_section\"], bgParamName: \"bg_image\" },\n { role: \"row\", tokens: [\"vc_row\"], colsParamName: \"layout\" },\n { role: \"column\", tokens: [\"vc_column_inner\", \"vc_column\"], widthParamName: \"width\" },\n ]),\n urlRules: [\n { shortcodePrefix: \"vc_single_image\", urlParams: [\"image\", \"src\", \"url\"], tag: \"img\" },\n ],\n scaffoldingPrefixes: [\"vc_\"],\n },\n {\n id: \"fusion\",\n detect: /\\[(?:\\/)?fusion_/i,\n layoutMap: prefixedLayoutMap({\n section: \"fusion_builder_container\",\n row: \"fusion_builder_row\",\n column: \"fusion_builder_column\",\n bgParamName: \"background_image\",\n }),\n scaffoldingPrefixes: [\"fusion_\"],\n },\n {\n id: \"beaver\",\n detect: /\\[(?:\\/)?fl_(?:row|col|builder)/i,\n layoutMap: extendedPrefixedLayoutMap([\n { role: \"row\", tokens: [\"fl_row\"] },\n { role: \"column\", tokens: [\"fl_col\"] },\n ]),\n scaffoldingPrefixes: [\"fl_\"],\n },\n {\n id: \"elementor\",\n detect: /\\[(?:\\/)?elementor[-_]/i,\n urlRules: [\n { shortcodePrefix: \"elementor-widget\", urlParams: [\"url\", \"src\", \"image\"], tag: \"img\" },\n ],\n scaffoldingPrefixes: [\"elementor_\"],\n },\n {\n id: \"oshine\",\n detect:\n /\\[(?:special_sub_title|special_heading5|blox_\\w+|grid_content|grids|testimonial\\b|portfolio\\b|recent_posts\\b|animate_icon\\w*|section\\b|row\\b|one_col|one_third|one_half|one_fourth|two_third|three_fourth|text\\b)/i,\n layoutMap: fractionalLayoutMap({\n section: \"section\",\n row: \"row\",\n columns: [\n \"one_col\",\n \"one_third\",\n \"two_third\",\n \"two_thirds\",\n \"one_half\",\n \"one_fourth\",\n \"three_fourth\",\n \"three_fourths\",\n ],\n bgParamName: \"bg_image\",\n }),\n layoutMaps: [\n extendedPrefixedLayoutMap([\n { role: \"section\", tokens: [\"blox_row\"], bgParamName: \"bg_image\" },\n { role: \"row\", tokens: [\"blox_row_inner\"], colsParamName: \"columns\" },\n {\n role: \"column\",\n tokens: [\"blox_column_inner\", \"blox_column\"],\n widthParamName: \"width\",\n },\n ]),\n ],\n textRules: [\n {\n shortcodePrefix: \"special_sub_title\",\n fields: [{ param: \"title_content\", tag: \"p\" }],\n },\n {\n shortcodePrefix: \"special_heading5\",\n fields: [\n { param: \"title_content\", tag: \"h2\" },\n { param: \"caption_content\", tag: \"h4\" },\n ],\n },\n ],\n wrapperRules: [\n { shortcodePrefix: \"grid_content\" },\n { shortcodePrefix: \"blox_text\" },\n ],\n urlRules: [\n { shortcodePrefix: \"blox_image\", urlParams: [\"image\", \"img\", \"src\", \"url\"], tag: \"img\" },\n ],\n scaffoldingPrefixes: [\"blox_\", \"animate_icon\"],\n legacyScaffoldingTokens: [\"text\", \"icon\", \"linebreak\", \"grids\", \"testimonials\"],\n },\n];\n\n/** @deprecated Use urlRules on BuilderThemeConfig — kept for type migration clarity. */\nexport type BuilderContentRule = BuilderUrlRule;\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/media-urls.ts"],"sourcesContent":["import * as cheerio from \"cheerio\";\n\n// --- Origin URL rewrite (gateway → public origin before parse/discovery) ---\n\nexport interface OriginUrlRewriteRule {\n /** Literal substring or regex matched against the full text block. */\n match: string | RegExp;\n replace: string;\n}\n\nexport interface OriginUrlRewriteConfig {\n rules: OriginUrlRewriteRule[];\n}\n\n/** Swap legacy gateway/staging host fragments before parse, fetch, or asset discovery. */\nexport function rewriteOriginUrlsInText(text: string, config: OriginUrlRewriteConfig): string {\n if (!text || config.rules.length === 0) return text;\n\n let result = text;\n for (const rule of config.rules) {\n if (typeof rule.match === \"string\") {\n if (!rule.match) continue;\n result = result.split(rule.match).join(rule.replace);\n continue;\n }\n result = result.replace(rule.match, rule.replace);\n }\n return result;\n}\n\n/** Build a rule that rewrites API-gateway `/prod/wp-content/` paths to a public origin. */\nexport function createWpContentGatewayRewrite(gatewayBase: string, publicOrigin: string): OriginUrlRewriteConfig {\n const normalizedGateway = gatewayBase.replace(/\\/$/, \"\");\n const normalizedPublic = publicOrigin.replace(/\\/$/, \"\");\n return {\n rules: [\n {\n match: `${normalizedGateway}/wp-content/`,\n replace: `${normalizedPublic}/wp-content/`,\n },\n ],\n };\n}\n\n// --- Content asset URL discovery & normalization ---\n\nconst IMAGE_EXTENSIONS = \"jpe?g|png|gif|webp|avif|svg\";\n/** Image file extension in a path or URL (allows trailing `?query` / `#hash`). */\nconst IMAGE_EXTENSION_PATTERN = new RegExp(String.raw`\\.(?:${IMAGE_EXTENSIONS})\\b`, \"i\");\n\n/** Captured value must contain an image extension — skips `url=\"…/about\"`, `<iframe src=\"…youtube…\">`, etc. */\nconst QUOTED_IMAGE_PATH = String.raw`[^\"']+\\.(?:${IMAGE_EXTENSIONS})(?:\\?[^\"'#]*)?(?:#.*)?`;\n\nconst SHORTCODE_IMAGE_PARAM_PATTERN = new RegExp(\n String.raw`\\b(?:image|bg_image|background_image|url)\\s*=\\s*[\"'](${QUOTED_IMAGE_PATH})[\"']`,\n \"gi\",\n);\n\n/** Bare `src=\"…jpg\"` outside `<img>` (shortcode fragments); `<img src>` handled by cheerio. */\nconst BARE_SRC_PARAM_PATTERN = new RegExp(\n String.raw`\\bsrc\\s*=\\s*[\"'](${QUOTED_IMAGE_PATH})[\"']`,\n \"gi\",\n);\n\nconst DATA_BG_IMAGE_PATTERN = /\\bdata-bg-image\\s*=\\s*[\"']([^\"']+)[\"']/gi;\n\n/** Inline CSS `background` / `background-image: url(…)` (quoted or bare). */\nconst BACKGROUND_IMAGE_URL_PATTERN =\n /background(?:-image)?\\s*:[^;]*?url\\s*\\(\\s*(['\"]?)([^'\")]+)\\1\\s*\\)/gi;\n\nconst HERO_URL_PARAM_PATTERN = new RegExp(\n String.raw`\\b(?:bg_image|background_image)\\s*=\\s*[\"'](${QUOTED_IMAGE_PATH})[\"']`,\n \"gi\",\n);\n\nconst INLINE_IMAGE_PARAM_PATTERN = new RegExp(\n String.raw`\\bimage\\s*=\\s*[\"'](${QUOTED_IMAGE_PATH})[\"']`,\n \"gi\",\n);\n\nconst IMG_TAG_SRC_PATTERN = /<img\\b[^>]*\\bsrc\\s*=\\s*[\"']([^\"']+)[\"']/gi;\n\nconst DATA_WP_ATTACHMENT_ID_PATTERN = /\\bdata-wp-attachment-id\\s*=\\s*[\"'](\\d+)[\"']/gi;\n\n/** Builder / core gallery shortcodes with explicit `ids=` lists (pre- or post-flatten). */\nconst SHORTCODE_GALLERY_IDS_PATTERN =\n /\\[(?:gallery|oshine_gallery|vc_gallery|nggallery)\\b[^\\]]*\\bids\\s*=\\s*[\"']([^\"']+)[\"']/gi;\n\nexport interface ContentAssetDiscovery {\n /** Network-resolvable image paths (`<img>`, backgrounds, shortcode `image=` attrs, …). */\n urls: string[];\n /**\n * WordPress attachment post ids referenced in content without an inline URL in this\n * file context (`data-wp-attachment-id`, `[gallery ids=…]`, `[oshine_gallery ids=…]`, …).\n */\n unresolvedAttachmentIds: string[];\n}\n\ninterface FeaturedAssetCandidate {\n url: string;\n index: number;\n tier: 0 | 1;\n}\n\nfunction ingestLikelyImageUrl(urls: Set<string>, raw: string | undefined): void {\n const normalized = normalizeAssetUrl(raw ?? \"\");\n if (normalized && isLikelyImageUrl(normalized)) {\n urls.add(normalized);\n }\n}\n\nfunction extractImgTagSrcs(content: string): string[] {\n if (!content.trim()) return [];\n const $ = cheerio.load(content, { xml: false });\n const srcs: string[] = [];\n $(\"img[src]\").each((_, el) => {\n const src = $(el).attr(\"src\")?.trim();\n if (src) srcs.push(src);\n });\n return srcs;\n}\n\nfunction hasImageExtension(value: string): boolean {\n const withoutHash = value.split(\"#\", 1)[0] ?? value;\n const withoutQuery = withoutHash.split(\"?\", 1)[0] ?? withoutHash;\n return IMAGE_EXTENSION_PATTERN.test(withoutQuery);\n}\n\nfunction extractDataBgImageUrls(content: string): string[] {\n const urls: string[] = [];\n for (const match of content.matchAll(DATA_BG_IMAGE_PATTERN)) {\n const raw = match[1]?.trim();\n if (raw) urls.push(raw);\n }\n return urls;\n}\n\nfunction extractCssBackgroundImageUrls(content: string): string[] {\n const urls: string[] = [];\n for (const match of content.matchAll(BACKGROUND_IMAGE_URL_PATTERN)) {\n const raw = match[2]?.trim();\n if (raw) urls.push(raw);\n }\n return urls;\n}\n\n/** All `<img src>` values (including those not ingested as vault assets). */\nexport function discoverRawImgSrcs(content: string): string[] {\n return extractImgTagSrcs(content).filter((src) => !src.startsWith(\"data:\"));\n}\n\n/** Normalize protocol-relative and trim; skip data URIs. */\nexport function normalizeAssetUrl(raw: string): string | undefined {\n const trimmed = raw.trim();\n if (!trimmed || trimmed.startsWith(\"data:\")) return undefined;\n if (trimmed.startsWith(\"//\")) return `https:${trimmed}`;\n return trimmed;\n}\n\n/** Heuristic: URL likely points at a raster/vector image asset, not a page link. */\nexport function isLikelyImageUrl(url: string): boolean {\n if (!url || url.startsWith(\"data:\")) return false;\n\n if (url.startsWith(\"/\")) {\n return hasImageExtension(url);\n }\n\n if (!/^https?:\\/\\//i.test(url)) return false;\n\n try {\n const { pathname } = new URL(url);\n if (hasImageExtension(pathname)) return true;\n } catch {\n // fall through — malformed absolute URL\n }\n\n return hasImageExtension(url);\n}\n\nfunction pushFeaturedCandidate(\n candidates: FeaturedAssetCandidate[],\n raw: string | undefined,\n index: number,\n tier: 0 | 1,\n): void {\n const normalized = normalizeAssetUrl(raw ?? \"\");\n if (!normalized || !isLikelyImageUrl(normalized)) return;\n candidates.push({ url: normalized, index, tier });\n}\n\nfunction collectFeaturedAssetCandidates(content: string): FeaturedAssetCandidate[] {\n const candidates: FeaturedAssetCandidate[] = [];\n\n for (const match of content.matchAll(DATA_BG_IMAGE_PATTERN)) {\n pushFeaturedCandidate(candidates, match[1], match.index ?? 0, 0);\n }\n for (const match of content.matchAll(BACKGROUND_IMAGE_URL_PATTERN)) {\n pushFeaturedCandidate(candidates, match[2], match.index ?? 0, 0);\n }\n for (const match of content.matchAll(HERO_URL_PARAM_PATTERN)) {\n pushFeaturedCandidate(candidates, match[1], match.index ?? 0, 0);\n }\n for (const match of content.matchAll(IMG_TAG_SRC_PATTERN)) {\n pushFeaturedCandidate(candidates, match[1], match.index ?? 0, 1);\n }\n for (const match of content.matchAll(INLINE_IMAGE_PARAM_PATTERN)) {\n pushFeaturedCandidate(candidates, match[1], match.index ?? 0, 1);\n }\n\n return candidates;\n}\n\n/**\n * Ordered featured-image candidates when `_thumbnail_id` is missing — heroes\n * (`data-bg-image`, CSS backgrounds, `bg_image=`) before inline assets; within\n * each tier, first in document order wins. Filename tokens (`_w`, `_2048`, …)\n * are not interpreted as quality signals.\n */\nexport function discoverFeaturedAssetCandidateUrls(content: string): string[] {\n if (!content.trim()) return [];\n\n const ranked = [...collectFeaturedAssetCandidates(content)].sort((left, right) => {\n if (left.tier !== right.tier) return left.tier - right.tier;\n return left.index - right.index;\n });\n\n const urls: string[] = [];\n const seen = new Set<string>();\n for (const candidate of ranked) {\n if (seen.has(candidate.url)) continue;\n seen.add(candidate.url);\n urls.push(candidate.url);\n }\n return urls;\n}\n\n/** Best featured-image URL from post/page HTML when attachment id is unavailable. */\nexport function resolveFeaturedContentAssetUrl(content: string): string | undefined {\n return discoverFeaturedAssetCandidateUrls(content)[0];\n}\n\nfunction parseAttachmentIdList(raw: string | undefined): string[] {\n if (!raw?.trim()) return [];\n return raw\n .split(\",\")\n .map((part) => part.trim())\n .filter((part) => /^\\d+$/.test(part));\n}\n\nfunction extractAttachmentIdsFromContent(content: string): string[] {\n const ids = new Set<string>();\n\n for (const match of content.matchAll(DATA_WP_ATTACHMENT_ID_PATTERN)) {\n const id = match[1]?.trim();\n if (id) ids.add(id);\n }\n\n for (const match of content.matchAll(SHORTCODE_GALLERY_IDS_PATTERN)) {\n for (const id of parseAttachmentIdList(match[1])) {\n ids.add(id);\n }\n }\n\n return [...ids];\n}\n\n/**\n * Generic content-discovery pass: collect resolvable image URLs and attachment ids\n * that still need an index / REST / crawl resolution step.\n */\nexport function discoverContentAssets(content: string): ContentAssetDiscovery {\n if (!content.trim()) {\n return { urls: [], unresolvedAttachmentIds: [] };\n }\n\n const urls = new Set<string>();\n\n for (const raw of extractImgTagSrcs(content)) {\n if (isMigrationMediaRef(raw)) {\n const sourceId = parseMigrationMediaRef(raw);\n if (sourceId?.startsWith(\"url:\")) {\n ingestLikelyImageUrl(urls, sourceId.slice(\"url:\".length));\n }\n continue;\n }\n ingestLikelyImageUrl(urls, raw);\n }\n\n for (const match of content.matchAll(SHORTCODE_IMAGE_PARAM_PATTERN)) {\n ingestLikelyImageUrl(urls, match[1]);\n }\n\n for (const match of content.matchAll(BARE_SRC_PARAM_PATTERN)) {\n ingestLikelyImageUrl(urls, match[1]);\n }\n\n for (const raw of extractDataBgImageUrls(content)) {\n ingestLikelyImageUrl(urls, raw);\n }\n\n for (const raw of extractCssBackgroundImageUrls(content)) {\n ingestLikelyImageUrl(urls, raw);\n }\n\n return {\n urls: [...urls],\n unresolvedAttachmentIds: extractAttachmentIdsFromContent(content),\n };\n}\n\n/**\n * Generic content-discovery pass: collect image URLs from HTML `<img>` tags,\n * section hero markers (`data-bg-image`), inline CSS backgrounds, and common\n * shortcode/builder attributes (`src=`, `image=`, `bg_image=`, …) without\n * parsing builder-specific structure (Tatsu, Elementor, etc.).\n */\nexport function discoverContentAssetUrls(content: string): string[] {\n return discoverContentAssets(content).urls;\n}\n\n/** @deprecated Use discoverContentAssetUrls — kept for call-site clarity during transition. */\nexport function extractInlineImageSrcs(content: string): string[] {\n return discoverContentAssetUrls(content);\n}\n\n// --- Migration media refs (`artinstack-migration://asset/{sourceId}`) ---\n\n/** Pseudo-URL scheme for portable migration asset pointers (not WordPress shortcodes). */\nexport const MIGRATION_MEDIA_REF_SCHEME = \"artinstack-migration://asset/\";\n\n/** Build `artinstack-migration://asset/{sourceId}` (percent-encodes the normalizer source id). */\nexport function formatMigrationMediaRef(sourceAssetId: string): string {\n return `${MIGRATION_MEDIA_REF_SCHEME}${encodeURIComponent(sourceAssetId)}`;\n}\n\nexport function isMigrationMediaRef(value: string): boolean {\n return value.trim().startsWith(MIGRATION_MEDIA_REF_SCHEME);\n}\n\n/** Parse a migration media ref back to the normalizer `sourceId`, or `undefined` if not a ref. */\nexport function parseMigrationMediaRef(value: string): string | undefined {\n const trimmed = value.trim();\n if (!trimmed.startsWith(MIGRATION_MEDIA_REF_SCHEME)) return undefined;\n const encoded = trimmed.slice(MIGRATION_MEDIA_REF_SCHEME.length);\n if (!encoded) return undefined;\n try {\n return decodeURIComponent(encoded);\n } catch {\n return undefined;\n }\n}\n\n/** Default `replaceWith` for `rewriteInlineImages` / `stampMigrationMediaRefs` (OSS-14). */\nexport function createMigrationMediaRefReplaceWith(): (\n ref: { sourceAssetId?: string },\n) => string {\n return (ref) => {\n if (!ref.sourceAssetId) return \"\";\n return formatMigrationMediaRef(ref.sourceAssetId);\n };\n}\n\n// --- Canonical inline keys & lookup index (OSS-15) ---\n\nexport interface CanonicalInlineAssetUrl {\n /** Canonical absolute URL stored on `NormalizedAsset.sourceUrl`. */\n canonicalUrl: string;\n /** Normalizer id: `url:{canonicalUrl}`. */\n sourceId: string;\n}\n\n/**\n * OSS-15: one canonical key for inline `url:` assets — apply origin rewrite then\n * `normalizeAssetUrl` so discovery, refs, and vault entities share the same id.\n */\nexport function canonicalizeInlineAssetUrl(\n raw: string,\n originUrlRewrite?: OriginUrlRewriteConfig,\n): CanonicalInlineAssetUrl | undefined {\n let value = raw.trim();\n if (!value || value.startsWith(\"data:\")) return undefined;\n\n if (originUrlRewrite) {\n value = rewriteOriginUrlsInText(value, originUrlRewrite);\n }\n\n const canonicalUrl = normalizeAssetUrl(value);\n if (!canonicalUrl) return undefined;\n\n return {\n canonicalUrl,\n sourceId: `url:${canonicalUrl}`,\n };\n}\n\nfunction urlPathname(url: string): string | undefined {\n try {\n return new URL(url, \"http://migration.local\").pathname;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Map normalized upload URLs (and pathnames) → normalizer `sourceId`.\n * Attachment ids are WXR `post_id` strings; inline discoveries use `url:{src}`.\n */\nexport function buildMigrationMediaUrlIndex(\n entries: Iterable<{ sourceUrl: string; sourceId: string }>,\n): Map<string, string> {\n const index = new Map<string, string>();\n\n for (const entry of entries) {\n index.set(entry.sourceUrl, entry.sourceId);\n const normalized = normalizeAssetUrl(entry.sourceUrl);\n if (normalized) index.set(normalized, entry.sourceId);\n const pathname = urlPathname(entry.sourceUrl);\n if (pathname) index.set(pathname, entry.sourceId);\n }\n\n return index;\n}\n\nexport function resolveMigrationMediaSourceId(\n src: string,\n urlIndex: Map<string, string>,\n originUrlRewrite?: OriginUrlRewriteConfig,\n): string | undefined {\n const canonical = canonicalizeInlineAssetUrl(src, originUrlRewrite);\n const normalized = canonical?.canonicalUrl ?? normalizeAssetUrl(src);\n if (!normalized) return undefined;\n\n return (\n urlIndex.get(normalized) ??\n urlIndex.get(src) ??\n (urlPathname(normalized) ? urlIndex.get(urlPathname(normalized)!) : undefined)\n );\n}\n\n/** Merge attachment + inline asset rows into one stamp/lookup index (OSS-15). */\nexport function buildContentMediaUrlIndex(\n entries: Iterable<{ sourceUrl: string; sourceId: string }>,\n originUrlRewrite?: OriginUrlRewriteConfig,\n): Map<string, string> {\n const canonicalEntries: { sourceUrl: string; sourceId: string }[] = [];\n for (const entry of entries) {\n const canonical = canonicalizeInlineAssetUrl(entry.sourceUrl, originUrlRewrite);\n canonicalEntries.push({\n sourceUrl: canonical?.canonicalUrl ?? entry.sourceUrl,\n sourceId: entry.sourceId,\n });\n }\n return buildMigrationMediaUrlIndex(canonicalEntries);\n}\n"],"mappings":"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","names":[]}
|