@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.
- package/dist/content-store-utils.d.ts.map +1 -1
- package/dist/content-store-utils.js +9 -1
- package/dist/content-store-utils.js.map +1 -1
- package/dist/content-store.d.ts +8 -0
- package/dist/content-store.d.ts.map +1 -1
- package/dist/content-store.js +9 -4
- package/dist/content-store.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/services/git.d.ts +38 -0
- package/dist/services/git.d.ts.map +1 -0
- package/dist/services/git.js +201 -0
- package/dist/services/git.js.map +1 -0
- package/dist/services/index.d.ts +3 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +15 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/run.d.ts +7 -0
- package/dist/services/run.d.ts.map +1 -0
- package/dist/services/run.js +53 -0
- package/dist/services/run.js.map +1 -0
- package/dist/utils/create-update-csi-docs.d.ts.map +1 -1
- package/dist/utils/create-update-csi-docs.js +18 -8
- package/dist/utils/create-update-csi-docs.js.map +1 -1
- package/dist/utils/duplicate-document.js +4 -0
- package/dist/utils/duplicate-document.js.map +1 -1
- package/dist/utils/index.d.ts +2 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/store-to-api-docs-converter.d.ts +1 -1
- package/dist/utils/store-to-api-docs-converter.d.ts.map +1 -1
- package/dist/utils/store-to-api-docs-converter.js +50 -28
- package/dist/utils/store-to-api-docs-converter.js.map +1 -1
- package/package.json +9 -6
- package/src/content-store-utils.ts +9 -1
- package/src/content-store.ts +18 -5
- package/src/index.ts +1 -0
- package/src/services/git.ts +245 -0
- package/src/services/index.ts +2 -0
- package/src/services/run.ts +54 -0
- package/src/utils/create-update-csi-docs.ts +19 -7
- package/src/utils/duplicate-document.ts +3 -0
- 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
|
-
|
|
118
|
-
|
|
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
|
|
126
|
-
csiModelFields
|
|
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
|
|
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
|
}
|
|
@@ -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
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
+
}
|