@stackbit/cms-core 0.1.26-gitcms.3 → 0.1.26-gitcms.5

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 (96) hide show
  1. package/dist/content-store-utils.d.ts +5 -5
  2. package/dist/content-store-utils.d.ts.map +1 -1
  3. package/dist/content-store-utils.js +8 -6
  4. package/dist/content-store-utils.js.map +1 -1
  5. package/dist/content-store.d.ts +9 -6
  6. package/dist/content-store.d.ts.map +1 -1
  7. package/dist/content-store.js +7 -7
  8. package/dist/content-store.js.map +1 -1
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +1 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/services/git.d.ts +6 -6
  14. package/dist/services/git.d.ts.map +1 -1
  15. package/dist/services/git.js +34 -29
  16. package/dist/services/git.js.map +1 -1
  17. package/dist/services/run.d.ts +5 -15
  18. package/dist/services/run.d.ts.map +1 -1
  19. package/dist/services/run.js +12 -13
  20. package/dist/services/run.js.map +1 -1
  21. package/dist/types/content-store-document-fields.d.ts +600 -0
  22. package/dist/types/content-store-document-fields.d.ts.map +1 -0
  23. package/dist/types/content-store-document-fields.js +3 -0
  24. package/dist/types/content-store-document-fields.js.map +1 -0
  25. package/dist/types/content-store-documents.d.ts +99 -0
  26. package/dist/types/content-store-documents.d.ts.map +1 -0
  27. package/dist/types/content-store-documents.js +3 -0
  28. package/dist/types/content-store-documents.js.map +1 -0
  29. package/dist/types/content-store-types.d.ts +75 -0
  30. package/dist/types/content-store-types.d.ts.map +1 -0
  31. package/dist/types/content-store-types.js.map +1 -0
  32. package/dist/types/content-store-update-operation.d.ts +61 -0
  33. package/dist/types/content-store-update-operation.d.ts.map +1 -0
  34. package/dist/types/content-store-update-operation.js +3 -0
  35. package/dist/types/content-store-update-operation.js.map +1 -0
  36. package/dist/types/index.d.ts +6 -0
  37. package/dist/types/index.d.ts.map +1 -0
  38. package/dist/types/index.js +18 -0
  39. package/dist/types/index.js.map +1 -0
  40. package/dist/types/search-filter.d.ts +1 -1
  41. package/dist/types/search-filter.d.ts.map +1 -1
  42. package/dist/utils/create-update-csi-docs.d.ts +1 -1
  43. package/dist/utils/create-update-csi-docs.d.ts.map +1 -1
  44. package/dist/utils/create-update-csi-docs.js +11 -10
  45. package/dist/utils/create-update-csi-docs.js.map +1 -1
  46. package/dist/utils/csi-to-store-docs-converter.d.ts +1 -1
  47. package/dist/utils/csi-to-store-docs-converter.d.ts.map +1 -1
  48. package/dist/utils/csi-to-store-docs-converter.js +20 -4
  49. package/dist/utils/csi-to-store-docs-converter.js.map +1 -1
  50. package/dist/utils/duplicate-document.d.ts +1 -1
  51. package/dist/utils/duplicate-document.d.ts.map +1 -1
  52. package/dist/utils/duplicate-document.js +7 -0
  53. package/dist/utils/duplicate-document.js.map +1 -1
  54. package/dist/utils/search-utils.d.ts +1 -1
  55. package/dist/utils/search-utils.d.ts.map +1 -1
  56. package/dist/utils/search-utils.js +16 -16
  57. package/dist/utils/search-utils.js.map +1 -1
  58. package/dist/utils/site-map.d.ts +1 -1
  59. package/dist/utils/site-map.d.ts.map +1 -1
  60. package/dist/utils/site-map.js +9 -0
  61. package/dist/utils/site-map.js.map +1 -1
  62. package/dist/utils/store-to-api-docs-converter.d.ts +3 -3
  63. package/dist/utils/store-to-api-docs-converter.d.ts.map +1 -1
  64. package/dist/utils/store-to-api-docs-converter.js +60 -32
  65. package/dist/utils/store-to-api-docs-converter.js.map +1 -1
  66. package/dist/utils/store-to-csi-docs-converter.d.ts +1 -1
  67. package/dist/utils/store-to-csi-docs-converter.d.ts.map +1 -1
  68. package/dist/utils/store-to-csi-docs-converter.js +4 -0
  69. package/dist/utils/store-to-csi-docs-converter.js.map +1 -1
  70. package/dist/utils/timer.d.ts +1 -1
  71. package/dist/utils/timer.d.ts.map +1 -1
  72. package/package.json +5 -5
  73. package/src/content-store-utils.ts +12 -11
  74. package/src/content-store.ts +22 -19
  75. package/src/index.ts +1 -1
  76. package/src/services/git.ts +44 -43
  77. package/src/services/run.ts +10 -15
  78. package/src/types/content-store-document-fields.ts +658 -0
  79. package/src/types/content-store-documents.ts +113 -0
  80. package/src/types/content-store-types.ts +96 -0
  81. package/src/types/content-store-update-operation.ts +85 -0
  82. package/src/types/index.ts +5 -0
  83. package/src/types/search-filter.ts +26 -19
  84. package/src/utils/create-update-csi-docs.ts +16 -12
  85. package/src/utils/csi-to-store-docs-converter.ts +33 -14
  86. package/src/utils/duplicate-document.ts +8 -1
  87. package/src/utils/search-utils.ts +18 -19
  88. package/src/utils/site-map.ts +10 -1
  89. package/src/utils/store-to-api-docs-converter.ts +67 -38
  90. package/src/utils/store-to-csi-docs-converter.ts +5 -1
  91. package/src/utils/timer.ts +1 -1
  92. package/dist/content-store-types.d.ts +0 -411
  93. package/dist/content-store-types.d.ts.map +0 -1
  94. package/dist/content-store-types.js.map +0 -1
  95. package/src/content-store-types.ts +0 -527
  96. /package/dist/{content-store-types.js → types/content-store-types.js} +0 -0
@@ -1,11 +1,9 @@
1
1
  import _ from 'lodash';
2
2
  import { ImageModel, Model } from '@stackbit/sdk';
3
- import * as ContentSourceInterface from '@stackbit/types';
4
- import { getLocalizedFieldForLocale } from '@stackbit/types';
5
3
 
4
+ import * as ContentStoreTypes from '../types';
6
5
  import { SearchFilter, SearchFilterItem } from '../types/search-filter';
7
- import { ContentStoreTypes } from '..';
8
- import { getContentSourceId } from '../content-store-utils';
6
+ import { getContentSourceId, getDocumentFieldForLocale } from '../content-store-utils';
9
7
 
10
8
  const META_FIELD = {
11
9
  createdAt: {
@@ -91,7 +89,7 @@ const isDocumentMatchesPattern = (document: ContentStoreTypes.Document, query: s
91
89
  case 'text':
92
90
  case 'markdown':
93
91
  case 'html':
94
- value = getLocalizedFieldForLocale(field, locale)?.value;
92
+ value = getDocumentFieldForLocale(field, locale)?.value;
95
93
  break;
96
94
  }
97
95
 
@@ -105,13 +103,14 @@ const isDocumentMatchesPattern = (document: ContentStoreTypes.Document, query: s
105
103
 
106
104
  const getFieldForFilter = (document: ContentStoreTypes.Document, filter: SearchFilterItem): ContentStoreTypes.DocumentField => {
107
105
  if (filter.isMeta) {
108
- const fieldDef = META_FIELD[filter.field as keyof typeof META_FIELD];
109
- if (!fieldDef) {
106
+ if (filter.field !== 'createdAt' && filter.field !== 'updatedAt') {
110
107
  throw new Error(`Unsupported meta field ${filter.field}`);
111
108
  }
109
+ const fieldDef = META_FIELD[filter.field];
110
+ const dateValue = document[filter.field];
112
111
  return {
113
112
  ...fieldDef,
114
- value: document[filter.field as keyof typeof document]
113
+ value: dateValue
115
114
  };
116
115
  } else {
117
116
  const documentField = document.fields[filter.field];
@@ -180,7 +179,7 @@ const isStringFieldMatches = ({
180
179
  locale?: string;
181
180
  }) => {
182
181
  // ignoring case
183
- const fieldValue = getLocalizedFieldForLocale(field, locale)?.value?.toLowerCase();
182
+ const fieldValue = getDocumentFieldForLocale(field, locale)?.value?.toLowerCase();
184
183
 
185
184
  switch (filter.operator) {
186
185
  case 'is-undefined': return fieldValue === undefined;
@@ -202,9 +201,9 @@ const isStringFieldMatches = ({
202
201
  case 'neq':
203
202
  return fieldValue !== filterValue;
204
203
  case 'includes':
205
- return fieldValue.includes(filterValue);
204
+ return Boolean(fieldValue?.includes(filterValue));
206
205
  case 'not-includes':
207
- return !fieldValue.includes(filterValue);
206
+ return !Boolean(fieldValue?.includes(filterValue));
208
207
  }
209
208
  }
210
209
  }
@@ -213,7 +212,7 @@ const isStringFieldMatches = ({
213
212
  };
214
213
 
215
214
  const isNumberFieldMatches = ({ field, filter, locale }: { field: ContentStoreTypes.DocumentFieldForType<'number'>; filter: SearchFilterItem; locale?: string }) => {
216
- const fieldValue = getLocalizedFieldForLocale(field, locale)?.value;
215
+ const fieldValue = getDocumentFieldForLocale(field, locale)?.value;
217
216
 
218
217
  switch (filter.operator) {
219
218
  case 'is-undefined': return fieldValue === undefined;
@@ -234,9 +233,9 @@ const isNumberFieldMatches = ({ field, filter, locale }: { field: ContentStoreTy
234
233
  case 'neq':
235
234
  return fieldValue !== filter.value;
236
235
  case 'gte':
237
- return fieldValue >= filter.value;
236
+ return Boolean(fieldValue && fieldValue >= filter.value);
238
237
  case 'lte':
239
- return fieldValue <= filter.value;
238
+ return Boolean(fieldValue && fieldValue <= filter.value);
240
239
  }
241
240
  }
242
241
 
@@ -246,7 +245,7 @@ const isNumberFieldMatches = ({ field, filter, locale }: { field: ContentStoreTy
246
245
  throw new Error(`Filter startValue and endValue should be number for field ${filter.field}`);
247
246
  }
248
247
 
249
- return fieldValue >= filter.startValue && fieldValue <= filter.endValue;
248
+ return Boolean(fieldValue && fieldValue >= filter.startValue && fieldValue <= filter.endValue);
250
249
  }
251
250
  }
252
251
 
@@ -262,7 +261,7 @@ const isBooleanFieldMatches = ({
262
261
  filter: SearchFilterItem;
263
262
  locale?: string;
264
263
  }) => {
265
- const fieldValue = getLocalizedFieldForLocale(field, locale)?.value;
264
+ const fieldValue = getDocumentFieldForLocale(field, locale)?.value;
266
265
 
267
266
  switch (filter.operator) {
268
267
  case 'is-undefined': return fieldValue === undefined;
@@ -311,7 +310,7 @@ const isDateFieldMatches = ({
311
310
  filter: SearchFilterItem;
312
311
  locale?: string;
313
312
  }) => {
314
- const origValue = getLocalizedFieldForLocale(field, locale)?.value;
313
+ const origValue = getDocumentFieldForLocale(field, locale)?.value;
315
314
  const fieldValue = parseDateValue(origValue);
316
315
  if (origValue && !fieldValue) {
317
316
  throw new Error(`Can't parse value ${origValue} for field ${filter.field}`);
@@ -374,7 +373,7 @@ const isDateFieldMatches = ({
374
373
  };
375
374
 
376
375
  const isEnumFieldMatches = ({ field, filter, locale }: { field: ContentStoreTypes.DocumentFieldForType<'enum'>; filter: SearchFilterItem; locale?: string }) => {
377
- const fieldValue = getLocalizedFieldForLocale(field, locale)?.value;
376
+ const fieldValue = getDocumentFieldForLocale(field, locale)?.value;
378
377
 
379
378
  switch (filter.operator) {
380
379
  case 'is-undefined': return fieldValue === undefined;
@@ -415,7 +414,7 @@ const isListFieldMatches = ({
415
414
  throw new Error(`Unsupported filter for list field ${filter.field} with children ${listItemsType}`);
416
415
  }
417
416
 
418
- const fieldValue = getLocalizedFieldForLocale(field as ContentSourceInterface.DocumentFieldForType<'list'>, locale)?.items?.map((item) =>
417
+ const fieldValue = getDocumentFieldForLocale(field, locale)?.items?.map((item) =>
419
418
  'value' in item ? item.value : undefined
420
419
  );
421
420
 
@@ -3,7 +3,7 @@ import { Config } from '@stackbit/sdk';
3
3
  import { append } from '@stackbit/utils';
4
4
  import { SiteMapEntry } from '@stackbit/types';
5
5
  import * as CSITypes from '@stackbit/types';
6
- import * as ContentStoreTypes from '../content-store-types';
6
+ import * as ContentStoreTypes from '../types';
7
7
  import { mapStoreDocumentsToCSIDocumentsWithSource } from './store-to-csi-docs-converter';
8
8
  import { getContentSourceId, getDocumentFieldForLocale } from '../content-store-utils';
9
9
 
@@ -169,6 +169,15 @@ function sanitizeAndGroupSiteMapEntries(siteMapEntries: SiteMapEntry[]): SiteMap
169
169
  if (!doc.srcType || !doc.srcProjectId || !doc.modelName || !doc.id) {
170
170
  return accum;
171
171
  }
172
+ siteMapEntry = {
173
+ ...siteMapEntry,
174
+ document: {
175
+ id: doc.id,
176
+ modelName: doc.modelName,
177
+ srcType: doc.srcType,
178
+ srcProjectId: doc.srcProjectId
179
+ }
180
+ }
172
181
  }
173
182
 
174
183
  if (!siteMapEntry.stableId) {
@@ -1,26 +1,27 @@
1
1
  import _ from 'lodash';
2
2
  import path from 'path';
3
3
  import { omitByNil } from '@stackbit/utils';
4
- import * as ContentStoreTypes from '../content-store-types';
4
+ import * as ContentStoreTypes from '../types';
5
+ import { DocumentStringLikeFieldAPI } from '../types';
5
6
 
6
- export function mapDocumentsToLocalizedApiObjects(documents: ContentStoreTypes.Document[], staticAssetsPublicPath: string, locale?: string): ContentStoreTypes.APIDocumentObject[] {
7
- return documents.map((document) => documentToLocalizedApiObject(document, staticAssetsPublicPath, locale));
7
+ export function mapDocumentsToLocalizedApiObjects(documents: ContentStoreTypes.Document[], locale?: string): ContentStoreTypes.APIDocumentObject[] {
8
+ return documents.map((document) => documentToLocalizedApiObject(document, locale));
8
9
  }
9
10
 
10
- function documentToLocalizedApiObject(document: ContentStoreTypes.Document, staticAssetsPublicPath: string, locale?: string): ContentStoreTypes.APIDocumentObject {
11
+ function documentToLocalizedApiObject(document: ContentStoreTypes.Document, locale?: string): ContentStoreTypes.APIDocumentObject {
11
12
  const { type, fields, ...rest } = document;
12
13
  return {
13
14
  type: 'object',
14
15
  ...rest,
15
- fields: toLocalizedAPIFields(fields, staticAssetsPublicPath, locale)
16
+ fields: toLocalizedAPIFields(fields, locale)
16
17
  };
17
18
  }
18
19
 
19
- function toLocalizedAPIFields(docFields: Record<string, ContentStoreTypes.DocumentField>, staticAssetsPublicPath: string, locale?: string): Record<string, ContentStoreTypes.DocumentFieldAPI> {
20
- return _.mapValues(docFields, (docField) => toLocalizedAPIField(docField, staticAssetsPublicPath, locale));
20
+ function toLocalizedAPIFields(docFields: Record<string, ContentStoreTypes.DocumentField>, locale?: string): Record<string, ContentStoreTypes.DocumentFieldAPI> {
21
+ return _.mapValues(docFields, (docField) => toLocalizedAPIField(docField, locale));
21
22
  }
22
23
 
23
- function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, staticAssetsPublicPath: string, locale?: string, isListItem = false): ContentStoreTypes.DocumentFieldAPI {
24
+ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?: string, isListItem = false): ContentStoreTypes.DocumentFieldAPI {
24
25
  type ToBoolean<T extends boolean | undefined> = T extends true ? true : false;
25
26
  function localeFields<T extends boolean | undefined>(localized: T): null | { localized: false } | { localized: true; locale: string } {
26
27
  const isLocalized = !!localized as ToBoolean<T>;
@@ -52,32 +53,53 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, staticAs
52
53
  case 'date':
53
54
  case 'datetime':
54
55
  case 'color':
55
- case 'style':
56
+ case 'style': {
57
+ if (docField.localized) {
58
+ const { localized, locales, ...base } = docField;
59
+ const localeProps = locales && locale ? locales[locale] : undefined;
60
+ return {
61
+ ...base,
62
+ ...localeProps,
63
+ ...localeFields(localized)
64
+ } as ContentStoreTypes.DocumentStringLikeFieldAPI;
65
+ }
66
+ return {
67
+ ...docField,
68
+ ...localeFields(docField.localized)
69
+ };
70
+ }
56
71
  case 'file':
57
72
  case 'json':
58
73
  case 'markdown':
59
- case 'richText':
74
+ case 'richText': {
60
75
  if (docField.localized) {
61
76
  const { localized, locales, ...base } = docField;
62
77
  const localeProps = locales && locale ? locales[locale] : undefined;
78
+ if (localeProps) {
79
+ return {
80
+ ...base,
81
+ ...localeProps,
82
+ ...localeFields(localized)
83
+ };
84
+ }
63
85
  return {
64
86
  ...base,
65
- ...(localeProps ?? { value: null }),
66
- ...localeFields(localized),
67
- ...(['file', 'json', 'markdown', 'richText'].includes(docField.type) && !localeProps ? { isUnset: true } : null)
87
+ isUnset: true,
88
+ ...localeFields(localized)
68
89
  };
69
90
  }
70
91
  return {
71
92
  ...docField,
72
93
  ...localeFields(docField.localized)
73
94
  };
95
+ }
74
96
  case 'image':
75
97
  let result: ContentStoreTypes.DocumentFieldAPI;
76
98
  if (docField.localized) {
77
99
  const { localized, locales, ...base } = docField;
78
100
  const localeProps = locales && locale ? locales[locale] : undefined;
79
101
  if (localeProps) {
80
- const fields = toLocalizedAPIFields(localeProps.fields, staticAssetsPublicPath, locale) as ContentStoreTypes.ImageFieldsAPI;
102
+ const fields = toLocalizedAPIFields(localeProps.fields, locale) as ContentStoreTypes.ImageFieldsAPI;
81
103
  result = {
82
104
  ...base,
83
105
  ...localeProps,
@@ -89,7 +111,7 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, staticAs
89
111
  ...base,
90
112
  isUnset: true,
91
113
  ...localeFields(localized)
92
- }
114
+ };
93
115
  }
94
116
  } else {
95
117
  if (docField.isUnset) {
@@ -97,15 +119,15 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, staticAs
97
119
  ...docField,
98
120
  type: 'image',
99
121
  ...localeFields(docField.localized)
100
- }
122
+ };
101
123
  } else {
102
- const fields = toLocalizedAPIFields(docField.fields, staticAssetsPublicPath, locale) as ContentStoreTypes.ImageFieldsAPI;
124
+ const fields = toLocalizedAPIFields(docField.fields, locale) as ContentStoreTypes.ImageFieldsAPI;
103
125
  result = {
104
126
  ...docField,
105
127
  type: 'image',
106
128
  fields,
107
129
  ...localeFields(docField.localized)
108
- }
130
+ };
109
131
  }
110
132
  }
111
133
  return result;
@@ -120,7 +142,7 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, staticAs
120
142
  ...(localeProps
121
143
  ? {
122
144
  ...localeProps,
123
- fields: toLocalizedAPIFields(localeProps.fields, staticAssetsPublicPath, locale)
145
+ fields: toLocalizedAPIFields(localeProps.fields, locale)
124
146
  }
125
147
  : { isUnset: true }),
126
148
  ...localeFields(localized)
@@ -134,7 +156,7 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, staticAs
134
156
  ...(localeProps
135
157
  ? {
136
158
  ...localeProps,
137
- fields: toLocalizedAPIFields(localeProps.fields, staticAssetsPublicPath, locale)
159
+ fields: toLocalizedAPIFields(localeProps.fields, locale)
138
160
  }
139
161
  : { isUnset: true }),
140
162
  ...localeFields(localized)
@@ -146,7 +168,7 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, staticAs
146
168
  ? {
147
169
  ...docField,
148
170
  type: 'object',
149
- fields: toLocalizedAPIFields(docField.fields, staticAssetsPublicPath, locale)
171
+ fields: toLocalizedAPIFields(docField.fields, locale)
150
172
  }
151
173
  : {
152
174
  ...docField,
@@ -233,14 +255,14 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, staticAs
233
255
  return {
234
256
  ...base,
235
257
  ...localeProps,
236
- items: (localeProps?.items ?? []).map((field) => toLocalizedAPIField(field, staticAssetsPublicPath, locale, true) as ContentStoreTypes.DocumentListFieldItemsAPI),
258
+ items: (localeProps?.items ?? []).map((field) => toLocalizedAPIField(field, locale, true) as ContentStoreTypes.DocumentListFieldItemsAPI),
237
259
  ...localeFields(localized)
238
260
  };
239
261
  }
240
262
  return {
241
263
  ...docField,
242
264
  ...localeFields(docField.localized),
243
- items: docField.items.map((field) => toLocalizedAPIField(field, staticAssetsPublicPath, locale, true) as ContentStoreTypes.DocumentListFieldItemsAPI)
265
+ items: docField.items.map((field) => toLocalizedAPIField(field, locale, true) as ContentStoreTypes.DocumentListFieldItemsAPI)
244
266
  };
245
267
  default:
246
268
  const _exhaustiveCheck: never = docField;
@@ -249,20 +271,20 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, staticAs
249
271
  }
250
272
  }
251
273
 
252
- export function mapAssetsToLocalizedApiImages(assets: ContentStoreTypes.Asset[], staticAssetsPublicPath: string, locale?: string): ContentStoreTypes.APIImageObject[] {
253
- return assets.map((asset) => assetToLocalizedApiImage(asset, staticAssetsPublicPath, locale));
274
+ export function mapAssetsToLocalizedApiImages(assets: ContentStoreTypes.Asset[], locale?: string): ContentStoreTypes.APIImageObject[] {
275
+ return assets.map((asset) => assetToLocalizedApiImage(asset, locale));
254
276
  }
255
277
 
256
- function assetToLocalizedApiImage(asset: ContentStoreTypes.Asset, staticAssetsPublicPath: string, locale?: string): ContentStoreTypes.APIImageObject {
278
+ function assetToLocalizedApiImage(asset: ContentStoreTypes.Asset, locale?: string): ContentStoreTypes.APIImageObject {
257
279
  const { type, fields, ...rest } = asset;
258
280
  return {
259
281
  type: 'image',
260
282
  ...rest,
261
- fields: localizeAssetFields(fields, staticAssetsPublicPath, locale)
283
+ fields: localizeAssetFields(fields, locale)
262
284
  };
263
285
  }
264
286
 
265
- function localizeAssetFields(assetFields: ContentStoreTypes.AssetFields, staticAssetsPublicPath: string, locale?: string): ContentStoreTypes.AssetFieldsAPI {
287
+ function localizeAssetFields(assetFields: ContentStoreTypes.AssetFields, locale?: string): ContentStoreTypes.AssetFieldsAPI {
266
288
  const fields: ContentStoreTypes.AssetFieldsAPI = {
267
289
  title: {
268
290
  type: 'string' as const,
@@ -276,9 +298,12 @@ function localizeAssetFields(assetFields: ContentStoreTypes.AssetFields, staticA
276
298
  const titleField = assetFields.title;
277
299
  if (titleField.localized) {
278
300
  if (locale) {
279
- fields.title.value = titleField.locales?.[locale]?.value ?? null;
280
- fields.title.localized = true;
281
- fields.title.locale = locale;
301
+ fields.title = {
302
+ type: 'string',
303
+ value: titleField.locales?.[locale]?.value ?? null,
304
+ localized: true,
305
+ locale: locale
306
+ };
282
307
  }
283
308
  } else {
284
309
  fields.title.value = titleField.value;
@@ -286,9 +311,12 @@ function localizeAssetFields(assetFields: ContentStoreTypes.AssetFields, staticA
286
311
  const assetFileField = assetFields.file;
287
312
  if (assetFileField.localized) {
288
313
  if (locale) {
289
- fields.url.value = assetFileField.locales?.[locale]?.url ?? null;
290
- fields.url.localized = true;
291
- fields.url.locale = locale;
314
+ fields.url = {
315
+ type: 'string',
316
+ value: assetFileField.locales?.[locale]?.url ?? null,
317
+ localized: true,
318
+ locale: locale
319
+ };
292
320
  }
293
321
  } else {
294
322
  fields.url.value = assetFileField.url;
@@ -313,7 +341,7 @@ function storeAssetToAPIAsset(asset: ContentStoreTypes.Asset, staticAssetsPublic
313
341
  createdAt: asset.createdAt,
314
342
  url: replaceAssetUrlIfNeeded(staticAssetsPublicPath, localizedFileField.url) ?? staticAssetsPublicPath,
315
343
  ...omitByNil({
316
- title: localizedTitleField?.value ?? null,
344
+ title: localizedTitleField?.value ?? undefined,
317
345
  fileName: localizedFileField.fileName,
318
346
  contentType: localizedFileField.contentType,
319
347
  size: localizedFileField.size,
@@ -325,8 +353,9 @@ function storeAssetToAPIAsset(asset: ContentStoreTypes.Asset, staticAssetsPublic
325
353
 
326
354
  function replaceAssetUrlIfNeeded(staticAssetsPublicPath: string, value: string | undefined) {
327
355
  let url = value;
328
- if (url && !url.startsWith('http:') && !url.startsWith('https:')) {
329
- url = path.join(staticAssetsPublicPath, url);
356
+ let normalizedUrl = url?.toLowerCase();
357
+ if (normalizedUrl && !normalizedUrl.startsWith('http:') && !normalizedUrl.startsWith('https:') && !normalizedUrl.startsWith('//')) {
358
+ url = path.join(staticAssetsPublicPath, url!);
330
359
  }
331
360
  return url;
332
- }
361
+ }
@@ -1,6 +1,6 @@
1
1
  import _ from 'lodash';
2
2
  import * as CSITypes from '@stackbit/types';
3
- import * as ContentStoreTypes from '../content-store-types';
3
+ import * as ContentStoreTypes from '../types';
4
4
 
5
5
  export function mapStoreDocumentsToCSIDocumentsWithSource(documents: ContentStoreTypes.Document[]): CSITypes.DocumentWithSource[] {
6
6
  return documents.map((document) => mapStoreDocumentToCSIDocumentWithSource(document));
@@ -95,6 +95,8 @@ function mapStoreFieldToCSIField(documentField: ContentStoreTypes.DocumentField)
95
95
  return {
96
96
  type: 'image',
97
97
  localized: true,
98
+ source: documentField.source,
99
+ sourceData: documentField.sourceData,
98
100
  locales: _.mapValues(documentField.locales, (locale) => ({
99
101
  locale: locale.locale,
100
102
  fields: mapStoreFieldsToCSIFields(locale.fields)
@@ -106,6 +108,8 @@ function mapStoreFieldToCSIField(documentField: ContentStoreTypes.DocumentField)
106
108
  }
107
109
  return {
108
110
  type: 'image',
111
+ source: documentField.source,
112
+ sourceData: documentField.sourceData,
109
113
  fields: mapStoreFieldsToCSIFields(documentField.fields)
110
114
  } as CSITypes.DocumentImageFieldNonLocalized;
111
115
  }
@@ -1,4 +1,4 @@
1
- import { Logger } from '../content-store-types';
1
+ import { Logger } from '@stackbit/types';
2
2
 
3
3
  export class Timer {
4
4
  private readonly timerCallback: () => void;