@geekity/plugin-wordpress 0.1.0 → 0.2.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 +174 -9
  2. package/dist/bundle/index.js +24337 -2098
  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 +155 -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 +53 -0
  13. package/dist/content-import.d.ts.map +1 -0
  14. package/dist/content-import.js +251 -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 +301 -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 +11 -4
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@geekity/plugin-wordpress",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "hostApi": 1,
5
5
  "peerDependencies": {
6
- "@geekity/cms": "^0.25.0"
6
+ "@geekity/cms": ">=0.28.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":"AAEA,OAAO,KAAK,EAIV,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAM7B,eAAO,MAAM,oBAAoB,EAAE,iBAGlC,CAAC"}
@@ -0,0 +1,155 @@
1
+ import { wordPressMedia } from './media.js';
2
+ import { placements } from './posts-import.js';
3
+ import { convertBody } from './wordpress-html.js';
4
+ export const commentsAndReactions = {
5
+ postTypes: [],
6
+ import: importComments,
7
+ };
8
+ const KINDS_BY_COMMENT_TYPE = {
9
+ comment: 'reply',
10
+ like: 'like',
11
+ repost: 'repost',
12
+ mention: 'mention',
13
+ bookmark: 'mention',
14
+ webmention: 'mention',
15
+ pingback: 'mention',
16
+ trackback: 'mention',
17
+ };
18
+ const LINKBACKS = new Set(['pingback', 'trackback']);
19
+ const STATUSES = {
20
+ '1': 'approved',
21
+ '0': 'pending',
22
+ };
23
+ const LEFT_OUT = {
24
+ spam: 'spam on WordPress',
25
+ trash: 'in the WordPress trash',
26
+ 'post-trashed': 'on a post in the WordPress trash',
27
+ };
28
+ function importComments(exported, context) {
29
+ const media = wordPressMedia(exported, context.options['origins']);
30
+ const origin = new URL(context.site.baseUrl).origin;
31
+ const markdownOf = (html) => media.rewrite(convertBody(html).markdown, origin);
32
+ const permalinks = new Map();
33
+ for (const placement of placements(exported)) {
34
+ if ('permalink' in placement)
35
+ permalinks.set(placement.item, placement.permalink);
36
+ }
37
+ const comments = [];
38
+ const notes = [];
39
+ for (const item of exported.items) {
40
+ if (item.comments.length === 0)
41
+ continue;
42
+ const permalink = permalinks.get(item);
43
+ if (permalink === undefined) {
44
+ const where = item.type === 'post' || item.type === 'page'
45
+ ? 'a post the import leaves out'
46
+ : `a ${item.type}, which takes no comments here`;
47
+ for (const comment of item.comments) {
48
+ notes.push({ item, outcome: 'skipped', why: `${labelOf(comment)}: on ${where}` });
49
+ }
50
+ continue;
51
+ }
52
+ const mapped = mapComments(item, markdownOf);
53
+ notes.push(...mapped.notes);
54
+ comments.push(...mapped.comments.map((comment) => ({ ...comment, permalink })));
55
+ }
56
+ return { files: [], notes, comments };
57
+ }
58
+ function mapComments(item, markdownOf) {
59
+ const idOf = (comment) => `${item.guid}#comment-${String(comment)}`;
60
+ const notes = [];
61
+ const kept = [];
62
+ for (const wordPress of [...item.comments].sort((a, b) => a.id - b.id)) {
63
+ const type = wordPress.type === '' ? 'comment' : wordPress.type;
64
+ const named = KINDS_BY_COMMENT_TYPE[type];
65
+ const status = STATUSES[wordPress.approved];
66
+ if (named === undefined || status === undefined) {
67
+ const why = named === undefined
68
+ ? `comment type "${type}", which this import does not know`
69
+ : (LEFT_OUT[wordPress.approved] ?? `WordPress status "${wordPress.approved}"`);
70
+ notes.push({ item, outcome: 'skipped', why: `${labelOf(wordPress)}: ${why}` });
71
+ continue;
72
+ }
73
+ const source = sourceOf(wordPress, type);
74
+ const kind = kindOf(source, named);
75
+ const says = kind === 'reply' || kind === 'mention';
76
+ const name = nameOf(wordPress);
77
+ kept.push({
78
+ wordPress,
79
+ comment: {
80
+ id: idOf(wordPress.id),
81
+ source,
82
+ kind,
83
+ status,
84
+ author: {
85
+ name,
86
+ url: wordPress.authorUrl || null,
87
+ email: source === 'comment' && wordPress.authorEmail !== '' ? wordPress.authorEmail : null,
88
+ avatar: metaOf(wordPress, 'avatar') || null,
89
+ },
90
+ markdown: says ? markdownOf(wordPress.content) : '',
91
+ submitted: instantOf(wordPress.dateGmt ?? item.dateGmt),
92
+ inReplyTo: null,
93
+ url: urlOf(wordPress, type, source, kind),
94
+ },
95
+ label: `${labelOf(wordPress)}, a ${kind} by ${name}`,
96
+ });
97
+ }
98
+ const kinds = new Map(kept.map(({ wordPress, comment }) => [wordPress.id, comment.kind]));
99
+ const comments = kept.map(({ wordPress, comment, label }) => {
100
+ const { parent } = wordPress;
101
+ if (parent === 0)
102
+ return { item, comment, label };
103
+ if (kinds.get(parent) === 'reply') {
104
+ return { item, comment: { ...comment, inReplyTo: idOf(parent) }, label };
105
+ }
106
+ notes.push({
107
+ item,
108
+ outcome: 'warned',
109
+ why: `${labelOf(wordPress)}: answers comment ${String(parent)}, which is not an imported reply; shown under the post`,
110
+ });
111
+ return { item, comment, label };
112
+ });
113
+ return { comments, notes };
114
+ }
115
+ function kindOf(source, named) {
116
+ return source === 'activitypub' && named === 'repost' ? 'boost' : named;
117
+ }
118
+ function sourceOf(comment, type) {
119
+ const protocol = metaOf(comment, 'protocol');
120
+ if (protocol === 'activitypub')
121
+ return 'activitypub';
122
+ if (protocol === 'webmention' || LINKBACKS.has(type))
123
+ return 'webmention';
124
+ return type === 'comment' ? 'comment' : 'webmention';
125
+ }
126
+ function urlOf(comment, type, source, kind) {
127
+ switch (source) {
128
+ case 'comment':
129
+ return null;
130
+ case 'activitypub':
131
+ return kind === 'reply'
132
+ ? metaOf(comment, 'source_url') || metaOf(comment, 'source_id') || null
133
+ : null;
134
+ case 'webmention':
135
+ return (metaOf(comment, 'webmention_source_url') ||
136
+ (LINKBACKS.has(type) ? comment.authorUrl : metaOf(comment, 'source_url')) ||
137
+ null);
138
+ }
139
+ }
140
+ function nameOf(comment) {
141
+ const name = comment.author.trim();
142
+ if (name !== '')
143
+ return name;
144
+ return URL.canParse(comment.authorUrl) ? new URL(comment.authorUrl).hostname : 'Anonymous';
145
+ }
146
+ function labelOf(comment) {
147
+ return `comment ${String(comment.id)}`;
148
+ }
149
+ function metaOf(comment, key) {
150
+ return comment.meta.find((meta) => meta.key === key)?.value.trim() ?? '';
151
+ }
152
+ function instantOf(date) {
153
+ return date === undefined ? '' : new Date(date).toISOString();
154
+ }
155
+ //# 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":"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"}
@@ -0,0 +1,53 @@
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
+ readonly label: string;
24
+ }
25
+ export interface ImporterOutput {
26
+ readonly files: readonly ImportedFile[];
27
+ readonly notes: readonly ItemNote[];
28
+ readonly entries?: readonly DataEntry[] | undefined;
29
+ readonly comments?: readonly ImportedComment[] | undefined;
30
+ }
31
+ export interface WordPressImporter {
32
+ readonly postTypes: readonly string[];
33
+ import(exported: WordPressExport, context: PluginCommandContext): ImporterOutput | Promise<ImporterOutput>;
34
+ }
35
+ export type Outcome = 'written' | 'unchanged' | 'kept' | 'conflict' | 'clash' | 'skipped' | 'warned';
36
+ export interface ReportRow {
37
+ readonly outcome: Outcome;
38
+ readonly item: WordPressItem;
39
+ readonly path?: string | undefined;
40
+ readonly why: string;
41
+ }
42
+ export interface ImportReport {
43
+ readonly rows: readonly ReportRow[];
44
+ }
45
+ export declare const IMPORT_RECORD_FILE = "import.json";
46
+ export declare const IMPORT_REDIRECTS_FILE = "_data/redirects/wordpress.json";
47
+ export declare function importWordPressContent(options: {
48
+ exported: WordPressExport;
49
+ context: PluginCommandContext;
50
+ data: PluginDataFolder;
51
+ importers: readonly WordPressImporter[];
52
+ }): Promise<ImportReport>;
53
+ //# 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":"AAIA,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,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;AA0BD,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"}
@@ -0,0 +1,251 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { mkdir, readFile, rename, stat, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ const SKIPPED_POST_TYPES = {
5
+ revision: 'an earlier version of a post; the import takes the current one',
6
+ oembed_cache: "WordPress's cache of embed answers; Geekity fetches its own",
7
+ nav_menu_item: 'a navigation menu entry; a Geekity theme draws its own menu',
8
+ wp_navigation: 'a block navigation menu; a Geekity theme draws its own menu',
9
+ wp_global_styles: "the block theme's styles; a Geekity theme carries its own",
10
+ wp_template: 'a block theme template; a Geekity theme carries its own',
11
+ wp_template_part: 'a block theme template part; a Geekity theme carries its own',
12
+ wp_font_family: 'a font installed into the block theme',
13
+ wp_font_face: 'a font installed into the block theme',
14
+ custom_css: "the Customizer's extra CSS; put it in a Geekity theme",
15
+ customize_changeset: 'an unsaved Customizer session',
16
+ user_request: 'a personal data export or erasure request',
17
+ wp_block: 'a reusable block; its content is already in each post that used it',
18
+ ap_actor: "the ActivityPub plugin's cache of a remote actor",
19
+ ap_inbox: "the ActivityPub plugin's record of an incoming activity",
20
+ ap_outbox: "the ActivityPub plugin's record of an outgoing activity",
21
+ ap_extrafield: "an ActivityPub plugin profile field; carry it to the user's profile by hand",
22
+ ap_extrafield_blog: "an ActivityPub plugin blog profile field; carry it to the site's profile by hand",
23
+ ap_post: "the ActivityPub plugin's copy of a remote post",
24
+ feedback: 'a contact form submission; Geekity keeps its own',
25
+ };
26
+ export const IMPORT_RECORD_FILE = 'import.json';
27
+ export const IMPORT_REDIRECTS_FILE = '_data/redirects/wordpress.json';
28
+ export async function importWordPressContent(options) {
29
+ const { exported, context, data, importers } = options;
30
+ const contentDir = context.site.contentDir;
31
+ const claimed = new Set(importers.flatMap((importer) => importer.postTypes));
32
+ const rows = exported.items
33
+ .filter((item) => !claimed.has(item.type))
34
+ .map((item) => ({
35
+ outcome: 'skipped',
36
+ item,
37
+ why: SKIPPED_POST_TYPES[item.type] ?? `there is no importer for ${item.type} items`,
38
+ }));
39
+ const files = [];
40
+ const entries = [];
41
+ const comments = [];
42
+ for (const importer of importers) {
43
+ const output = await importer.import(exported, context);
44
+ files.push(...output.files);
45
+ rows.push(...output.notes);
46
+ entries.push(...(output.entries ?? []));
47
+ comments.push(...(output.comments ?? []));
48
+ }
49
+ const record = readRecord(data);
50
+ const seen = new Set();
51
+ for (const file of files) {
52
+ const relative = contentPath(file.path);
53
+ if (seen.has(relative)) {
54
+ throw new Error(`Two importers both write ${relative}; each path has one owner.`);
55
+ }
56
+ seen.add(relative);
57
+ rows.push(await writeOne(contentDir, relative, file, record, data));
58
+ }
59
+ const byFile = new Map();
60
+ for (const entry of entries) {
61
+ const file = contentPath(entry.file);
62
+ byFile.set(file, [...(byFile.get(file) ?? []), entry]);
63
+ }
64
+ for (const [file, inFile] of byFile) {
65
+ rows.push(...(await writeEntries(contentDir, file, inFile, record, data)));
66
+ }
67
+ const byPost = new Map();
68
+ for (const comment of comments) {
69
+ byPost.set(comment.permalink, [...(byPost.get(comment.permalink) ?? []), comment]);
70
+ }
71
+ for (const [permalink, onPost] of byPost) {
72
+ rows.push(...(await writeComments(context.site, permalink, onPost, record, data)));
73
+ }
74
+ const order = new Map(exported.items.map((item, index) => [item, index]));
75
+ rows.sort((a, b) => (order.get(a.item) ?? 0) - (order.get(b.item) ?? 0));
76
+ return { rows };
77
+ }
78
+ function readRecord(data) {
79
+ const text = data.read(IMPORT_RECORD_FILE);
80
+ const parsed = text === undefined ? {} : JSON.parse(text);
81
+ const nested = (saved) => new Map(Object.entries(saved ?? {}).map(([file, keys]) => [file, new Map(Object.entries(keys))]));
82
+ return {
83
+ files: new Map(Object.entries(parsed.files ?? {})),
84
+ entries: nested(parsed.entries),
85
+ comments: nested(parsed.comments),
86
+ };
87
+ }
88
+ async function saveRecord(data, record) {
89
+ const sorted = (map) => Object.fromEntries([...map].sort(([a], [b]) => (a < b ? -1 : 1)));
90
+ const nested = (map) => Object.fromEntries([...map].sort(([a], [b]) => (a < b ? -1 : 1)).map(([file, keys]) => [file, sorted(keys)]));
91
+ const saved = { files: sorted(record.files) };
92
+ if (record.entries.size > 0)
93
+ saved.entries = nested(record.entries);
94
+ if (record.comments.size > 0)
95
+ saved.comments = nested(record.comments);
96
+ await data.update(IMPORT_RECORD_FILE, () => `${JSON.stringify(saved, null, 2)}\n`);
97
+ }
98
+ function decide(current, recorded, next) {
99
+ if (current === undefined) {
100
+ return {
101
+ action: 'write',
102
+ outcome: 'written',
103
+ why: recorded === undefined ? 'new' : 'removed on this site, written again',
104
+ };
105
+ }
106
+ if (current === next) {
107
+ return { action: 'adopt', outcome: 'unchanged', why: 'already as WordPress has it' };
108
+ }
109
+ if (recorded === undefined) {
110
+ return {
111
+ action: 'leave',
112
+ outcome: 'clash',
113
+ why: 'a file not written by the import is already there; it was left alone',
114
+ };
115
+ }
116
+ if (current === recorded) {
117
+ return {
118
+ action: 'write',
119
+ outcome: 'written',
120
+ why: 'changed on WordPress since the last import',
121
+ };
122
+ }
123
+ return next === recorded
124
+ ? {
125
+ action: 'leave',
126
+ outcome: 'kept',
127
+ why: 'WordPress has not changed it since the last import',
128
+ }
129
+ : { action: 'leave', outcome: 'conflict', why: "this site's version was kept" };
130
+ }
131
+ async function writeOne(contentDir, relative, file, record, data) {
132
+ const absolute = path.join(contentDir, relative);
133
+ const current = await readIfPresent(absolute);
134
+ const recorded = record.files.get(relative);
135
+ const next = sha256(file.contents);
136
+ const decision = decide(current === undefined ? undefined : sha256(current), recorded, next);
137
+ if (decision.action === 'write')
138
+ await writeAtomically(absolute, file.contents);
139
+ if (decision.action !== 'leave' && recorded !== next) {
140
+ record.files.set(relative, next);
141
+ await saveRecord(data, record);
142
+ }
143
+ let why = decision.why;
144
+ if (decision.outcome === 'kept' || decision.outcome === 'conflict') {
145
+ const editedAt = (await stat(absolute)).mtime.toISOString();
146
+ const changedAt = file.item.modifiedGmt ?? file.item.dateGmt ?? 'an unknown time';
147
+ why =
148
+ decision.outcome === 'kept'
149
+ ? `edited on this site at ${editedAt}; ${why}`
150
+ : `edited on this site at ${editedAt}, and changed on WordPress at ${changedAt}; ${why}`;
151
+ }
152
+ return { outcome: decision.outcome, item: file.item, path: relative, why };
153
+ }
154
+ async function writeEntries(contentDir, file, entries, record, data) {
155
+ const absolute = path.join(contentDir, file);
156
+ const text = await readIfPresent(absolute);
157
+ const held = text === undefined ? {} : JSON.parse(text.toString('utf8'));
158
+ const recordedKeys = record.entries.get(file) ?? new Map();
159
+ const name = path.posix.basename(file);
160
+ const rows = [];
161
+ let changed = false;
162
+ for (const { item, key, value } of entries) {
163
+ const next = JSON.stringify(value);
164
+ const current = held[key] === undefined ? undefined : JSON.stringify(held[key]);
165
+ const recorded = recordedKeys.get(key);
166
+ const decision = decide(current, recorded, next);
167
+ if (decision.action === 'write') {
168
+ held[key] = value;
169
+ changed = true;
170
+ }
171
+ if (decision.action !== 'leave' && recorded !== next) {
172
+ recordedKeys.set(key, next);
173
+ record.entries.set(file, recordedKeys);
174
+ await saveRecord(data, record);
175
+ }
176
+ let why = `${key} is ${next}`;
177
+ if (decision.outcome === 'clash') {
178
+ why = `${name} already sets ${key} to ${current ?? ''}; it was left alone`;
179
+ }
180
+ else if (decision.action === 'leave') {
181
+ why = `${key} was changed on this site to ${current ?? ''}; it was left alone`;
182
+ }
183
+ rows.push({ outcome: decision.outcome, item, path: file, why });
184
+ }
185
+ if (changed)
186
+ await writeAtomically(absolute, `${JSON.stringify(held, null, 2)}\n`);
187
+ return rows;
188
+ }
189
+ async function writeComments(site, permalink, comments, record, data) {
190
+ const held = site.comments(permalink);
191
+ const current = new Map(held.comments.map((comment) => [comment.id, sha256(canonical(comment))]));
192
+ const recorded = record.comments.get(held.file) ?? new Map();
193
+ const rows = [];
194
+ const writes = [];
195
+ for (const { item, comment, label } of comments) {
196
+ const now = current.get(comment.id);
197
+ const before = recorded.get(comment.id);
198
+ const next = sha256(canonical(comment));
199
+ const deletedHere = now === undefined && before !== undefined;
200
+ const decision = deletedHere
201
+ ? { action: 'leave', outcome: 'kept', why: 'deleted on this site; left out' }
202
+ : decide(now, before, next);
203
+ if (decision.action === 'write')
204
+ writes.push(comment);
205
+ if (decision.action !== 'leave')
206
+ recorded.set(comment.id, next);
207
+ rows.push({
208
+ outcome: decision.outcome,
209
+ item,
210
+ path: held.file,
211
+ why: `${label}: ${decision.why}`,
212
+ });
213
+ }
214
+ await site.putComments(permalink, writes);
215
+ if (recorded.size > 0)
216
+ record.comments.set(held.file, recorded);
217
+ await saveRecord(data, record);
218
+ return rows;
219
+ }
220
+ function canonical(value) {
221
+ return JSON.stringify(value, (_key, inner) => inner !== null && typeof inner === 'object' && !Array.isArray(inner)
222
+ ? Object.fromEntries(Object.entries(inner).sort(([a], [b]) => (a < b ? -1 : 1)))
223
+ : inner);
224
+ }
225
+ function contentPath(given) {
226
+ const normalised = path.posix.normalize(given);
227
+ if (path.posix.isAbsolute(normalised) || normalised.startsWith('../') || normalised === '..') {
228
+ throw new Error(`${given} is outside the content directory; an importer writes only inside it.`);
229
+ }
230
+ return normalised;
231
+ }
232
+ async function readIfPresent(file) {
233
+ try {
234
+ return await readFile(file);
235
+ }
236
+ catch (error) {
237
+ if (error.code === 'ENOENT')
238
+ return undefined;
239
+ throw error;
240
+ }
241
+ }
242
+ async function writeAtomically(file, contents) {
243
+ await mkdir(path.dirname(file), { recursive: true });
244
+ const temporary = `${file}.${process.pid.toString(36)}.tmp`;
245
+ await writeFile(temporary, contents);
246
+ await rename(temporary, file);
247
+ }
248
+ function sha256(contents) {
249
+ return createHash('sha256').update(contents).digest('hex');
250
+ }
251
+ //# sourceMappingURL=content-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-import.js","sourceRoot":"","sources":["../src/content-import.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC9F,YAAY,EACV,qBAAqB,EACrB,WAAW,EACX,2BAA2B,EAC3B,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,WAAW,EACX,2BAA2B,EAC3B,aAAa,EACb,0BAA0B,EAC1B,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,GACf,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC9F,YAAY,EACV,qBAAqB,EACrB,WAAW,EACX,2BAA2B,EAC3B,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,WAAW,EACX,2BAA2B,EAC3B,aAAa,EACb,0BAA0B,EAC1B,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,GACf,MAAM,cAAc,CAAC"}