@stackbit/cms-core 0.1.31 → 0.2.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 (44) hide show
  1. package/dist/content-store-utils.d.ts.map +1 -1
  2. package/dist/content-store-utils.js +9 -1
  3. package/dist/content-store-utils.js.map +1 -1
  4. package/dist/content-store.d.ts +8 -0
  5. package/dist/content-store.d.ts.map +1 -1
  6. package/dist/content-store.js +9 -4
  7. package/dist/content-store.js.map +1 -1
  8. package/dist/index.d.ts +1 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +1 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/services/git.d.ts +38 -0
  13. package/dist/services/git.d.ts.map +1 -0
  14. package/dist/services/git.js +201 -0
  15. package/dist/services/git.js.map +1 -0
  16. package/dist/services/index.d.ts +3 -0
  17. package/dist/services/index.d.ts.map +1 -0
  18. package/dist/services/index.js +15 -0
  19. package/dist/services/index.js.map +1 -0
  20. package/dist/services/run.d.ts +7 -0
  21. package/dist/services/run.d.ts.map +1 -0
  22. package/dist/services/run.js +53 -0
  23. package/dist/services/run.js.map +1 -0
  24. package/dist/utils/create-update-csi-docs.d.ts.map +1 -1
  25. package/dist/utils/create-update-csi-docs.js +18 -8
  26. package/dist/utils/create-update-csi-docs.js.map +1 -1
  27. package/dist/utils/duplicate-document.js +4 -0
  28. package/dist/utils/duplicate-document.js.map +1 -1
  29. package/dist/utils/index.d.ts +2 -2
  30. package/dist/utils/index.d.ts.map +1 -1
  31. package/dist/utils/store-to-api-docs-converter.d.ts +1 -1
  32. package/dist/utils/store-to-api-docs-converter.d.ts.map +1 -1
  33. package/dist/utils/store-to-api-docs-converter.js +50 -28
  34. package/dist/utils/store-to-api-docs-converter.js.map +1 -1
  35. package/package.json +9 -6
  36. package/src/content-store-utils.ts +9 -1
  37. package/src/content-store.ts +18 -5
  38. package/src/index.ts +1 -0
  39. package/src/services/git.ts +245 -0
  40. package/src/services/index.ts +2 -0
  41. package/src/services/run.ts +54 -0
  42. package/src/utils/create-update-csi-docs.ts +19 -7
  43. package/src/utils/duplicate-document.ts +3 -0
  44. package/src/utils/store-to-api-docs-converter.ts +47 -27
@@ -111,19 +111,32 @@ export async function createDocumentRecursively({
111
111
  if (!model || !csiModel) {
112
112
  throw new Error(`no model with name '${modelName}' was found`);
113
113
  }
114
+ let modelFields = model.fields ?? [];
115
+ let csiModelFields = csiModel.fields ?? [];
114
116
  if (model.type === 'page') {
115
117
  const tokens = extractTokensFromString(String(model.urlPath));
116
118
  const slugField = _.last(tokens);
117
- if (object && slugField && slugField in object) {
118
- const slugFieldValue = object[slugField];
119
+ //TODO legacy
120
+ if (object && slugField && (slugField in object || '_stackbit_slug' in object)) {
121
+ const slugFieldValue = object[slugField] || object['_stackbit_slug'];
119
122
  object[slugField] = sanitizeSlug(slugFieldValue);
123
+ if (!modelFields.find(field => field.name === slugField)) {
124
+ modelFields = [...modelFields, {
125
+ type: 'slug',
126
+ name: slugField
127
+ }];
128
+ csiModelFields = [...csiModelFields, {
129
+ type: 'slug',
130
+ name: slugField
131
+ }];
132
+ }
120
133
  }
121
134
  }
122
135
 
123
136
  const nestedResult = await createObjectRecursively({
124
137
  object,
125
- modelFields: model.fields ?? [],
126
- csiModelFields: csiModel.fields ?? [],
138
+ modelFields,
139
+ csiModelFields,
127
140
  fieldPath: [modelName],
128
141
  modelMap,
129
142
  csiModelMap,
@@ -147,9 +160,8 @@ function extractTokensFromString(input: string): string[] {
147
160
  return input.match(/(?<={)[^}]+(?=})/g) || [];
148
161
  }
149
162
 
150
- function sanitizeSlug(slug: string) {
151
- return slug
152
- .split('/')
163
+ function sanitizeSlug(slug?: string) {
164
+ return slug?.split('/')
153
165
  .map((part) => slugify(part, { lower: true }))
154
166
  .join('/');
155
167
  }
@@ -66,6 +66,9 @@ function mergeObjectWithDocumentFields({
66
66
  });
67
67
  if (typeof value !== 'undefined') {
68
68
  object[fieldName] = value;
69
+ } else {
70
+ // make sure we keep field empty and don't use default value
71
+ object[fieldName] = null;
69
72
  }
70
73
  return object;
71
74
  },
@@ -1,4 +1,5 @@
1
1
  import _ from 'lodash';
2
+ import path from 'path';
2
3
  import { omitByNil } from '@stackbit/utils';
3
4
  import * as ContentStoreTypes from '../types';
4
5
  import { DocumentStringLikeFieldAPI } from '../types';
@@ -93,33 +94,43 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?:
93
94
  };
94
95
  }
95
96
  case 'image':
97
+ let result: ContentStoreTypes.DocumentFieldAPI;
96
98
  if (docField.localized) {
97
99
  const { localized, locales, ...base } = docField;
98
100
  const localeProps = locales && locale ? locales[locale] : undefined;
99
- return {
100
- ...base,
101
- ...(localeProps
102
- ? {
103
- ...localeProps,
104
- fields: toLocalizedAPIFields(localeProps.fields, locale) as ContentStoreTypes.ImageFieldsAPI
105
- }
106
- : { isUnset: true }),
107
- ...localeFields(localized)
108
- };
101
+ if (localeProps) {
102
+ const fields = toLocalizedAPIFields(localeProps.fields, locale) as ContentStoreTypes.ImageFieldsAPI;
103
+ result = {
104
+ ...base,
105
+ ...localeProps,
106
+ fields,
107
+ ...localeFields(localized)
108
+ };
109
+ } else {
110
+ result = {
111
+ ...base,
112
+ isUnset: true,
113
+ ...localeFields(localized)
114
+ };
115
+ }
116
+ } else {
117
+ if (docField.isUnset) {
118
+ result = {
119
+ ...docField,
120
+ type: 'image',
121
+ ...localeFields(docField.localized)
122
+ };
123
+ } else {
124
+ const fields = toLocalizedAPIFields(docField.fields, locale) as ContentStoreTypes.ImageFieldsAPI;
125
+ result = {
126
+ ...docField,
127
+ type: 'image',
128
+ fields,
129
+ ...localeFields(docField.localized)
130
+ };
131
+ }
109
132
  }
110
- return {
111
- ...(!docField.isUnset
112
- ? {
113
- ...docField,
114
- type: 'image',
115
- fields: toLocalizedAPIFields(docField.fields, locale) as ContentStoreTypes.ImageFieldsAPI
116
- }
117
- : {
118
- ...docField,
119
- type: 'image'
120
- }),
121
- ...localeFields(docField.localized)
122
- };
133
+ return result;
123
134
  case 'object':
124
135
  case 'model':
125
136
  if (docField.localized) {
@@ -313,11 +324,11 @@ function localizeAssetFields(assetFields: ContentStoreTypes.AssetFields, locale?
313
324
  return fields;
314
325
  }
315
326
 
316
- export function mapStoreAssetsToAPIAssets(assets: ContentStoreTypes.Asset[], locale?: string): ContentStoreTypes.APIAsset[] {
317
- return assets.map((asset) => storeAssetToAPIAsset(asset, locale)).filter((asset): asset is ContentStoreTypes.APIAsset => !!asset);
327
+ export function mapStoreAssetsToAPIAssets(assets: ContentStoreTypes.Asset[], staticAssetsPublicPath: string, locale?: string): ContentStoreTypes.APIAsset[] {
328
+ return assets.map((asset) => storeAssetToAPIAsset(asset, staticAssetsPublicPath, locale)).filter((asset): asset is ContentStoreTypes.APIAsset => !!asset);
318
329
  }
319
330
 
320
- function storeAssetToAPIAsset(asset: ContentStoreTypes.Asset, locale?: string): ContentStoreTypes.APIAsset | null {
331
+ function storeAssetToAPIAsset(asset: ContentStoreTypes.Asset, staticAssetsPublicPath: string, locale?: string): ContentStoreTypes.APIAsset | null {
321
332
  const assetTitleField = asset.fields.title;
322
333
  const localizedTitleField = assetTitleField.localized ? assetTitleField.locales?.[locale!] : assetTitleField;
323
334
  const assetFileField = asset.fields.file;
@@ -328,7 +339,7 @@ function storeAssetToAPIAsset(asset: ContentStoreTypes.Asset, locale?: string):
328
339
  return {
329
340
  objectId: asset.srcObjectId,
330
341
  createdAt: asset.createdAt,
331
- url: localizedFileField.url,
342
+ url: replaceAssetUrlIfNeeded(staticAssetsPublicPath, localizedFileField.url) ?? staticAssetsPublicPath,
332
343
  ...omitByNil({
333
344
  title: localizedTitleField?.value ?? undefined,
334
345
  fileName: localizedFileField.fileName,
@@ -339,3 +350,12 @@ function storeAssetToAPIAsset(asset: ContentStoreTypes.Asset, locale?: string):
339
350
  })
340
351
  };
341
352
  }
353
+
354
+ function replaceAssetUrlIfNeeded(staticAssetsPublicPath: string, value: string | undefined) {
355
+ let url = value;
356
+ let normalizedUrl = url?.toLowerCase();
357
+ if (normalizedUrl && !normalizedUrl.startsWith('http:') && !normalizedUrl.startsWith('https:') && !normalizedUrl.startsWith('//')) {
358
+ url = path.join(staticAssetsPublicPath, url!);
359
+ }
360
+ return url;
361
+ }