@stackbit/cms-core 0.2.1 → 0.3.0-develop.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 (54) hide show
  1. package/dist/content-store-utils.d.ts +5 -1
  2. package/dist/content-store-utils.d.ts.map +1 -1
  3. package/dist/content-store-utils.js +28 -3
  4. package/dist/content-store-utils.js.map +1 -1
  5. package/dist/content-store.d.ts +12 -1
  6. package/dist/content-store.d.ts.map +1 -1
  7. package/dist/content-store.js +399 -177
  8. package/dist/content-store.js.map +1 -1
  9. package/dist/types/content-store-document-fields.d.ts +26 -4
  10. package/dist/types/content-store-document-fields.d.ts.map +1 -1
  11. package/dist/types/content-store-documents.d.ts +14 -3
  12. package/dist/types/content-store-documents.d.ts.map +1 -1
  13. package/dist/types/content-store-types.d.ts +7 -1
  14. package/dist/types/content-store-types.d.ts.map +1 -1
  15. package/dist/utils/backward-compatibility.d.ts +184 -0
  16. package/dist/utils/backward-compatibility.d.ts.map +1 -0
  17. package/dist/utils/backward-compatibility.js +151 -0
  18. package/dist/utils/backward-compatibility.js.map +1 -0
  19. package/dist/utils/config-delegate.d.ts +11 -0
  20. package/dist/utils/config-delegate.d.ts.map +1 -0
  21. package/dist/utils/config-delegate.js +226 -0
  22. package/dist/utils/config-delegate.js.map +1 -0
  23. package/dist/utils/create-update-csi-docs.d.ts +7 -5
  24. package/dist/utils/create-update-csi-docs.d.ts.map +1 -1
  25. package/dist/utils/create-update-csi-docs.js +24 -24
  26. package/dist/utils/create-update-csi-docs.js.map +1 -1
  27. package/dist/utils/csi-to-store-docs-converter.d.ts +17 -3
  28. package/dist/utils/csi-to-store-docs-converter.d.ts.map +1 -1
  29. package/dist/utils/csi-to-store-docs-converter.js +187 -47
  30. package/dist/utils/csi-to-store-docs-converter.js.map +1 -1
  31. package/dist/utils/site-map.d.ts.map +1 -1
  32. package/dist/utils/site-map.js +4 -1
  33. package/dist/utils/site-map.js.map +1 -1
  34. package/dist/utils/store-to-api-docs-converter.d.ts +6 -1
  35. package/dist/utils/store-to-api-docs-converter.d.ts.map +1 -1
  36. package/dist/utils/store-to-api-docs-converter.js +140 -51
  37. package/dist/utils/store-to-api-docs-converter.js.map +1 -1
  38. package/dist/utils/store-to-csi-docs-converter.d.ts +1 -0
  39. package/dist/utils/store-to-csi-docs-converter.d.ts.map +1 -1
  40. package/dist/utils/store-to-csi-docs-converter.js +2 -1
  41. package/dist/utils/store-to-csi-docs-converter.js.map +1 -1
  42. package/package.json +5 -5
  43. package/src/content-store-utils.ts +40 -6
  44. package/src/content-store.ts +552 -299
  45. package/src/types/content-store-document-fields.ts +16 -4
  46. package/src/types/content-store-documents.ts +12 -3
  47. package/src/types/content-store-types.ts +4 -1
  48. package/src/utils/backward-compatibility.ts +269 -0
  49. package/src/utils/config-delegate.ts +277 -0
  50. package/src/utils/create-update-csi-docs.ts +47 -50
  51. package/src/utils/csi-to-store-docs-converter.ts +256 -43
  52. package/src/utils/site-map.ts +19 -7
  53. package/src/utils/store-to-api-docs-converter.ts +185 -52
  54. package/src/utils/store-to-csi-docs-converter.ts +1 -1
@@ -1,27 +1,74 @@
1
1
  import _ from 'lodash';
2
2
  import path from 'path';
3
3
  import { omitByNil } from '@stackbit/utils';
4
+ import * as CSITypes from '@stackbit/types';
4
5
  import * as ContentStoreTypes from '../types';
5
- import { DocumentStringLikeFieldAPI } from '../types';
6
6
 
7
- export function mapDocumentsToLocalizedApiObjects(documents: ContentStoreTypes.Document[], locale?: string): ContentStoreTypes.APIDocumentObject[] {
8
- return documents.map((document) => documentToLocalizedApiObject(document, locale));
7
+ export function mapDocumentsToLocalizedApiObjects({
8
+ documents,
9
+ locale,
10
+ delegate
11
+ }: {
12
+ documents: ContentStoreTypes.Document[];
13
+ locale?: string;
14
+ delegate: CSITypes.ConfigDelegate;
15
+ }): ContentStoreTypes.APIDocumentObject[] {
16
+ return documents.map((document) =>
17
+ documentToLocalizedApiObject({
18
+ document,
19
+ locale,
20
+ delegate
21
+ })
22
+ );
9
23
  }
10
24
 
11
- function documentToLocalizedApiObject(document: ContentStoreTypes.Document, locale?: string): ContentStoreTypes.APIDocumentObject {
12
- const { type, fields, ...rest } = document;
25
+ function documentToLocalizedApiObject({
26
+ document,
27
+ locale,
28
+ delegate
29
+ }: {
30
+ document: ContentStoreTypes.Document;
31
+ locale?: string;
32
+ delegate: CSITypes.ConfigDelegate;
33
+ }): ContentStoreTypes.APIDocumentObject {
34
+ const { type, fields, getPreview, ...rest } = document;
13
35
  return {
14
36
  type: 'object',
15
37
  ...rest,
16
- fields: toLocalizedAPIFields(fields, locale)
38
+ srcObjectLabel: getPreview({ delegate, locale }).previewTitle,
39
+ fields: toLocalizedAPIFields({ docFields: fields, delegate, locale })
17
40
  };
18
41
  }
19
42
 
20
- function toLocalizedAPIFields(docFields: Record<string, ContentStoreTypes.DocumentField>, locale?: string): Record<string, ContentStoreTypes.DocumentFieldAPI> {
21
- return _.mapValues(docFields, (docField) => toLocalizedAPIField(docField, locale));
43
+ function toLocalizedAPIFields({
44
+ docFields,
45
+ delegate,
46
+ locale
47
+ }: {
48
+ docFields: Record<string, ContentStoreTypes.DocumentField>;
49
+ delegate: CSITypes.ConfigDelegate;
50
+ locale?: string;
51
+ }): Record<string, ContentStoreTypes.DocumentFieldAPI> {
52
+ return _.mapValues(docFields, (docField) => {
53
+ return toLocalizedAPIField({
54
+ docField,
55
+ delegate,
56
+ locale
57
+ });
58
+ });
22
59
  }
23
60
 
24
- function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?: string, isListItem = false): ContentStoreTypes.DocumentFieldAPI {
61
+ function toLocalizedAPIField({
62
+ docField,
63
+ delegate,
64
+ locale,
65
+ isListItem = false
66
+ }: {
67
+ docField: ContentStoreTypes.DocumentField;
68
+ delegate: CSITypes.ConfigDelegate;
69
+ locale?: string;
70
+ isListItem?: boolean;
71
+ }): ContentStoreTypes.DocumentFieldAPI {
25
72
  type ToBoolean<T extends boolean | undefined> = T extends true ? true : false;
26
73
  function localeFields<T extends boolean | undefined>(localized: T): null | { localized: false } | { localized: true; locale: string } {
27
74
  const isLocalized = !!localized as ToBoolean<T>;
@@ -93,13 +140,17 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?:
93
140
  ...localeFields(docField.localized)
94
141
  };
95
142
  }
96
- case 'image':
143
+ case 'image': {
97
144
  let result: ContentStoreTypes.DocumentFieldAPI;
98
145
  if (docField.localized) {
99
146
  const { localized, locales, ...base } = docField;
100
147
  const localeProps = locales && locale ? locales[locale] : undefined;
101
148
  if (localeProps) {
102
- const fields = toLocalizedAPIFields(localeProps.fields, locale) as ContentStoreTypes.ImageFieldsAPI;
149
+ const fields = toLocalizedAPIFields({
150
+ docFields: localeProps.fields,
151
+ delegate,
152
+ locale
153
+ }) as ContentStoreTypes.ImageFieldsAPI;
103
154
  result = {
104
155
  ...base,
105
156
  ...localeProps,
@@ -121,7 +172,11 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?:
121
172
  ...localeFields(docField.localized)
122
173
  };
123
174
  } else {
124
- const fields = toLocalizedAPIFields(docField.fields, locale) as ContentStoreTypes.ImageFieldsAPI;
175
+ const fields = toLocalizedAPIFields({
176
+ docFields: docField.fields,
177
+ delegate,
178
+ locale
179
+ }) as ContentStoreTypes.ImageFieldsAPI;
125
180
  result = {
126
181
  ...docField,
127
182
  type: 'image',
@@ -131,51 +186,111 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?:
131
186
  }
132
187
  }
133
188
  return result;
134
- case 'object':
135
- case 'model':
189
+ }
190
+ case 'object': {
136
191
  if (docField.localized) {
137
- if (docField.type === 'object') {
138
- const { localized, locales, ...base } = docField;
139
- const localeProps = locales && locale ? locales[locale] : undefined;
140
- return {
141
- ...base,
142
- ...(localeProps
143
- ? {
144
- ...localeProps,
145
- fields: toLocalizedAPIFields(localeProps.fields, locale)
146
- }
147
- : { isUnset: true }),
148
- ...localeFields(localized)
149
- };
150
- } else {
151
- const { localized, locales, ...base } = docField;
152
- const localeProps = locales && locale ? locales[locale] : undefined;
192
+ const { localized, locales, ...base } = docField;
193
+ const localeProps = locales && locale ? locales[locale] : undefined;
194
+ if (localeProps) {
195
+ const { fields, getPreview, locale } = localeProps;
153
196
  return {
154
197
  ...base,
155
- type: 'object',
156
- ...(localeProps
157
- ? {
158
- ...localeProps,
159
- fields: toLocalizedAPIFields(localeProps.fields, locale)
160
- }
161
- : { isUnset: true }),
162
- ...localeFields(localized)
198
+ ...localeFields(localized),
199
+ srcObjectLabel:
200
+ getPreview({
201
+ delegate,
202
+ locale
203
+ }).previewTitle ?? (isListItem ? 'Item' : 'Object'),
204
+ fields: toLocalizedAPIFields({
205
+ docFields: fields,
206
+ delegate,
207
+ locale
208
+ })
163
209
  };
164
210
  }
211
+ return {
212
+ ...base,
213
+ ...localeFields(localized),
214
+ isUnset: true
215
+ };
165
216
  }
217
+ if (docField.isUnset) {
218
+ return {
219
+ ...docField,
220
+ type: 'object',
221
+ ...localeFields(docField.localized)
222
+ };
223
+ }
224
+ const { fields, getPreview, ...rest } = docField;
166
225
  return {
167
- ...(!docField.isUnset
168
- ? {
169
- ...docField,
170
- type: 'object',
171
- fields: toLocalizedAPIFields(docField.fields, locale)
172
- }
173
- : {
174
- ...docField,
175
- type: 'object'
176
- }),
226
+ ...rest,
227
+ type: 'object',
228
+ srcObjectLabel:
229
+ getPreview({
230
+ delegate,
231
+ locale
232
+ }).previewTitle ?? (isListItem ? 'Item' : 'Object'),
233
+ fields: toLocalizedAPIFields({
234
+ docFields: fields,
235
+ delegate,
236
+ locale
237
+ }),
177
238
  ...localeFields(docField.localized)
178
239
  };
240
+ }
241
+ case 'model': {
242
+ if (docField.localized) {
243
+ const { localized, locales, ...base } = docField;
244
+ const localeProps = locales && locale ? locales[locale] : undefined;
245
+ if (localeProps) {
246
+ const { fields, getPreview, ...rest } = localeProps;
247
+ return {
248
+ ...base,
249
+ ...rest,
250
+ type: 'object', // API uses 'object' not 'model'
251
+ ...localeFields(localized),
252
+ srcObjectLabel: getPreview({
253
+ delegate,
254
+ locale
255
+ }).previewTitle,
256
+ fields: toLocalizedAPIFields({
257
+ docFields: fields,
258
+ delegate,
259
+ locale
260
+ })
261
+ };
262
+ }
263
+ return {
264
+ ...base,
265
+ type: 'object', // API uses 'object' not 'model'
266
+ isUnset: true,
267
+ ...localeFields(localized)
268
+ };
269
+ }
270
+ if (docField.isUnset) {
271
+ return {
272
+ ...docField,
273
+ type: 'object', // API uses 'object' not 'model'
274
+ ...localeFields(docField.localized)
275
+ };
276
+ } else {
277
+ const { fields, getPreview, ...rest } = docField;
278
+ return {
279
+ ...rest,
280
+ type: 'object', // API uses 'object' not 'model'
281
+ ...localeFields(docField.localized),
282
+ srcObjectLabel: getPreview({
283
+ delegate,
284
+ locale
285
+ }).previewTitle,
286
+ fields: toLocalizedAPIFields({
287
+ docFields: fields,
288
+ delegate,
289
+ locale
290
+ })
291
+ };
292
+ }
293
+ }
179
294
  case 'reference': {
180
295
  if (docField.localized) {
181
296
  const { type, refType, localized, locales, ...base } = docField;
@@ -248,22 +363,40 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?:
248
363
  ...localeFields(docField.localized)
249
364
  };
250
365
  }
251
- case 'list':
366
+ case 'list': {
252
367
  if (docField.localized) {
253
368
  const { localized, locales, ...base } = docField;
254
369
  const localeProps = locales && locale ? locales[locale] : undefined;
255
370
  return {
256
371
  ...base,
257
372
  ...localeProps,
258
- items: (localeProps?.items ?? []).map((field) => toLocalizedAPIField(field, locale, true) as ContentStoreTypes.DocumentListFieldItemsAPI),
373
+ items: (localeProps?.items ?? []).map(
374
+ (field) =>
375
+ toLocalizedAPIField({
376
+ docField: field,
377
+ delegate,
378
+ locale,
379
+ isListItem: true
380
+ }) as ContentStoreTypes.DocumentListFieldItemsAPI
381
+ ),
259
382
  ...localeFields(localized)
260
383
  };
261
384
  }
385
+ const { items, ...rest } = docField;
262
386
  return {
263
- ...docField,
387
+ ...rest,
264
388
  ...localeFields(docField.localized),
265
- items: docField.items.map((field) => toLocalizedAPIField(field, locale, true) as ContentStoreTypes.DocumentListFieldItemsAPI)
389
+ items: items.map(
390
+ (field) =>
391
+ toLocalizedAPIField({
392
+ docField: field,
393
+ delegate,
394
+ locale,
395
+ isListItem: true
396
+ }) as ContentStoreTypes.DocumentListFieldItemsAPI
397
+ )
266
398
  };
399
+ }
267
400
  default:
268
401
  const _exhaustiveCheck: never = docField;
269
402
  console.error(`toLocalizedAPIField _exhaustiveCheck failed, docField.type: ${docField['type']}`);
@@ -6,7 +6,7 @@ export function mapStoreDocumentsToCSIDocumentsWithSource(documents: ContentStor
6
6
  return documents.map((document) => mapStoreDocumentToCSIDocumentWithSource(document));
7
7
  }
8
8
 
9
- function mapStoreDocumentToCSIDocumentWithSource(document: ContentStoreTypes.Document): CSITypes.DocumentWithSource {
9
+ export function mapStoreDocumentToCSIDocumentWithSource(document: ContentStoreTypes.Document): CSITypes.DocumentWithSource {
10
10
  return {
11
11
  type: document.type,
12
12
  id: document.srcObjectId,