@artinstack/migrator 0.1.5 → 0.1.6
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-EXYXTAZM.js +91 -0
- package/dist/chunk-EXYXTAZM.js.map +1 -0
- package/dist/{chunk-YLFVYPB3.js → chunk-IPYHS5R2.js} +59 -4
- package/dist/chunk-IPYHS5R2.js.map +1 -0
- package/dist/{chunk-XUBCG3IA.js → chunk-XQVKA54A.js} +64 -8
- package/dist/chunk-XQVKA54A.js.map +1 -0
- package/dist/chunk-XYP3VYDH.js +159 -0
- package/dist/chunk-XYP3VYDH.js.map +1 -0
- package/dist/cli/index.js +4 -4
- package/dist/index.d.ts +2 -2
- package/dist/index.js +9 -5
- package/dist/lib/index.d.ts +14 -4
- package/dist/lib/index.js +7 -3
- package/dist/{rewrite-inline-images-BckVKPbh.d.ts → rewrite-inline-images-DPoxyzVC.d.ts} +1 -1
- package/dist/sinks/index.d.ts +2 -2
- package/dist/sinks/index.js +3 -3
- package/dist/transformers/index.d.ts +1 -1
- package/dist/transformers/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-2PNSVE5Y.js +0 -67
- package/dist/chunk-2PNSVE5Y.js.map +0 -1
- package/dist/chunk-S7TRWILI.js +0 -71
- package/dist/chunk-S7TRWILI.js.map +0 -1
- package/dist/chunk-XUBCG3IA.js.map +0 -1
- package/dist/chunk-YLFVYPB3.js.map +0 -1
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// src/lib/content-asset-urls.ts
|
|
2
|
+
import * as cheerio from "cheerio";
|
|
3
|
+
var IMAGE_EXTENSIONS = "jpe?g|png|gif|webp|avif|svg";
|
|
4
|
+
var IMAGE_EXTENSION_PATTERN = new RegExp(String.raw`\.(?:${IMAGE_EXTENSIONS})\b`, "i");
|
|
5
|
+
var QUOTED_IMAGE_PATH = String.raw`[^"']+\.(?:${IMAGE_EXTENSIONS})(?:\?[^"'#]*)?(?:#.*)?`;
|
|
6
|
+
var SHORTCODE_IMAGE_PARAM_PATTERN = new RegExp(
|
|
7
|
+
String.raw`\b(?:image|bg_image|background_image|url)\s*=\s*["'](${QUOTED_IMAGE_PATH})["']`,
|
|
8
|
+
"gi"
|
|
9
|
+
);
|
|
10
|
+
var BARE_SRC_PARAM_PATTERN = new RegExp(
|
|
11
|
+
String.raw`\bsrc\s*=\s*["'](${QUOTED_IMAGE_PATH})["']`,
|
|
12
|
+
"gi"
|
|
13
|
+
);
|
|
14
|
+
var DATA_BG_IMAGE_PATTERN = /\bdata-bg-image\s*=\s*["']([^"']+)["']/gi;
|
|
15
|
+
var BACKGROUND_IMAGE_URL_PATTERN = /background(?:-image)?\s*:[^;]*?url\s*\(\s*(['"]?)([^'")]+)\1\s*\)/gi;
|
|
16
|
+
var HERO_URL_PARAM_PATTERN = new RegExp(
|
|
17
|
+
String.raw`\b(?:bg_image|background_image)\s*=\s*["'](${QUOTED_IMAGE_PATH})["']`,
|
|
18
|
+
"gi"
|
|
19
|
+
);
|
|
20
|
+
var INLINE_IMAGE_PARAM_PATTERN = new RegExp(
|
|
21
|
+
String.raw`\bimage\s*=\s*["'](${QUOTED_IMAGE_PATH})["']`,
|
|
22
|
+
"gi"
|
|
23
|
+
);
|
|
24
|
+
var IMG_TAG_SRC_PATTERN = /<img\b[^>]*\bsrc\s*=\s*["']([^"']+)["']/gi;
|
|
25
|
+
function ingestLikelyImageUrl(urls, raw) {
|
|
26
|
+
const normalized = normalizeAssetUrl(raw ?? "");
|
|
27
|
+
if (normalized && isLikelyImageUrl(normalized)) {
|
|
28
|
+
urls.add(normalized);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function extractImgTagSrcs(content) {
|
|
32
|
+
if (!content.trim()) return [];
|
|
33
|
+
const $ = cheerio.load(content, { xml: false });
|
|
34
|
+
const srcs = [];
|
|
35
|
+
$("img[src]").each((_, el) => {
|
|
36
|
+
const src = $(el).attr("src")?.trim();
|
|
37
|
+
if (src) srcs.push(src);
|
|
38
|
+
});
|
|
39
|
+
return srcs;
|
|
40
|
+
}
|
|
41
|
+
function hasImageExtension(value) {
|
|
42
|
+
const withoutHash = value.split("#", 1)[0] ?? value;
|
|
43
|
+
const withoutQuery = withoutHash.split("?", 1)[0] ?? withoutHash;
|
|
44
|
+
return IMAGE_EXTENSION_PATTERN.test(withoutQuery);
|
|
45
|
+
}
|
|
46
|
+
function extractDataBgImageUrls(content) {
|
|
47
|
+
const urls = [];
|
|
48
|
+
for (const match of content.matchAll(DATA_BG_IMAGE_PATTERN)) {
|
|
49
|
+
const raw = match[1]?.trim();
|
|
50
|
+
if (raw) urls.push(raw);
|
|
51
|
+
}
|
|
52
|
+
return urls;
|
|
53
|
+
}
|
|
54
|
+
function extractCssBackgroundImageUrls(content) {
|
|
55
|
+
const urls = [];
|
|
56
|
+
for (const match of content.matchAll(BACKGROUND_IMAGE_URL_PATTERN)) {
|
|
57
|
+
const raw = match[2]?.trim();
|
|
58
|
+
if (raw) urls.push(raw);
|
|
59
|
+
}
|
|
60
|
+
return urls;
|
|
61
|
+
}
|
|
62
|
+
function discoverRawImgSrcs(content) {
|
|
63
|
+
return extractImgTagSrcs(content).filter((src) => !src.startsWith("data:"));
|
|
64
|
+
}
|
|
65
|
+
function normalizeAssetUrl(raw) {
|
|
66
|
+
const trimmed = raw.trim();
|
|
67
|
+
if (!trimmed || trimmed.startsWith("data:")) return void 0;
|
|
68
|
+
if (trimmed.startsWith("//")) return `https:${trimmed}`;
|
|
69
|
+
return trimmed;
|
|
70
|
+
}
|
|
71
|
+
function isLikelyImageUrl(url) {
|
|
72
|
+
if (!url || url.startsWith("data:")) return false;
|
|
73
|
+
if (url.startsWith("/")) {
|
|
74
|
+
return hasImageExtension(url);
|
|
75
|
+
}
|
|
76
|
+
if (!/^https?:\/\//i.test(url)) return false;
|
|
77
|
+
try {
|
|
78
|
+
const { pathname } = new URL(url);
|
|
79
|
+
if (hasImageExtension(pathname)) return true;
|
|
80
|
+
} catch {
|
|
81
|
+
}
|
|
82
|
+
return hasImageExtension(url);
|
|
83
|
+
}
|
|
84
|
+
function pushFeaturedCandidate(candidates, raw, index, tier) {
|
|
85
|
+
const normalized = normalizeAssetUrl(raw ?? "");
|
|
86
|
+
if (!normalized || !isLikelyImageUrl(normalized)) return;
|
|
87
|
+
candidates.push({ url: normalized, index, tier });
|
|
88
|
+
}
|
|
89
|
+
function collectFeaturedAssetCandidates(content) {
|
|
90
|
+
const candidates = [];
|
|
91
|
+
for (const match of content.matchAll(DATA_BG_IMAGE_PATTERN)) {
|
|
92
|
+
pushFeaturedCandidate(candidates, match[1], match.index ?? 0, 0);
|
|
93
|
+
}
|
|
94
|
+
for (const match of content.matchAll(BACKGROUND_IMAGE_URL_PATTERN)) {
|
|
95
|
+
pushFeaturedCandidate(candidates, match[2], match.index ?? 0, 0);
|
|
96
|
+
}
|
|
97
|
+
for (const match of content.matchAll(HERO_URL_PARAM_PATTERN)) {
|
|
98
|
+
pushFeaturedCandidate(candidates, match[1], match.index ?? 0, 0);
|
|
99
|
+
}
|
|
100
|
+
for (const match of content.matchAll(IMG_TAG_SRC_PATTERN)) {
|
|
101
|
+
pushFeaturedCandidate(candidates, match[1], match.index ?? 0, 1);
|
|
102
|
+
}
|
|
103
|
+
for (const match of content.matchAll(INLINE_IMAGE_PARAM_PATTERN)) {
|
|
104
|
+
pushFeaturedCandidate(candidates, match[1], match.index ?? 0, 1);
|
|
105
|
+
}
|
|
106
|
+
return candidates;
|
|
107
|
+
}
|
|
108
|
+
function discoverFeaturedAssetCandidateUrls(content) {
|
|
109
|
+
if (!content.trim()) return [];
|
|
110
|
+
const ranked = [...collectFeaturedAssetCandidates(content)].sort((left, right) => {
|
|
111
|
+
if (left.tier !== right.tier) return left.tier - right.tier;
|
|
112
|
+
return left.index - right.index;
|
|
113
|
+
});
|
|
114
|
+
const urls = [];
|
|
115
|
+
const seen = /* @__PURE__ */ new Set();
|
|
116
|
+
for (const candidate of ranked) {
|
|
117
|
+
if (seen.has(candidate.url)) continue;
|
|
118
|
+
seen.add(candidate.url);
|
|
119
|
+
urls.push(candidate.url);
|
|
120
|
+
}
|
|
121
|
+
return urls;
|
|
122
|
+
}
|
|
123
|
+
function resolveFeaturedContentAssetUrl(content) {
|
|
124
|
+
return discoverFeaturedAssetCandidateUrls(content)[0];
|
|
125
|
+
}
|
|
126
|
+
function discoverContentAssetUrls(content) {
|
|
127
|
+
if (!content.trim()) return [];
|
|
128
|
+
const urls = /* @__PURE__ */ new Set();
|
|
129
|
+
for (const raw of extractImgTagSrcs(content)) {
|
|
130
|
+
ingestLikelyImageUrl(urls, raw);
|
|
131
|
+
}
|
|
132
|
+
for (const match of content.matchAll(SHORTCODE_IMAGE_PARAM_PATTERN)) {
|
|
133
|
+
ingestLikelyImageUrl(urls, match[1]);
|
|
134
|
+
}
|
|
135
|
+
for (const match of content.matchAll(BARE_SRC_PARAM_PATTERN)) {
|
|
136
|
+
ingestLikelyImageUrl(urls, match[1]);
|
|
137
|
+
}
|
|
138
|
+
for (const raw of extractDataBgImageUrls(content)) {
|
|
139
|
+
ingestLikelyImageUrl(urls, raw);
|
|
140
|
+
}
|
|
141
|
+
for (const raw of extractCssBackgroundImageUrls(content)) {
|
|
142
|
+
ingestLikelyImageUrl(urls, raw);
|
|
143
|
+
}
|
|
144
|
+
return [...urls];
|
|
145
|
+
}
|
|
146
|
+
function extractInlineImageSrcs(content) {
|
|
147
|
+
return discoverContentAssetUrls(content);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export {
|
|
151
|
+
discoverRawImgSrcs,
|
|
152
|
+
normalizeAssetUrl,
|
|
153
|
+
isLikelyImageUrl,
|
|
154
|
+
discoverFeaturedAssetCandidateUrls,
|
|
155
|
+
resolveFeaturedContentAssetUrl,
|
|
156
|
+
discoverContentAssetUrls,
|
|
157
|
+
extractInlineImageSrcs
|
|
158
|
+
};
|
|
159
|
+
//# sourceMappingURL=chunk-XYP3VYDH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/content-asset-urls.ts"],"sourcesContent":["import * as cheerio from \"cheerio\";\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\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\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 if (!content.trim()) return [];\n\n const urls = new Set<string>();\n\n for (const raw of extractImgTagSrcs(content)) {\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 [...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"],"mappings":";AAAA,YAAY,aAAa;AAEzB,IAAM,mBAAmB;AAEzB,IAAM,0BAA0B,IAAI,OAAO,OAAO,WAAW,gBAAgB,OAAO,GAAG;AAGvF,IAAM,oBAAoB,OAAO,iBAAiB,gBAAgB;AAElE,IAAM,gCAAgC,IAAI;AAAA,EACxC,OAAO,2DAA2D,iBAAiB;AAAA,EACnF;AACF;AAGA,IAAM,yBAAyB,IAAI;AAAA,EACjC,OAAO,uBAAuB,iBAAiB;AAAA,EAC/C;AACF;AAEA,IAAM,wBAAwB;AAG9B,IAAM,+BACJ;AAEF,IAAM,yBAAyB,IAAI;AAAA,EACjC,OAAO,iDAAiD,iBAAiB;AAAA,EACzE;AACF;AAEA,IAAM,6BAA6B,IAAI;AAAA,EACrC,OAAO,yBAAyB,iBAAiB;AAAA,EACjD;AACF;AAEA,IAAM,sBAAsB;AAQ5B,SAAS,qBAAqB,MAAmB,KAA+B;AAC9E,QAAM,aAAa,kBAAkB,OAAO,EAAE;AAC9C,MAAI,cAAc,iBAAiB,UAAU,GAAG;AAC9C,SAAK,IAAI,UAAU;AAAA,EACrB;AACF;AAEA,SAAS,kBAAkB,SAA2B;AACpD,MAAI,CAAC,QAAQ,KAAK,EAAG,QAAO,CAAC;AAC7B,QAAM,IAAY,aAAK,SAAS,EAAE,KAAK,MAAM,CAAC;AAC9C,QAAM,OAAiB,CAAC;AACxB,IAAE,UAAU,EAAE,KAAK,CAAC,GAAG,OAAO;AAC5B,UAAM,MAAM,EAAE,EAAE,EAAE,KAAK,KAAK,GAAG,KAAK;AACpC,QAAI,IAAK,MAAK,KAAK,GAAG;AAAA,EACxB,CAAC;AACD,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAwB;AACjD,QAAM,cAAc,MAAM,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK;AAC9C,QAAM,eAAe,YAAY,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK;AACrD,SAAO,wBAAwB,KAAK,YAAY;AAClD;AAEA,SAAS,uBAAuB,SAA2B;AACzD,QAAM,OAAiB,CAAC;AACxB,aAAW,SAAS,QAAQ,SAAS,qBAAqB,GAAG;AAC3D,UAAM,MAAM,MAAM,CAAC,GAAG,KAAK;AAC3B,QAAI,IAAK,MAAK,KAAK,GAAG;AAAA,EACxB;AACA,SAAO;AACT;AAEA,SAAS,8BAA8B,SAA2B;AAChE,QAAM,OAAiB,CAAC;AACxB,aAAW,SAAS,QAAQ,SAAS,4BAA4B,GAAG;AAClE,UAAM,MAAM,MAAM,CAAC,GAAG,KAAK;AAC3B,QAAI,IAAK,MAAK,KAAK,GAAG;AAAA,EACxB;AACA,SAAO;AACT;AAGO,SAAS,mBAAmB,SAA2B;AAC5D,SAAO,kBAAkB,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,WAAW,OAAO,CAAC;AAC5E;AAGO,SAAS,kBAAkB,KAAiC;AACjE,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,CAAC,WAAW,QAAQ,WAAW,OAAO,EAAG,QAAO;AACpD,MAAI,QAAQ,WAAW,IAAI,EAAG,QAAO,SAAS,OAAO;AACrD,SAAO;AACT;AAGO,SAAS,iBAAiB,KAAsB;AACrD,MAAI,CAAC,OAAO,IAAI,WAAW,OAAO,EAAG,QAAO;AAE5C,MAAI,IAAI,WAAW,GAAG,GAAG;AACvB,WAAO,kBAAkB,GAAG;AAAA,EAC9B;AAEA,MAAI,CAAC,gBAAgB,KAAK,GAAG,EAAG,QAAO;AAEvC,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,IAAI,IAAI,GAAG;AAChC,QAAI,kBAAkB,QAAQ,EAAG,QAAO;AAAA,EAC1C,QAAQ;AAAA,EAER;AAEA,SAAO,kBAAkB,GAAG;AAC9B;AAEA,SAAS,sBACP,YACA,KACA,OACA,MACM;AACN,QAAM,aAAa,kBAAkB,OAAO,EAAE;AAC9C,MAAI,CAAC,cAAc,CAAC,iBAAiB,UAAU,EAAG;AAClD,aAAW,KAAK,EAAE,KAAK,YAAY,OAAO,KAAK,CAAC;AAClD;AAEA,SAAS,+BAA+B,SAA2C;AACjF,QAAM,aAAuC,CAAC;AAE9C,aAAW,SAAS,QAAQ,SAAS,qBAAqB,GAAG;AAC3D,0BAAsB,YAAY,MAAM,CAAC,GAAG,MAAM,SAAS,GAAG,CAAC;AAAA,EACjE;AACA,aAAW,SAAS,QAAQ,SAAS,4BAA4B,GAAG;AAClE,0BAAsB,YAAY,MAAM,CAAC,GAAG,MAAM,SAAS,GAAG,CAAC;AAAA,EACjE;AACA,aAAW,SAAS,QAAQ,SAAS,sBAAsB,GAAG;AAC5D,0BAAsB,YAAY,MAAM,CAAC,GAAG,MAAM,SAAS,GAAG,CAAC;AAAA,EACjE;AACA,aAAW,SAAS,QAAQ,SAAS,mBAAmB,GAAG;AACzD,0BAAsB,YAAY,MAAM,CAAC,GAAG,MAAM,SAAS,GAAG,CAAC;AAAA,EACjE;AACA,aAAW,SAAS,QAAQ,SAAS,0BAA0B,GAAG;AAChE,0BAAsB,YAAY,MAAM,CAAC,GAAG,MAAM,SAAS,GAAG,CAAC;AAAA,EACjE;AAEA,SAAO;AACT;AAQO,SAAS,mCAAmC,SAA2B;AAC5E,MAAI,CAAC,QAAQ,KAAK,EAAG,QAAO,CAAC;AAE7B,QAAM,SAAS,CAAC,GAAG,+BAA+B,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,UAAU;AAChF,QAAI,KAAK,SAAS,MAAM,KAAM,QAAO,KAAK,OAAO,MAAM;AACvD,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC5B,CAAC;AAED,QAAM,OAAiB,CAAC;AACxB,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,aAAa,QAAQ;AAC9B,QAAI,KAAK,IAAI,UAAU,GAAG,EAAG;AAC7B,SAAK,IAAI,UAAU,GAAG;AACtB,SAAK,KAAK,UAAU,GAAG;AAAA,EACzB;AACA,SAAO;AACT;AAGO,SAAS,+BAA+B,SAAqC;AAClF,SAAO,mCAAmC,OAAO,EAAE,CAAC;AACtD;AAQO,SAAS,yBAAyB,SAA2B;AAClE,MAAI,CAAC,QAAQ,KAAK,EAAG,QAAO,CAAC;AAE7B,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,OAAO,kBAAkB,OAAO,GAAG;AAC5C,yBAAqB,MAAM,GAAG;AAAA,EAChC;AAEA,aAAW,SAAS,QAAQ,SAAS,6BAA6B,GAAG;AACnE,yBAAqB,MAAM,MAAM,CAAC,CAAC;AAAA,EACrC;AAEA,aAAW,SAAS,QAAQ,SAAS,sBAAsB,GAAG;AAC5D,yBAAqB,MAAM,MAAM,CAAC,CAAC;AAAA,EACrC;AAEA,aAAW,OAAO,uBAAuB,OAAO,GAAG;AACjD,yBAAqB,MAAM,GAAG;AAAA,EAChC;AAEA,aAAW,OAAO,8BAA8B,OAAO,GAAG;AACxD,yBAAqB,MAAM,GAAG;AAAA,EAChC;AAEA,SAAO,CAAC,GAAG,IAAI;AACjB;AAGO,SAAS,uBAAuB,SAA2B;AAChE,SAAO,yBAAyB,OAAO;AACzC;","names":[]}
|
package/dist/cli/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
createWpContentGatewayRewrite,
|
|
4
4
|
getAdapter
|
|
5
|
-
} from "../chunk-
|
|
5
|
+
} from "../chunk-XQVKA54A.js";
|
|
6
6
|
import {
|
|
7
7
|
analyzeConflicts,
|
|
8
8
|
buildMigrationReport,
|
|
@@ -17,12 +17,12 @@ import {
|
|
|
17
17
|
runMigration,
|
|
18
18
|
staleUrlsFromEstimate,
|
|
19
19
|
writeFilesystemExport
|
|
20
|
-
} from "../chunk-
|
|
20
|
+
} from "../chunk-IPYHS5R2.js";
|
|
21
21
|
import {
|
|
22
22
|
collectEntities
|
|
23
23
|
} from "../chunk-HI7JHWZU.js";
|
|
24
|
-
import "../chunk-
|
|
25
|
-
import "../chunk-
|
|
24
|
+
import "../chunk-EXYXTAZM.js";
|
|
25
|
+
import "../chunk-XYP3VYDH.js";
|
|
26
26
|
|
|
27
27
|
// src/cli/index.ts
|
|
28
28
|
import { writeFile } from "fs/promises";
|
package/dist/index.d.ts
CHANGED
|
@@ -3,9 +3,9 @@ export { A as AdapterContext, E as EntityKey, h as EntityType, i as MigrationCur
|
|
|
3
3
|
export { EntityState, MigrationCheckpoint, TrackedEntity, buildPortfolioMediaLinks, isTerminalState, normalizedAssetExifSchema, normalizedAssetSchema, normalizedCategorySchema, normalizedEntitySchema, normalizedPageSchema, normalizedPortfolioSchema, normalizedPostSchema, normalizedTagSchema, shouldProcessEntity, sourceMetadataSchema, validateNormalizedAsset, validateNormalizedCategory, validateNormalizedEntity, validateNormalizedPage, validateNormalizedPortfolio, validateNormalizedPost, validateNormalizedTag } from './normalizer/index.js';
|
|
4
4
|
export { B as BundleCounts, E as EntityBundle, b as bundleCounts, c as collectEntities, e as emptyBundle } from './bundle-uAAHehbv.js';
|
|
5
5
|
export { ConflictReport, DryRunOptions, DryRunResult, FALLBACK_ASSET_BYTES, FilesystemMigrationSink, MIGRATION_WRITE_STAGES, MigrationRedirect, MigrationReport, MigrationRunMode, MigrationRunOptions, MigrationRunResult, MigrationSink, MigrationWriteStage, StorageEstimate, UploadAssetInput, UploadAssetResult, WriteFilesystemOptions, analyzeConflicts, buildMigrationReport, buildRedirectMap, bundleToCombinedJson, createFilesystemMigrationSink, detectRedirectLoops, emptyConflictReport, estimateStorage, hasBlockingConflicts, hasWarnings, portfolioMediaMatchesBundle, runDryRun, runMigration, runMigrationFromBundle, staleUrlsFromEstimate, writeFilesystemExport } from './sinks/index.js';
|
|
6
|
-
export { R as RewriteInlineImageRef, a as RewriteInlineImagesOptions, b as RewriteInlineImagesResult, U as UploadedAssetRef, r as rewriteInlineImages } from './rewrite-inline-images-
|
|
6
|
+
export { R as RewriteInlineImageRef, a as RewriteInlineImagesOptions, b as RewriteInlineImagesResult, U as UploadedAssetRef, r as rewriteInlineImages } from './rewrite-inline-images-DPoxyzVC.js';
|
|
7
7
|
export { GrapesComponent, GrapesProjectSnapshot, GrapesStyleRule, HtmlToGrapesOptions, HtmlToTiptapOptions, LayoutKind, LayoutTypeMap, TiptapDoc, TiptapMark, TiptapNode, ValidateGrapesProjectSnapshotOptions, ValidateTiptapDocOptions, cssToStyles, grapesComponentSchema, grapesProjectSnapshotSchema, grapesStyleRuleSchema, htmlToGrapes, htmlToTiptap, tiptapDocSchema, tiptapMarkSchema, tiptapNodeSchema, validateGrapesProjectSnapshot, validateTiptapDoc } from './transformers/index.js';
|
|
8
|
-
export { discoverContentAssetUrls, discoverRawImgSrcs, extractInlineImageSrcs, isLikelyImageUrl, normalizeAssetUrl } from './lib/index.js';
|
|
8
|
+
export { discoverContentAssetUrls, discoverFeaturedAssetCandidateUrls, discoverRawImgSrcs, extractInlineImageSrcs, isLikelyImageUrl, normalizeAssetUrl, resolveFeaturedContentAssetUrl } from './lib/index.js';
|
|
9
9
|
import { z } from 'zod';
|
|
10
10
|
import 'node:stream';
|
|
11
11
|
|
package/dist/index.js
CHANGED
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
squarespaceAdapter,
|
|
16
16
|
wixAdapter,
|
|
17
17
|
wordpressAdapter
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-XQVKA54A.js";
|
|
19
19
|
import {
|
|
20
20
|
normalizedAssetExifSchema,
|
|
21
21
|
normalizedAssetSchema,
|
|
@@ -58,7 +58,7 @@ import {
|
|
|
58
58
|
runMigrationFromBundle,
|
|
59
59
|
staleUrlsFromEstimate,
|
|
60
60
|
writeFilesystemExport
|
|
61
|
-
} from "./chunk-
|
|
61
|
+
} from "./chunk-IPYHS5R2.js";
|
|
62
62
|
import {
|
|
63
63
|
buildPortfolioMediaLinks,
|
|
64
64
|
bundleCounts,
|
|
@@ -83,14 +83,16 @@ import {
|
|
|
83
83
|
} from "./chunk-CIOYDRY5.js";
|
|
84
84
|
import {
|
|
85
85
|
rewriteInlineImages
|
|
86
|
-
} from "./chunk-
|
|
86
|
+
} from "./chunk-EXYXTAZM.js";
|
|
87
87
|
import {
|
|
88
88
|
discoverContentAssetUrls,
|
|
89
|
+
discoverFeaturedAssetCandidateUrls,
|
|
89
90
|
discoverRawImgSrcs,
|
|
90
91
|
extractInlineImageSrcs,
|
|
91
92
|
isLikelyImageUrl,
|
|
92
|
-
normalizeAssetUrl
|
|
93
|
-
|
|
93
|
+
normalizeAssetUrl,
|
|
94
|
+
resolveFeaturedContentAssetUrl
|
|
95
|
+
} from "./chunk-XYP3VYDH.js";
|
|
94
96
|
export {
|
|
95
97
|
FALLBACK_ASSET_BYTES,
|
|
96
98
|
FilesystemMigrationSink,
|
|
@@ -116,6 +118,7 @@ export {
|
|
|
116
118
|
cssToStyles,
|
|
117
119
|
detectRedirectLoops,
|
|
118
120
|
discoverContentAssetUrls,
|
|
121
|
+
discoverFeaturedAssetCandidateUrls,
|
|
119
122
|
discoverRawImgSrcs,
|
|
120
123
|
emptyBundle,
|
|
121
124
|
emptyConflictReport,
|
|
@@ -144,6 +147,7 @@ export {
|
|
|
144
147
|
normalizedTagSchema,
|
|
145
148
|
portfolioMediaMatchesBundle,
|
|
146
149
|
readSmugMugCredentialsFromEnv,
|
|
150
|
+
resolveFeaturedContentAssetUrl,
|
|
147
151
|
rewriteInlineImages,
|
|
148
152
|
rewriteOriginUrlsInText,
|
|
149
153
|
runDryRun,
|
package/dist/lib/index.d.ts
CHANGED
|
@@ -5,12 +5,22 @@ declare function normalizeAssetUrl(raw: string): string | undefined;
|
|
|
5
5
|
/** Heuristic: URL likely points at a raster/vector image asset, not a page link. */
|
|
6
6
|
declare function isLikelyImageUrl(url: string): boolean;
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* Ordered featured-image candidates when `_thumbnail_id` is missing — heroes
|
|
9
|
+
* (`data-bg-image`, CSS backgrounds, `bg_image=`) before inline assets; within
|
|
10
|
+
* each tier, first in document order wins. Filename tokens (`_w`, `_2048`, …)
|
|
11
|
+
* are not interpreted as quality signals.
|
|
12
|
+
*/
|
|
13
|
+
declare function discoverFeaturedAssetCandidateUrls(content: string): string[];
|
|
14
|
+
/** Best featured-image URL from post/page HTML when attachment id is unavailable. */
|
|
15
|
+
declare function resolveFeaturedContentAssetUrl(content: string): string | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Generic content-discovery pass: collect image URLs from HTML `<img>` tags,
|
|
18
|
+
* section hero markers (`data-bg-image`), inline CSS backgrounds, and common
|
|
19
|
+
* shortcode/builder attributes (`src=`, `image=`, `bg_image=`, …) without
|
|
20
|
+
* parsing builder-specific structure (Tatsu, Elementor, etc.).
|
|
11
21
|
*/
|
|
12
22
|
declare function discoverContentAssetUrls(content: string): string[];
|
|
13
23
|
/** @deprecated Use discoverContentAssetUrls — kept for call-site clarity during transition. */
|
|
14
24
|
declare function extractInlineImageSrcs(content: string): string[];
|
|
15
25
|
|
|
16
|
-
export { discoverContentAssetUrls, discoverRawImgSrcs, extractInlineImageSrcs, isLikelyImageUrl, normalizeAssetUrl };
|
|
26
|
+
export { discoverContentAssetUrls, discoverFeaturedAssetCandidateUrls, discoverRawImgSrcs, extractInlineImageSrcs, isLikelyImageUrl, normalizeAssetUrl, resolveFeaturedContentAssetUrl };
|
package/dist/lib/index.js
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import {
|
|
2
2
|
discoverContentAssetUrls,
|
|
3
|
+
discoverFeaturedAssetCandidateUrls,
|
|
3
4
|
discoverRawImgSrcs,
|
|
4
5
|
extractInlineImageSrcs,
|
|
5
6
|
isLikelyImageUrl,
|
|
6
|
-
normalizeAssetUrl
|
|
7
|
-
|
|
7
|
+
normalizeAssetUrl,
|
|
8
|
+
resolveFeaturedContentAssetUrl
|
|
9
|
+
} from "../chunk-XYP3VYDH.js";
|
|
8
10
|
export {
|
|
9
11
|
discoverContentAssetUrls,
|
|
12
|
+
discoverFeaturedAssetCandidateUrls,
|
|
10
13
|
discoverRawImgSrcs,
|
|
11
14
|
extractInlineImageSrcs,
|
|
12
15
|
isLikelyImageUrl,
|
|
13
|
-
normalizeAssetUrl
|
|
16
|
+
normalizeAssetUrl,
|
|
17
|
+
resolveFeaturedContentAssetUrl
|
|
14
18
|
};
|
|
15
19
|
//# sourceMappingURL=index.js.map
|
|
@@ -15,7 +15,7 @@ interface RewriteInlineImagesResult {
|
|
|
15
15
|
referencedSources: string[];
|
|
16
16
|
unresolved: string[];
|
|
17
17
|
}
|
|
18
|
-
/** Rewrite `<img src>` / `srcset` using uploaded asset targets
|
|
18
|
+
/** Rewrite `<img src>` / `srcset`, `data-bg-image`, and inline CSS backgrounds using uploaded asset targets. */
|
|
19
19
|
declare function rewriteInlineImages(html: string, options: RewriteInlineImagesOptions, uploadedBySourceId: Map<string, UploadedAssetRef>): RewriteInlineImagesResult;
|
|
20
20
|
|
|
21
21
|
export { type RewriteInlineImageRef as R, type UploadedAssetRef as U, type RewriteInlineImagesOptions as a, type RewriteInlineImagesResult as b, rewriteInlineImages as r };
|
package/dist/sinks/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { d as NormalizedCategory, e as NormalizedTag, b as NormalizedAsset, c as NormalizedPortfolio, N as NormalizedPost, a as NormalizedPage, P as PortfolioMediaLink, E as EntityKey, f as NormalizedEntity, g as MigrationPlatform, M as MigrationAdapter } from '../types-DWOP8Dcy.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-DPoxyzVC.js';
|
|
4
|
+
export { b as RewriteInlineImagesResult, r as rewriteInlineImages } from '../rewrite-inline-images-DPoxyzVC.js';
|
|
5
5
|
import { E as EntityBundle } from '../bundle-uAAHehbv.js';
|
|
6
6
|
|
|
7
7
|
interface CreatePostResult {
|
package/dist/sinks/index.js
CHANGED
|
@@ -18,12 +18,12 @@ import {
|
|
|
18
18
|
runMigrationFromBundle,
|
|
19
19
|
staleUrlsFromEstimate,
|
|
20
20
|
writeFilesystemExport
|
|
21
|
-
} from "../chunk-
|
|
21
|
+
} from "../chunk-IPYHS5R2.js";
|
|
22
22
|
import "../chunk-HI7JHWZU.js";
|
|
23
23
|
import {
|
|
24
24
|
rewriteInlineImages
|
|
25
|
-
} from "../chunk-
|
|
26
|
-
import "../chunk-
|
|
25
|
+
} from "../chunk-EXYXTAZM.js";
|
|
26
|
+
import "../chunk-XYP3VYDH.js";
|
|
27
27
|
export {
|
|
28
28
|
FALLBACK_ASSET_BYTES,
|
|
29
29
|
FilesystemMigrationSink,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { l as ValidationResult } from '../types-DWOP8Dcy.js';
|
|
3
|
-
export { R as RewriteInlineImageRef, a as RewriteInlineImagesOptions, b as RewriteInlineImagesResult, U as UploadedAssetRef, r as rewriteInlineImages } from '../rewrite-inline-images-
|
|
3
|
+
export { R as RewriteInlineImageRef, a as RewriteInlineImagesOptions, b as RewriteInlineImagesResult, U as UploadedAssetRef, r as rewriteInlineImages } from '../rewrite-inline-images-DPoxyzVC.js';
|
|
4
4
|
|
|
5
5
|
type LayoutKind = "section" | "row" | "column";
|
|
6
6
|
/** Map OSS-2 `data-layout` markers to Grapes component types (host may override). */
|
|
@@ -13,8 +13,8 @@ import {
|
|
|
13
13
|
} from "../chunk-CIOYDRY5.js";
|
|
14
14
|
import {
|
|
15
15
|
rewriteInlineImages
|
|
16
|
-
} from "../chunk-
|
|
17
|
-
import "../chunk-
|
|
16
|
+
} from "../chunk-EXYXTAZM.js";
|
|
17
|
+
import "../chunk-XYP3VYDH.js";
|
|
18
18
|
export {
|
|
19
19
|
cssToStyles,
|
|
20
20
|
grapesComponentSchema,
|
package/package.json
CHANGED
package/dist/chunk-2PNSVE5Y.js
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
// src/lib/content-asset-urls.ts
|
|
2
|
-
import * as cheerio from "cheerio";
|
|
3
|
-
var ASSET_URL_PARAM_PATTERN = /\b(?:src|image|url)\s*=\s*["']([^"']+)["']/gi;
|
|
4
|
-
var IMAGE_EXTENSION_PATTERN = /\.(?:jpe?g|png|gif|webp|avif|svg)(?:[?#]|$)/i;
|
|
5
|
-
var WP_UPLOADS_PATTERN = /\/wp-content\/uploads\//i;
|
|
6
|
-
function extractImgTagSrcs(content) {
|
|
7
|
-
if (!content.trim()) return [];
|
|
8
|
-
const $ = cheerio.load(content, { xml: false });
|
|
9
|
-
const srcs = [];
|
|
10
|
-
$("img[src]").each((_, el) => {
|
|
11
|
-
const src = $(el).attr("src")?.trim();
|
|
12
|
-
if (src) srcs.push(src);
|
|
13
|
-
});
|
|
14
|
-
return srcs;
|
|
15
|
-
}
|
|
16
|
-
function discoverRawImgSrcs(content) {
|
|
17
|
-
return extractImgTagSrcs(content).filter((src) => !src.startsWith("data:"));
|
|
18
|
-
}
|
|
19
|
-
function normalizeAssetUrl(raw) {
|
|
20
|
-
const trimmed = raw.trim();
|
|
21
|
-
if (!trimmed || trimmed.startsWith("data:")) return void 0;
|
|
22
|
-
if (trimmed.startsWith("//")) return `https:${trimmed}`;
|
|
23
|
-
return trimmed;
|
|
24
|
-
}
|
|
25
|
-
function isLikelyImageUrl(url) {
|
|
26
|
-
if (!url || url.startsWith("data:")) return false;
|
|
27
|
-
if (url.startsWith("/")) {
|
|
28
|
-
return WP_UPLOADS_PATTERN.test(url) || IMAGE_EXTENSION_PATTERN.test(url);
|
|
29
|
-
}
|
|
30
|
-
if (!/^https?:\/\//i.test(url)) return false;
|
|
31
|
-
if (WP_UPLOADS_PATTERN.test(url)) return true;
|
|
32
|
-
try {
|
|
33
|
-
const pathname = new URL(url).pathname;
|
|
34
|
-
return IMAGE_EXTENSION_PATTERN.test(pathname);
|
|
35
|
-
} catch {
|
|
36
|
-
return IMAGE_EXTENSION_PATTERN.test(url);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
function discoverContentAssetUrls(content) {
|
|
40
|
-
if (!content.trim()) return [];
|
|
41
|
-
const urls = /* @__PURE__ */ new Set();
|
|
42
|
-
for (const raw of extractImgTagSrcs(content)) {
|
|
43
|
-
const normalized = normalizeAssetUrl(raw);
|
|
44
|
-
if (normalized && isLikelyImageUrl(normalized)) {
|
|
45
|
-
urls.add(normalized);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
for (const match of content.matchAll(ASSET_URL_PARAM_PATTERN)) {
|
|
49
|
-
const normalized = normalizeAssetUrl(match[1] ?? "");
|
|
50
|
-
if (normalized && isLikelyImageUrl(normalized)) {
|
|
51
|
-
urls.add(normalized);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
return [...urls];
|
|
55
|
-
}
|
|
56
|
-
function extractInlineImageSrcs(content) {
|
|
57
|
-
return discoverContentAssetUrls(content);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export {
|
|
61
|
-
discoverRawImgSrcs,
|
|
62
|
-
normalizeAssetUrl,
|
|
63
|
-
isLikelyImageUrl,
|
|
64
|
-
discoverContentAssetUrls,
|
|
65
|
-
extractInlineImageSrcs
|
|
66
|
-
};
|
|
67
|
-
//# sourceMappingURL=chunk-2PNSVE5Y.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/content-asset-urls.ts"],"sourcesContent":["import * as cheerio from \"cheerio\";\n\n/** Builder-agnostic attribute names that commonly hold image URLs in post_content. */\nconst ASSET_URL_PARAM_PATTERN =\n /\\b(?:src|image|url)\\s*=\\s*[\"']([^\"']+)[\"']/gi;\n\nconst IMAGE_EXTENSION_PATTERN = /\\.(?:jpe?g|png|gif|webp|avif|svg)(?:[?#]|$)/i;\nconst WP_UPLOADS_PATTERN = /\\/wp-content\\/uploads\\//i;\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\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 WP_UPLOADS_PATTERN.test(url) || IMAGE_EXTENSION_PATTERN.test(url);\n }\n\n if (!/^https?:\\/\\//i.test(url)) return false;\n\n if (WP_UPLOADS_PATTERN.test(url)) return true;\n\n try {\n const pathname = new URL(url).pathname;\n return IMAGE_EXTENSION_PATTERN.test(pathname);\n } catch {\n return IMAGE_EXTENSION_PATTERN.test(url);\n }\n}\n\n/**\n * Generic content-discovery pass: collect image URLs from HTML `<img>` tags and\n * common shortcode/builder attributes (`src=`, `image=`, `url=`) without parsing\n * builder-specific structure (Tatsu, Elementor, etc.).\n */\nexport function discoverContentAssetUrls(content: string): string[] {\n if (!content.trim()) return [];\n\n const urls = new Set<string>();\n\n for (const raw of extractImgTagSrcs(content)) {\n const normalized = normalizeAssetUrl(raw);\n if (normalized && isLikelyImageUrl(normalized)) {\n urls.add(normalized);\n }\n }\n\n for (const match of content.matchAll(ASSET_URL_PARAM_PATTERN)) {\n const normalized = normalizeAssetUrl(match[1] ?? \"\");\n if (normalized && isLikelyImageUrl(normalized)) {\n urls.add(normalized);\n }\n }\n\n return [...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"],"mappings":";AAAA,YAAY,aAAa;AAGzB,IAAM,0BACJ;AAEF,IAAM,0BAA0B;AAChC,IAAM,qBAAqB;AAE3B,SAAS,kBAAkB,SAA2B;AACpD,MAAI,CAAC,QAAQ,KAAK,EAAG,QAAO,CAAC;AAC7B,QAAM,IAAY,aAAK,SAAS,EAAE,KAAK,MAAM,CAAC;AAC9C,QAAM,OAAiB,CAAC;AACxB,IAAE,UAAU,EAAE,KAAK,CAAC,GAAG,OAAO;AAC5B,UAAM,MAAM,EAAE,EAAE,EAAE,KAAK,KAAK,GAAG,KAAK;AACpC,QAAI,IAAK,MAAK,KAAK,GAAG;AAAA,EACxB,CAAC;AACD,SAAO;AACT;AAGO,SAAS,mBAAmB,SAA2B;AAC5D,SAAO,kBAAkB,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,WAAW,OAAO,CAAC;AAC5E;AAGO,SAAS,kBAAkB,KAAiC;AACjE,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,CAAC,WAAW,QAAQ,WAAW,OAAO,EAAG,QAAO;AACpD,MAAI,QAAQ,WAAW,IAAI,EAAG,QAAO,SAAS,OAAO;AACrD,SAAO;AACT;AAGO,SAAS,iBAAiB,KAAsB;AACrD,MAAI,CAAC,OAAO,IAAI,WAAW,OAAO,EAAG,QAAO;AAE5C,MAAI,IAAI,WAAW,GAAG,GAAG;AACvB,WAAO,mBAAmB,KAAK,GAAG,KAAK,wBAAwB,KAAK,GAAG;AAAA,EACzE;AAEA,MAAI,CAAC,gBAAgB,KAAK,GAAG,EAAG,QAAO;AAEvC,MAAI,mBAAmB,KAAK,GAAG,EAAG,QAAO;AAEzC,MAAI;AACF,UAAM,WAAW,IAAI,IAAI,GAAG,EAAE;AAC9B,WAAO,wBAAwB,KAAK,QAAQ;AAAA,EAC9C,QAAQ;AACN,WAAO,wBAAwB,KAAK,GAAG;AAAA,EACzC;AACF;AAOO,SAAS,yBAAyB,SAA2B;AAClE,MAAI,CAAC,QAAQ,KAAK,EAAG,QAAO,CAAC;AAE7B,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,OAAO,kBAAkB,OAAO,GAAG;AAC5C,UAAM,aAAa,kBAAkB,GAAG;AACxC,QAAI,cAAc,iBAAiB,UAAU,GAAG;AAC9C,WAAK,IAAI,UAAU;AAAA,IACrB;AAAA,EACF;AAEA,aAAW,SAAS,QAAQ,SAAS,uBAAuB,GAAG;AAC7D,UAAM,aAAa,kBAAkB,MAAM,CAAC,KAAK,EAAE;AACnD,QAAI,cAAc,iBAAiB,UAAU,GAAG;AAC9C,WAAK,IAAI,UAAU;AAAA,IACrB;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,IAAI;AACjB;AAGO,SAAS,uBAAuB,SAA2B;AAChE,SAAO,yBAAyB,OAAO;AACzC;","names":[]}
|
package/dist/chunk-S7TRWILI.js
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
normalizeAssetUrl
|
|
3
|
-
} from "./chunk-2PNSVE5Y.js";
|
|
4
|
-
|
|
5
|
-
// src/transformers/rewrite-inline-images.ts
|
|
6
|
-
import * as cheerio from "cheerio";
|
|
7
|
-
function rewriteSrcset(srcset, options, uploadedBySourceId, referencedSources, unresolved) {
|
|
8
|
-
return srcset.split(",").map((entry) => {
|
|
9
|
-
const trimmed = entry.trim();
|
|
10
|
-
if (!trimmed) return entry;
|
|
11
|
-
const [urlPart, descriptor] = trimmed.split(/\s+/, 2);
|
|
12
|
-
const normalized = normalizeAssetUrl(urlPart ?? "");
|
|
13
|
-
if (!normalized) return entry;
|
|
14
|
-
referencedSources.add(normalized);
|
|
15
|
-
const ref = options.resolveAsset(normalized);
|
|
16
|
-
if (!ref?.sourceAssetId) {
|
|
17
|
-
unresolved.add(normalized);
|
|
18
|
-
return entry;
|
|
19
|
-
}
|
|
20
|
-
const uploaded = uploadedBySourceId.get(ref.sourceAssetId);
|
|
21
|
-
if (!uploaded) {
|
|
22
|
-
unresolved.add(normalized);
|
|
23
|
-
return entry;
|
|
24
|
-
}
|
|
25
|
-
const replaced = options.replaceWith(ref, uploaded);
|
|
26
|
-
return descriptor ? `${replaced} ${descriptor}` : replaced;
|
|
27
|
-
}).join(", ");
|
|
28
|
-
}
|
|
29
|
-
function rewriteInlineImages(html, options, uploadedBySourceId) {
|
|
30
|
-
if (!html.trim()) {
|
|
31
|
-
return { html, referencedSources: [], unresolved: [] };
|
|
32
|
-
}
|
|
33
|
-
const $ = cheerio.load(html, { xml: false });
|
|
34
|
-
const referencedSources = /* @__PURE__ */ new Set();
|
|
35
|
-
const unresolved = /* @__PURE__ */ new Set();
|
|
36
|
-
$("img").each((_, element) => {
|
|
37
|
-
const img = $(element);
|
|
38
|
-
const src = img.attr("src")?.trim();
|
|
39
|
-
if (src && !src.startsWith("data:")) {
|
|
40
|
-
const normalized = normalizeAssetUrl(src);
|
|
41
|
-
if (normalized) {
|
|
42
|
-
referencedSources.add(normalized);
|
|
43
|
-
const ref = options.resolveAsset(normalized);
|
|
44
|
-
if (!ref?.sourceAssetId) {
|
|
45
|
-
unresolved.add(normalized);
|
|
46
|
-
} else {
|
|
47
|
-
const uploaded = uploadedBySourceId.get(ref.sourceAssetId);
|
|
48
|
-
if (!uploaded) {
|
|
49
|
-
unresolved.add(normalized);
|
|
50
|
-
} else {
|
|
51
|
-
img.attr("src", options.replaceWith(ref, uploaded));
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
const srcset = img.attr("srcset")?.trim();
|
|
57
|
-
if (srcset) {
|
|
58
|
-
img.attr("srcset", rewriteSrcset(srcset, options, uploadedBySourceId, referencedSources, unresolved));
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
return {
|
|
62
|
-
html: $.root().html() ?? html,
|
|
63
|
-
referencedSources: [...referencedSources],
|
|
64
|
-
unresolved: [...unresolved]
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export {
|
|
69
|
-
rewriteInlineImages
|
|
70
|
-
};
|
|
71
|
-
//# sourceMappingURL=chunk-S7TRWILI.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/transformers/rewrite-inline-images.ts"],"sourcesContent":["import * as cheerio from \"cheerio\";\n\nimport { normalizeAssetUrl } from \"../lib/content-asset-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 replaceWith: (ref: RewriteInlineImageRef, uploaded: UploadedAssetRef) => string;\n}\n\nexport interface RewriteInlineImagesResult {\n html: string;\n referencedSources: string[];\n unresolved: string[];\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 normalized = normalizeAssetUrl(urlPart ?? \"\");\n if (!normalized) return entry;\n referencedSources.add(normalized);\n const ref = options.resolveAsset(normalized);\n if (!ref?.sourceAssetId) {\n unresolved.add(normalized);\n return entry;\n }\n const uploaded = uploadedBySourceId.get(ref.sourceAssetId);\n if (!uploaded) {\n unresolved.add(normalized);\n return entry;\n }\n const replaced = options.replaceWith(ref, uploaded);\n return descriptor ? `${replaced} ${descriptor}` : replaced;\n })\n .join(\", \");\n}\n\n/** Rewrite `<img src>` / `srcset` using uploaded asset targets supplied by the host sink. */\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 normalized = normalizeAssetUrl(src);\n if (normalized) {\n referencedSources.add(normalized);\n const ref = options.resolveAsset(normalized);\n if (!ref?.sourceAssetId) {\n unresolved.add(normalized);\n } else {\n const uploaded = uploadedBySourceId.get(ref.sourceAssetId);\n if (!uploaded) {\n unresolved.add(normalized);\n } else {\n img.attr(\"src\", options.replaceWith(ref, uploaded));\n }\n }\n }\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 return {\n html: $.root().html() ?? html,\n referencedSources: [...referencedSources],\n unresolved: [...unresolved],\n };\n}\n"],"mappings":";;;;;AAAA,YAAY,aAAa;AAyBzB,SAAS,cACP,QACA,SACA,oBACA,mBACA,YACQ;AACR,SAAO,OACJ,MAAM,GAAG,EACT,IAAI,CAAC,UAAU;AACd,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,CAAC,QAAS,QAAO;AACrB,UAAM,CAAC,SAAS,UAAU,IAAI,QAAQ,MAAM,OAAO,CAAC;AACpD,UAAM,aAAa,kBAAkB,WAAW,EAAE;AAClD,QAAI,CAAC,WAAY,QAAO;AACxB,sBAAkB,IAAI,UAAU;AAChC,UAAM,MAAM,QAAQ,aAAa,UAAU;AAC3C,QAAI,CAAC,KAAK,eAAe;AACvB,iBAAW,IAAI,UAAU;AACzB,aAAO;AAAA,IACT;AACA,UAAM,WAAW,mBAAmB,IAAI,IAAI,aAAa;AACzD,QAAI,CAAC,UAAU;AACb,iBAAW,IAAI,UAAU;AACzB,aAAO;AAAA,IACT;AACA,UAAM,WAAW,QAAQ,YAAY,KAAK,QAAQ;AAClD,WAAO,aAAa,GAAG,QAAQ,IAAI,UAAU,KAAK;AAAA,EACpD,CAAC,EACA,KAAK,IAAI;AACd;AAGO,SAAS,oBACd,MACA,SACA,oBAC2B;AAC3B,MAAI,CAAC,KAAK,KAAK,GAAG;AAChB,WAAO,EAAE,MAAM,mBAAmB,CAAC,GAAG,YAAY,CAAC,EAAE;AAAA,EACvD;AAEA,QAAM,IAAY,aAAK,MAAM,EAAE,KAAK,MAAM,CAAC;AAC3C,QAAM,oBAAoB,oBAAI,IAAY;AAC1C,QAAM,aAAa,oBAAI,IAAY;AAEnC,IAAE,KAAK,EAAE,KAAK,CAAC,GAAG,YAAY;AAC5B,UAAM,MAAM,EAAE,OAAO;AACrB,UAAM,MAAM,IAAI,KAAK,KAAK,GAAG,KAAK;AAClC,QAAI,OAAO,CAAC,IAAI,WAAW,OAAO,GAAG;AACnC,YAAM,aAAa,kBAAkB,GAAG;AACxC,UAAI,YAAY;AACd,0BAAkB,IAAI,UAAU;AAChC,cAAM,MAAM,QAAQ,aAAa,UAAU;AAC3C,YAAI,CAAC,KAAK,eAAe;AACvB,qBAAW,IAAI,UAAU;AAAA,QAC3B,OAAO;AACL,gBAAM,WAAW,mBAAmB,IAAI,IAAI,aAAa;AACzD,cAAI,CAAC,UAAU;AACb,uBAAW,IAAI,UAAU;AAAA,UAC3B,OAAO;AACL,gBAAI,KAAK,OAAO,QAAQ,YAAY,KAAK,QAAQ,CAAC;AAAA,UACpD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,IAAI,KAAK,QAAQ,GAAG,KAAK;AACxC,QAAI,QAAQ;AACV,UAAI,KAAK,UAAU,cAAc,QAAQ,SAAS,oBAAoB,mBAAmB,UAAU,CAAC;AAAA,IACtG;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK;AAAA,IACzB,mBAAmB,CAAC,GAAG,iBAAiB;AAAA,IACxC,YAAY,CAAC,GAAG,UAAU;AAAA,EAC5B;AACF;","names":[]}
|