@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,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LIST_ROW_KEY = void 0;
4
+ exports.keyOf = keyOf;
5
+ exports.listOf = listOf;
6
+ exports.payloadConfigSource = payloadConfigSource;
7
+ /** The key a platform's field/type name becomes: stable, and a valid field name. */
8
+ function keyOf(name) {
9
+ const k = name
10
+ .replace(/[^A-Za-z0-9_]+(.)?/g, (_m, c) => (c ? c.toUpperCase() : ''))
11
+ .replace(/^[0-9]+/, '');
12
+ return k ? k[0].toLowerCase() + k.slice(1) : 'field';
13
+ }
14
+ /**
15
+ * A list of scalars or files. The model has no "many texts" or "many media"
16
+ * field (the Payload reader says so: `hasMany` on those is unsupported); the
17
+ * model's own spelling is an array whose rows hold one value. Importers write
18
+ * `value` rows and the engine wraps raw lists into them (`./coerce`).
19
+ */
20
+ exports.LIST_ROW_KEY = 'value';
21
+ function listOf(name, inner, label) {
22
+ return { name, type: 'array', ...(label ? { label } : {}), fields: [{ ...inner, name: exports.LIST_ROW_KEY }] };
23
+ }
24
+ function fieldLiteral(f) {
25
+ return {
26
+ name: f.name,
27
+ type: f.type,
28
+ ...(f.label ? { label: f.label } : {}),
29
+ ...(f.required ? { required: true } : {}),
30
+ ...(f.localized ? { localized: true } : {}),
31
+ ...(f.hasMany ? { hasMany: true } : {}),
32
+ ...(f.relationTo ? { relationTo: f.relationTo } : {}),
33
+ ...(f.options ? { options: f.options.map((o) => ({ label: o, value: o })) } : {}),
34
+ ...(f.fields ? { fields: f.fields.map(fieldLiteral) } : {}),
35
+ };
36
+ }
37
+ function payloadConfigSource(collections) {
38
+ const config = {
39
+ collections: collections.map((c) => ({
40
+ slug: c.slug,
41
+ ...(c.label ? { labels: { singular: c.label, plural: c.label } } : {}),
42
+ ...(c.titleField ? { admin: { useAsTitle: c.titleField } } : {}),
43
+ fields: c.fields.map(fieldLiteral),
44
+ })),
45
+ };
46
+ return `export default ${JSON.stringify(config, null, 2)}\n`;
47
+ }
48
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/import/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ImportSource } from './types';
2
+ export declare function readContentfulExport(text: string): ImportSource;
3
+ //# sourceMappingURL=contentful.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contentful.d.ts","sourceRoot":"","sources":["../../src/import/contentful.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAA0B,MAAM,SAAS,CAAC;AA2CpE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAkH/D"}
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readContentfulExport = readContentfulExport;
4
+ /**
5
+ * Contentful: the JSON `contentful space export` writes (content types,
6
+ * entries, assets, locales).
7
+ *
8
+ * Content types become collections, entries become records of them, and a
9
+ * `Link` to an asset or entry becomes an upload or relationship. Only the
10
+ * space's default locale becomes the entry; every OTHER locale's values become
11
+ * the entry's locale twins (the engine adds the languages to the library and
12
+ * writes the twins). A Contentful field that is not `localized` has one value
13
+ * for all locales, so it stays on the source entry, as the library's model says.
14
+ */
15
+ const config_1 = require("./config");
16
+ const richtext_json_1 = require("./richtext-json");
17
+ const isObj = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
18
+ const arr = (v) => (Array.isArray(v) ? v : []);
19
+ const sysId = (v) => (isObj(v) && isObj(v.sys) && typeof v.sys.id === 'string' ? v.sys.id : null);
20
+ function fieldOf(f, name, label) {
21
+ const base = { name, label, ...(f.required ? { required: true } : {}), ...(f.localized ? { localized: true } : {}) };
22
+ const link = (spec) => {
23
+ if (spec.linkType === 'Asset')
24
+ return { ...base, type: 'upload', relationTo: 'media' };
25
+ const allowed = arr(arr(spec.validations).filter(isObj).find((v) => Array.isArray(v.linkContentType))?.linkContentType).map(String);
26
+ return { ...base, type: 'relationship', relationTo: allowed.length ? allowed.map(config_1.keyOf) : ['*'] };
27
+ };
28
+ switch (f.type) {
29
+ case 'Symbol': {
30
+ const inList = arr(arr(f.validations).filter(isObj).find((v) => Array.isArray(v.in))?.in).map(String);
31
+ return inList.length ? { ...base, type: 'select', options: inList } : { ...base, type: 'text' };
32
+ }
33
+ case 'Text':
34
+ return { ...base, type: 'textarea' };
35
+ case 'RichText':
36
+ return { ...base, type: 'richText' };
37
+ case 'Integer':
38
+ case 'Number':
39
+ return { ...base, type: 'number' };
40
+ case 'Date':
41
+ return { ...base, type: 'date' };
42
+ case 'Boolean':
43
+ return { ...base, type: 'checkbox' };
44
+ case 'Link':
45
+ return link(f);
46
+ case 'Array': {
47
+ const items = isObj(f.items) ? f.items : {};
48
+ if (items.type === 'Link' && items.linkType === 'Asset')
49
+ return (0, config_1.listOf)(name, { type: 'upload', relationTo: 'media' }, label);
50
+ if (items.type === 'Link')
51
+ return { ...link(items), hasMany: true };
52
+ return (0, config_1.listOf)(name, { type: 'text' }, label);
53
+ }
54
+ default:
55
+ return { ...base, type: 'json' };
56
+ }
57
+ }
58
+ function readContentfulExport(text) {
59
+ const data = JSON.parse(text);
60
+ const notes = [];
61
+ const locales = arr(data.locales).filter(isObj);
62
+ const fallback = locales.find((l) => l.default)?.code;
63
+ const defaultLocale = typeof fallback === 'string' ? fallback : 'en-US';
64
+ const unlocalized = { n: 0 };
65
+ const types = arr(data.contentTypes).filter(isObj);
66
+ const typeKeys = new Map(types.map((t) => [sysId(t) ?? '', (0, config_1.keyOf)(sysId(t) ?? '')]));
67
+ const fieldKeys = new Map();
68
+ const localizedFields = new Map();
69
+ const collections = [];
70
+ for (const t of types) {
71
+ const id = sysId(t);
72
+ if (!id)
73
+ continue;
74
+ const keys = new Map();
75
+ const fields = [];
76
+ for (const f of arr(t.fields).filter(isObj)) {
77
+ if (f.omitted || typeof f.id !== 'string')
78
+ continue;
79
+ const name = (0, config_1.keyOf)(f.id);
80
+ keys.set(f.id, name);
81
+ const field = fieldOf(f, name, typeof f.name === 'string' ? f.name : f.id);
82
+ if (field)
83
+ fields.push(f.localized ? { ...field, localized: true } : field); // lists (listOf) carry no base, so set it here
84
+ }
85
+ fieldKeys.set(id, keys);
86
+ localizedFields.set(id, new Set(arr(t.fields).filter(isObj).filter((f) => f.localized && typeof f.id === 'string').map((f) => String(f.id))));
87
+ collections.push({
88
+ slug: typeKeys.get(id),
89
+ label: typeof t.name === 'string' ? t.name : id,
90
+ ...(typeof t.displayField === 'string' && keys.has(t.displayField) ? { titleField: keys.get(t.displayField) } : {}),
91
+ fields,
92
+ });
93
+ }
94
+ // Relationship targets named by content type id become collection slugs; "any type" is every collection.
95
+ const all = collections.map((c) => c.slug);
96
+ const fixTargets = (fs) => fs.forEach((f) => {
97
+ if (f.type === 'relationship')
98
+ f.relationTo = Array.isArray(f.relationTo) && f.relationTo.includes('*') ? all : f.relationTo;
99
+ if (f.relationTo && Array.isArray(f.relationTo) && f.relationTo.length === 1)
100
+ f.relationTo = f.relationTo[0];
101
+ });
102
+ collections.forEach((c) => fixTargets(c.fields));
103
+ const pick = (localized) => (isObj(localized) ? (localized[defaultLocale] ?? undefined) : undefined);
104
+ const media = [];
105
+ const assetUrls = new Map();
106
+ for (const a of arr(data.assets).filter(isObj)) {
107
+ const id = sysId(a);
108
+ const fields = isObj(a.fields) ? a.fields : {};
109
+ const file = isObj(pick(fields.file)) ? pick(fields.file) : null;
110
+ if (!id || !file || typeof file.url !== 'string')
111
+ continue;
112
+ const url = file.url.startsWith('//') ? `https:${file.url}` : file.url;
113
+ const title = pick(fields.title);
114
+ media.push({
115
+ id,
116
+ filename: typeof file.fileName === 'string' ? file.fileName : (url.split('/').pop() ?? id),
117
+ location: url,
118
+ ...(typeof file.contentType === 'string' ? { contentType: file.contentType } : {}),
119
+ ...(typeof title === 'string' ? { alt: title } : {}),
120
+ aliases: [file.url, url],
121
+ });
122
+ assetUrls.set(id, { url, ...(typeof title === 'string' ? { alt: title } : {}) });
123
+ }
124
+ const records = [];
125
+ for (const e of arr(data.entries).filter(isObj)) {
126
+ const id = sysId(e);
127
+ const typeId = isObj(e.sys) ? sysId(e.sys.contentType) : null;
128
+ if (!id || !typeId || !typeKeys.has(typeId)) {
129
+ notes.push(`Entry ${id ?? '?'} has a content type that is not in the export and was skipped.`);
130
+ continue;
131
+ }
132
+ const keys = fieldKeys.get(typeId);
133
+ const values = {};
134
+ const twins = {};
135
+ const fields = isObj(e.fields) ? e.fields : {};
136
+ for (const [fid, loc] of Object.entries(fields)) {
137
+ const v = pick(loc);
138
+ if (v !== undefined && keys.has(fid))
139
+ values[keys.get(fid)] = v;
140
+ if (!isObj(loc) || !keys.has(fid))
141
+ continue;
142
+ for (const [code, other] of Object.entries(loc)) {
143
+ if (code === defaultLocale || other === undefined || other === null)
144
+ continue;
145
+ if (!localizedFields.get(typeId)?.has(fid))
146
+ unlocalized.n++;
147
+ else
148
+ (twins[code] ??= {})[keys.get(fid)] = other;
149
+ }
150
+ }
151
+ const sys = isObj(e.sys) ? e.sys : {};
152
+ const slugField = ['slug', 'urlSlug'].find((k) => typeof values[k] === 'string');
153
+ records.push({
154
+ type: typeKeys.get(typeId),
155
+ id,
156
+ published: typeof sys.publishedVersion === 'number',
157
+ ...(slugField ? { slug: values[slugField] } : {}),
158
+ values,
159
+ ...(Object.keys(twins).length ? { locales: twins } : {}),
160
+ });
161
+ }
162
+ if (unlocalized.n)
163
+ notes.push(`${unlocalized.n} value(s) in other locales sit on fields the export does not mark localized and were not imported.`);
164
+ return {
165
+ name: 'contentful',
166
+ languages: locales.flatMap((l) => (typeof l.code === 'string' ? [{ code: l.code, label: typeof l.name === 'string' ? l.name : l.code, ...(l.code === defaultLocale ? { default: true } : {}) }] : [])),
167
+ modelSource: collections.length ? (0, config_1.payloadConfigSource)(collections) : undefined,
168
+ records,
169
+ media,
170
+ notes,
171
+ richText: (raw, image) => (0, richtext_json_1.fromContentful)(raw, image, (id) => assetUrls.get(id) ?? null),
172
+ mediaId: (raw) => sysId(raw),
173
+ refs: (raw) => (Array.isArray(raw) ? raw : [raw]).flatMap((v) => {
174
+ const id = sysId(v);
175
+ return id ? [{ id }] : [];
176
+ }),
177
+ };
178
+ }
179
+ //# sourceMappingURL=contentful.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contentful.js","sourceRoot":"","sources":["../../src/import/contentful.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ImportFiles } from './types';
2
+ export declare const diskFiles: ImportFiles;
3
+ export declare function fetchBytes(url: string): Promise<Uint8Array>;
4
+ //# sourceMappingURL=disk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disk.d.ts","sourceRoot":"","sources":["../../src/import/disk.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,eAAO,MAAM,SAAS,EAAE,WAMvB,CAAC;AAEF,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAIjE"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.diskFiles = void 0;
4
+ exports.fetchBytes = fetchBytes;
5
+ const node_fs_1 = require("node:fs");
6
+ exports.diskFiles = {
7
+ read: (p) => (0, node_fs_1.readFileSync)(p, 'utf8'),
8
+ readBytes: (p) => new Uint8Array((0, node_fs_1.readFileSync)(p)),
9
+ exists: (p) => (0, node_fs_1.existsSync)(p),
10
+ list: (d) => (0, node_fs_1.readdirSync)(d).sort(),
11
+ isDir: (p) => (0, node_fs_1.existsSync)(p) && (0, node_fs_1.statSync)(p).isDirectory(),
12
+ };
13
+ async function fetchBytes(url) {
14
+ const res = await fetch(url);
15
+ if (!res.ok)
16
+ throw new Error(`${url} answered ${res.status}`);
17
+ return new Uint8Array(await res.arrayBuffer());
18
+ }
19
+ //# sourceMappingURL=disk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disk.js","sourceRoot":"","sources":["../../src/import/disk.ts"],"names":[],"mappings":";;;AAWA,gCAIC;AAfD,qCAA0E;AAG7D,QAAA,SAAS,GAAgB;IACpC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,sBAAY,EAAC,CAAC,EAAE,MAAM,CAAC;IACpC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,IAAA,sBAAY,EAAC,CAAC,CAAC,CAAC;IACjD,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,oBAAU,EAAC,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,qBAAW,EAAC,CAAC,CAAC,CAAC,IAAI,EAAE;IAClC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,oBAAU,EAAC,CAAC,CAAC,IAAI,IAAA,kBAAQ,EAAC,CAAC,CAAC,CAAC,WAAW,EAAE;CACzD,CAAC;AAEK,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,aAAa,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9D,OAAO,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * The locale half of an import: make sure the library has the source's
3
+ * languages, then write each record's other-locale values as the entry's
4
+ * locale twins.
5
+ *
6
+ * Kept apart from the engine because it is a separate mechanism with its own
7
+ * failure rule: a language the library refuses, or a twin the API rejects, is
8
+ * reported against that language / record and the rest of the import goes on.
9
+ */
10
+ import type { ForumulateClient } from '@forumulate/sdk';
11
+ import type { ResolvedFields } from './model-fields';
12
+ import type { FieldDecl, ImportReport, ImportSource, RawRecord } from './types';
13
+ /**
14
+ * Adds the source's non-default languages the library lacks; returns the codes
15
+ * the library has afterwards (the only ones twins can be written in).
16
+ */
17
+ export declare function ensureLanguages(client: ForumulateClient, orgId: string, libraryId: string, source: ImportSource, report: ImportReport): Promise<Set<string>>;
18
+ export interface TwinJob {
19
+ client: ForumulateClient;
20
+ orgId: string;
21
+ libraryId: string;
22
+ records: RawRecord[];
23
+ ready: ReadonlySet<string>;
24
+ /** Source entry ids by the engine's record key. */
25
+ ids: ReadonlyMap<string, string>;
26
+ /** Filled: record key → the twin entry ids written (they are published with the source). */
27
+ twinIds: Map<string, string[]>;
28
+ report: ImportReport;
29
+ pace: () => Promise<void>;
30
+ typeOf: (type: string) => ResolvedFields | null;
31
+ coerce: (decls: FieldDecl[], values: Record<string, unknown>, r: RawRecord) => Record<string, unknown>;
32
+ keyOf: (r: RawRecord) => string;
33
+ }
34
+ export declare function writeTwins(j: TwinJob): Promise<void>;
35
+ //# sourceMappingURL=engine-locales.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-locales.d.ts","sourceRoot":"","sources":["../../src/import/engine-locales.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAIhF;;;GAGG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAsBtB;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,mDAAmD;IACnD,GAAG,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,4FAA4F;IAC5F,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,cAAc,GAAG,IAAI,CAAC;IAChD,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvG,KAAK,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,MAAM,CAAC;CACjC;AAED,wBAAsB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB1D"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ensureLanguages = ensureLanguages;
4
+ exports.writeTwins = writeTwins;
5
+ const errMessage = (e) => (e instanceof Error ? e.message : String(e));
6
+ /**
7
+ * Adds the source's non-default languages the library lacks; returns the codes
8
+ * the library has afterwards (the only ones twins can be written in).
9
+ */
10
+ async function ensureLanguages(client, orgId, libraryId, source, report) {
11
+ const have = await client.content.locales.list(orgId, libraryId);
12
+ const codes = new Set(have.locales.map((l) => l.code));
13
+ const sourceDefault = source.languages?.find((l) => l.default)?.code;
14
+ if (sourceDefault && sourceDefault !== have.sourceLocale) {
15
+ report.notes.push(`The export's default language is ${sourceDefault} but the library's source language is ${have.sourceLocale}; ` +
16
+ `the default-language values were written as ${have.sourceLocale}.`);
17
+ }
18
+ const wanted = new Set(Object.keys(Object.assign({}, ...source.records.map((r) => r.locales ?? {}))));
19
+ for (const code of wanted) {
20
+ if (codes.has(code))
21
+ continue;
22
+ const label = source.languages?.find((l) => l.code === code)?.label ?? code;
23
+ try {
24
+ const added = await client.content.locales.add(orgId, libraryId, { code, label });
25
+ for (const l of added.locales)
26
+ codes.add(l.code);
27
+ }
28
+ catch (e) {
29
+ report.notes.push(`Language ${code} could not be added to the library (${errMessage(e)}); its translations were skipped.`);
30
+ }
31
+ }
32
+ return codes;
33
+ }
34
+ async function writeTwins(j) {
35
+ for (const r of j.records) {
36
+ const id = j.ids.get(j.keyOf(r));
37
+ const type = j.typeOf(r.type);
38
+ if (!id || !type || !r.locales)
39
+ continue;
40
+ // The API refuses a non-localized field on a twin (the source entry owns it), so only localized ones go.
41
+ const decls = type.fields.filter((f) => f.localized);
42
+ for (const [code, values] of Object.entries(r.locales)) {
43
+ if (!j.ready.has(code))
44
+ continue;
45
+ try {
46
+ const own = Object.fromEntries(Object.entries(values).filter(([k]) => decls.some((d) => d.key === k)));
47
+ const fields = j.coerce(decls, own, r);
48
+ if (!Object.keys(fields).length)
49
+ continue;
50
+ const res = await j.client.content.entries.writeLocale(j.orgId, j.libraryId, id, code, fields);
51
+ j.report.entries.translations++;
52
+ (j.twinIds.get(j.keyOf(r)) ?? j.twinIds.set(j.keyOf(r), []).get(j.keyOf(r))).push(res.entryId);
53
+ await j.pace();
54
+ }
55
+ catch (e) {
56
+ j.report.entries.failed.push({ id: r.id, type: r.type, message: `translation ${code}: ${errMessage(e)}` });
57
+ }
58
+ }
59
+ }
60
+ }
61
+ //# sourceMappingURL=engine-locales.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-locales.js","sourceRoot":"","sources":["../../src/import/engine-locales.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { ForumulateClient } from '@forumulate/sdk';
2
+ import { type ResolvedFields } from './model-fields';
3
+ import type { ImportFiles, ImportReport, ImportSource, RawRecord } from './types';
4
+ export interface EngineDeps {
5
+ client: ForumulateClient;
6
+ upload?: (path: string, form: FormData) => Promise<unknown>;
7
+ files: ImportFiles;
8
+ fetchBytes: (url: string) => Promise<Uint8Array>;
9
+ /** Folder the export lives in; relative media locations are under it. */
10
+ root: string;
11
+ sleep?: (ms: number) => Promise<void>;
12
+ }
13
+ export interface EngineOptions {
14
+ orgId: string;
15
+ libraryId: string;
16
+ dryRun: boolean;
17
+ /** `source`: publish what the source had published. `all`, or `none` (everything stays a draft). */
18
+ publish: 'source' | 'all' | 'none';
19
+ /** Apply a model that removes content types the library has. */
20
+ allowModelRemovals: boolean;
21
+ /** Milliseconds between writes. */
22
+ pace: number;
23
+ }
24
+ export declare function slugOf(s: string | undefined): string | undefined;
25
+ /** `Idempotency-Key` for one record: the same export record is the same entry on every run. */
26
+ export declare function entryKey(source: string, library: string, r: Pick<RawRecord, 'type' | 'id'>): string;
27
+ export declare function titleOf(r: RawRecord, fields: ResolvedFields | null): string;
28
+ export declare function runImport(source: ImportSource, deps: EngineDeps, opts: EngineOptions): Promise<ImportReport>;
29
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/import/engine.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAKxD,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAa,MAAM,SAAS,CAAC;AAE7F,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IACjD,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,oGAAoG;IACpG,OAAO,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IACnC,gEAAgE;IAChE,kBAAkB,EAAE,OAAO,CAAC;IAC5B,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;CACd;AAKD,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGhE;AAED,+FAA+F;AAC/F,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,MAAM,CAEnG;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,MAAM,CAG3E;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAiMlH"}