@cogenta/import 0.1.4 → 0.2.2
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/csv-import.d.ts +11 -0
- package/dist/csv-import.d.ts.map +1 -0
- package/dist/csv-import.js +14 -0
- package/dist/csv-import.js.map +1 -0
- package/dist/csv.d.ts +15 -0
- package/dist/csv.d.ts.map +1 -0
- package/dist/csv.js +100 -0
- package/dist/csv.js.map +1 -0
- package/dist/feed.d.ts +4 -0
- package/dist/feed.d.ts.map +1 -0
- package/dist/feed.js +50 -0
- package/dist/feed.js.map +1 -0
- package/dist/generic-import.d.ts +56 -0
- package/dist/generic-import.d.ts.map +1 -0
- package/dist/generic-import.js +64 -0
- package/dist/generic-import.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/json-import.d.ts +52 -0
- package/dist/json-import.d.ts.map +1 -0
- package/dist/json-import.js +110 -0
- package/dist/json-import.js.map +1 -0
- package/dist/mapping.d.ts +23 -0
- package/dist/mapping.d.ts.map +1 -0
- package/dist/mapping.js +41 -0
- package/dist/mapping.js.map +1 -0
- package/dist/ssrf.d.ts +12 -0
- package/dist/ssrf.d.ts.map +1 -0
- package/dist/ssrf.js +106 -0
- package/dist/ssrf.js.map +1 -0
- package/dist/tracking.d.ts +82 -0
- package/dist/tracking.d.ts.map +1 -0
- package/dist/tracking.js +200 -0
- package/dist/tracking.js.map +1 -0
- package/dist/undo.d.ts +27 -0
- package/dist/undo.d.ts.map +1 -0
- package/dist/undo.js +47 -0
- package/dist/undo.js.map +1 -0
- package/dist/wordpress/analyze.d.ts +40 -0
- package/dist/wordpress/analyze.d.ts.map +1 -0
- package/dist/wordpress/analyze.js +111 -0
- package/dist/wordpress/analyze.js.map +1 -0
- package/dist/wordpress/import.d.ts +31 -0
- package/dist/wordpress/import.d.ts.map +1 -1
- package/dist/wordpress/import.js +199 -6
- package/dist/wordpress/import.js.map +1 -1
- package/dist/wordpress/media.d.ts +3 -0
- package/dist/wordpress/media.d.ts.map +1 -1
- package/dist/wordpress/media.js +39 -2
- package/dist/wordpress/media.js.map +1 -1
- package/package.json +6 -5
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { convertContent, mediaUrlsOf } from './content-convert.js';
|
|
2
|
+
import { parseWxr } from './parse.js';
|
|
3
|
+
/**
|
|
4
|
+
* The "analyze" phase of a WordPress import (fiche 25 task 1): everything an
|
|
5
|
+
* apply would do, without a database, a storage driver, or a single write.
|
|
6
|
+
*
|
|
7
|
+
* This deliberately duplicates the *counting* logic of `importWordPress`
|
|
8
|
+
* (which post is importable, which is skipped, which media it references)
|
|
9
|
+
* rather than the *writing* logic — the parts that touch `db`/`storage` are
|
|
10
|
+
* the only parts absent, on purpose, per the pièges connus note: "la
|
|
11
|
+
* prévisualisation doit venir du paquet, pas d'une deuxième analyse [de
|
|
12
|
+
* moteur de rendu]". `convertContent` — the actual Gutenberg/HTML → block
|
|
13
|
+
* conversion — runs for real, so the block/media counts here are exact, not
|
|
14
|
+
* estimated.
|
|
15
|
+
*/
|
|
16
|
+
const IMPORTABLE_STATUSES = new Set(['publish', 'draft', 'pending', 'private', 'future']);
|
|
17
|
+
function slugConflictsOf(items, kind) {
|
|
18
|
+
const bySlug = new Map();
|
|
19
|
+
for (const item of items) {
|
|
20
|
+
if (!IMPORTABLE_STATUSES.has(item.status))
|
|
21
|
+
continue;
|
|
22
|
+
const slug = item.postName || item.postId;
|
|
23
|
+
const list = bySlug.get(slug) ?? [];
|
|
24
|
+
list.push(item.postId);
|
|
25
|
+
bySlug.set(slug, list);
|
|
26
|
+
}
|
|
27
|
+
return [...bySlug.entries()]
|
|
28
|
+
.filter(([, ids]) => ids.length > 1)
|
|
29
|
+
.map(([slug, wpIds]) => ({ kind, slug, wpIds }));
|
|
30
|
+
}
|
|
31
|
+
export function analyzeWordPress(xml) {
|
|
32
|
+
const parsed = parseWxr(xml);
|
|
33
|
+
const posts = parsed.items.filter((item) => item.postType === 'post');
|
|
34
|
+
const pages = parsed.items.filter((item) => item.postType === 'page');
|
|
35
|
+
const attachments = parsed.items.filter((item) => item.postType === 'attachment');
|
|
36
|
+
const ignored = [];
|
|
37
|
+
const warnings = [];
|
|
38
|
+
const allMediaUrls = new Set();
|
|
39
|
+
const attachmentUrlById = new Map(attachments
|
|
40
|
+
.filter((item) => item.attachmentUrl !== null)
|
|
41
|
+
.map((item) => [item.postId, item.attachmentUrl]));
|
|
42
|
+
for (const url of attachmentUrlById.values())
|
|
43
|
+
allMediaUrls.add(url);
|
|
44
|
+
let commentCount = 0;
|
|
45
|
+
for (const item of [...posts, ...pages]) {
|
|
46
|
+
const kind = item.postType === 'post' ? 'post' : 'page';
|
|
47
|
+
if (item.status === 'trash') {
|
|
48
|
+
ignored.push({
|
|
49
|
+
type: kind,
|
|
50
|
+
wpId: item.postId,
|
|
51
|
+
title: item.title,
|
|
52
|
+
reason: 'Trashed in WordPress.',
|
|
53
|
+
});
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (!IMPORTABLE_STATUSES.has(item.status)) {
|
|
57
|
+
ignored.push({
|
|
58
|
+
type: kind,
|
|
59
|
+
wpId: item.postId,
|
|
60
|
+
title: item.title,
|
|
61
|
+
reason: `Unrecognised WordPress status "${item.status}".`,
|
|
62
|
+
});
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const { blocks, notes } = convertContent(item.contentEncoded);
|
|
66
|
+
for (const url of mediaUrlsOf(blocks))
|
|
67
|
+
allMediaUrls.add(url);
|
|
68
|
+
const thumbnail = item.thumbnailId === null ? undefined : attachmentUrlById.get(item.thumbnailId);
|
|
69
|
+
if (thumbnail !== undefined)
|
|
70
|
+
allMediaUrls.add(thumbnail);
|
|
71
|
+
for (const note of notes) {
|
|
72
|
+
warnings.push(`"${item.title || item.postId}" — ${note.source}: ${note.reason} (kept as plain text).`);
|
|
73
|
+
}
|
|
74
|
+
for (const comment of item.comments) {
|
|
75
|
+
if (comment.approved === '1') {
|
|
76
|
+
commentCount += 1;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
ignored.push({
|
|
80
|
+
type: 'comment',
|
|
81
|
+
wpId: comment.id,
|
|
82
|
+
title: `Comment on "${item.title}"`,
|
|
83
|
+
reason: comment.approved === 'spam'
|
|
84
|
+
? 'Marked as spam in WordPress.'
|
|
85
|
+
: 'Not yet approved in WordPress.',
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (parsed.authors.some((author) => author.email.trim().length === 0)) {
|
|
91
|
+
warnings.push('At least one author has no email in the export; a placeholder will be used.');
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
counts: {
|
|
95
|
+
posts: posts.length,
|
|
96
|
+
pages: pages.length,
|
|
97
|
+
categories: parsed.categories.length,
|
|
98
|
+
tags: parsed.tags.length,
|
|
99
|
+
comments: commentCount,
|
|
100
|
+
attachments: attachments.length,
|
|
101
|
+
},
|
|
102
|
+
collectionMapping: { post: 'post', page: 'page' },
|
|
103
|
+
authors: parsed.authors.map((author) => ({ login: author.login, email: author.email })),
|
|
104
|
+
mediaUrls: [...allMediaUrls],
|
|
105
|
+
mediaCount: allMediaUrls.size,
|
|
106
|
+
slugConflicts: [...slugConflictsOf(posts, 'post'), ...slugConflictsOf(pages, 'page')],
|
|
107
|
+
ignored,
|
|
108
|
+
warnings,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=analyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/wordpress/analyze.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,41 @@
|
|
|
1
|
+
import type { CommentStore } from '@cogenta/comments';
|
|
1
2
|
import { type DatabaseHandle, type StorageDriver } from '@cogenta/core';
|
|
3
|
+
import type { ImportTrackingStore } from '../tracking.js';
|
|
2
4
|
import { type ConversionReport } from './report.js';
|
|
3
5
|
export interface ImportWordPressOptions {
|
|
4
6
|
readonly db: DatabaseHandle;
|
|
5
7
|
readonly storage: StorageDriver;
|
|
6
8
|
/** Injected for tests — real `fetch` by default. */
|
|
7
9
|
readonly fetchImpl?: typeof fetch;
|
|
10
|
+
/**
|
|
11
|
+
* Fiche 25 tasks 3-4: when both are given, every post/page/comment this
|
|
12
|
+
* apply writes is recorded against `runId` — what makes a second call with
|
|
13
|
+
* the same `runId` a **resume** (already-recorded WordPress ids are
|
|
14
|
+
* skipped rather than re-created) and what `undoImport` reads to trash
|
|
15
|
+
* everything a run produced. Categories, tags, media and authors are
|
|
16
|
+
* deliberately not tracked here: they are reference data a second import
|
|
17
|
+
* or the site's own editors may already depend on, so undo leaves them in
|
|
18
|
+
* place — the same choice WordPress's own "remove imported posts" tools
|
|
19
|
+
* make.
|
|
20
|
+
*/
|
|
21
|
+
readonly tracking?: ImportTrackingStore;
|
|
22
|
+
readonly runId?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Fiche 15 task 7 (ADR-0025): when given, every importable WordPress
|
|
25
|
+
* comment is written through contract F's own store — real status
|
|
26
|
+
* (approved/pending/spam/trash, from `wp:comment_approved`, not just the
|
|
27
|
+
* `'1'` this importer used to keep), real threading (`wp:comment_parent`),
|
|
28
|
+
* on both posts *and* pages (pages were silently skipped entirely before
|
|
29
|
+
* this option existed — a real, independent bug, not something this
|
|
30
|
+
* fiche introduced).
|
|
31
|
+
*
|
|
32
|
+
* Absent keeps the pre-fiche-15 behaviour: only approved (`'1'`) comments,
|
|
33
|
+
* only on posts, written into the synthetic `comment` collection
|
|
34
|
+
* (`collections.ts`'s `wpComment`) — kept for a caller that has not wired
|
|
35
|
+
* `@cogenta/comments` yet. A caller SHOULD pass this; `cogenta import
|
|
36
|
+
* wordpress` (the CLI) always does.
|
|
37
|
+
*/
|
|
38
|
+
readonly comments?: CommentStore;
|
|
8
39
|
}
|
|
9
40
|
/**
|
|
10
41
|
* Imports a WordPress "Export All Content" WXR file into Cogenta.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/wordpress/import.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/wordpress/import.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACpE,OAAO,EAA4B,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAOjG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAkBzD,OAAO,EAAE,KAAK,gBAAgB,EAAqC,MAAM,aAAa,CAAA;AAGtF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;IAC/B,oDAAoD;IACpD,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;IACjC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAA;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAA;CACjC;AAuED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAkb3B"}
|
package/dist/wordpress/import.js
CHANGED
|
@@ -6,6 +6,37 @@ import { convertContent, mediaUrlsOf, resolveMediaReferences, } from './content-
|
|
|
6
6
|
import { downloadAndStoreMedia } from './media.js';
|
|
7
7
|
import { parseWxr } from './parse.js';
|
|
8
8
|
import { emptyReport } from './report.js';
|
|
9
|
+
/** `wp:comment_approved`'s four real values, mapped to contract F's own vocabulary. Anything else (WordPress has used `'hold'` too) degrades to `pending` rather than being silently dropped. */
|
|
10
|
+
function wpApprovedToStatus(approved) {
|
|
11
|
+
if (approved === '1')
|
|
12
|
+
return 'approved';
|
|
13
|
+
if (approved === 'spam')
|
|
14
|
+
return 'spam';
|
|
15
|
+
if (approved === 'trash')
|
|
16
|
+
return 'trash';
|
|
17
|
+
return 'pending';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* WordPress's classic comment form allowed a small set of inline tags
|
|
21
|
+
* (`<a>`, `<em>`, `<strong>`, …) that contract F refuses outright (R3, first
|
|
22
|
+
* line of defense against stored XSS — `CommentStore.create` has no
|
|
23
|
+
* escape hatch for "a little HTML is fine"). Rather than drop such a
|
|
24
|
+
* comment, its markup is stripped to plain text and the loss is reported —
|
|
25
|
+
* the same "degrade and report, never lose silently" contract every other
|
|
26
|
+
* step of this importer already follows.
|
|
27
|
+
*/
|
|
28
|
+
function stripHtmlToPlainText(html) {
|
|
29
|
+
return html
|
|
30
|
+
.replace(/<[^>]*>/gu, '')
|
|
31
|
+
.replace(/ /giu, ' ')
|
|
32
|
+
.replace(/&/giu, '&')
|
|
33
|
+
.replace(/</giu, '<')
|
|
34
|
+
.replace(/>/giu, '>')
|
|
35
|
+
.replace(/"/giu, '"')
|
|
36
|
+
.replace(/�?39;/giu, "'")
|
|
37
|
+
.replace(/\s+/gu, ' ')
|
|
38
|
+
.trim();
|
|
39
|
+
}
|
|
9
40
|
const APPROVED = '1';
|
|
10
41
|
const IMPORTABLE_STATUSES = new Set(['publish', 'draft', 'pending', 'private', 'future']);
|
|
11
42
|
function wpDateToIso(wpDate) {
|
|
@@ -77,10 +108,22 @@ export async function importWordPress(xml, options) {
|
|
|
77
108
|
}
|
|
78
109
|
}
|
|
79
110
|
// ---- Categories & tags ----------------------------------------------
|
|
111
|
+
// A resumed apply (task 3) re-parses the same WXR and reaches this loop
|
|
112
|
+
// again: `slug` is `unique`, so re-creating an already-imported category or
|
|
113
|
+
// tag would throw rather than silently duplicate. Looking it up by slug
|
|
114
|
+
// first makes this idempotent, the same property `recordItem` gives posts
|
|
115
|
+
// and pages via the tracking table — categories/tags have no source id of
|
|
116
|
+
// their own to track against, but their slug already is one.
|
|
80
117
|
const categoryByNiceName = new Map();
|
|
81
118
|
for (const category of parsed.categories) {
|
|
119
|
+
const slug = category.niceName;
|
|
120
|
+
const existing = await categoryStore.list({ where: { slug }, limit: 1 });
|
|
121
|
+
if (existing.items[0] !== undefined) {
|
|
122
|
+
categoryByNiceName.set(category.niceName, existing.items[0].id);
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
82
125
|
const entry = await categoryStore.create({
|
|
83
|
-
values: { name: category.name || category.niceName, slug
|
|
126
|
+
values: { name: category.name || category.niceName, slug },
|
|
84
127
|
status: 'published',
|
|
85
128
|
});
|
|
86
129
|
categoryByNiceName.set(category.niceName, entry.id);
|
|
@@ -88,16 +131,36 @@ export async function importWordPress(xml, options) {
|
|
|
88
131
|
}
|
|
89
132
|
const tagByNiceName = new Map();
|
|
90
133
|
for (const tag of parsed.tags) {
|
|
134
|
+
const slug = tag.slug;
|
|
135
|
+
const existing = await tagStore.list({ where: { slug }, limit: 1 });
|
|
136
|
+
if (existing.items[0] !== undefined) {
|
|
137
|
+
tagByNiceName.set(tag.slug, existing.items[0].id);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
91
140
|
const entry = await tagStore.create({
|
|
92
|
-
values: { name: tag.name || tag.slug, slug
|
|
141
|
+
values: { name: tag.name || tag.slug, slug },
|
|
93
142
|
status: 'published',
|
|
94
143
|
});
|
|
95
144
|
tagByNiceName.set(tag.slug, entry.id);
|
|
96
145
|
acc.imported.tags += 1;
|
|
97
146
|
}
|
|
147
|
+
// ---- Resume (task 3) -------------------------------------------------
|
|
148
|
+
// Entry ids are deterministic (`store.create({ id: item.postId, … })`
|
|
149
|
+
// below), so a WordPress id already recorded for this run was already
|
|
150
|
+
// written by an earlier, interrupted attempt. Filtering it out here — not
|
|
151
|
+
// merely skipping the write — is what also keeps its comments from being
|
|
152
|
+
// re-created: `commentStore.create` has no id of its own to dedupe on, so
|
|
153
|
+
// reaching that loop a second time for the same post would duplicate them.
|
|
154
|
+
const done = options.tracking !== undefined && options.runId !== undefined
|
|
155
|
+
? await options.tracking.doneSourceIds(options.runId)
|
|
156
|
+
: new Set();
|
|
98
157
|
// ---- Media --------------------------------------------------------
|
|
99
|
-
const posts = parsed.items
|
|
100
|
-
|
|
158
|
+
const posts = parsed.items
|
|
159
|
+
.filter((item) => item.postType === 'post')
|
|
160
|
+
.filter((item) => !done.has(item.postId));
|
|
161
|
+
const pages = parsed.items
|
|
162
|
+
.filter((item) => item.postType === 'page')
|
|
163
|
+
.filter((item) => !done.has(item.postId));
|
|
101
164
|
const attachments = parsed.items.filter((item) => item.postType === 'attachment');
|
|
102
165
|
const attachmentUrlById = new Map(attachments
|
|
103
166
|
.filter((item) => item.attachmentUrl !== null)
|
|
@@ -203,14 +266,121 @@ export async function importWordPress(xml, options) {
|
|
|
203
266
|
}
|
|
204
267
|
return entry.id;
|
|
205
268
|
}
|
|
269
|
+
// Posts and pages are recorded under their bare WordPress id, matching
|
|
270
|
+
// `done` above (which the resume filter checks the same id against);
|
|
271
|
+
// comments get a prefixed id since a comment id and a post id share the
|
|
272
|
+
// same small-integer namespace in a WXR export and would otherwise collide
|
|
273
|
+
// in the tracking table's `(run_id, source_id)` uniqueness.
|
|
274
|
+
async function record(kind, wpId, entryId) {
|
|
275
|
+
if (options.tracking === undefined || options.runId === undefined)
|
|
276
|
+
return;
|
|
277
|
+
await options.tracking.recordItem({
|
|
278
|
+
runId: options.runId,
|
|
279
|
+
sourceId: kind === 'comment' ? `comment:${wpId}` : wpId,
|
|
280
|
+
collection: kind === 'comment' ? wpComment.name : kind === 'post' ? wpPost.name : wpPage.name,
|
|
281
|
+
entryId,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* All of one item's comments, real threading resolved before a reply is
|
|
286
|
+
* written (a reply needs its parent's *new* id, not its WordPress one).
|
|
287
|
+
* Processed in waves — every comment whose parent is already resolved (or
|
|
288
|
+
* top-level) goes this pass, repeat until nothing is left or nothing
|
|
289
|
+
* progressed. A WXR's own comments are almost always one level deep, so
|
|
290
|
+
* this is normally one or two waves; a comment whose parent never
|
|
291
|
+
* resolves (a broken export) is reported and imported top-level rather
|
|
292
|
+
* than dropped.
|
|
293
|
+
*/
|
|
294
|
+
async function importCommentsForEntry(comments, entryCollection, entryId, itemTitle) {
|
|
295
|
+
const store = options.comments;
|
|
296
|
+
if (store === undefined || comments.length === 0)
|
|
297
|
+
return;
|
|
298
|
+
const byWpId = new Map(comments.map((comment) => [comment.id, comment]));
|
|
299
|
+
const resolvedId = new Map();
|
|
300
|
+
const pending = new Set(comments.map((comment) => comment.id));
|
|
301
|
+
while (pending.size > 0) {
|
|
302
|
+
let progressed = false;
|
|
303
|
+
for (const wpId of [...pending]) {
|
|
304
|
+
const comment = byWpId.get(wpId);
|
|
305
|
+
if (comment === undefined) {
|
|
306
|
+
pending.delete(wpId);
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
const wpParent = comment.parentId;
|
|
310
|
+
const topLevel = wpParent === '' || wpParent === '0';
|
|
311
|
+
const parentStillPending = !topLevel && !resolvedId.has(wpParent) && byWpId.has(wpParent);
|
|
312
|
+
if (parentStillPending) {
|
|
313
|
+
// Its parent is still in this same wave — try again next pass.
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
// A parent id that names no comment anywhere in this export (a
|
|
317
|
+
// broken export, or one the parser skipped) — imported top-level
|
|
318
|
+
// rather than dropped, and reported so the loss is visible.
|
|
319
|
+
const parentTrulyMissing = !topLevel && !resolvedId.has(wpParent) && !byWpId.has(wpParent);
|
|
320
|
+
if (parentTrulyMissing) {
|
|
321
|
+
acc.warnings.push(`Comment ${comment.id} on "${itemTitle}" replies to parent comment ${wpParent}, which does not exist in this export; imported as top-level instead.`);
|
|
322
|
+
}
|
|
323
|
+
const plainText = stripHtmlToPlainText(comment.content);
|
|
324
|
+
if (plainText !== comment.content.trim()) {
|
|
325
|
+
acc.warnings.push(`Comment ${comment.id} on "${itemTitle}" contained HTML, which contract F does not store (R3); it was reduced to plain text.`);
|
|
326
|
+
}
|
|
327
|
+
if (plainText.length === 0) {
|
|
328
|
+
acc.warnings.push(`Comment ${comment.id} on "${itemTitle}" had no text content once stripped; skipped.`);
|
|
329
|
+
pending.delete(wpId);
|
|
330
|
+
progressed = true;
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
const email = comment.authorEmail.trim().length > 0
|
|
334
|
+
? comment.authorEmail.trim()
|
|
335
|
+
: `${(comment.author || 'anonymous')
|
|
336
|
+
.toLowerCase()
|
|
337
|
+
.replace(/[^a-z0-9]+/gu, '.')
|
|
338
|
+
.replace(/^\.+|\.+$/gu, '') || 'anonymous'}@imported.invalid`;
|
|
339
|
+
try {
|
|
340
|
+
const created = await store.create({
|
|
341
|
+
collection: entryCollection,
|
|
342
|
+
entryId,
|
|
343
|
+
parentId: topLevel ? null : (resolvedId.get(wpParent) ?? null),
|
|
344
|
+
author: { name: comment.author || 'Anonymous', email },
|
|
345
|
+
body: plainText,
|
|
346
|
+
status: wpApprovedToStatus(comment.approved),
|
|
347
|
+
provenance: 'human',
|
|
348
|
+
});
|
|
349
|
+
resolvedId.set(wpId, created.id);
|
|
350
|
+
acc.imported.comments += 1;
|
|
351
|
+
await record('comment', wpId, created.id);
|
|
352
|
+
}
|
|
353
|
+
catch (error) {
|
|
354
|
+
acc.warnings.push(`Comment ${comment.id} on "${itemTitle}" could not be imported: ${error instanceof Error ? error.message : String(error)}`);
|
|
355
|
+
}
|
|
356
|
+
pending.delete(wpId);
|
|
357
|
+
progressed = true;
|
|
358
|
+
}
|
|
359
|
+
if (!progressed)
|
|
360
|
+
break;
|
|
361
|
+
}
|
|
362
|
+
// Reachable only by a genuine cycle (A replies to B, B replies to A) —
|
|
363
|
+
// every other case above already resolved or reported its comment and
|
|
364
|
+
// removed it from `pending`. Skipped rather than imported top-level:
|
|
365
|
+
// unlike a missing parent, there is no honest single choice for which
|
|
366
|
+
// one to break the cycle at.
|
|
367
|
+
for (const wpId of pending) {
|
|
368
|
+
acc.warnings.push(`Comment ${wpId} on "${itemTitle}" is part of a reply cycle in the export and was skipped.`);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
206
371
|
for (const item of posts) {
|
|
207
372
|
const id = await writeEntry(item, postStore, 'post');
|
|
208
373
|
if (id !== null) {
|
|
209
374
|
acc.imported.posts += 1;
|
|
375
|
+
await record('post', item.postId, id);
|
|
376
|
+
if (options.comments !== undefined) {
|
|
377
|
+
await importCommentsForEntry(item.comments, wpPost.name, id, item.title);
|
|
378
|
+
continue;
|
|
379
|
+
}
|
|
210
380
|
for (const comment of item.comments) {
|
|
211
381
|
if (comment.approved !== APPROVED)
|
|
212
382
|
continue;
|
|
213
|
-
await commentStore.create({
|
|
383
|
+
const createdComment = await commentStore.create({
|
|
214
384
|
status: 'published',
|
|
215
385
|
values: {
|
|
216
386
|
post: id,
|
|
@@ -221,13 +391,36 @@ export async function importWordPress(xml, options) {
|
|
|
221
391
|
},
|
|
222
392
|
});
|
|
223
393
|
acc.imported.comments += 1;
|
|
394
|
+
await record('comment', comment.id, createdComment.id);
|
|
224
395
|
}
|
|
225
396
|
}
|
|
226
397
|
}
|
|
227
398
|
for (const item of pages) {
|
|
228
399
|
const id = await writeEntry(item, pageStore, 'page');
|
|
229
|
-
if (id !== null)
|
|
400
|
+
if (id !== null) {
|
|
230
401
|
acc.imported.pages += 1;
|
|
402
|
+
await record('page', item.postId, id);
|
|
403
|
+
// A real, independent bug (fiche 15 task 7's own instruction to check
|
|
404
|
+
// what this importer does today): WordPress allows comments on a
|
|
405
|
+
// page exactly as it does on a post, and this loop never imported a
|
|
406
|
+
// single one. Fixed here for the real store path. The legacy
|
|
407
|
+
// synthetic `comment` collection (`collections.ts`'s `wpComment`)
|
|
408
|
+
// cannot be fixed the same way: its `post` field is a hard `relation`
|
|
409
|
+
// to the `post` collection specifically (contract A, `onDelete:
|
|
410
|
+
// 'cascade'`), so writing a page's id there is not a bug fix, it is a
|
|
411
|
+
// foreign-key violation waiting to happen — the real reason to prefer
|
|
412
|
+
// the `comments` option instead of extending a model that was never
|
|
413
|
+
// built to hold this.
|
|
414
|
+
if (options.comments !== undefined) {
|
|
415
|
+
await importCommentsForEntry(item.comments, wpPage.name, id, item.title);
|
|
416
|
+
}
|
|
417
|
+
else if (item.comments.length > 0) {
|
|
418
|
+
acc.warnings.push(`"${item.title}" has ${item.comments.length} comment(s) that were not imported: the legacy comment model only supports comments on posts. Pass a \`comments\` store to import them.`);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
if (options.tracking !== undefined && options.runId !== undefined && done.size > 0) {
|
|
423
|
+
acc.warnings.push(`Resumed: ${done.size} item(s) already imported by an earlier attempt of this run were not re-created.`);
|
|
231
424
|
}
|
|
232
425
|
const skipped = acc.skipped;
|
|
233
426
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/wordpress/import.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/wordpress/import.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { lookup } from 'node:dns/promises';
|
|
1
2
|
import type { MediaAsset, MediaStore, StorageDriver } from '@cogenta/core';
|
|
2
3
|
export interface MediaDownloadFailure {
|
|
3
4
|
readonly url: string;
|
|
@@ -14,6 +15,8 @@ export interface DownloadAndStoreMediaOptions {
|
|
|
14
15
|
readonly createdBy: string | null;
|
|
15
16
|
/** Injected for tests — real `fetch` by default. */
|
|
16
17
|
readonly fetchImpl?: typeof fetch;
|
|
18
|
+
/** Injected for tests — real `dns.lookup` by default. */
|
|
19
|
+
readonly lookupImpl?: typeof lookup;
|
|
17
20
|
}
|
|
18
21
|
/**
|
|
19
22
|
* Downloads every distinct media URL a WXR import references and stores it
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/wordpress/media.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/wordpress/media.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE1C,OAAO,KAAK,EAAoB,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAG5F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClD,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAA;IACxC,QAAQ,CAAC,MAAM,EAAE,SAAS,oBAAoB,EAAE,CAAA;CACjD;AAYD,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;IAC/B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,oDAAoD;IACpD,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;IACjC,yDAAyD;IACzD,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,MAAM,CAAA;CACpC;AAmBD;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,iBAAiB,CAAC,CAwE5B"}
|
package/dist/wordpress/media.js
CHANGED
|
@@ -1,4 +1,15 @@
|
|
|
1
|
+
import { lookup } from 'node:dns/promises';
|
|
1
2
|
import { basename } from 'node:path';
|
|
3
|
+
import { assertPublicUrl } from '../ssrf.js';
|
|
4
|
+
/**
|
|
5
|
+
* Caps on the outbound side of an import (pièges connus: SSRF, and a
|
|
6
|
+
* multi-gigabyte "media" response tying up the process). Both are limits a
|
|
7
|
+
* real WordPress export can comfortably stay under; a file or count beyond
|
|
8
|
+
* them is reported as a failure per item, never a reason to abort the run.
|
|
9
|
+
*/
|
|
10
|
+
const MAX_MEDIA_BYTES = 50 * 1024 * 1024;
|
|
11
|
+
const MAX_MEDIA_ITEMS = 5000;
|
|
12
|
+
const FETCH_TIMEOUT_MS = 15_000;
|
|
2
13
|
function filenameFrom(url) {
|
|
3
14
|
try {
|
|
4
15
|
const path = new URL(url).pathname;
|
|
@@ -31,15 +42,41 @@ export async function downloadAndStoreMedia(urls, options) {
|
|
|
31
42
|
const urlToMediaId = new Map();
|
|
32
43
|
const imported = [];
|
|
33
44
|
const failed = [];
|
|
34
|
-
|
|
45
|
+
const distinct = [...new Set(urls)];
|
|
46
|
+
const overflow = distinct.slice(MAX_MEDIA_ITEMS);
|
|
47
|
+
for (const url of overflow) {
|
|
48
|
+
failed.push({
|
|
49
|
+
url,
|
|
50
|
+
reason: `More than ${MAX_MEDIA_ITEMS} distinct media URLs; this one was not fetched.`,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
for (const url of distinct.slice(0, MAX_MEDIA_ITEMS)) {
|
|
35
54
|
try {
|
|
36
|
-
|
|
55
|
+
await assertPublicUrl(url, { lookupImpl: options.lookupImpl ?? lookup });
|
|
56
|
+
const controller = new AbortController();
|
|
57
|
+
const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
58
|
+
let response;
|
|
59
|
+
try {
|
|
60
|
+
response = await doFetch(url, { signal: controller.signal });
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
clearTimeout(timeout);
|
|
64
|
+
}
|
|
37
65
|
if (!response.ok) {
|
|
38
66
|
failed.push({ url, reason: `HTTP ${response.status}` });
|
|
39
67
|
continue;
|
|
40
68
|
}
|
|
69
|
+
const declaredLength = Number(response.headers.get('content-length') ?? '');
|
|
70
|
+
if (Number.isFinite(declaredLength) && declaredLength > MAX_MEDIA_BYTES) {
|
|
71
|
+
failed.push({ url, reason: `Larger than the ${MAX_MEDIA_BYTES} byte limit.` });
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
41
74
|
const mimeType = response.headers.get('content-type')?.split(';')[0]?.trim() ?? 'application/octet-stream';
|
|
42
75
|
const buffer = Buffer.from(await response.arrayBuffer());
|
|
76
|
+
if (buffer.byteLength > MAX_MEDIA_BYTES) {
|
|
77
|
+
failed.push({ url, reason: `Larger than the ${MAX_MEDIA_BYTES} byte limit.` });
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
43
80
|
const filename = filenameFrom(url);
|
|
44
81
|
const storageKey = `imports/wordpress/${Date.now()}-${Math.random().toString(36).slice(2)}-${filename}`;
|
|
45
82
|
await options.storage.put(storageKey, buffer, { contentType: mimeType });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/wordpress/media.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/wordpress/media.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cogenta/import",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Importers that bring content from another CMS into Cogenta, starting with WordPress WXR.",
|
|
5
5
|
"license": "MPL-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -27,10 +27,11 @@
|
|
|
27
27
|
"directory": "packages/import"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@cogenta/
|
|
31
|
-
"@cogenta/
|
|
32
|
-
"@cogenta/auth": "0.
|
|
33
|
-
"@cogenta/
|
|
30
|
+
"@cogenta/blocks": "1.0.2",
|
|
31
|
+
"@cogenta/core": "0.7.0",
|
|
32
|
+
"@cogenta/auth": "0.5.1",
|
|
33
|
+
"@cogenta/schema": "0.5.0",
|
|
34
|
+
"@cogenta/comments": "0.2.2"
|
|
34
35
|
},
|
|
35
36
|
"devDependencies": {
|
|
36
37
|
"typescript": "^7.0.2",
|