@geekity/plugin-wordpress 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +232 -9
  2. package/dist/bundle/index.js +24475 -2130
  3. package/dist/bundle/plugin.json +2 -2
  4. package/dist/comments-import.d.ts +3 -0
  5. package/dist/comments-import.d.ts.map +1 -0
  6. package/dist/comments-import.js +246 -0
  7. package/dist/comments-import.js.map +1 -0
  8. package/dist/content-command.d.ts +3 -0
  9. package/dist/content-command.d.ts.map +1 -0
  10. package/dist/content-command.js +100 -0
  11. package/dist/content-command.js.map +1 -0
  12. package/dist/content-import.d.ts +55 -0
  13. package/dist/content-import.d.ts.map +1 -0
  14. package/dist/content-import.js +299 -0
  15. package/dist/content-import.js.map +1 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +6 -1
  18. package/dist/index.js.map +1 -1
  19. package/dist/media-import.d.ts +3 -0
  20. package/dist/media-import.d.ts.map +1 -0
  21. package/dist/media-import.js +89 -0
  22. package/dist/media-import.js.map +1 -0
  23. package/dist/media-redirect.d.ts +4 -0
  24. package/dist/media-redirect.d.ts.map +1 -0
  25. package/dist/media-redirect.js +28 -0
  26. package/dist/media-redirect.js.map +1 -0
  27. package/dist/media.d.ts +14 -0
  28. package/dist/media.d.ts.map +1 -0
  29. package/dist/media.js +102 -0
  30. package/dist/media.js.map +1 -0
  31. package/dist/posts-import.d.ts +34 -0
  32. package/dist/posts-import.d.ts.map +1 -0
  33. package/dist/posts-import.js +304 -0
  34. package/dist/posts-import.js.map +1 -0
  35. package/dist/version.d.ts +1 -1
  36. package/dist/version.js +1 -1
  37. package/dist/wordpress-html.d.ts +7 -0
  38. package/dist/wordpress-html.d.ts.map +1 -0
  39. package/dist/wordpress-html.js +360 -0
  40. package/dist/wordpress-html.js.map +1 -0
  41. package/dist/wxr.d.ts +80 -0
  42. package/dist/wxr.d.ts.map +1 -0
  43. package/dist/wxr.js +212 -0
  44. package/dist/wxr.js.map +1 -0
  45. package/package.json +8 -4
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@geekity/plugin-wordpress",
3
- "version": "0.1.1",
3
+ "version": "0.3.0",
4
4
  "hostApi": 1,
5
5
  "peerDependencies": {
6
- "@geekity/cms": ">=0.27.0 <1.0.0"
6
+ "@geekity/cms": ">=0.30.0 <1.0.0"
7
7
  }
8
8
  }
@@ -0,0 +1,3 @@
1
+ import type { WordPressImporter } from './content-import.ts';
2
+ export declare const commentsAndReactions: WordPressImporter;
3
+ //# sourceMappingURL=comments-import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments-import.d.ts","sourceRoot":"","sources":["../src/comments-import.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAIV,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAM7B,eAAO,MAAM,oBAAoB,EAAE,iBAGlC,CAAC"}
@@ -0,0 +1,246 @@
1
+ import { repliesKey, webmentionKey } from '@geekity/cms/plugin';
2
+ import { wordPressMedia } from './media.js';
3
+ import { placements } from './posts-import.js';
4
+ import { convertBody } from './wordpress-html.js';
5
+ export const commentsAndReactions = {
6
+ postTypes: [],
7
+ import: importComments,
8
+ };
9
+ const KINDS_BY_COMMENT_TYPE = {
10
+ comment: 'reply',
11
+ like: 'like',
12
+ repost: 'repost',
13
+ mention: 'mention',
14
+ bookmark: 'mention',
15
+ webmention: 'mention',
16
+ pingback: 'mention',
17
+ trackback: 'mention',
18
+ };
19
+ const LINKBACKS = new Set(['pingback', 'trackback']);
20
+ const STATUSES = {
21
+ '1': 'approved',
22
+ '0': 'pending',
23
+ };
24
+ const LEFT_OUT = {
25
+ spam: 'spam on WordPress',
26
+ trash: 'in the WordPress trash',
27
+ 'post-trashed': 'on a post in the WordPress trash',
28
+ };
29
+ function importComments(exported, context) {
30
+ const media = wordPressMedia(exported, context.options['origins']);
31
+ const origin = new URL(context.site.baseUrl).origin;
32
+ const markdownOf = (html) => media.rewrite(convertBody(html).markdown, origin);
33
+ const permalinks = new Map();
34
+ for (const placement of placements(exported)) {
35
+ if ('permalink' in placement)
36
+ permalinks.set(placement.item, placement.permalink);
37
+ }
38
+ // Who wrote it signed in: the WordPress user's login, when this site has a
39
+ // user by that name, the rule a post's author is mapped by.
40
+ const usernames = new Set(context.site.users().map((user) => user.username));
41
+ const users = new Map(exported.authors
42
+ .filter((author) => usernames.has(author.login))
43
+ .map((author) => [author.id, author.login]));
44
+ const actors = remoteActors(exported);
45
+ const comments = [];
46
+ const notes = [];
47
+ for (const item of exported.items) {
48
+ if (item.comments.length === 0)
49
+ continue;
50
+ const permalink = permalinks.get(item);
51
+ if (permalink === undefined) {
52
+ const where = item.type === 'post' || item.type === 'page'
53
+ ? 'a post the import leaves out'
54
+ : `a ${item.type}, which takes no comments here`;
55
+ for (const comment of item.comments) {
56
+ notes.push({ item, outcome: 'skipped', why: `${labelOf(comment)}: on ${where}` });
57
+ }
58
+ continue;
59
+ }
60
+ const mapped = mapComments(item, permalink, markdownOf, users, actors);
61
+ notes.push(...mapped.notes);
62
+ comments.push(...mapped.comments);
63
+ }
64
+ return { files: [], notes, comments };
65
+ }
66
+ function mapComments(item, permalink, markdownOf, users, actors) {
67
+ const notes = [];
68
+ const kept = [];
69
+ for (const wordPress of [...item.comments].sort((a, b) => a.id - b.id)) {
70
+ const type = wordPress.type === '' ? 'comment' : wordPress.type;
71
+ const named = KINDS_BY_COMMENT_TYPE[type];
72
+ const status = STATUSES[wordPress.approved];
73
+ if (named === undefined || status === undefined) {
74
+ const why = named === undefined
75
+ ? `comment type "${type}", which this import does not know`
76
+ : (LEFT_OUT[wordPress.approved] ?? `WordPress status "${wordPress.approved}"`);
77
+ notes.push({ item, outcome: 'skipped', why: `${labelOf(wordPress)}: ${why}` });
78
+ continue;
79
+ }
80
+ const source = sourceOf(wordPress, type);
81
+ const kind = kindOf(source, named);
82
+ const says = kind === 'reply' || kind === 'mention';
83
+ const name = nameOf(wordPress);
84
+ const url = urlOf(wordPress, type, source, kind);
85
+ const origin = originOf(wordPress, source, url);
86
+ const formerId = `${item.guid}#comment-${String(wordPress.id)}`;
87
+ const user = users.get(wordPress.userId);
88
+ const actor = source === 'activitypub'
89
+ ? actors.get(metaOf(wordPress, '_activitypub_remote_actor_id'))
90
+ : undefined;
91
+ kept.push({
92
+ wordPress,
93
+ formerId,
94
+ comment: {
95
+ id: keyOf(source, origin, permalink, formerId),
96
+ source,
97
+ kind,
98
+ status,
99
+ author: {
100
+ name,
101
+ url: wordPress.authorUrl || null,
102
+ email: source === 'comment' && wordPress.authorEmail !== '' ? wordPress.authorEmail : null,
103
+ avatar: metaOf(wordPress, 'avatar') || (actor?.avatar ?? null),
104
+ },
105
+ markdown: says ? markdownOf(wordPress.content) : '',
106
+ submitted: instantOf(wordPress.dateGmt ?? item.dateGmt),
107
+ inReplyTo: null,
108
+ url,
109
+ migrated: true,
110
+ ...(origin === undefined ? {} : { origin }),
111
+ ...(user === undefined ? {} : { user }),
112
+ ...(actor === undefined ? {} : { actor: actor.id }),
113
+ },
114
+ label: `${labelOf(wordPress)}, a ${kind} by ${name}`,
115
+ });
116
+ }
117
+ const replies = new Map(kept
118
+ .filter(({ comment }) => comment.kind === 'reply')
119
+ .map(({ wordPress, comment }) => [wordPress.id, comment.id]));
120
+ const comments = kept.map(({ wordPress, comment, formerId, label }) => {
121
+ const imported = { item, permalink, formerId, label };
122
+ const { parent } = wordPress;
123
+ if (parent === 0)
124
+ return { ...imported, comment };
125
+ const inReplyTo = replies.get(parent);
126
+ if (inReplyTo !== undefined)
127
+ return { ...imported, comment: { ...comment, inReplyTo } };
128
+ notes.push({
129
+ item,
130
+ outcome: 'warned',
131
+ why: `${labelOf(wordPress)}: answers comment ${String(parent)}, which is not an imported reply; shown under the post`,
132
+ });
133
+ return { ...imported, comment };
134
+ });
135
+ return { comments, notes };
136
+ }
137
+ /** Each `ap_actor` item whose content is an actor, by its post id, which `_activitypub_remote_actor_id` names. */
138
+ function remoteActors(exported) {
139
+ const actors = new Map();
140
+ for (const item of exported.items) {
141
+ if (item.type !== 'ap_actor')
142
+ continue;
143
+ const actor = actorJson(item.content);
144
+ if (actor === undefined || typeof actor['id'] !== 'string')
145
+ continue;
146
+ actors.set(String(item.id), { id: actor['id'], avatar: iconUrl(actor['icon']) });
147
+ }
148
+ return actors;
149
+ }
150
+ function actorJson(content) {
151
+ try {
152
+ const parsed = JSON.parse(content);
153
+ return isObject(parsed) ? parsed : undefined;
154
+ }
155
+ catch {
156
+ return undefined;
157
+ }
158
+ }
159
+ /** An actor's `icon`: an Image's `url`, a Link's `href`, or the first of several that has one. */
160
+ function iconUrl(icon) {
161
+ if (typeof icon === 'string')
162
+ return icon === '' ? null : icon;
163
+ if (Array.isArray(icon)) {
164
+ for (const each of icon) {
165
+ const url = iconUrl(each);
166
+ if (url !== null)
167
+ return url;
168
+ }
169
+ return null;
170
+ }
171
+ if (!isObject(icon))
172
+ return null;
173
+ return iconUrl(icon['url']) ?? iconUrl(icon['href']);
174
+ }
175
+ function isObject(value) {
176
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
177
+ }
178
+ function kindOf(source, named) {
179
+ return source === 'activitypub' && named === 'repost' ? 'boost' : named;
180
+ }
181
+ function sourceOf(comment, type) {
182
+ const protocol = metaOf(comment, 'protocol');
183
+ if (protocol === 'activitypub')
184
+ return 'activitypub';
185
+ if (protocol === 'webmention' || LINKBACKS.has(type))
186
+ return 'webmention';
187
+ return type === 'comment' ? 'comment' : 'webmention';
188
+ }
189
+ function urlOf(comment, type, source, kind) {
190
+ switch (source) {
191
+ case 'comment':
192
+ return null;
193
+ case 'activitypub':
194
+ return kind === 'reply'
195
+ ? metaOf(comment, 'source_url') || metaOf(comment, 'source_id') || null
196
+ : null;
197
+ case 'webmention':
198
+ return (metaOf(comment, 'webmention_source_url') ||
199
+ (LINKBACKS.has(type) ? comment.authorUrl : metaOf(comment, 'source_url')) ||
200
+ null);
201
+ }
202
+ }
203
+ /**
204
+ * Its name where it was first published: the note a fediverse reply is, or
205
+ * the activity a like or boost is; the page a webmention was sent from. A
206
+ * form comment has none.
207
+ */
208
+ function originOf(comment, source, url) {
209
+ switch (source) {
210
+ case 'comment':
211
+ return undefined;
212
+ case 'activitypub':
213
+ return metaOf(comment, 'source_id') || undefined;
214
+ case 'webmention':
215
+ return url ?? (metaOf(comment, 'source_id') || undefined);
216
+ }
217
+ }
218
+ /**
219
+ * The key the site would give the same comment arriving here itself
220
+ * (decision-51), so a resend or a redelivery is the comment it already holds.
221
+ * A form comment, which arrived nowhere else, has the key of its WordPress
222
+ * URL.
223
+ */
224
+ function keyOf(source, origin, permalink, formerId) {
225
+ if (origin === undefined)
226
+ return repliesKey(formerId);
227
+ return source === 'webmention'
228
+ ? (webmentionKey(origin, permalink) ?? repliesKey(formerId))
229
+ : repliesKey(origin);
230
+ }
231
+ function nameOf(comment) {
232
+ const name = comment.author.trim();
233
+ if (name !== '')
234
+ return name;
235
+ return URL.canParse(comment.authorUrl) ? new URL(comment.authorUrl).hostname : 'Anonymous';
236
+ }
237
+ function labelOf(comment) {
238
+ return `comment ${String(comment.id)}`;
239
+ }
240
+ function metaOf(comment, key) {
241
+ return comment.meta.find((meta) => meta.key === key)?.value.trim() ?? '';
242
+ }
243
+ function instantOf(date) {
244
+ return date === undefined ? '' : new Date(date).toISOString();
245
+ }
246
+ //# sourceMappingURL=comments-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments-import.js","sourceRoot":"","sources":["../src/comments-import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PluginCommand, PluginDataFolder } from '@geekity/cms/plugin';
2
+ export declare function contentImportCommand(data: PluginDataFolder): PluginCommand;
3
+ //# sourceMappingURL=content-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-command.d.ts","sourceRoot":"","sources":["../src/content-command.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAwB,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAYjG,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,GAAG,aAAa,CAsB1E"}
@@ -0,0 +1,100 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { importWordPressContent } from './content-import.js';
4
+ import { commentsAndReactions } from './comments-import.js';
5
+ import { attachments } from './media-import.js';
6
+ import { postsAndPages } from './posts-import.js';
7
+ import { NotAWordPressExportError, parseWordPressExport } from './wxr.js';
8
+ const IMPORTERS = [postsAndPages, attachments, commentsAndReactions];
9
+ export function contentImportCommand(data) {
10
+ return {
11
+ words: ['import', 'wordpress'],
12
+ usage: '<export.xml> [--uploads <directory>] [--origins <url,…>]',
13
+ summary: 'Bring the posts, pages, media, reactions and redirects of a WordPress export (Tools > Export) into the content directory. Rerunnable; never overwrites a file the import did not write.',
14
+ options: [
15
+ {
16
+ name: 'uploads',
17
+ value: '<directory>',
18
+ description: "A copy of the site's wp-content/uploads. Each attachment's original is copied from it into content/uploads/ at the same path. Left off, no media is copied and the report names each attachment.",
19
+ },
20
+ {
21
+ name: 'origins',
22
+ value: '<url,…>',
23
+ description: "Other origins the posts wrote media URLs on, such as the staging host the site was built on, comma-separated. URLs on the export's own origin are always rewritten.",
24
+ },
25
+ ],
26
+ run: (context) => run(context, data),
27
+ };
28
+ }
29
+ async function run(context, data) {
30
+ const given = context.args[0];
31
+ if (given === undefined) {
32
+ throw new Error('geekity import wordpress <export.xml> needs the file WordPress wrote under Tools > Export.');
33
+ }
34
+ const exported = await readExport(given, path.resolve(context.cwd, given));
35
+ const report = await importWordPressContent({ exported, context, data, importers: IMPORTERS });
36
+ context.write(formatReport(given, context.site.contentDir, report));
37
+ return 0;
38
+ }
39
+ async function readExport(given, file) {
40
+ let xml;
41
+ try {
42
+ xml = await readFile(file, 'utf8');
43
+ }
44
+ catch (error) {
45
+ throw new Error(`${given} could not be read: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
46
+ }
47
+ try {
48
+ return parseWordPressExport(xml);
49
+ }
50
+ catch (error) {
51
+ if (!(error instanceof NotAWordPressExportError))
52
+ throw error;
53
+ throw new Error([`${given} is not a WordPress export:`, ...error.problems.map((line) => ` ${line}`)].join('\n'), { cause: error });
54
+ }
55
+ }
56
+ const OUTCOMES = [
57
+ 'written',
58
+ 'unchanged',
59
+ 'kept',
60
+ 'conflict',
61
+ 'clash',
62
+ 'skipped',
63
+ 'warned',
64
+ ];
65
+ function formatReport(given, contentDir, report) {
66
+ const count = (values) => {
67
+ const counts = new Map();
68
+ for (const value of values)
69
+ counts.set(value, (counts.get(value) ?? 0) + 1);
70
+ return counts;
71
+ };
72
+ const outcomes = count(report.rows.map((row) => row.outcome));
73
+ const skippedTypes = count(report.rows.filter((row) => row.outcome === 'skipped').map((row) => row.item.type));
74
+ const lines = [
75
+ `Imported ${given} into ${contentDir}`,
76
+ ` ${OUTCOMES.map((outcome) => `${String(outcomes.get(outcome) ?? 0)} ${outcome}`).join(', ')}`,
77
+ ];
78
+ if (skippedTypes.size > 0) {
79
+ lines.push(` skipped by type: ${[...skippedTypes]
80
+ .sort(([a], [b]) => (a < b ? -1 : 1))
81
+ .map(([type, n]) => `${type} ${String(n)}`)
82
+ .join(', ')}`);
83
+ }
84
+ if ((outcomes.get('conflict') ?? 0) + (outcomes.get('clash') ?? 0) > 0) {
85
+ lines.push(' Conflicts and clashes were left as they are on this site. Resolve each by hand, or remove the file and run the import again.');
86
+ }
87
+ lines.push('', ['outcome', 'type', 'id', 'title', 'path', 'why'].join('\t'));
88
+ for (const row of report.rows) {
89
+ lines.push([
90
+ row.outcome,
91
+ row.item.type,
92
+ String(row.item.id),
93
+ row.item.title.replace(/\s+/g, ' '),
94
+ row.path ?? '',
95
+ row.why,
96
+ ].join('\t'));
97
+ }
98
+ return `${lines.join('\n')}\n`;
99
+ }
100
+ //# sourceMappingURL=content-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-command.js","sourceRoot":"","sources":["../src/content-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAG1E,MAAM,SAAS,GAAiC,CAAC,aAAa,EAAE,WAAW,EAAE,oBAAoB,CAAC,CAAC;AAEnG,MAAM,UAAU,oBAAoB,CAAC,IAAsB;IACzD,OAAO;QACL,KAAK,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;QAC9B,KAAK,EAAE,0DAA0D;QACjE,OAAO,EACL,yLAAyL;QAC3L,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,aAAa;gBACpB,WAAW,EACT,kMAAkM;aACrM;YACD;gBACE,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,SAAS;gBAChB,WAAW,EACT,qKAAqK;aACxK;SACF;QACD,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,OAA6B,EAAE,IAAsB;IACtE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,4FAA4F,CAC7F,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/F,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,KAAa,EAAE,IAAY;IACnD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,uBAAuB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACvF,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,KAAK,YAAY,wBAAwB,CAAC;YAAE,MAAM,KAAK,CAAC;QAC9D,MAAM,IAAI,KAAK,CACb,CAAC,GAAG,KAAK,6BAA6B,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CACxF,IAAI,CACL,EACD,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,QAAQ,GAAuB;IACnC,SAAS;IACT,WAAW;IACX,MAAM;IACN,UAAU;IACV,OAAO;IACP,SAAS;IACT,QAAQ;CACT,CAAC;AAEF,SAAS,YAAY,CAAC,KAAa,EAAE,UAAkB,EAAE,MAAoB;IAC3E,MAAM,KAAK,GAAG,CAAC,MAAyB,EAAuB,EAAE;QAC/D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5E,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,KAAK,CACxB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CACnF,CAAC;IAEF,MAAM,KAAK,GAAG;QACZ,YAAY,KAAK,SAAS,UAAU,EAAE;QACtC,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KAChG,CAAC;IACF,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CACR,sBAAsB,CAAC,GAAG,YAAY,CAAC;aACpC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACpC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACvE,KAAK,CAAC,IAAI,CACR,gIAAgI,CACjI,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7E,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CACR;YACE,GAAG,CAAC,OAAO;YACX,GAAG,CAAC,IAAI,CAAC,IAAI;YACb,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;YACnC,GAAG,CAAC,IAAI,IAAI,EAAE;YACd,GAAG,CAAC,GAAG;SACR,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC"}
@@ -0,0 +1,55 @@
1
+ import type { PluginCommandContext, PluginComment, PluginDataFolder } from '@geekity/cms/plugin';
2
+ import type { WordPressExport, WordPressItem } from './wxr.ts';
3
+ export interface ImportedFile {
4
+ readonly item: WordPressItem;
5
+ readonly path: string;
6
+ readonly contents: string | Uint8Array;
7
+ }
8
+ export interface ItemNote {
9
+ readonly item: WordPressItem;
10
+ readonly outcome: 'skipped' | 'warned';
11
+ readonly why: string;
12
+ }
13
+ export interface DataEntry {
14
+ readonly item: WordPressItem;
15
+ readonly file: string;
16
+ readonly key: string;
17
+ readonly value: unknown;
18
+ }
19
+ export interface ImportedComment {
20
+ readonly item: WordPressItem;
21
+ readonly permalink: string;
22
+ readonly comment: PluginComment;
23
+ /** Its id as plugin-wordpress 0.2.0 wrote it: its WordPress URL, `{guid}#comment-N`. */
24
+ readonly formerId: string;
25
+ readonly label: string;
26
+ }
27
+ export interface ImporterOutput {
28
+ readonly files: readonly ImportedFile[];
29
+ readonly notes: readonly ItemNote[];
30
+ readonly entries?: readonly DataEntry[] | undefined;
31
+ readonly comments?: readonly ImportedComment[] | undefined;
32
+ }
33
+ export interface WordPressImporter {
34
+ readonly postTypes: readonly string[];
35
+ import(exported: WordPressExport, context: PluginCommandContext): ImporterOutput | Promise<ImporterOutput>;
36
+ }
37
+ export type Outcome = 'written' | 'unchanged' | 'kept' | 'conflict' | 'clash' | 'skipped' | 'warned';
38
+ export interface ReportRow {
39
+ readonly outcome: Outcome;
40
+ readonly item: WordPressItem;
41
+ readonly path?: string | undefined;
42
+ readonly why: string;
43
+ }
44
+ export interface ImportReport {
45
+ readonly rows: readonly ReportRow[];
46
+ }
47
+ export declare const IMPORT_RECORD_FILE = "import.json";
48
+ export declare const IMPORT_REDIRECTS_FILE = "_data/redirects/wordpress.json";
49
+ export declare function importWordPressContent(options: {
50
+ exported: WordPressExport;
51
+ context: PluginCommandContext;
52
+ data: PluginDataFolder;
53
+ importers: readonly WordPressImporter[];
54
+ }): Promise<ImportReport>;
55
+ //# sourceMappingURL=content-import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-import.d.ts","sourceRoot":"","sources":["../src/content-import.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,gBAAgB,EAEjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC;CACxC;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,GAAG,QAAQ,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,wFAAwF;IACxF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,eAAe,EAAE,GAAG,SAAS,CAAC;CAC5D;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,MAAM,CACJ,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,oBAAoB,GAC5B,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAC7C;AA2BD,MAAM,MAAM,OAAO,GACjB,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEjF,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,CAAC;CACrC;AAED,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAEhD,eAAO,MAAM,qBAAqB,mCAAmC,CAAC;AAEtE,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,oBAAoB,CAAC;IAC9B,IAAI,EAAE,gBAAgB,CAAC;IACvB,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACzC,GAAG,OAAO,CAAC,YAAY,CAAC,CAqDxB"}