@stackbit/cms-core 0.1.25 → 0.1.26-gitcms.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.d.ts +5 -0
- package/dist/content-store.d.ts.map +1 -1
- package/dist/content-store.js +11 -6
- 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 +35 -0
- package/dist/services/git.d.ts.map +1 -0
- package/dist/services/git.js +182 -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 +17 -0
- package/dist/services/run.d.ts.map +1 -0
- package/dist/services/run.js +54 -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 +17 -4
- package/dist/utils/create-update-csi-docs.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 +3 -3
- package/dist/utils/store-to-api-docs-converter.d.ts.map +1 -1
- package/dist/utils/store-to-api-docs-converter.js +66 -45
- package/dist/utils/store-to-api-docs-converter.js.map +1 -1
- package/package.json +9 -6
- package/src/content-store.ts +17 -7
- package/src/index.ts +1 -0
- package/src/services/git.ts +227 -0
- package/src/services/index.ts +2 -0
- package/src/services/run.ts +59 -0
- package/src/utils/create-update-csi-docs.ts +17 -4
- package/src/utils/store-to-api-docs-converter.ts +63 -44
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import childProcess, { ChildProcessWithoutNullStreams } from 'child_process';
|
|
2
|
+
import { RunServiceInterface } from '@stackbit/types';
|
|
3
|
+
|
|
4
|
+
export class RunService implements RunServiceInterface {
|
|
5
|
+
private readonly env: NodeJS.ProcessEnv;
|
|
6
|
+
private readonly uid?: number;
|
|
7
|
+
|
|
8
|
+
constructor(options: { env: NodeJS.ProcessEnv; uid?: number }) {
|
|
9
|
+
this.env = options.env;
|
|
10
|
+
this.uid = options.uid;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
command(command: string, args: string[], cwd?: string, shell?: boolean) {
|
|
14
|
+
return getProcessPromise(
|
|
15
|
+
childProcess.spawn(command, args, {
|
|
16
|
+
cwd: cwd,
|
|
17
|
+
shell: shell,
|
|
18
|
+
env: this.env,
|
|
19
|
+
...(this.uid ? { uid: this.uid } : {})
|
|
20
|
+
})
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function getProcessPromise(p: ChildProcessWithoutNullStreams): Promise<{
|
|
26
|
+
stdout: string;
|
|
27
|
+
stderr: string;
|
|
28
|
+
exitCode?: number;
|
|
29
|
+
err?: Error;
|
|
30
|
+
}> {
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
let stdout = '';
|
|
33
|
+
let stderr = '';
|
|
34
|
+
p.stdout.on('data', (out) => (stdout += out));
|
|
35
|
+
p.stderr.on('data', (out) => (stderr += out));
|
|
36
|
+
p.on('exit', (exitCode) => {
|
|
37
|
+
if (exitCode !== 0) {
|
|
38
|
+
reject({
|
|
39
|
+
err: new Error(`process exited with code: ${exitCode}, stderr: ${stderr}`),
|
|
40
|
+
stdout,
|
|
41
|
+
stderr,
|
|
42
|
+
exitCode
|
|
43
|
+
});
|
|
44
|
+
} else {
|
|
45
|
+
resolve({
|
|
46
|
+
stdout,
|
|
47
|
+
stderr
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
p.on('error', (err) => {
|
|
52
|
+
reject({
|
|
53
|
+
err,
|
|
54
|
+
stdout,
|
|
55
|
+
stderr
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
@@ -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
|
+
const modelFields = model.fields ?? [];
|
|
115
|
+
const 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.push({
|
|
125
|
+
type: 'slug',
|
|
126
|
+
name: slugField
|
|
127
|
+
});
|
|
128
|
+
csiModelFields.push({
|
|
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,
|
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
import _ from 'lodash';
|
|
2
|
+
import path from 'path';
|
|
2
3
|
import { omitByNil } from '@stackbit/utils';
|
|
3
4
|
import * as ContentStoreTypes from '../content-store-types';
|
|
4
5
|
|
|
5
|
-
export function mapDocumentsToLocalizedApiObjects(documents: ContentStoreTypes.Document[], locale?: string): ContentStoreTypes.APIDocumentObject[] {
|
|
6
|
-
return documents.map((document) => documentToLocalizedApiObject(document, locale));
|
|
6
|
+
export function mapDocumentsToLocalizedApiObjects(documents: ContentStoreTypes.Document[], staticAssetsPublicPath: string, locale?: string): ContentStoreTypes.APIDocumentObject[] {
|
|
7
|
+
return documents.map((document) => documentToLocalizedApiObject(document, staticAssetsPublicPath, locale));
|
|
7
8
|
}
|
|
8
9
|
|
|
9
|
-
function documentToLocalizedApiObject(document: ContentStoreTypes.Document, locale?: string): ContentStoreTypes.APIDocumentObject {
|
|
10
|
+
function documentToLocalizedApiObject(document: ContentStoreTypes.Document, staticAssetsPublicPath: string, locale?: string): ContentStoreTypes.APIDocumentObject {
|
|
10
11
|
const { type, fields, ...rest } = document;
|
|
11
12
|
return {
|
|
12
13
|
type: 'object',
|
|
13
14
|
...rest,
|
|
14
|
-
fields: toLocalizedAPIFields(fields, locale)
|
|
15
|
+
fields: toLocalizedAPIFields(fields, staticAssetsPublicPath, locale)
|
|
15
16
|
};
|
|
16
17
|
}
|
|
17
18
|
|
|
18
|
-
function toLocalizedAPIFields(docFields: Record<string, ContentStoreTypes.DocumentField>, locale?: string): Record<string, ContentStoreTypes.DocumentFieldAPI> {
|
|
19
|
-
return _.mapValues(docFields, (docField) => toLocalizedAPIField(docField, locale));
|
|
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
21
|
}
|
|
21
22
|
|
|
22
|
-
function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?: string, isListItem = false): ContentStoreTypes.DocumentFieldAPI {
|
|
23
|
+
function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, staticAssetsPublicPath: string, locale?: string, isListItem = false): ContentStoreTypes.DocumentFieldAPI {
|
|
23
24
|
type ToBoolean<T extends boolean | undefined> = T extends true ? true : false;
|
|
24
25
|
function localeFields<T extends boolean | undefined>(localized: T): null | { localized: false } | { localized: true; locale: string } {
|
|
25
26
|
const isLocalized = !!localized as ToBoolean<T>;
|
|
@@ -71,33 +72,43 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?:
|
|
|
71
72
|
...localeFields(docField.localized)
|
|
72
73
|
};
|
|
73
74
|
case 'image':
|
|
75
|
+
let result: ContentStoreTypes.DocumentFieldAPI;
|
|
74
76
|
if (docField.localized) {
|
|
75
77
|
const { localized, locales, ...base } = docField;
|
|
76
78
|
const localeProps = locales && locale ? locales[locale] : undefined;
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
79
|
+
if (localeProps) {
|
|
80
|
+
const fields = toLocalizedAPIFields(localeProps.fields, staticAssetsPublicPath, locale) as ContentStoreTypes.ImageFieldsAPI;
|
|
81
|
+
result = {
|
|
82
|
+
...base,
|
|
83
|
+
...localeProps,
|
|
84
|
+
fields,
|
|
85
|
+
...localeFields(localized)
|
|
86
|
+
};
|
|
87
|
+
} else {
|
|
88
|
+
result = {
|
|
89
|
+
...base,
|
|
90
|
+
isUnset: true,
|
|
91
|
+
...localeFields(localized)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
} else {
|
|
95
|
+
if (docField.isUnset) {
|
|
96
|
+
result = {
|
|
97
|
+
...docField,
|
|
98
|
+
type: 'image',
|
|
99
|
+
...localeFields(docField.localized)
|
|
100
|
+
}
|
|
101
|
+
} else {
|
|
102
|
+
const fields = toLocalizedAPIFields(docField.fields, staticAssetsPublicPath, locale) as ContentStoreTypes.ImageFieldsAPI;
|
|
103
|
+
result = {
|
|
104
|
+
...docField,
|
|
105
|
+
type: 'image',
|
|
106
|
+
fields,
|
|
107
|
+
...localeFields(docField.localized)
|
|
108
|
+
}
|
|
109
|
+
}
|
|
87
110
|
}
|
|
88
|
-
return
|
|
89
|
-
...(!docField.isUnset
|
|
90
|
-
? {
|
|
91
|
-
...docField,
|
|
92
|
-
type: 'image',
|
|
93
|
-
fields: toLocalizedAPIFields(docField.fields, locale) as ContentStoreTypes.ImageFieldsAPI
|
|
94
|
-
}
|
|
95
|
-
: {
|
|
96
|
-
...docField,
|
|
97
|
-
type: 'image'
|
|
98
|
-
}),
|
|
99
|
-
...localeFields(docField.localized)
|
|
100
|
-
};
|
|
111
|
+
return result;
|
|
101
112
|
case 'object':
|
|
102
113
|
case 'model':
|
|
103
114
|
if (docField.localized) {
|
|
@@ -109,7 +120,7 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?:
|
|
|
109
120
|
...(localeProps
|
|
110
121
|
? {
|
|
111
122
|
...localeProps,
|
|
112
|
-
fields: toLocalizedAPIFields(localeProps.fields, locale)
|
|
123
|
+
fields: toLocalizedAPIFields(localeProps.fields, staticAssetsPublicPath, locale)
|
|
113
124
|
}
|
|
114
125
|
: { isUnset: true }),
|
|
115
126
|
...localeFields(localized)
|
|
@@ -123,7 +134,7 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?:
|
|
|
123
134
|
...(localeProps
|
|
124
135
|
? {
|
|
125
136
|
...localeProps,
|
|
126
|
-
fields: toLocalizedAPIFields(localeProps.fields, locale)
|
|
137
|
+
fields: toLocalizedAPIFields(localeProps.fields, staticAssetsPublicPath, locale)
|
|
127
138
|
}
|
|
128
139
|
: { isUnset: true }),
|
|
129
140
|
...localeFields(localized)
|
|
@@ -135,7 +146,7 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?:
|
|
|
135
146
|
? {
|
|
136
147
|
...docField,
|
|
137
148
|
type: 'object',
|
|
138
|
-
fields: toLocalizedAPIFields(docField.fields, locale)
|
|
149
|
+
fields: toLocalizedAPIFields(docField.fields, staticAssetsPublicPath, locale)
|
|
139
150
|
}
|
|
140
151
|
: {
|
|
141
152
|
...docField,
|
|
@@ -222,14 +233,14 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?:
|
|
|
222
233
|
return {
|
|
223
234
|
...base,
|
|
224
235
|
...localeProps,
|
|
225
|
-
items: (localeProps?.items ?? []).map((field) => toLocalizedAPIField(field, locale, true) as ContentStoreTypes.DocumentListFieldItemsAPI),
|
|
236
|
+
items: (localeProps?.items ?? []).map((field) => toLocalizedAPIField(field, staticAssetsPublicPath, locale, true) as ContentStoreTypes.DocumentListFieldItemsAPI),
|
|
226
237
|
...localeFields(localized)
|
|
227
238
|
};
|
|
228
239
|
}
|
|
229
240
|
return {
|
|
230
241
|
...docField,
|
|
231
242
|
...localeFields(docField.localized),
|
|
232
|
-
items: docField.items.map((field) => toLocalizedAPIField(field, locale, true) as ContentStoreTypes.DocumentListFieldItemsAPI)
|
|
243
|
+
items: docField.items.map((field) => toLocalizedAPIField(field, staticAssetsPublicPath, locale, true) as ContentStoreTypes.DocumentListFieldItemsAPI)
|
|
233
244
|
};
|
|
234
245
|
default:
|
|
235
246
|
const _exhaustiveCheck: never = docField;
|
|
@@ -238,20 +249,20 @@ function toLocalizedAPIField(docField: ContentStoreTypes.DocumentField, locale?:
|
|
|
238
249
|
}
|
|
239
250
|
}
|
|
240
251
|
|
|
241
|
-
export function mapAssetsToLocalizedApiImages(assets: ContentStoreTypes.Asset[], locale?: string): ContentStoreTypes.APIImageObject[] {
|
|
242
|
-
return assets.map((asset) => assetToLocalizedApiImage(asset, locale));
|
|
252
|
+
export function mapAssetsToLocalizedApiImages(assets: ContentStoreTypes.Asset[], staticAssetsPublicPath: string, locale?: string): ContentStoreTypes.APIImageObject[] {
|
|
253
|
+
return assets.map((asset) => assetToLocalizedApiImage(asset, staticAssetsPublicPath, locale));
|
|
243
254
|
}
|
|
244
255
|
|
|
245
|
-
function assetToLocalizedApiImage(asset: ContentStoreTypes.Asset, locale?: string): ContentStoreTypes.APIImageObject {
|
|
256
|
+
function assetToLocalizedApiImage(asset: ContentStoreTypes.Asset, staticAssetsPublicPath: string, locale?: string): ContentStoreTypes.APIImageObject {
|
|
246
257
|
const { type, fields, ...rest } = asset;
|
|
247
258
|
return {
|
|
248
259
|
type: 'image',
|
|
249
260
|
...rest,
|
|
250
|
-
fields: localizeAssetFields(fields, locale)
|
|
261
|
+
fields: localizeAssetFields(fields, staticAssetsPublicPath, locale)
|
|
251
262
|
};
|
|
252
263
|
}
|
|
253
264
|
|
|
254
|
-
function localizeAssetFields(assetFields: ContentStoreTypes.AssetFields, locale?: string): ContentStoreTypes.AssetFieldsAPI {
|
|
265
|
+
function localizeAssetFields(assetFields: ContentStoreTypes.AssetFields, staticAssetsPublicPath: string, locale?: string): ContentStoreTypes.AssetFieldsAPI {
|
|
255
266
|
const fields: ContentStoreTypes.AssetFieldsAPI = {
|
|
256
267
|
title: {
|
|
257
268
|
type: 'string' as const,
|
|
@@ -285,11 +296,11 @@ function localizeAssetFields(assetFields: ContentStoreTypes.AssetFields, locale?
|
|
|
285
296
|
return fields;
|
|
286
297
|
}
|
|
287
298
|
|
|
288
|
-
export function mapStoreAssetsToAPIAssets(assets: ContentStoreTypes.Asset[], locale?: string): ContentStoreTypes.APIAsset[] {
|
|
289
|
-
return assets.map((asset) => storeAssetToAPIAsset(asset, locale)).filter((asset): asset is ContentStoreTypes.APIAsset => !!asset);
|
|
299
|
+
export function mapStoreAssetsToAPIAssets(assets: ContentStoreTypes.Asset[], staticAssetsPublicPath: string, locale?: string): ContentStoreTypes.APIAsset[] {
|
|
300
|
+
return assets.map((asset) => storeAssetToAPIAsset(asset, staticAssetsPublicPath, locale)).filter((asset): asset is ContentStoreTypes.APIAsset => !!asset);
|
|
290
301
|
}
|
|
291
302
|
|
|
292
|
-
function storeAssetToAPIAsset(asset: ContentStoreTypes.Asset, locale?: string): ContentStoreTypes.APIAsset | null {
|
|
303
|
+
function storeAssetToAPIAsset(asset: ContentStoreTypes.Asset, staticAssetsPublicPath: string, locale?: string): ContentStoreTypes.APIAsset | null {
|
|
293
304
|
const assetTitleField = asset.fields.title;
|
|
294
305
|
const localizedTitleField = assetTitleField.localized ? assetTitleField.locales?.[locale!] : assetTitleField;
|
|
295
306
|
const assetFileField = asset.fields.file;
|
|
@@ -300,7 +311,7 @@ function storeAssetToAPIAsset(asset: ContentStoreTypes.Asset, locale?: string):
|
|
|
300
311
|
return {
|
|
301
312
|
objectId: asset.srcObjectId,
|
|
302
313
|
createdAt: asset.createdAt,
|
|
303
|
-
url: localizedFileField.url,
|
|
314
|
+
url: replaceAssetUrlIfNeeded(staticAssetsPublicPath, localizedFileField.url) ?? staticAssetsPublicPath,
|
|
304
315
|
...omitByNil({
|
|
305
316
|
title: localizedTitleField?.value ?? null,
|
|
306
317
|
fileName: localizedFileField.fileName,
|
|
@@ -311,3 +322,11 @@ function storeAssetToAPIAsset(asset: ContentStoreTypes.Asset, locale?: string):
|
|
|
311
322
|
})
|
|
312
323
|
};
|
|
313
324
|
}
|
|
325
|
+
|
|
326
|
+
function replaceAssetUrlIfNeeded(staticAssetsPublicPath: string, value: string | undefined) {
|
|
327
|
+
let url = value;
|
|
328
|
+
if (url && !url.startsWith('http:') && !url.startsWith('https:')) {
|
|
329
|
+
url = path.join(staticAssetsPublicPath, url);
|
|
330
|
+
}
|
|
331
|
+
return url;
|
|
332
|
+
}
|