@stackbit/cms-core 0.1.11 → 0.1.12-locale.1

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.
@@ -22,16 +22,23 @@ function toLocalizedAPIFields(docFields: Record<string, ContentStoreTypes.Docume
22
22
 
23
23
  function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?: string, isListItem = false): ContentStoreTypes.DocumentFieldAPI {
24
24
  type ToBoolean<T extends boolean | undefined> = T extends true ? true : false;
25
- function localeFields<T extends boolean | undefined>(
26
- localized: T,
27
- _locale: string | undefined
28
- ): null | { localized: ToBoolean<T>; locale: string | undefined } {
29
- return isListItem
30
- ? null
31
- : {
32
- localized: !!localized as ToBoolean<T>,
33
- locale: locale ?? _locale
34
- };
25
+ function localeFields<T extends boolean | undefined>(localized: T): null | { localized: false } | { localized: true; locale: string } {
26
+ const isLocalized = !!localized as ToBoolean<T>;
27
+ if (isListItem) {
28
+ return null;
29
+ }
30
+ if (!isLocalized) {
31
+ return {
32
+ localized: false
33
+ };
34
+ }
35
+ if (!locale) {
36
+ return null;
37
+ }
38
+ return {
39
+ localized: isLocalized,
40
+ locale: locale
41
+ };
35
42
  }
36
43
  switch (docField.type) {
37
44
  case 'string':
@@ -52,22 +59,22 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?:
52
59
  case 'richText':
53
60
  if (docField.localized) {
54
61
  const { localized, locales, ...base } = docField;
55
- const localeProps = locale ? locales[locale] : undefined;
62
+ const localeProps = locales && locale ? locales[locale] : undefined;
56
63
  return {
57
64
  ...base,
58
65
  ...(localeProps ?? { value: null }),
59
- ...localeFields(localized, locale),
66
+ ...localeFields(localized),
60
67
  ...(['file', 'json', 'markdown', 'richText'].includes(docField.type) && !localeProps ? { isUnset: true } : null)
61
68
  };
62
69
  }
63
70
  return {
64
71
  ...docField,
65
- ...localeFields(docField.localized, docField.locale)
72
+ ...localeFields(docField.localized)
66
73
  };
67
74
  case 'image':
68
75
  if (docField.localized) {
69
76
  const { localized, locales, ...base } = docField;
70
- const localeProps = locale ? locales[locale] : undefined;
77
+ const localeProps = locales && locale ? locales[locale] : undefined;
71
78
  return {
72
79
  ...base,
73
80
  ...(localeProps
@@ -76,7 +83,7 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?:
76
83
  fields: toLocalizedAPIFields(localeProps.fields, locale) as ContentStoreTypes.ImageFieldsAPI
77
84
  }
78
85
  : { isUnset: true }),
79
- ...localeFields(localized, locale)
86
+ ...localeFields(localized)
80
87
  };
81
88
  }
82
89
  return {
@@ -90,14 +97,14 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?:
90
97
  ...docField,
91
98
  type: 'image'
92
99
  }),
93
- ...localeFields(docField.localized, docField.locale)
100
+ ...localeFields(docField.localized)
94
101
  };
95
102
  case 'object':
96
103
  case 'model':
97
104
  if (docField.localized) {
98
105
  if (docField.type === 'object') {
99
106
  const { localized, locales, ...base } = docField;
100
- const localeProps = locale ? locales[locale] : undefined;
107
+ const localeProps = locales && locale ? locales[locale] : undefined;
101
108
  return {
102
109
  ...base,
103
110
  ...(localeProps
@@ -106,11 +113,11 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?:
106
113
  fields: toLocalizedAPIFields(localeProps.fields, locale)
107
114
  }
108
115
  : { isUnset: true }),
109
- ...localeFields(localized, locale)
116
+ ...localeFields(localized)
110
117
  };
111
118
  } else {
112
119
  const { localized, locales, ...base } = docField;
113
- const localeProps = locale ? locales[locale] : undefined;
120
+ const localeProps = locales && locale ? locales[locale] : undefined;
114
121
  return {
115
122
  ...base,
116
123
  type: 'object',
@@ -120,7 +127,7 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?:
120
127
  fields: toLocalizedAPIFields(localeProps.fields, locale)
121
128
  }
122
129
  : { isUnset: true }),
123
- ...localeFields(localized, locale)
130
+ ...localeFields(localized)
124
131
  };
125
132
  }
126
133
  }
@@ -135,19 +142,19 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?:
135
142
  ...docField,
136
143
  type: 'object'
137
144
  }),
138
- ...localeFields(docField.localized, docField.locale)
145
+ ...localeFields(docField.localized)
139
146
  };
140
147
  case 'reference':
141
148
  if (docField.localized) {
142
149
  const { type, refType, localized, locales, ...base } = docField;
143
- const localeProps = locale ? locales[locale] : undefined;
150
+ const localeProps = locales && locale ? locales[locale] : undefined;
144
151
  // if reference field isUnset === true, it behaves like a regular object
145
152
  if (!localeProps || localeProps.isUnset) {
146
153
  return {
147
154
  type: 'object',
148
155
  isUnset: true,
149
156
  ...base,
150
- ...localeFields(localized, locale)
157
+ ...localeFields(localized)
151
158
  };
152
159
  }
153
160
  return {
@@ -155,7 +162,7 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?:
155
162
  refType: refType === 'asset' ? 'image' : 'object',
156
163
  ...base,
157
164
  ...localeProps,
158
- ...localeFields(localized, locale)
165
+ ...localeFields(localized)
159
166
  };
160
167
  }
161
168
  const { type, refType, ...base } = docField;
@@ -163,29 +170,29 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?:
163
170
  return {
164
171
  type: 'object',
165
172
  ...base,
166
- ...localeFields(docField.localized, docField.locale)
173
+ ...localeFields(docField.localized)
167
174
  };
168
175
  }
169
176
  return {
170
177
  type: 'unresolved_reference',
171
178
  refType: refType === 'asset' ? 'image' : 'object',
172
179
  ...base,
173
- ...localeFields(docField.localized, docField.locale)
180
+ ...localeFields(docField.localized)
174
181
  };
175
182
  case 'list':
176
183
  if (docField.localized) {
177
184
  const { localized, locales, ...base } = docField;
178
- const localeProps = locale ? locales[locale] : undefined;
185
+ const localeProps = locales && locale ? locales[locale] : undefined;
179
186
  return {
180
187
  ...base,
181
188
  ...localeProps,
182
189
  items: (localeProps?.items ?? []).map((field) => toLocalizedAPIField(field, locale, true)),
183
- ...localeFields(localized, locale)
190
+ ...localeFields(localized)
184
191
  };
185
192
  }
186
193
  return {
187
194
  ...docField,
188
- ...localeFields(docField.localized, docField.locale),
195
+ ...localeFields(docField.localized),
189
196
  items: docField.items.map((field) => toLocalizedAPIField(field, locale, true))
190
197
  };
191
198
  default:
@@ -221,35 +228,37 @@ function localizeAssetFields(assetFields: ContentStoreTypes.AssetFields, locale?
221
228
  };
222
229
  const titleFieldNonLocalized = getDocumentFieldForLocale(assetFields.title, locale);
223
230
  fields.title.value = titleFieldNonLocalized?.value;
224
- fields.title.locale = locale ?? titleFieldNonLocalized?.locale;
231
+ fields.title.locale = locale;
225
232
  const assetFileField = assetFields.file;
226
233
  if (assetFileField.localized) {
227
234
  if (locale) {
228
- fields.url.value = assetFileField.locales[locale]?.url ?? null;
235
+ fields.url.value = assetFileField.locales?.[locale]?.url ?? null;
229
236
  fields.url.locale = locale;
230
237
  }
231
238
  } else {
232
239
  fields.url.value = assetFileField.url;
233
- fields.url.locale = assetFileField.locale;
234
240
  }
235
241
  return fields;
236
242
  }
237
243
 
238
244
  export function mapStoreAssetsToAPIAssets(assets: ContentStoreTypes.Asset[], locale?: string): ContentStoreTypes.APIAsset[] {
239
- return assets.map((asset) => storeAssetToAPIAsset(asset, locale));
245
+ return assets.map((asset) => storeAssetToAPIAsset(asset, locale)).filter((asset): asset is ContentStoreTypes.APIAsset => !!asset);
240
246
  }
241
247
 
242
- function storeAssetToAPIAsset(asset: ContentStoreTypes.Asset, locale?: string): ContentStoreTypes.APIAsset {
248
+ function storeAssetToAPIAsset(asset: ContentStoreTypes.Asset, locale?: string): ContentStoreTypes.APIAsset | null {
243
249
  const assetTitleField = asset.fields.title;
244
- const localizedTitleField = assetTitleField.localized ? assetTitleField.locales[locale!]! : assetTitleField;
250
+ const localizedTitleField = assetTitleField.localized ? assetTitleField.locales?.[locale!] : assetTitleField;
245
251
  const assetFileField = asset.fields.file;
246
- const localizedFileField = assetFileField.localized ? assetFileField.locales[locale!]! : assetFileField;
252
+ const localizedFileField = assetFileField.localized ? assetFileField.locales?.[locale!] : assetFileField;
253
+ if (!localizedFileField) {
254
+ return null;
255
+ }
247
256
  return {
248
257
  objectId: asset.srcObjectId,
249
258
  createdAt: asset.createdAt,
250
259
  url: localizedFileField.url,
251
260
  ...omitByNil({
252
- title: localizedTitleField.value,
261
+ title: localizedTitleField?.value ?? null,
253
262
  fileName: localizedFileField.fileName,
254
263
  contentType: localizedFileField.contentType,
255
264
  size: localizedFileField.size,