@forumulate/cli 0.3.6 → 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 (160) hide show
  1. package/README.md +4 -3
  2. package/dist/cli.js +37 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/content/command.d.ts +34 -0
  5. package/dist/content/command.d.ts.map +1 -0
  6. package/dist/content/command.js +225 -0
  7. package/dist/content/command.js.map +1 -0
  8. package/dist/content/library.d.ts +22 -0
  9. package/dist/content/library.d.ts.map +1 -0
  10. package/dist/content/library.js +40 -0
  11. package/dist/content/library.js.map +1 -0
  12. package/dist/content/render.d.ts +15 -0
  13. package/dist/content/render.d.ts.map +1 -0
  14. package/dist/content/render.js +85 -0
  15. package/dist/content/render.js.map +1 -0
  16. package/dist/content/types-gen.d.ts +40 -0
  17. package/dist/content/types-gen.d.ts.map +1 -0
  18. package/dist/content/types-gen.js +200 -0
  19. package/dist/content/types-gen.js.map +1 -0
  20. package/dist/import/coerce.d.ts +34 -0
  21. package/dist/import/coerce.d.ts.map +1 -0
  22. package/dist/import/coerce.js +134 -0
  23. package/dist/import/coerce.js.map +1 -0
  24. package/dist/import/command.d.ts +25 -0
  25. package/dist/import/command.d.ts.map +1 -0
  26. package/dist/import/command.js +127 -0
  27. package/dist/import/command.js.map +1 -0
  28. package/dist/import/config.d.ts +39 -0
  29. package/dist/import/config.d.ts.map +1 -0
  30. package/dist/import/config.js +48 -0
  31. package/dist/import/config.js.map +1 -0
  32. package/dist/import/contentful.d.ts +3 -0
  33. package/dist/import/contentful.d.ts.map +1 -0
  34. package/dist/import/contentful.js +179 -0
  35. package/dist/import/contentful.js.map +1 -0
  36. package/dist/import/disk.d.ts +4 -0
  37. package/dist/import/disk.d.ts.map +1 -0
  38. package/dist/import/disk.js +19 -0
  39. package/dist/import/disk.js.map +1 -0
  40. package/dist/import/engine-locales.d.ts +35 -0
  41. package/dist/import/engine-locales.d.ts.map +1 -0
  42. package/dist/import/engine-locales.js +61 -0
  43. package/dist/import/engine-locales.js.map +1 -0
  44. package/dist/import/engine.d.ts +29 -0
  45. package/dist/import/engine.d.ts.map +1 -0
  46. package/dist/import/engine.js +248 -0
  47. package/dist/import/engine.js.map +1 -0
  48. package/dist/import/media.d.ts +24 -0
  49. package/dist/import/media.d.ts.map +1 -0
  50. package/dist/import/media.js +39 -0
  51. package/dist/import/media.js.map +1 -0
  52. package/dist/import/model-fields.d.ts +22 -0
  53. package/dist/import/model-fields.d.ts.map +1 -0
  54. package/dist/import/model-fields.js +60 -0
  55. package/dist/import/model-fields.js.map +1 -0
  56. package/dist/import/payload/index.d.ts +9 -0
  57. package/dist/import/payload/index.d.ts.map +1 -0
  58. package/dist/import/payload/index.js +129 -0
  59. package/dist/import/payload/index.js.map +1 -0
  60. package/dist/import/report.d.ts +5 -0
  61. package/dist/import/report.d.ts.map +1 -0
  62. package/dist/import/report.js +52 -0
  63. package/dist/import/report.js.map +1 -0
  64. package/dist/import/richtext-core.d.ts +26 -0
  65. package/dist/import/richtext-core.d.ts.map +1 -0
  66. package/dist/import/richtext-core.js +65 -0
  67. package/dist/import/richtext-core.js.map +1 -0
  68. package/dist/import/richtext-html.d.ts +5 -0
  69. package/dist/import/richtext-html.d.ts.map +1 -0
  70. package/dist/import/richtext-html.js +311 -0
  71. package/dist/import/richtext-html.js.map +1 -0
  72. package/dist/import/richtext-json.d.ts +10 -0
  73. package/dist/import/richtext-json.d.ts.map +1 -0
  74. package/dist/import/richtext-json.js +250 -0
  75. package/dist/import/richtext-json.js.map +1 -0
  76. package/dist/import/sanity.d.ts +8 -0
  77. package/dist/import/sanity.d.ts.map +1 -0
  78. package/dist/import/sanity.js +158 -0
  79. package/dist/import/sanity.js.map +1 -0
  80. package/dist/import/strapi-archive.d.ts +6 -0
  81. package/dist/import/strapi-archive.d.ts.map +1 -0
  82. package/dist/import/strapi-archive.js +127 -0
  83. package/dist/import/strapi-archive.js.map +1 -0
  84. package/dist/import/strapi.d.ts +7 -0
  85. package/dist/import/strapi.d.ts.map +1 -0
  86. package/dist/import/strapi.js +185 -0
  87. package/dist/import/strapi.js.map +1 -0
  88. package/dist/import/tar.d.ts +3 -0
  89. package/dist/import/tar.d.ts.map +1 -0
  90. package/dist/import/tar.js +48 -0
  91. package/dist/import/tar.js.map +1 -0
  92. package/dist/import/types.d.ts +157 -0
  93. package/dist/import/types.d.ts.map +1 -0
  94. package/dist/import/types.js +12 -0
  95. package/dist/import/types.js.map +1 -0
  96. package/dist/import/wordpress.d.ts +15 -0
  97. package/dist/import/wordpress.d.ts.map +1 -0
  98. package/dist/import/wordpress.js +147 -0
  99. package/dist/import/wordpress.js.map +1 -0
  100. package/dist/publish/api.d.ts +95 -0
  101. package/dist/publish/api.d.ts.map +1 -0
  102. package/dist/publish/api.js +265 -0
  103. package/dist/publish/api.js.map +1 -0
  104. package/dist/publish/command.d.ts +44 -0
  105. package/dist/publish/command.d.ts.map +1 -0
  106. package/dist/publish/command.js +246 -0
  107. package/dist/publish/command.js.map +1 -0
  108. package/dist/publish/compare.d.ts +45 -0
  109. package/dist/publish/compare.d.ts.map +1 -0
  110. package/dist/publish/compare.js +124 -0
  111. package/dist/publish/compare.js.map +1 -0
  112. package/dist/publish/context.d.ts +46 -0
  113. package/dist/publish/context.d.ts.map +1 -0
  114. package/dist/publish/context.js +54 -0
  115. package/dist/publish/context.js.map +1 -0
  116. package/dist/publish/docs-apply.d.ts +39 -0
  117. package/dist/publish/docs-apply.d.ts.map +1 -0
  118. package/dist/publish/docs-apply.js +178 -0
  119. package/dist/publish/docs-apply.js.map +1 -0
  120. package/dist/publish/docs-plan.d.ts +40 -0
  121. package/dist/publish/docs-plan.d.ts.map +1 -0
  122. package/dist/publish/docs-plan.js +211 -0
  123. package/dist/publish/docs-plan.js.map +1 -0
  124. package/dist/publish/docs-reconcile.d.ts +26 -0
  125. package/dist/publish/docs-reconcile.d.ts.map +1 -0
  126. package/dist/publish/docs-reconcile.js +162 -0
  127. package/dist/publish/docs-reconcile.js.map +1 -0
  128. package/dist/publish/extras.d.ts +25 -0
  129. package/dist/publish/extras.d.ts.map +1 -0
  130. package/dist/publish/extras.js +218 -0
  131. package/dist/publish/extras.js.map +1 -0
  132. package/dist/publish/frontmatter.d.ts +45 -0
  133. package/dist/publish/frontmatter.d.ts.map +1 -0
  134. package/dist/publish/frontmatter.js +265 -0
  135. package/dist/publish/frontmatter.js.map +1 -0
  136. package/dist/publish/manifest.d.ts +5 -0
  137. package/dist/publish/manifest.d.ts.map +1 -0
  138. package/dist/publish/manifest.js +144 -0
  139. package/dist/publish/manifest.js.map +1 -0
  140. package/dist/publish/posts.d.ts +39 -0
  141. package/dist/publish/posts.d.ts.map +1 -0
  142. package/dist/publish/posts.js +350 -0
  143. package/dist/publish/posts.js.map +1 -0
  144. package/dist/publish/rewrite.d.ts +20 -0
  145. package/dist/publish/rewrite.d.ts.map +1 -0
  146. package/dist/publish/rewrite.js +82 -0
  147. package/dist/publish/rewrite.js.map +1 -0
  148. package/dist/publish/scan.d.ts +25 -0
  149. package/dist/publish/scan.d.ts.map +1 -0
  150. package/dist/publish/scan.js +351 -0
  151. package/dist/publish/scan.js.map +1 -0
  152. package/dist/publish/types.d.ts +155 -0
  153. package/dist/publish/types.d.ts.map +1 -0
  154. package/dist/publish/types.js +13 -0
  155. package/dist/publish/types.js.map +1 -0
  156. package/dist/run.d.ts +15 -1
  157. package/dist/run.d.ts.map +1 -1
  158. package/dist/run.js +103 -45
  159. package/dist/run.js.map +1 -1
  160. package/package.json +3 -2
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+ /**
3
+ * TypeScript from a content library's `schema.json` (plan P4-T1, spec 7):
4
+ * `forumulate content types --library acme-site --out src/forumulate.d.ts`.
5
+ *
6
+ * The schema names everything already: `type.<key>` is a content type's
7
+ * `fields`, `entry.<key>` the delivery envelope around them (marked
8
+ * `x-forumulate-global` for a global), `block.<key>` a block type, and
9
+ * `json.*` the hoisted definitions of a json field's own schema. Each becomes
10
+ * one named type, so a `json` field is typed from its schema, a blocks
11
+ * field is a union discriminated on `blockType`, and a reference to an
12
+ * author is an `AuthorFields`.
13
+ *
14
+ * One deliberate departure from the schema: objects are CLOSED here. The
15
+ * schema says `additionalProperties: true` so a site keeps working while a
16
+ * field is being renamed; the types say exactly what the model has, so code
17
+ * that still reads the old name fails to compile after the model changes.
18
+ * That compile error is the point of generating types at all.
19
+ *
20
+ * Pure and deterministic: same schema, same bytes.
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.pascal = pascal;
24
+ exports.defName = defName;
25
+ exports.toType = toType;
26
+ exports.generateTypes = generateTypes;
27
+ const isObj = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
28
+ const IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
29
+ function pascal(s) {
30
+ const out = s
31
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
32
+ .split(/[^A-Za-z0-9]+/)
33
+ .filter(Boolean)
34
+ .map((w) => w[0].toUpperCase() + w.slice(1))
35
+ .join('');
36
+ return /^[0-9]/.test(out) ? `T${out}` : out || 'T';
37
+ }
38
+ /** The TypeScript name of a `$defs` entry. */
39
+ function defName(def) {
40
+ const dot = def.indexOf('.');
41
+ const kind = def.slice(0, dot);
42
+ const rest = def.slice(dot + 1);
43
+ if (kind === 'type')
44
+ return `${pascal(rest)}Fields`;
45
+ if (kind === 'entry')
46
+ return `${pascal(rest)}Entry`;
47
+ if (kind === 'block')
48
+ return `${pascal(rest)}Block`;
49
+ return `Json${pascal(rest.replace(/~/g, ' '))}`;
50
+ }
51
+ const literal = (v) => JSON.stringify(v);
52
+ const key = (k) => (IDENT.test(k) ? k : JSON.stringify(k));
53
+ /** Parenthesised when a union or intersection sits at its top level (`(A | B)[]`). */
54
+ function paren(t) {
55
+ let depth = 0;
56
+ for (let i = 0; i < t.length; i++) {
57
+ const c = t[i];
58
+ if (c === '{' || c === '(' || c === '[' || c === '<')
59
+ depth++;
60
+ else if (c === '}' || c === ')' || c === ']' || c === '>')
61
+ depth--;
62
+ else if (c === '"') {
63
+ // Skip a string literal, escapes included: an enum value may hold a `|`.
64
+ for (i++; i < t.length && t[i] !== '"'; i++)
65
+ if (t[i] === '\\')
66
+ i++;
67
+ }
68
+ else if (depth === 0 && (c === '|' || c === '&'))
69
+ return `(${t})`;
70
+ }
71
+ return t;
72
+ }
73
+ function comment(s, indent) {
74
+ const text = [s.title, s.description].filter((x) => typeof x === 'string' && x.length > 0);
75
+ const uniq = [...new Set(text)];
76
+ if (!uniq.length)
77
+ return '';
78
+ return `${indent}/** ${uniq.join(' — ').replace(/\*\//g, '*\\/').replace(/\n/g, ' ')} */\n`;
79
+ }
80
+ /** One schema as a TypeScript type expression. */
81
+ function toType(s, indent = '') {
82
+ if (s === true || s === undefined)
83
+ return 'unknown';
84
+ if (s === false)
85
+ return 'never';
86
+ if (!isObj(s))
87
+ return 'unknown';
88
+ if (typeof s.$ref === 'string') {
89
+ const m = /^#\/\$defs\/(.+)$/.exec(s.$ref);
90
+ return m ? defName(m[1]) : 'unknown';
91
+ }
92
+ if ('const' in s)
93
+ return literal(s.const);
94
+ if (Array.isArray(s.enum))
95
+ return s.enum.length ? s.enum.map(literal).join(' | ') : 'never';
96
+ for (const k of ['oneOf', 'anyOf']) {
97
+ if (Array.isArray(s[k])) {
98
+ const parts = [...new Set(s[k].map((x) => toType(x, indent)))];
99
+ return parts.length ? parts.join(' | ') : 'never';
100
+ }
101
+ }
102
+ if (Array.isArray(s.allOf))
103
+ return s.allOf.map((x) => paren(toType(x, indent))).join(' & ');
104
+ const types = Array.isArray(s.type) ? s.type : typeof s.type === 'string' ? [s.type] : [];
105
+ if (!types.length) {
106
+ if (isObj(s.properties) || s.additionalProperties !== undefined)
107
+ return objectType(s, indent);
108
+ if (s.items !== undefined)
109
+ return arrayType(s, indent);
110
+ return 'unknown';
111
+ }
112
+ const parts = types.map((t) => {
113
+ switch (t) {
114
+ case 'string':
115
+ return 'string';
116
+ case 'number':
117
+ case 'integer':
118
+ return 'number';
119
+ case 'boolean':
120
+ return 'boolean';
121
+ case 'null':
122
+ return 'null';
123
+ case 'array':
124
+ return arrayType(s, indent);
125
+ case 'object':
126
+ return objectType(s, indent);
127
+ default:
128
+ return 'unknown';
129
+ }
130
+ });
131
+ return [...new Set(parts)].join(' | ');
132
+ }
133
+ function arrayType(s, indent) {
134
+ if (Array.isArray(s.items))
135
+ return `[${s.items.map((x) => toType(x, indent)).join(', ')}]`;
136
+ return `${paren(toType(s.items, indent))}[]`;
137
+ }
138
+ function objectType(s, indent) {
139
+ const props = isObj(s.properties) ? s.properties : {};
140
+ const names = Object.keys(props);
141
+ if (!names.length) {
142
+ // A map: its values are typed when the schema says how.
143
+ return isObj(s.additionalProperties) ? `Record<string, ${toType(s.additionalProperties, indent)}>` : 'Record<string, unknown>';
144
+ }
145
+ return `{\n${members(s, indent + ' ')}${indent}}`;
146
+ }
147
+ function members(s, indent) {
148
+ const props = (isObj(s.properties) ? s.properties : {});
149
+ const required = new Set(Array.isArray(s.required) ? s.required : []);
150
+ let out = '';
151
+ for (const [name, prop] of Object.entries(props)) {
152
+ out += isObj(prop) ? comment(prop, indent) : '';
153
+ out += `${indent}${key(name)}${required.has(name) ? '' : '?'}: ${toType(prop, indent)};\n`;
154
+ }
155
+ return out;
156
+ }
157
+ /**
158
+ * A `$defs` entry as a declaration. Always a type alias, never an interface:
159
+ * an interface is not assignable to `Record<string, unknown>` (it has no
160
+ * implicit index signature), and that is the constraint every generic
161
+ * content helper puts on `fields` (`Entry<T = Record<string, unknown>>`).
162
+ */
163
+ function declaration(def, s) {
164
+ const doc = isObj(s) ? comment(s, '') : '';
165
+ return `${doc}export type ${defName(def)} = ${toType(s)};\n`;
166
+ }
167
+ /** The whole `forumulate.d.ts` for a library schema. */
168
+ function generateTypes(schema, opts = {}) {
169
+ if (!isObj(schema) || !isObj(schema.$defs))
170
+ throw new Error('This is not a content library schema: it has no `$defs`.');
171
+ const defs = schema.$defs;
172
+ const entries = Object.keys(defs).filter((d) => d.startsWith('entry.'));
173
+ const isGlobal = (k) => isObj(defs[`entry.${k}`]) && defs[`entry.${k}`]['x-forumulate-global'] === true;
174
+ const typeKeys = Object.keys(defs).filter((d) => d.startsWith('type.')).map((d) => d.slice(5));
175
+ const blockKeys = Object.keys(defs).filter((d) => d.startsWith('block.')).map((d) => d.slice(6));
176
+ const collections = typeKeys.filter((k) => !isGlobal(k));
177
+ const globals = typeKeys.filter((k) => isGlobal(k));
178
+ const parts = [
179
+ '/* eslint-disable */',
180
+ '// Generated by `forumulate content types`. Do not edit: regenerate after a model change',
181
+ `// (${opts.command ?? 'forumulate content types --library <id> --out <file>'}).`,
182
+ ...(opts.libraryId ? [`// Content library: ${opts.libraryId}`] : []),
183
+ '// Fields are optional because an entry may leave them empty; objects are closed so a',
184
+ '// field removed or renamed in the model is a compile error wherever code still reads it.',
185
+ '',
186
+ ];
187
+ // Fields, then entries, then blocks, then json schemas: the order a reader looks for them.
188
+ const order = ['type.', 'entry.', 'block.', 'json.'];
189
+ const sorted = Object.keys(defs).sort((a, b) => {
190
+ const ra = order.findIndex((p) => a.startsWith(p));
191
+ const rb = order.findIndex((p) => b.startsWith(p));
192
+ return (ra < 0 ? 9 : ra) - (rb < 0 ? 9 : rb);
193
+ });
194
+ for (const def of sorted)
195
+ parts.push(declaration(def, defs[def]));
196
+ const map = (name, keys, suffix, doc) => `/** ${doc} */\nexport type ${name} = {\n${keys.map((k) => ` ${key(k)}: ${suffix(k)};\n`).join('')}};\n`;
197
+ parts.push(`/** Every block type, discriminated on \`blockType\`. */\nexport type Block = ${blockKeys.length ? blockKeys.map((k) => defName(`block.${k}`)).join(' | ') : 'never'};\n`, "export type BlockTypeKey = Block['blockType'];\n", map('Blocks', blockKeys, (k) => defName(`block.${k}`), 'Block types by key.'), map('ContentTypes', collections, (k) => defName(`type.${k}`), 'The fields of each collection (a content type with many entries), by key.'), map('Globals', globals, (k) => defName(`type.${k}`), 'The fields of each global (one entry per locale), by key.'), map('Entries', entries.map((d) => d.slice(6)), (k) => defName(`entry.${k}`), 'The delivery envelope of each content type, by key.'), 'export type ContentTypeKey = keyof ContentTypes;\n', 'export type GlobalKey = keyof Globals;\n', '/** Everything at once, for a client typed against this library. */\nexport type ForumulateContent = {\n types: ContentTypes;\n globals: Globals;\n blocks: Blocks;\n entries: Entries;\n};\n');
198
+ return { source: parts.join('\n'), types: collections, globals, blocks: blockKeys };
199
+ }
200
+ //# sourceMappingURL=types-gen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-gen.js","sourceRoot":"","sources":["../../src/content/types-gen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * A record's source values as the values of the model's declared fields.
3
+ *
4
+ * Driven by the field's declared TYPE, never by guessing from the value: a
5
+ * number is an id only where the field is a reference. What a value means
6
+ * (a rich-text document, a file, a pointer) is the importer's to say
7
+ * (`ImportSource`); what the library wants it to look like is decided here, so
8
+ * five platforms produce one shape. Anything that cannot be converted is
9
+ * left out and counted, never stored wrong.
10
+ */
11
+ import type { FieldDecl, ImageResolver, ImportSource, RefTarget } from './types';
12
+ type Obj = Record<string, unknown>;
13
+ export interface CoerceCtx {
14
+ source: ImportSource;
15
+ image: ImageResolver;
16
+ /** The library asset id for a source file, uploading it first if needed. */
17
+ asset(sourceId: string): {
18
+ id: string;
19
+ filename: string;
20
+ } | null;
21
+ /** The entry id for a source record, or null while it does not exist yet / is not in the export. */
22
+ entry(target: RefTarget): string | null;
23
+ blocks: Map<string, FieldDecl[]>;
24
+ /** `type.field` → values that fitted no declared field or could not be converted. */
25
+ dropped: Map<string, number>;
26
+ /** Set when a reference could not be resolved yet; the engine writes the field again once all entries exist. */
27
+ pendingRef: {
28
+ value: boolean;
29
+ };
30
+ }
31
+ export declare function coerceFields(fields: FieldDecl[], raw: Obj, ctx: CoerceCtx, path: string, skip?: ReadonlySet<string>): Obj;
32
+ export declare function coerceValue(f: FieldDecl, raw: unknown, ctx: CoerceCtx, path: string): unknown;
33
+ export {};
34
+ //# sourceMappingURL=coerce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coerce.d.ts","sourceRoot":"","sources":["../../src/import/coerce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEjF,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAGnC,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,aAAa,CAAC;IACrB,4EAA4E;IAC5E,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACjE,oGAAoG;IACpG,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC;IACxC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACjC,qFAAqF;IACrF,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,gHAAgH;IAChH,UAAU,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;CAChC;AAYD,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAW,CAAC,MAAM,CAAa,GAAG,GAAG,CAUpI;AAWD,wBAAgB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAsF7F"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.coerceFields = coerceFields;
4
+ exports.coerceValue = coerceValue;
5
+ const isObj = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
6
+ const drop = (ctx, path) => ctx.dropped.set(path, (ctx.dropped.get(path) ?? 0) + 1);
7
+ function many(field, raw, one) {
8
+ if (field.hasMany) {
9
+ const list = (Array.isArray(raw) ? raw : raw === undefined || raw === null ? [] : [raw]).map(one).filter((x) => x !== undefined);
10
+ return list;
11
+ }
12
+ return one(Array.isArray(raw) ? raw[0] : raw);
13
+ }
14
+ function coerceFields(fields, raw, ctx, path, skip = new Set()) {
15
+ const out = {};
16
+ const known = new Set(fields.map((f) => f.key));
17
+ for (const f of fields) {
18
+ if (skip.has(f.key) || raw[f.key] === undefined || raw[f.key] === null)
19
+ continue;
20
+ const v = coerceValue(f, raw[f.key], ctx, `${path}.${f.key}`);
21
+ if (v !== undefined && !(Array.isArray(v) && v.length === 0 && f.hasMany))
22
+ out[f.key] = v;
23
+ }
24
+ for (const k of Object.keys(raw))
25
+ if (!known.has(k) && !skip.has(k) && raw[k] !== undefined && raw[k] !== null)
26
+ drop(ctx, `${path}.${k}`);
27
+ return out;
28
+ }
29
+ /**
30
+ * A list of scalars or files is an array of one-field rows in the model. A raw
31
+ * list of strings, ids or file objects is wrapped into those rows; a raw row
32
+ * that already names the field is left as it is.
33
+ */
34
+ const WRAPPED = new Set(['media', 'file', 'reference', 'richText', 'json']);
35
+ const ISO = /^\d{4}-\d{2}-\d{2}/;
36
+ function coerceValue(f, raw, ctx, path) {
37
+ const bad = () => {
38
+ drop(ctx, path);
39
+ return undefined;
40
+ };
41
+ switch (f.type) {
42
+ case 'text':
43
+ case 'textarea':
44
+ case 'email':
45
+ case 'select':
46
+ case 'multiselect':
47
+ case 'slug':
48
+ case 'color':
49
+ case 'url':
50
+ case 'phone':
51
+ return many(f, raw, (v) => (typeof v === 'string' ? v : typeof v === 'number' || typeof v === 'boolean' ? String(v) : undefined)) ?? bad();
52
+ case 'number':
53
+ case 'money':
54
+ return many(f, raw, (v) => (typeof v === 'number' && Number.isFinite(v) ? v : typeof v === 'string' && v.trim() !== '' && Number.isFinite(Number(v)) ? Number(v) : undefined)) ?? bad();
55
+ case 'boolean':
56
+ return typeof raw === 'boolean' ? raw : raw === 'true' ? true : raw === 'false' ? false : bad();
57
+ case 'datetime':
58
+ case 'date': {
59
+ const d = typeof raw === 'string' || typeof raw === 'number' ? new Date(raw) : null;
60
+ if (!d || Number.isNaN(d.getTime()))
61
+ return bad();
62
+ // A calendar day stays the day the source wrote, not that day in UTC shifted by a zone.
63
+ return f.type === 'date' ? (typeof raw === 'string' && ISO.test(raw) ? raw.slice(0, 10) : d.toISOString().slice(0, 10)) : d.toISOString();
64
+ }
65
+ case 'code':
66
+ if (typeof raw === 'string')
67
+ return { language: 'text', code: raw };
68
+ return isObj(raw) && typeof raw.code === 'string' ? { language: typeof raw.language === 'string' && raw.language ? raw.language : 'text', code: raw.code } : bad();
69
+ case 'json':
70
+ return raw;
71
+ case 'richText': {
72
+ const doc = ctx.source.richText(raw, ctx.image);
73
+ return doc ?? bad();
74
+ }
75
+ case 'media':
76
+ case 'file': {
77
+ const one = (v) => {
78
+ const id = ctx.source.mediaId(v);
79
+ const asset = id ? ctx.asset(id) : null;
80
+ if (!asset)
81
+ return undefined;
82
+ const alt = isObj(v) && typeof v.alt === 'string' ? v.alt : undefined;
83
+ return f.type === 'file' ? { assetId: asset.id, name: asset.filename } : { assetId: asset.id, ...(alt ? { alt } : {}) };
84
+ };
85
+ return many(f, raw, one) ?? bad();
86
+ }
87
+ case 'reference': {
88
+ const targets = ctx.source.refs(raw, f);
89
+ const ids = [];
90
+ for (const t of targets) {
91
+ const id = ctx.entry(t);
92
+ if (id)
93
+ ids.push({ kind: 'entry', id });
94
+ else
95
+ ctx.pendingRef.value = true;
96
+ }
97
+ if (!targets.length)
98
+ return bad();
99
+ if (!ids.length)
100
+ return undefined;
101
+ return f.hasMany ? ids : ids[0];
102
+ }
103
+ case 'group':
104
+ return isObj(raw) ? coerceFields(f.fields ?? [], raw, ctx, path) : bad();
105
+ case 'array': {
106
+ if (!Array.isArray(raw))
107
+ return bad();
108
+ const only = f.fields?.length === 1 ? f.fields[0] : null;
109
+ return raw
110
+ .map((row) => (only && !(isObj(row) && only.key in row) && (!isObj(row) || WRAPPED.has(only.type)) ? { [only.key]: row } : row))
111
+ .filter(isObj)
112
+ .map((row, i) => coerceFields(f.fields ?? [], row, ctx, `${path}[${i}]`, new Set(['id'])));
113
+ }
114
+ case 'blocks': {
115
+ if (!Array.isArray(raw))
116
+ return bad();
117
+ const rows = [];
118
+ raw.forEach((row, i) => {
119
+ if (!isObj(row))
120
+ return;
121
+ const bt = String(row.blockType ?? row._type ?? '');
122
+ const fields = ctx.blocks.get(bt);
123
+ if (!fields)
124
+ return void drop(ctx, `${path}[${i}]<${bt || 'unnamed block'}>`);
125
+ rows.push({ blockType: bt, ...coerceFields(fields, row, ctx, `${path}[${i}]<${bt}>`, new Set(['id', 'blockType', 'blockName', '_type', '_key'])) });
126
+ });
127
+ return rows;
128
+ }
129
+ default:
130
+ // seo, link, form… have shapes only the author's model knows; a value already in that shape passes.
131
+ return raw;
132
+ }
133
+ }
134
+ //# sourceMappingURL=coerce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coerce.js","sourceRoot":"","sources":["../../src/import/coerce.ts"],"names":[],"mappings":";;AAuCA,oCAUC;AAWD,kCAsFC;AArID,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;AAgBjG,MAAM,IAAI,GAAG,CAAC,GAAc,EAAE,IAAY,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAEvG,SAAS,IAAI,CAAI,KAAgB,EAAE,GAAY,EAAE,GAAkC;IACjF,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAU,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QACzI,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAChD,CAAC;AAED,SAAgB,YAAY,CAAC,MAAmB,EAAE,GAAQ,EAAE,GAAc,EAAE,IAAY,EAAE,OAA4B,IAAI,GAAG,EAAE;IAC7H,MAAM,GAAG,GAAQ,EAAE,CAAC;IACpB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI;YAAE,SAAS;QACjF,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5F,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1I,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;AAE5E,MAAM,GAAG,GAAG,oBAAoB,CAAC;AAEjC,SAAgB,WAAW,CAAC,CAAY,EAAE,GAAY,EAAE,GAAc,EAAE,IAAY;IAClF,MAAM,GAAG,GAAG,GAAG,EAAE;QACf,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IACF,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU,CAAC;QAChB,KAAK,OAAO,CAAC;QACb,KAAK,QAAQ,CAAC;QACd,KAAK,aAAa,CAAC;QACnB,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,KAAK,CAAC;QACX,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;QAC7I,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;QAC1L,KAAK,SAAS;YACZ,OAAO,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAClG,KAAK,UAAU,CAAC;QAChB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,CAAC,GAAG,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACpF,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBAAE,OAAO,GAAG,EAAE,CAAC;YAClD,wFAAwF;YACxF,OAAO,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5I,CAAC;QACD,KAAK,MAAM;YACT,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YACpE,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACrK,KAAK,MAAM;YACT,OAAO,GAAG,CAAC;QACb,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;YAChD,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,CAAC;QACD,KAAK,OAAO,CAAC;QACb,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,GAAG,GAAG,CAAC,CAAU,EAAE,EAAE;gBACzB,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACjC,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACxC,IAAI,CAAC,KAAK;oBAAE,OAAO,SAAS,CAAC;gBAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;gBACtE,OAAO,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YAC1H,CAAC,CAAC;YACF,OAAO,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QACpC,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM,GAAG,GAAoC,EAAE,CAAC;YAChD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACxB,IAAI,EAAE;oBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;;oBACnC,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC;YACnC,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAO,GAAG,EAAE,CAAC;YAClC,IAAI,CAAC,GAAG,CAAC,MAAM;gBAAE,OAAO,SAAS,CAAC;YAClC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,KAAK,OAAO;YACV,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAC3E,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,OAAO,GAAG,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1D,OAAO,GAAG;iBACP,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;iBAC/H,MAAM,CAAC,KAAK,CAAC;iBACb,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/F,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,OAAO,GAAG,EAAE,CAAC;YACtC,MAAM,IAAI,GAAU,EAAE,CAAC;YACvB,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;gBACrB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;oBAAE,OAAO;gBACxB,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBACpD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAClC,IAAI,CAAC,MAAM;oBAAE,OAAO,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,eAAe,GAAG,CAAC,CAAC;gBAC9E,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtJ,CAAC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QACD;YACE,oGAAoG;YACpG,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { ForumulateClient } from '@forumulate/sdk';
2
+ import type { ImportFiles, ImportSource } from './types';
3
+ /**
4
+ * `forumulate import <platform> <path> --library <id|slug>` (plan P4-T3, T4).
5
+ *
6
+ * Reads the export, shows what the model needs and what would land (a dry run
7
+ * is always the first step), and writes only after a yes or `--yes`. Talks to
8
+ * the library through the same management API every other client uses.
9
+ */
10
+ export interface ImportDeps {
11
+ client: ForumulateClient;
12
+ out: (line: string) => void;
13
+ err: (line: string) => void;
14
+ env?: NodeJS.ProcessEnv;
15
+ ask?: (question: string) => Promise<string>;
16
+ upload?: (path: string, form: FormData) => Promise<unknown>;
17
+ sleep?: (ms: number) => Promise<void>;
18
+ files?: ImportFiles;
19
+ fetchBytes?: (url: string) => Promise<Uint8Array>;
20
+ }
21
+ export declare const IMPORT_PLATFORMS: readonly ["payload", "contentful", "sanity", "strapi", "wordpress"];
22
+ export declare const IMPORT_VALUE_FLAGS: string[];
23
+ export declare function readSource(platform: string, path: string, argv: readonly string[], files: ImportFiles): ImportSource;
24
+ export declare function runImportCommand(argv: readonly string[], positional: readonly string[], deps: ImportDeps): Promise<number>;
25
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/import/command.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAUxD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGzD;;;;;;GAMG;AAEH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,gBAAgB,CAAC;IACzB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CACnD;AAED,eAAO,MAAM,gBAAgB,qEAAsE,CAAC;AACpG,eAAO,MAAM,kBAAkB,UAAgE,CAAC;AAahG,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,YAAY,CAmBpH;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAoEhI"}
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IMPORT_VALUE_FLAGS = exports.IMPORT_PLATFORMS = void 0;
4
+ exports.readSource = readSource;
5
+ exports.runImportCommand = runImportCommand;
6
+ const node_path_1 = require("node:path");
7
+ const library_1 = require("../content/library");
8
+ const contentful_1 = require("./contentful");
9
+ const disk_1 = require("./disk");
10
+ const engine_1 = require("./engine");
11
+ const payload_1 = require("./payload");
12
+ const report_1 = require("./report");
13
+ const sanity_1 = require("./sanity");
14
+ const strapi_1 = require("./strapi");
15
+ const strapi_archive_1 = require("./strapi-archive");
16
+ const wordpress_1 = require("./wordpress");
17
+ exports.IMPORT_PLATFORMS = ['payload', 'contentful', 'sanity', 'strapi', 'wordpress'];
18
+ exports.IMPORT_VALUE_FLAGS = ['--config', '--publish', '--base-url', '--media-collection'];
19
+ class UsageError extends Error {
20
+ }
21
+ function valuesOf(argv, name) {
22
+ const out = [];
23
+ argv.forEach((a, i) => {
24
+ if (a === name && argv[i + 1] !== undefined)
25
+ out.push(argv[i + 1]);
26
+ else if (a.startsWith(`${name}=`))
27
+ out.push(a.slice(name.length + 1));
28
+ });
29
+ return out;
30
+ }
31
+ function readSource(platform, path, argv, files) {
32
+ const value = (n) => valuesOf(argv, n)[0];
33
+ switch (platform) {
34
+ case 'payload': {
35
+ const config = value('--config');
36
+ const media = valuesOf(argv, '--media-collection');
37
+ return (0, payload_1.readPayloadExport)(path, files, { configPath: config, ...(media.length ? { mediaCollections: media } : {}) });
38
+ }
39
+ case 'contentful':
40
+ return (0, contentful_1.readContentfulExport)(files.read(path));
41
+ case 'sanity':
42
+ return (0, sanity_1.readSanityExport)(files.read(files.isDir(path) ? (0, node_path_1.join)(path, 'data.ndjson') : path));
43
+ case 'strapi':
44
+ return (0, strapi_1.readStrapiExport)(path, files, { baseUrl: value('--base-url') });
45
+ case 'wordpress':
46
+ return (0, wordpress_1.readWordpressExport)(files.read(path));
47
+ default:
48
+ throw new UsageError(`Unknown platform "${platform}". Import from: ${exports.IMPORT_PLATFORMS.join(', ')}.`);
49
+ }
50
+ }
51
+ async function runImportCommand(argv, positional, deps) {
52
+ let files = deps.files ?? disk_1.diskFiles;
53
+ const env = deps.env ?? process.env;
54
+ const flag = (n) => argv.includes(n);
55
+ const value = (n) => valuesOf(argv, n)[0];
56
+ const [platform, given] = positional;
57
+ let path = given;
58
+ try {
59
+ // `strapi export --no-encrypt` writes one archive: unpack it in memory and read it as a folder.
60
+ if (platform === 'strapi' && path && (0, strapi_archive_1.isStrapiArchive)(path) && !files.isDir(path)) {
61
+ files = (0, strapi_archive_1.strapiArchiveFiles)(files.readBytes(path), path);
62
+ path = strapi_archive_1.STRAPI_ARCHIVE_ROOT;
63
+ }
64
+ if (!platform || !path)
65
+ throw new UsageError(`Usage: forumulate import <${exports.IMPORT_PLATFORMS.join('|')}> <export path> --library <id|slug>`);
66
+ const publish = value('--publish') ?? 'source';
67
+ if (publish !== 'source' && publish !== 'all' && publish !== 'none')
68
+ throw new UsageError('--publish is source, all or none.');
69
+ const target = await (0, library_1.resolveLibrary)(deps.client, { org: value('--org') ?? env.FORUMULATE_ORG, library: value('--library') ?? env.FORUMULATE_LIBRARY });
70
+ const source = readSource(platform, path, argv, files);
71
+ const root = files.isDir(path) ? path : (0, node_path_1.dirname)(path);
72
+ const engineDeps = {
73
+ client: deps.client,
74
+ upload: deps.upload,
75
+ files,
76
+ fetchBytes: deps.fetchBytes ?? disk_1.fetchBytes,
77
+ root,
78
+ sleep: deps.sleep,
79
+ };
80
+ const base = {
81
+ orgId: target.orgId,
82
+ libraryId: target.libraryId,
83
+ publish,
84
+ allowModelRemovals: flag('--allow-model-removals'),
85
+ pace: Number(value('--pace') ?? 0) || 0,
86
+ };
87
+ const dry = await (0, engine_1.runImport)(source, engineDeps, { ...base, dryRun: true });
88
+ if (flag('--json') && flag('--dry-run')) {
89
+ deps.out(JSON.stringify(dry, null, 2));
90
+ return 0;
91
+ }
92
+ if (!flag('--json')) {
93
+ deps.out(`${platform} export ${path} → "${target.name}":`);
94
+ for (const l of (0, report_1.reportLines)(dry))
95
+ deps.out(l);
96
+ }
97
+ if (flag('--dry-run'))
98
+ return 0;
99
+ if (!flag('--yes')) {
100
+ if (!deps.ask) {
101
+ deps.err('Nothing imported: pass --yes to import without a prompt (or --dry-run to only look).');
102
+ return 1;
103
+ }
104
+ const a = (await deps.ask(`Import ${dry.entries.planned} entries and ${dry.media.planned} files into "${target.name}"? [y/N] `)).trim().toLowerCase();
105
+ if (a !== 'y' && a !== 'yes') {
106
+ deps.out('Nothing imported.');
107
+ return 0;
108
+ }
109
+ }
110
+ const done = await (0, engine_1.runImport)(source, engineDeps, { ...base, dryRun: false });
111
+ if (flag('--json'))
112
+ deps.out(JSON.stringify(done, null, 2));
113
+ else
114
+ for (const l of (0, report_1.reportLines)(done))
115
+ deps.out(l);
116
+ return (0, report_1.exitCode)(done);
117
+ }
118
+ catch (e) {
119
+ if (e instanceof UsageError || e instanceof library_1.TargetError) {
120
+ deps.err(e.message);
121
+ return 1;
122
+ }
123
+ deps.err(`Import stopped: ${e instanceof Error ? e.message : String(e)}`);
124
+ return 1;
125
+ }
126
+ }
127
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/import/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * A platform's schema as a Payload-format config.
3
+ *
4
+ * Contentful, Sanity, Strapi and WordPress each describe their content
5
+ * differently, and the API already has exactly one reader that turns a field
6
+ * list into a content model: the Payload one. So each importer states its
7
+ * schema in Payload's vocabulary (a small, literal subset) and sends it
8
+ * through that reader. A mapping bug is then fixed in one place, and the
9
+ * report of what did not map comes from the same code as `content push`.
10
+ */
11
+ export interface PayloadField {
12
+ name: string;
13
+ type: 'text' | 'textarea' | 'email' | 'richText' | 'number' | 'date' | 'checkbox' | 'json' | 'upload' | 'relationship' | 'select' | 'array' | 'group';
14
+ label?: string;
15
+ required?: boolean;
16
+ localized?: boolean;
17
+ hasMany?: boolean;
18
+ relationTo?: string | string[];
19
+ options?: string[];
20
+ fields?: PayloadField[];
21
+ }
22
+ export interface PayloadCollection {
23
+ slug: string;
24
+ label?: string;
25
+ titleField?: string;
26
+ fields: PayloadField[];
27
+ }
28
+ /** The key a platform's field/type name becomes: stable, and a valid field name. */
29
+ export declare function keyOf(name: string): string;
30
+ /**
31
+ * A list of scalars or files. The model has no "many texts" or "many media"
32
+ * field (the Payload reader says so: `hasMany` on those is unsupported); the
33
+ * model's own spelling is an array whose rows hold one value. Importers write
34
+ * `value` rows and the engine wraps raw lists into them (`./coerce`).
35
+ */
36
+ export declare const LIST_ROW_KEY = "value";
37
+ export declare function listOf(name: string, inner: Omit<PayloadField, 'name'>, label?: string): PayloadField;
38
+ export declare function payloadConfigSource(collections: PayloadCollection[]): string;
39
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/import/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;IACtJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,oFAAoF;AACpF,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK1C;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,UAAU,CAAC;AACpC,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,CAEpG;AAgBD,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAU5E"}