@forumulate/cli 0.4.0 → 0.5.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 (111) hide show
  1. package/dist/cli.js +12 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/content/command.d.ts +34 -0
  4. package/dist/content/command.d.ts.map +1 -0
  5. package/dist/content/command.js +225 -0
  6. package/dist/content/command.js.map +1 -0
  7. package/dist/content/library.d.ts +22 -0
  8. package/dist/content/library.d.ts.map +1 -0
  9. package/dist/content/library.js +40 -0
  10. package/dist/content/library.js.map +1 -0
  11. package/dist/content/render.d.ts +15 -0
  12. package/dist/content/render.d.ts.map +1 -0
  13. package/dist/content/render.js +85 -0
  14. package/dist/content/render.js.map +1 -0
  15. package/dist/content/types-gen.d.ts +40 -0
  16. package/dist/content/types-gen.d.ts.map +1 -0
  17. package/dist/content/types-gen.js +200 -0
  18. package/dist/content/types-gen.js.map +1 -0
  19. package/dist/import/coerce.d.ts +34 -0
  20. package/dist/import/coerce.d.ts.map +1 -0
  21. package/dist/import/coerce.js +134 -0
  22. package/dist/import/coerce.js.map +1 -0
  23. package/dist/import/command.d.ts +25 -0
  24. package/dist/import/command.d.ts.map +1 -0
  25. package/dist/import/command.js +127 -0
  26. package/dist/import/command.js.map +1 -0
  27. package/dist/import/config.d.ts +39 -0
  28. package/dist/import/config.d.ts.map +1 -0
  29. package/dist/import/config.js +48 -0
  30. package/dist/import/config.js.map +1 -0
  31. package/dist/import/contentful.d.ts +3 -0
  32. package/dist/import/contentful.d.ts.map +1 -0
  33. package/dist/import/contentful.js +179 -0
  34. package/dist/import/contentful.js.map +1 -0
  35. package/dist/import/disk.d.ts +4 -0
  36. package/dist/import/disk.d.ts.map +1 -0
  37. package/dist/import/disk.js +19 -0
  38. package/dist/import/disk.js.map +1 -0
  39. package/dist/import/engine-locales.d.ts +35 -0
  40. package/dist/import/engine-locales.d.ts.map +1 -0
  41. package/dist/import/engine-locales.js +61 -0
  42. package/dist/import/engine-locales.js.map +1 -0
  43. package/dist/import/engine.d.ts +29 -0
  44. package/dist/import/engine.d.ts.map +1 -0
  45. package/dist/import/engine.js +248 -0
  46. package/dist/import/engine.js.map +1 -0
  47. package/dist/import/media.d.ts +24 -0
  48. package/dist/import/media.d.ts.map +1 -0
  49. package/dist/import/media.js +39 -0
  50. package/dist/import/media.js.map +1 -0
  51. package/dist/import/model-fields.d.ts +22 -0
  52. package/dist/import/model-fields.d.ts.map +1 -0
  53. package/dist/import/model-fields.js +60 -0
  54. package/dist/import/model-fields.js.map +1 -0
  55. package/dist/import/payload/index.d.ts +9 -0
  56. package/dist/import/payload/index.d.ts.map +1 -0
  57. package/dist/import/payload/index.js +129 -0
  58. package/dist/import/payload/index.js.map +1 -0
  59. package/dist/import/report.d.ts +5 -0
  60. package/dist/import/report.d.ts.map +1 -0
  61. package/dist/import/report.js +52 -0
  62. package/dist/import/report.js.map +1 -0
  63. package/dist/import/richtext-core.d.ts +26 -0
  64. package/dist/import/richtext-core.d.ts.map +1 -0
  65. package/dist/import/richtext-core.js +65 -0
  66. package/dist/import/richtext-core.js.map +1 -0
  67. package/dist/import/richtext-html.d.ts +5 -0
  68. package/dist/import/richtext-html.d.ts.map +1 -0
  69. package/dist/import/richtext-html.js +311 -0
  70. package/dist/import/richtext-html.js.map +1 -0
  71. package/dist/import/richtext-json.d.ts +10 -0
  72. package/dist/import/richtext-json.d.ts.map +1 -0
  73. package/dist/import/richtext-json.js +250 -0
  74. package/dist/import/richtext-json.js.map +1 -0
  75. package/dist/import/sanity.d.ts +8 -0
  76. package/dist/import/sanity.d.ts.map +1 -0
  77. package/dist/import/sanity.js +158 -0
  78. package/dist/import/sanity.js.map +1 -0
  79. package/dist/import/strapi-archive.d.ts +6 -0
  80. package/dist/import/strapi-archive.d.ts.map +1 -0
  81. package/dist/import/strapi-archive.js +127 -0
  82. package/dist/import/strapi-archive.js.map +1 -0
  83. package/dist/import/strapi.d.ts +7 -0
  84. package/dist/import/strapi.d.ts.map +1 -0
  85. package/dist/import/strapi.js +185 -0
  86. package/dist/import/strapi.js.map +1 -0
  87. package/dist/import/tar.d.ts +3 -0
  88. package/dist/import/tar.d.ts.map +1 -0
  89. package/dist/import/tar.js +48 -0
  90. package/dist/import/tar.js.map +1 -0
  91. package/dist/import/types.d.ts +157 -0
  92. package/dist/import/types.d.ts.map +1 -0
  93. package/dist/import/types.js +12 -0
  94. package/dist/import/types.js.map +1 -0
  95. package/dist/import/wordpress.d.ts +15 -0
  96. package/dist/import/wordpress.d.ts.map +1 -0
  97. package/dist/import/wordpress.js +147 -0
  98. package/dist/import/wordpress.js.map +1 -0
  99. package/dist/publish/scan.d.ts +1 -1
  100. package/dist/publish/scan.d.ts.map +1 -1
  101. package/dist/publish/scan.js +2 -2
  102. package/dist/publish/scan.js.map +1 -1
  103. package/dist/publish-dir.d.ts +54 -0
  104. package/dist/publish-dir.d.ts.map +1 -0
  105. package/dist/publish-dir.js +119 -0
  106. package/dist/publish-dir.js.map +1 -0
  107. package/dist/run.d.ts +6 -1
  108. package/dist/run.d.ts.map +1 -1
  109. package/dist/run.js +47 -2
  110. package/dist/run.js.map +1 -1
  111. package/package.json +2 -2
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readStrapiExport = readStrapiExport;
4
+ /**
5
+ * Strapi: the content-type schemas of a project (`src/api/<name>/content-types/<name>/schema.json`,
6
+ * copied into one folder as `<name>.schema.json`) plus the data as its REST API
7
+ * gives it (`<plural-name>.json`: `{ data: [...] }`, Strapi 5 flat or Strapi 4
8
+ * `{ id, attributes }`), `media.json` for the Media Library, and the files in
9
+ * `uploads/`.
10
+ *
11
+ * Strapi's own `strapi export` archive is encrypted and versioned for
12
+ * restoring into Strapi; this reads what a person can actually produce from a
13
+ * running instance or a repository. Components and dynamic zones carry no
14
+ * schema in these files, so they are imported as JSON and counted in the notes.
15
+ */
16
+ const node_path_1 = require("node:path");
17
+ const config_1 = require("./config");
18
+ const richtext_html_1 = require("./richtext-html");
19
+ const richtext_json_1 = require("./richtext-json");
20
+ const isObj = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
21
+ const idOf = (v) => (typeof v === 'string' || typeof v === 'number' ? String(v) : isObj(v) && (typeof v.id === 'string' || typeof v.id === 'number') ? String(v.id) : null);
22
+ /** Strapi 4 wraps a relation/media value in `{ data }` and a record's fields in `attributes`. */
23
+ const unwrap = (v) => (isObj(v) && 'data' in v && Object.keys(v).length <= 2 ? v.data : v);
24
+ const flat = (d) => (isObj(d.attributes) ? { id: d.id, ...d.attributes } : d);
25
+ function readStrapiExport(dir, files, opts = {}) {
26
+ const notes = [];
27
+ const names = files.list(dir);
28
+ const schemas = names.filter((n) => n.endsWith('.schema.json')).map((n) => JSON.parse(files.read((0, node_path_1.join)(dir, n))));
29
+ const singular = (uid) => {
30
+ const m = /^api::([^.]+)\.(.+)$/.exec(uid);
31
+ return m ? (0, config_1.keyOf)(m[2]) : (0, config_1.keyOf)(uid);
32
+ };
33
+ const plurals = new Map();
34
+ const collections = [];
35
+ let components = 0;
36
+ for (const s of schemas) {
37
+ const info = isObj(s.info) ? s.info : {};
38
+ if (typeof info.singularName !== 'string')
39
+ continue;
40
+ const slug = (0, config_1.keyOf)(info.singularName);
41
+ plurals.set(typeof info.pluralName === 'string' ? info.pluralName : info.singularName, slug);
42
+ plurals.set(info.singularName, slug);
43
+ const fields = [];
44
+ for (const [name, a] of Object.entries(isObj(s.attributes) ? s.attributes : {})) {
45
+ if (!isObj(a))
46
+ continue;
47
+ const base = { name: (0, config_1.keyOf)(name), label: name, ...(a.required ? { required: true } : {}) };
48
+ switch (a.type) {
49
+ case 'string':
50
+ case 'uid':
51
+ fields.push({ ...base, type: 'text' });
52
+ break;
53
+ case 'text':
54
+ fields.push({ ...base, type: 'textarea' });
55
+ break;
56
+ case 'email':
57
+ fields.push({ ...base, type: 'email' });
58
+ break;
59
+ case 'enumeration':
60
+ fields.push({ ...base, type: 'select', options: (Array.isArray(a.enum) ? a.enum : []).map(String) });
61
+ break;
62
+ case 'richtext':
63
+ case 'blocks':
64
+ fields.push({ ...base, type: 'richText' });
65
+ break;
66
+ case 'integer':
67
+ case 'biginteger':
68
+ case 'decimal':
69
+ case 'float':
70
+ fields.push({ ...base, type: 'number' });
71
+ break;
72
+ case 'boolean':
73
+ fields.push({ ...base, type: 'checkbox' });
74
+ break;
75
+ case 'date':
76
+ case 'datetime':
77
+ fields.push({ ...base, type: 'date' });
78
+ break;
79
+ case 'media':
80
+ fields.push(a.multiple ? (0, config_1.listOf)(base.name, { type: 'upload', relationTo: 'media' }, name) : { ...base, type: 'upload', relationTo: 'media' });
81
+ break;
82
+ case 'relation':
83
+ if (typeof a.target === 'string') {
84
+ fields.push({ ...base, type: 'relationship', relationTo: singular(a.target), ...(/ToMany$/.test(String(a.relation)) ? { hasMany: true } : {}) });
85
+ }
86
+ break;
87
+ case 'password':
88
+ break; // A credential is never content.
89
+ case 'component':
90
+ case 'dynamiczone':
91
+ components++;
92
+ fields.push({ ...base, type: 'json' });
93
+ break;
94
+ default:
95
+ fields.push({ ...base, type: 'json' });
96
+ }
97
+ }
98
+ collections.push({ slug, label: typeof info.displayName === 'string' ? info.displayName : undefined, fields });
99
+ }
100
+ if (components)
101
+ notes.push(`${components} component / dynamic-zone field(s) have no schema in these files and were imported as JSON.`);
102
+ const media = [];
103
+ const mediaIds = new Set();
104
+ const addMedia = (d) => {
105
+ const id = idOf(d);
106
+ const url = typeof d.url === 'string' ? d.url : '';
107
+ const filename = typeof d.name === 'string' ? d.name : url.split('/').pop() ?? '';
108
+ if (!id || !filename || mediaIds.has(id))
109
+ return;
110
+ mediaIds.add(id);
111
+ const local = (0, node_path_1.join)(dir, 'uploads', url.split('/').pop() ?? filename);
112
+ const location = files.exists(local) ? local : /^https?:/i.test(url) ? url : opts.baseUrl && url ? opts.baseUrl.replace(/\/$/, '') + url : local;
113
+ media.push({
114
+ id,
115
+ filename,
116
+ location,
117
+ ...(typeof d.alternativeText === 'string' ? { alt: d.alternativeText } : {}),
118
+ ...(typeof d.mime === 'string' ? { contentType: d.mime } : {}),
119
+ aliases: [url].filter(Boolean),
120
+ });
121
+ };
122
+ if (files.exists((0, node_path_1.join)(dir, 'media.json'))) {
123
+ const m = JSON.parse(files.read((0, node_path_1.join)(dir, 'media.json')));
124
+ (Array.isArray(m) ? m : isObj(m) && Array.isArray(m.data) ? m.data : []).filter(isObj).forEach((d) => addMedia(flat(d)));
125
+ }
126
+ const records = [];
127
+ for (const n of names) {
128
+ if (!n.endsWith('.json') || n.endsWith('.schema.json') || n === 'media.json')
129
+ continue;
130
+ const slug = plurals.get(n.slice(0, -5));
131
+ if (!slug) {
132
+ notes.push(`${n} matches no content type schema and was skipped.`);
133
+ continue;
134
+ }
135
+ const parsed = JSON.parse(files.read((0, node_path_1.join)(dir, n)));
136
+ const list = Array.isArray(parsed) ? parsed : isObj(parsed) && Array.isArray(parsed.data) ? parsed.data : isObj(parsed) && isObj(parsed.data) ? [parsed.data] : [];
137
+ for (const raw of list.filter(isObj)) {
138
+ const d = flat(raw);
139
+ const id = idOf(d);
140
+ if (!id)
141
+ continue;
142
+ const { id: _id, documentId: _doc, createdAt: _c, updatedAt: _u, publishedAt, locale: _l, createdBy: _cb, updatedBy: _ub, localizations: _loc, ...values } = d;
143
+ const out = {};
144
+ for (const [k, v] of Object.entries(values))
145
+ out[(0, config_1.keyOf)(k)] = unwrap(v);
146
+ records.push({
147
+ type: slug,
148
+ id,
149
+ published: typeof publishedAt === 'string',
150
+ ...(typeof d.slug === 'string' ? { slug: d.slug } : {}),
151
+ ...(typeof d.title === 'string' ? { title: d.title } : {}),
152
+ values: out,
153
+ });
154
+ }
155
+ }
156
+ const scan = (v, depth = 0) => {
157
+ if (depth > 40)
158
+ return;
159
+ if (Array.isArray(v))
160
+ return v.forEach((x) => scan(x, depth + 1));
161
+ if (!isObj(v))
162
+ return;
163
+ if (typeof v.url === 'string' && typeof v.mime === 'string')
164
+ addMedia(v);
165
+ Object.values(v).forEach((x) => scan(x, depth + 1));
166
+ };
167
+ records.forEach((r) => scan(r.values));
168
+ return {
169
+ name: 'strapi',
170
+ modelSource: collections.length ? (0, config_1.payloadConfigSource)(collections) : undefined,
171
+ records,
172
+ media,
173
+ notes,
174
+ richText: (raw, image) => Array.isArray(raw) ? (0, richtext_json_1.fromStrapiBlocks)(raw, image) : typeof raw === 'string' ? (/^\s*<[a-z!]/i.test(raw) ? (0, richtext_html_1.fromHtml)(raw, image) : (0, richtext_html_1.fromMarkdown)(raw, image)) : null,
175
+ mediaId: (raw) => {
176
+ const id = idOf(unwrap(raw));
177
+ return id && mediaIds.has(id) ? id : null;
178
+ },
179
+ refs: (raw) => (Array.isArray(unwrap(raw)) ? unwrap(raw) : [unwrap(raw)]).flatMap((v) => {
180
+ const id = idOf(unwrap(v));
181
+ return id ? [{ id }] : [];
182
+ }),
183
+ };
184
+ }
185
+ //# sourceMappingURL=strapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strapi.js","sourceRoot":"","sources":["../../src/import/strapi.ts"],"names":[],"mappings":";;AA+BA,4CAyJC;AAxLD;;;;;;;;;;;GAWG;AACH,yCAAiC;AACjC,qCAAyG;AACzG,mDAAyD;AACzD,mDAAmD;AAInD,MAAM,KAAK,GAAG,CAAC,CAAU,EAAY,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACjG,MAAM,IAAI,GAAG,CAAC,CAAU,EAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAEpM,iGAAiG;AACjG,MAAM,MAAM,GAAG,CAAC,CAAU,EAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7G,MAAM,IAAI,GAAG,CAAC,CAAM,EAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAOxF,SAAgB,gBAAgB,CAAC,GAAW,EAAE,KAAkB,EAAE,OAAsB,EAAE;IACxF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAA,gBAAI,EAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAQ,CAAC,CAAC;IAExH,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE;QAC/B,MAAM,CAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,CAAC,CAAC,CAAC,CAAC,IAAA,cAAK,EAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,IAAA,cAAK,EAAC,GAAG,CAAC,CAAC;IACvC,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,MAAM,WAAW,GAAwB,EAAE,CAAC;IAC5C,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ;YAAE,SAAS;QACpD,MAAM,IAAI,GAAG,IAAA,cAAK,EAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC7F,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACrC,MAAM,MAAM,GAAmB,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YAChF,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBAAE,SAAS;YACxB,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,IAAA,cAAK,EAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3F,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;gBACf,KAAK,QAAQ,CAAC;gBACd,KAAK,KAAK;oBACR,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBACvC,MAAM;gBACR,KAAK,MAAM;oBACT,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;oBAC3C,MAAM;gBACR,KAAK,OAAO;oBACV,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;oBACxC,MAAM;gBACR,KAAK,aAAa;oBAChB,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACrG,MAAM;gBACR,KAAK,UAAU,CAAC;gBAChB,KAAK,QAAQ;oBACX,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;oBAC3C,MAAM;gBACR,KAAK,SAAS,CAAC;gBACf,KAAK,YAAY,CAAC;gBAClB,KAAK,SAAS,CAAC;gBACf,KAAK,OAAO;oBACV,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;oBACzC,MAAM;gBACR,KAAK,SAAS;oBACZ,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;oBAC3C,MAAM;gBACR,KAAK,MAAM,CAAC;gBACZ,KAAK,UAAU;oBACb,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBACvC,MAAM;gBACR,KAAK,OAAO;oBACV,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAA,eAAM,EAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC9I,MAAM;gBACR,KAAK,UAAU;oBACb,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;wBACjC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACnJ,CAAC;oBACD,MAAM;gBACR,KAAK,UAAU;oBACb,MAAM,CAAC,iCAAiC;gBAC1C,KAAK,WAAW,CAAC;gBACjB,KAAK,aAAa;oBAChB,UAAU,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBACvC,MAAM;gBACR;oBACE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IACjH,CAAC;IACD,IAAI,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,6FAA6F,CAAC,CAAC;IAEvI,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,QAAQ,GAAG,CAAC,CAAM,EAAE,EAAE;QAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAClF,IAAI,CAAC,EAAE,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO;QACjD,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjB,MAAM,KAAK,GAAG,IAAA,gBAAI,EAAC,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QACjJ,KAAK,CAAC,IAAI,CAAC;YACT,EAAE;YACF,QAAQ;YACR,QAAQ;YACR,GAAG,CAAC,OAAO,CAAC,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;SAC/B,CAAC,CAAC;IACL,CAAC,CAAC;IACF,IAAI,KAAK,CAAC,MAAM,CAAC,IAAA,gBAAI,EAAC,GAAG,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAA,gBAAI,EAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAY,CAAC;QACrE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3H,CAAC;IAED,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,YAAY;YAAE,SAAS;QACvF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;YACnE,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAA,gBAAI,EAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnK,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,IAAI,CAAC,EAAE;gBAAE,SAAS;YAClB,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC;YAC/J,MAAM,GAAG,GAA4B,EAAE,CAAC;YACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,GAAG,CAAC,IAAA,cAAK,EAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,IAAI;gBACV,EAAE;gBACF,SAAS,EAAE,OAAO,WAAW,KAAK,QAAQ;gBAC1C,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1D,MAAM,EAAE,GAAG;aACZ,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,CAAU,EAAE,KAAK,GAAG,CAAC,EAAQ,EAAE;QAC3C,IAAI,KAAK,GAAG,EAAE;YAAE,OAAO;QACvB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAAE,OAAO;QACtB,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC;IACF,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvC,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAA,4BAAmB,EAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;QAC9E,OAAO;QACP,KAAK;QACL,KAAK;QACL,QAAQ,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CACvB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAA,gCAAgB,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAA,wBAAQ,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAA,4BAAY,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QACnK,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACf,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,OAAO,EAAE,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5C,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,MAAM,CAAC,GAAG,CAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACrG,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5B,CAAC,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Regular files by path (leading `./` and the archive's single wrapper folder kept as written). */
2
+ export declare function readTar(bytes: Uint8Array): Map<string, Uint8Array>;
3
+ //# sourceMappingURL=tar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tar.d.ts","sourceRoot":"","sources":["../../src/import/tar.ts"],"names":[],"mappings":"AAcA,oGAAoG;AACpG,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAyBlE"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readTar = readTar;
4
+ /**
5
+ * A tar reader for `strapi export --no-encrypt` archives (a gzipped ustar).
6
+ *
7
+ * Hand-rolled because the CLI ships without runtime dependencies beyond the
8
+ * SDK; the format needed is small: 512-byte headers, octal sizes, the ustar
9
+ * `prefix`, and the pax / GNU long-name records writers emit for deep paths.
10
+ */
11
+ const node_zlib_1 = require("node:zlib");
12
+ const text = (b, from, len) => {
13
+ const end = b.subarray(from, from + len).indexOf(0);
14
+ return Buffer.from(b.subarray(from, from + (end < 0 ? len : end))).toString('utf8');
15
+ };
16
+ /** Regular files by path (leading `./` and the archive's single wrapper folder kept as written). */
17
+ function readTar(bytes) {
18
+ const data = bytes.length > 2 && bytes[0] === 0x1f && bytes[1] === 0x8b ? new Uint8Array((0, node_zlib_1.gunzipSync)(bytes)) : bytes;
19
+ const out = new Map();
20
+ let longName = null;
21
+ let paxPath = null;
22
+ for (let at = 0; at + 512 <= data.length;) {
23
+ if (data.subarray(at, at + 512).every((x) => x === 0))
24
+ break;
25
+ const size = parseInt(text(data, at + 124, 12).trim() || '0', 8);
26
+ const type = String.fromCharCode(data[at + 156] || 48);
27
+ const prefix = text(data, at + 345, 155);
28
+ const name = text(data, at, 100);
29
+ const body = data.subarray(at + 512, at + 512 + size);
30
+ at += 512 + Math.ceil(size / 512) * 512;
31
+ if (type === 'L')
32
+ longName = text(body, 0, body.length);
33
+ else if (type === 'x') {
34
+ // pax records are `<len> key=value\n`; only `path` matters here.
35
+ const m = /\d+ path=([^\n]*)\n/.exec(Buffer.from(body).toString('utf8'));
36
+ paxPath = m ? m[1] : null;
37
+ }
38
+ else if (type === '0' || type === '\0') {
39
+ const path = (paxPath ?? longName ?? (prefix ? `${prefix}/${name}` : name)).replace(/^\.\//, '');
40
+ out.set(path, body);
41
+ longName = paxPath = null;
42
+ }
43
+ else
44
+ longName = paxPath = null;
45
+ }
46
+ return out;
47
+ }
48
+ //# sourceMappingURL=tar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tar.js","sourceRoot":"","sources":["../../src/import/tar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * What every importer hands the shared engine (`./engine`).
3
+ *
4
+ * An importer's only jobs are to read its platform's export and to say, for a
5
+ * value of a declared field type, what it MEANS (a rich-text document, a
6
+ * picture, a pointer to another record). Creating the model, uploading media,
7
+ * writing entries, resolving references and publishing are the engine's, so
8
+ * all five platforms land content the same way and report it the same way.
9
+ */
10
+ /** A BlockDoc node, structurally; the CLI does not depend on docs-schema. */
11
+ export interface DocNode {
12
+ type: string;
13
+ attrs?: Record<string, unknown>;
14
+ content?: DocNode[];
15
+ text?: string;
16
+ marks?: {
17
+ type: string;
18
+ attrs?: Record<string, unknown>;
19
+ }[];
20
+ }
21
+ export interface RichDoc {
22
+ type: 'doc';
23
+ content: DocNode[];
24
+ }
25
+ /** A picture in rich text, as the source names it; the engine swaps in the uploaded asset's URL. */
26
+ export type ImageResolver = (src: string, alt?: string) => string;
27
+ /** One record of the export, before any of its values is interpreted. */
28
+ export interface RawRecord {
29
+ /** The content type's key: a Payload slug, a Contentful content type id, a Sanity `_type`. */
30
+ type: string;
31
+ /** The source's own id; the engine remembers it so a reference to it can be resolved. */
32
+ id: string;
33
+ published: boolean;
34
+ slug?: string;
35
+ title?: string;
36
+ /** Field key → source value. Keys that match no declared field are reported, not dropped quietly. */
37
+ values: Record<string, unknown>;
38
+ /**
39
+ * The same record's LOCALIZED fields in the source's other locales, by locale
40
+ * code: each becomes the record's locale twin. `values` is the source locale.
41
+ */
42
+ locales?: Record<string, Record<string, unknown>>;
43
+ }
44
+ /** A file the export refers to, to be uploaded into the library's media. */
45
+ export interface SourceMedia {
46
+ id: string;
47
+ filename: string;
48
+ /** Where the bytes are: a path on disk or a URL. */
49
+ location: string;
50
+ alt?: string;
51
+ contentType?: string;
52
+ /** Other ways records name this file (its URL in a rich-text body). */
53
+ aliases?: string[];
54
+ }
55
+ export interface RefTarget {
56
+ /** Absent when the source does not say (a bare id): the engine resolves it only if one record has that id. */
57
+ type?: string;
58
+ id: string;
59
+ }
60
+ /** A field as the engine needs it, read off the library's stored model. */
61
+ export interface FieldDecl {
62
+ key: string;
63
+ type: string;
64
+ hasMany?: boolean;
65
+ localized?: boolean;
66
+ fields?: FieldDecl[];
67
+ to?: {
68
+ kind: string;
69
+ types?: string[];
70
+ }[];
71
+ }
72
+ export interface ImportSource {
73
+ /** `payload`, `contentful`…: names the import in the report and in idempotency keys. */
74
+ name: string;
75
+ /**
76
+ * The model the export implies, as a Payload-format config the API's own
77
+ * Payload reader turns into a model (so there is ONE mapping, the API's).
78
+ * Absent when the library's model is already what the records fill.
79
+ */
80
+ modelSource?: string;
81
+ /**
82
+ * The source's languages, when it has more than one. Each non-default one is
83
+ * added to the library (if missing) before its twins are written.
84
+ */
85
+ languages?: {
86
+ code: string;
87
+ label: string;
88
+ default?: boolean;
89
+ }[];
90
+ records: RawRecord[];
91
+ media: SourceMedia[];
92
+ /** What the source wants said to the user (locales it skipped, drafts it merged). */
93
+ notes: string[];
94
+ richText(raw: unknown, image: ImageResolver): RichDoc | null;
95
+ /** The id of the file a media/upload value names. */
96
+ mediaId(raw: unknown): string | null;
97
+ /** The records a reference value names. */
98
+ refs(raw: unknown, field: FieldDecl): RefTarget[];
99
+ }
100
+ export interface ImportFiles {
101
+ read(path: string): string;
102
+ readBytes(path: string): Uint8Array;
103
+ exists(path: string): boolean;
104
+ /** File names (not paths) directly inside `dir`. */
105
+ list(dir: string): string[];
106
+ isDir(path: string): boolean;
107
+ }
108
+ export interface ImportReport {
109
+ source: string;
110
+ dryRun: boolean;
111
+ model: {
112
+ changed: boolean;
113
+ version: number | null;
114
+ issues: {
115
+ path: string;
116
+ kind: string;
117
+ message: string;
118
+ }[];
119
+ };
120
+ entries: {
121
+ planned: number;
122
+ created: number;
123
+ updated: number;
124
+ translations: number;
125
+ published: number;
126
+ failed: {
127
+ id: string;
128
+ type: string;
129
+ message: string;
130
+ }[];
131
+ };
132
+ media: {
133
+ planned: number;
134
+ uploaded: number;
135
+ failed: {
136
+ id: string;
137
+ message: string;
138
+ }[];
139
+ };
140
+ /** Values the export carried that no declared field takes, by `type.key` with a count. */
141
+ dropped: {
142
+ field: string;
143
+ count: number;
144
+ }[];
145
+ /** References whose target is not in the export. */
146
+ unresolved: {
147
+ from: string;
148
+ to: string;
149
+ }[];
150
+ notes: string[];
151
+ /** Dry run: how many planned entries already exist (re-runs update them) and how many are new. */
152
+ plan?: {
153
+ new: number;
154
+ update: number;
155
+ };
156
+ }
157
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/import/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,6EAA6E;AAC7E,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE,CAAC;CAC7D;AACD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,KAAK,CAAC;IACZ,OAAO,EAAE,OAAO,EAAE,CAAC;CACpB;AAED,oGAAoG;AACpG,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;AAElE,yEAAyE;AACzE,MAAM,WAAW,SAAS;IACxB,8FAA8F;IAC9F,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qGAAqG;IACrG,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACnD;AAED,4EAA4E;AAC5E,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,8GAA8G;IAC9G,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,2EAA2E;AAC3E,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,EAAE,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,YAAY;IAC3B,wFAAwF;IACxF,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IACjE,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,qFAAqF;IACrF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,GAAG,IAAI,CAAC;IAC7D,qDAAqD;IACrD,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;IACrC,2CAA2C;IAC3C,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IACpC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,oDAAoD;IACpD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC;IAC/G,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC;IACjK,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC;IACxF,0FAA0F;IAC1F,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,oDAAoD;IACpD,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,kGAAkG;IAClG,IAAI,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACxC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /**
3
+ * What every importer hands the shared engine (`./engine`).
4
+ *
5
+ * An importer's only jobs are to read its platform's export and to say, for a
6
+ * value of a declared field type, what it MEANS (a rich-text document, a
7
+ * picture, a pointer to another record). Creating the model, uploading media,
8
+ * writing entries, resolving references and publishing are the engine's, so
9
+ * all five platforms land content the same way and report it the same way.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/import/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,15 @@
1
+ import type { ImportSource } from './types';
2
+ interface Item {
3
+ tags: Map<string, string>;
4
+ meta: Map<string, string>;
5
+ cats: {
6
+ domain: string;
7
+ value: string;
8
+ }[];
9
+ }
10
+ export declare function parseWxr(xml: string): Item[];
11
+ /** WordPress stores paragraphs as blank-line-separated text and adds the <p> when it renders. */
12
+ export declare function autop(html: string): string;
13
+ export declare function readWordpressExport(xml: string): ImportSource;
14
+ export {};
15
+ //# sourceMappingURL=wordpress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wordpress.d.ts","sourceRoot":"","sources":["../../src/import/wordpress.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAA0B,MAAM,SAAS,CAAC;AAEpE,UAAU,IAAI;IACZ,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC3C;AAQD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,CAqB5C;AAED,iGAAiG;AACjG,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ1C;AAID,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAoF7D"}
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseWxr = parseWxr;
4
+ exports.autop = autop;
5
+ exports.readWordpressExport = readWordpressExport;
6
+ /**
7
+ * WordPress: the WXR file `Tools → Export` writes (`.xml`, "All content").
8
+ *
9
+ * Posts, pages and any custom post type become collections (attachments are
10
+ * media, menus and revisions are not content), with the same fields on each:
11
+ * title, body (rich text from the HTML), excerpt, date, author, categories,
12
+ * tags and the featured image. WordPress has no per-type schema in the
13
+ * export, so there is no schema to map; the model is this fixed one, which
14
+ * is what a post IS in WordPress.
15
+ */
16
+ const config_1 = require("./config");
17
+ const richtext_html_1 = require("./richtext-html");
18
+ /** CDATA is literal text; anything outside it has its entities decoded. */
19
+ const cdata = (s) => {
20
+ const m = /^\s*<!\[CDATA\[([\s\S]*?)\]\]>\s*$/.exec(s);
21
+ return m ? m[1] : (0, richtext_html_1.decodeEntities)(s);
22
+ };
23
+ function parseWxr(xml) {
24
+ const items = [];
25
+ for (const m of xml.matchAll(/<item>([\s\S]*?)<\/item>/g)) {
26
+ let body = m[1];
27
+ const meta = new Map();
28
+ body = body.replace(/<wp:postmeta>([\s\S]*?)<\/wp:postmeta>/g, (_x, inner) => {
29
+ const k = /<wp:meta_key>([\s\S]*?)<\/wp:meta_key>/.exec(inner)?.[1];
30
+ const v = /<wp:meta_value>([\s\S]*?)<\/wp:meta_value>/.exec(inner)?.[1];
31
+ if (k !== undefined)
32
+ meta.set(cdata(k), cdata(v ?? ''));
33
+ return '';
34
+ });
35
+ const cats = [];
36
+ body = body.replace(/<category\b([^>]*)>([\s\S]*?)<\/category>/g, (_x, attrs, text) => {
37
+ cats.push({ domain: /domain="([^"]*)"/.exec(attrs)?.[1] ?? 'category', value: cdata(text) });
38
+ return '';
39
+ });
40
+ const tags = new Map();
41
+ for (const t of body.matchAll(/<([A-Za-z][\w:-]*)(?:\s[^>]*)?>([\s\S]*?)<\/\1>/g))
42
+ if (!tags.has(t[1]))
43
+ tags.set(t[1], cdata(t[2]));
44
+ items.push({ tags, meta, cats });
45
+ }
46
+ return items;
47
+ }
48
+ /** WordPress stores paragraphs as blank-line-separated text and adds the <p> when it renders. */
49
+ function autop(html) {
50
+ if (/<(p|h[1-6]|ul|ol|div|blockquote|pre|figure|table)\b/i.test(html))
51
+ return html;
52
+ return html
53
+ .split(/\n{2,}/)
54
+ .map((p) => p.trim())
55
+ .filter(Boolean)
56
+ .map((p) => `<p>${p.replace(/\n/g, '<br>')}</p>`)
57
+ .join('\n');
58
+ }
59
+ const NOT_CONTENT = new Set(['attachment', 'nav_menu_item', 'revision', 'customize_changeset', 'oembed_cache', 'wp_global_styles', 'wp_navigation', 'wp_template', 'wp_template_part', 'custom_css', 'user_request']);
60
+ function readWordpressExport(xml) {
61
+ const notes = [];
62
+ const items = parseWxr(xml);
63
+ const get = (i, k) => i.tags.get(k) ?? '';
64
+ // WordPress stores titles and names entity-encoded even inside CDATA.
65
+ const text = (i, k) => (0, richtext_html_1.decodeEntities)(get(i, k));
66
+ const media = [];
67
+ for (const i of items.filter((x) => get(x, 'wp:post_type') === 'attachment')) {
68
+ const url = get(i, 'wp:attachment_url');
69
+ const id = get(i, 'wp:post_id');
70
+ if (!url || !id)
71
+ continue;
72
+ media.push({
73
+ id,
74
+ filename: decodeURIComponent(url.split('/').pop() ?? id),
75
+ location: url,
76
+ ...(i.meta.get('_wp_attachment_image_alt') ? { alt: i.meta.get('_wp_attachment_image_alt') } : {}),
77
+ aliases: [url],
78
+ });
79
+ }
80
+ const records = [];
81
+ const skipped = new Map();
82
+ let scheduled = 0;
83
+ for (const i of items) {
84
+ const type = get(i, 'wp:post_type');
85
+ const id = get(i, 'wp:post_id');
86
+ if (!type || !id || type === 'attachment')
87
+ continue;
88
+ const status = get(i, 'wp:status');
89
+ if (NOT_CONTENT.has(type) || status === 'trash' || status === 'auto-draft' || status === 'inherit') {
90
+ skipped.set(type, (skipped.get(type) ?? 0) + 1);
91
+ continue;
92
+ }
93
+ if (status === 'future')
94
+ scheduled++;
95
+ const gmt = get(i, 'wp:post_date_gmt');
96
+ const date = gmt && !gmt.startsWith('0000') ? `${gmt.replace(' ', 'T')}Z` : get(i, 'wp:post_date') ? get(i, 'wp:post_date').replace(' ', 'T') + 'Z' : undefined;
97
+ const thumb = i.meta.get('_thumbnail_id');
98
+ const slug = get(i, 'wp:post_name') || undefined;
99
+ records.push({
100
+ type: (0, config_1.keyOf)(type),
101
+ id,
102
+ published: status === 'publish',
103
+ ...(slug ? { slug } : {}),
104
+ title: text(i, 'title') || undefined,
105
+ values: {
106
+ title: text(i, 'title') || undefined,
107
+ body: get(i, 'content:encoded') ? { $html: get(i, 'content:encoded') } : undefined,
108
+ excerpt: text(i, 'excerpt:encoded') || undefined,
109
+ publishedAt: date,
110
+ author: text(i, 'dc:creator') || undefined,
111
+ categories: i.cats.filter((c) => c.domain === 'category').map((c) => (0, richtext_html_1.decodeEntities)(c.value)),
112
+ tags: i.cats.filter((c) => c.domain === 'post_tag').map((c) => (0, richtext_html_1.decodeEntities)(c.value)),
113
+ featuredImage: thumb && media.some((m) => m.id === thumb) ? thumb : undefined,
114
+ },
115
+ });
116
+ }
117
+ const types = [...new Set(records.map((r) => r.type))];
118
+ const collections = types.map((slug) => ({
119
+ slug,
120
+ titleField: 'title',
121
+ fields: [
122
+ { name: 'title', type: 'text', required: true },
123
+ { name: 'body', type: 'richText' },
124
+ { name: 'excerpt', type: 'textarea' },
125
+ { name: 'publishedAt', type: 'date' },
126
+ { name: 'author', type: 'text' },
127
+ (0, config_1.listOf)('categories', { type: 'text' }),
128
+ (0, config_1.listOf)('tags', { type: 'text' }),
129
+ { name: 'featuredImage', type: 'upload', relationTo: 'media' },
130
+ ],
131
+ }));
132
+ for (const [t, n] of skipped)
133
+ notes.push(`${n} ${t} item(s) (menus, revisions, trash…) are not content and were skipped.`);
134
+ if (scheduled)
135
+ notes.push(`${scheduled} scheduled post(s) are imported as drafts; schedule them in the library.`);
136
+ return {
137
+ name: 'wordpress',
138
+ modelSource: collections.length ? (0, config_1.payloadConfigSource)(collections) : undefined,
139
+ records,
140
+ media,
141
+ notes,
142
+ richText: (raw, image) => (typeof raw === 'object' && raw !== null && typeof raw.$html === 'string' ? (0, richtext_html_1.fromHtml)(autop(raw.$html), image) : null),
143
+ mediaId: (raw) => (typeof raw === 'string' || typeof raw === 'number' ? String(raw) : null),
144
+ refs: () => [],
145
+ };
146
+ }
147
+ //# sourceMappingURL=wordpress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wordpress.js","sourceRoot":"","sources":["../../src/import/wordpress.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { LocalSpace, SpaceSpec } from './types';
2
2
  export declare const MANIFEST_NAMES: string[];
3
3
  /** The product's slug rule (packages/shared `slugify`), mirrored: this package ships alone. */
4
- export declare function slugify(input: string, fallback?: string): string;
4
+ export declare function slugify(input: string, fallback?: string, max?: number): string;
5
5
  /**
6
6
  * The product's TAG rule (apps/api `normalizeTag`), mirrored for the same reason
7
7
  * as `slugify`. Used to compare a front-matter tag list with the stored one: an