@stackbit/cms-core 0.2.1 → 0.3.0-develop.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.
- package/dist/content-store-utils.d.ts +5 -1
- package/dist/content-store-utils.d.ts.map +1 -1
- package/dist/content-store-utils.js +28 -3
- package/dist/content-store-utils.js.map +1 -1
- package/dist/content-store.d.ts +12 -1
- package/dist/content-store.d.ts.map +1 -1
- package/dist/content-store.js +399 -177
- package/dist/content-store.js.map +1 -1
- package/dist/types/content-store-document-fields.d.ts +26 -4
- package/dist/types/content-store-document-fields.d.ts.map +1 -1
- package/dist/types/content-store-documents.d.ts +14 -3
- package/dist/types/content-store-documents.d.ts.map +1 -1
- package/dist/types/content-store-types.d.ts +7 -1
- package/dist/types/content-store-types.d.ts.map +1 -1
- package/dist/utils/backward-compatibility.d.ts +184 -0
- package/dist/utils/backward-compatibility.d.ts.map +1 -0
- package/dist/utils/backward-compatibility.js +151 -0
- package/dist/utils/backward-compatibility.js.map +1 -0
- package/dist/utils/config-delegate.d.ts +11 -0
- package/dist/utils/config-delegate.d.ts.map +1 -0
- package/dist/utils/config-delegate.js +226 -0
- package/dist/utils/config-delegate.js.map +1 -0
- package/dist/utils/create-update-csi-docs.d.ts +7 -5
- package/dist/utils/create-update-csi-docs.d.ts.map +1 -1
- package/dist/utils/create-update-csi-docs.js +24 -24
- package/dist/utils/create-update-csi-docs.js.map +1 -1
- package/dist/utils/csi-to-store-docs-converter.d.ts +17 -3
- package/dist/utils/csi-to-store-docs-converter.d.ts.map +1 -1
- package/dist/utils/csi-to-store-docs-converter.js +187 -47
- package/dist/utils/csi-to-store-docs-converter.js.map +1 -1
- package/dist/utils/site-map.d.ts.map +1 -1
- package/dist/utils/site-map.js +4 -1
- package/dist/utils/site-map.js.map +1 -1
- package/dist/utils/store-to-api-docs-converter.d.ts +6 -1
- package/dist/utils/store-to-api-docs-converter.d.ts.map +1 -1
- package/dist/utils/store-to-api-docs-converter.js +140 -51
- package/dist/utils/store-to-api-docs-converter.js.map +1 -1
- package/dist/utils/store-to-csi-docs-converter.d.ts +1 -0
- package/dist/utils/store-to-csi-docs-converter.d.ts.map +1 -1
- package/dist/utils/store-to-csi-docs-converter.js +2 -1
- package/dist/utils/store-to-csi-docs-converter.js.map +1 -1
- package/package.json +5 -5
- package/src/content-store-utils.ts +40 -6
- package/src/content-store.ts +552 -299
- package/src/types/content-store-document-fields.ts +16 -4
- package/src/types/content-store-documents.ts +12 -3
- package/src/types/content-store-types.ts +4 -1
- package/src/utils/backward-compatibility.ts +269 -0
- package/src/utils/config-delegate.ts +277 -0
- package/src/utils/create-update-csi-docs.ts +47 -50
- package/src/utils/csi-to-store-docs-converter.ts +256 -43
- package/src/utils/site-map.ts +19 -7
- package/src/utils/store-to-api-docs-converter.ts +185 -52
- package/src/utils/store-to-csi-docs-converter.ts +1 -1
|
@@ -1,11 +1,21 @@
|
|
|
1
1
|
import _ from 'lodash';
|
|
2
|
-
import { Model, ImageModel } from '@stackbit/sdk';
|
|
3
|
-
import {
|
|
2
|
+
import { Model, ObjectModel, ImageModel } from '@stackbit/sdk';
|
|
3
|
+
import { omitByNil } from '@stackbit/utils';
|
|
4
|
+
import {
|
|
5
|
+
Field,
|
|
6
|
+
FieldSpecificProps,
|
|
7
|
+
FieldList,
|
|
8
|
+
FieldModelProps,
|
|
9
|
+
FieldObjectProps,
|
|
10
|
+
isLocalizedField,
|
|
11
|
+
getLocalizedFieldForLocale,
|
|
12
|
+
isDocumentFieldOneOfFieldTypes
|
|
13
|
+
} from '@stackbit/types';
|
|
4
14
|
import * as CSITypes from '@stackbit/types';
|
|
5
15
|
|
|
6
16
|
import * as ContentStoreTypes from '../types';
|
|
7
17
|
import { IMAGE_MODEL } from '../common/common-schema';
|
|
8
|
-
import {
|
|
18
|
+
import { BackCompatContentSourceInterface } from './backward-compatibility';
|
|
9
19
|
|
|
10
20
|
export function mapCSIAssetsToStoreAssets({
|
|
11
21
|
csiAssets,
|
|
@@ -13,7 +23,7 @@ export function mapCSIAssetsToStoreAssets({
|
|
|
13
23
|
defaultLocaleCode
|
|
14
24
|
}: {
|
|
15
25
|
csiAssets: CSITypes.Asset[];
|
|
16
|
-
contentSourceInstance:
|
|
26
|
+
contentSourceInstance: BackCompatContentSourceInterface;
|
|
17
27
|
defaultLocaleCode?: string;
|
|
18
28
|
}): ContentStoreTypes.Asset[] {
|
|
19
29
|
const extra = getMetadataFromContentStore({ contentSourceInstance });
|
|
@@ -40,7 +50,7 @@ function sourceAssetToStoreAsset({
|
|
|
40
50
|
...extra,
|
|
41
51
|
srcObjectId: csiAsset.id,
|
|
42
52
|
srcObjectUrl: csiAsset.manageUrl,
|
|
43
|
-
srcObjectLabel:
|
|
53
|
+
srcObjectLabel: getAssetLabel(csiAsset, defaultLocaleCode),
|
|
44
54
|
srcModelName: IMAGE_MODEL.name,
|
|
45
55
|
srcModelLabel: IMAGE_MODEL.label!,
|
|
46
56
|
isChanged: csiAsset.status === 'added' || csiAsset.status === 'modified',
|
|
@@ -87,21 +97,24 @@ export function mapCSIDocumentsToStoreDocuments({
|
|
|
87
97
|
csiDocuments,
|
|
88
98
|
contentSourceInstance,
|
|
89
99
|
modelMap,
|
|
90
|
-
defaultLocaleCode
|
|
100
|
+
defaultLocaleCode,
|
|
101
|
+
createConfigDelegate
|
|
91
102
|
}: {
|
|
92
103
|
csiDocuments: CSITypes.Document[];
|
|
93
|
-
contentSourceInstance:
|
|
104
|
+
contentSourceInstance: BackCompatContentSourceInterface;
|
|
94
105
|
modelMap: Record<string, Model>;
|
|
95
106
|
defaultLocaleCode?: string;
|
|
107
|
+
createConfigDelegate: () => CSITypes.ConfigDelegate;
|
|
96
108
|
}): ContentStoreTypes.Document[] {
|
|
97
|
-
const
|
|
109
|
+
const meta = getMetadataFromContentStore({ contentSourceInstance });
|
|
98
110
|
return csiDocuments.map((csiDocument) =>
|
|
99
111
|
mapCSIDocumentToStoreDocument({
|
|
100
112
|
csiDocument,
|
|
101
113
|
model: modelMap[csiDocument.modelName]!,
|
|
102
114
|
modelMap,
|
|
103
115
|
defaultLocaleCode,
|
|
104
|
-
|
|
116
|
+
meta,
|
|
117
|
+
createConfigDelegate
|
|
105
118
|
})
|
|
106
119
|
);
|
|
107
120
|
}
|
|
@@ -111,20 +124,30 @@ function mapCSIDocumentToStoreDocument({
|
|
|
111
124
|
model,
|
|
112
125
|
modelMap,
|
|
113
126
|
defaultLocaleCode,
|
|
114
|
-
|
|
127
|
+
meta,
|
|
128
|
+
createConfigDelegate
|
|
115
129
|
}: {
|
|
116
130
|
csiDocument: CSITypes.Document;
|
|
117
131
|
model: Model;
|
|
118
132
|
modelMap: Record<string, Model>;
|
|
119
133
|
defaultLocaleCode?: string;
|
|
120
|
-
|
|
134
|
+
meta: { srcType: string; srcProjectId: string; srcProjectUrl: string; srcEnvironment: string };
|
|
135
|
+
createConfigDelegate: () => CSITypes.ConfigDelegate;
|
|
121
136
|
}): ContentStoreTypes.Document {
|
|
122
137
|
return omitByNil({
|
|
123
138
|
type: 'document',
|
|
124
|
-
...
|
|
139
|
+
...meta,
|
|
125
140
|
srcObjectId: csiDocument.id,
|
|
126
141
|
srcObjectUrl: csiDocument.manageUrl,
|
|
127
|
-
|
|
142
|
+
getPreview: ({ delegate, locale }: { delegate?: CSITypes.ConfigDelegate; locale?: string }) =>
|
|
143
|
+
getDocumentPreview({
|
|
144
|
+
csiDocument,
|
|
145
|
+
model,
|
|
146
|
+
srcType: meta.srcType,
|
|
147
|
+
srcProjectId: meta.srcProjectId,
|
|
148
|
+
delegate: delegate ?? createConfigDelegate(),
|
|
149
|
+
locale
|
|
150
|
+
}),
|
|
128
151
|
srcModelLabel: model.label ?? _.startCase(csiDocument.modelName),
|
|
129
152
|
srcModelName: csiDocument.modelName,
|
|
130
153
|
isChanged: csiDocument.status === 'added' || csiDocument.status === 'modified',
|
|
@@ -133,21 +156,29 @@ function mapCSIDocumentToStoreDocument({
|
|
|
133
156
|
createdBy: csiDocument.createdBy,
|
|
134
157
|
updatedAt: csiDocument.updatedAt,
|
|
135
158
|
updatedBy: csiDocument.updatedBy,
|
|
136
|
-
locale: csiDocument
|
|
159
|
+
locale: getDocumentLocale({ csiDocument, model }),
|
|
137
160
|
fields: mapCSIFieldsToStoreFields({
|
|
138
161
|
csiDocumentFields: csiDocument.fields,
|
|
139
162
|
modelFields: model.fields ?? [],
|
|
140
163
|
context: {
|
|
164
|
+
srcType: meta.srcType,
|
|
165
|
+
srcProjectId: meta.srcProjectId,
|
|
166
|
+
parentDocument: csiDocument,
|
|
141
167
|
modelMap,
|
|
142
|
-
defaultLocaleCode
|
|
168
|
+
defaultLocaleCode,
|
|
169
|
+
createConfigDelegate
|
|
143
170
|
}
|
|
144
171
|
})
|
|
145
172
|
});
|
|
146
173
|
}
|
|
147
174
|
|
|
148
175
|
type MapContext = {
|
|
176
|
+
srcType: string;
|
|
177
|
+
srcProjectId: string;
|
|
178
|
+
parentDocument: CSITypes.Document;
|
|
149
179
|
modelMap: Record<string, Model>;
|
|
150
180
|
defaultLocaleCode?: string;
|
|
181
|
+
createConfigDelegate: () => CSITypes.ConfigDelegate;
|
|
151
182
|
};
|
|
152
183
|
|
|
153
184
|
function mapCSIFieldsToStoreFields({
|
|
@@ -225,7 +256,7 @@ function mapCSIFieldToStoreField({
|
|
|
225
256
|
case 'reference':
|
|
226
257
|
return csiDocumentField as ContentStoreTypes.DocumentField;
|
|
227
258
|
case 'cross-reference':
|
|
228
|
-
return
|
|
259
|
+
return mapCrossReferenceField(csiDocumentField);
|
|
229
260
|
case 'object':
|
|
230
261
|
return mapObjectField(csiDocumentField as CSITypes.DocumentObjectField, modelField, context);
|
|
231
262
|
case 'model':
|
|
@@ -244,7 +275,7 @@ function mapCSIFieldToStoreField({
|
|
|
244
275
|
}
|
|
245
276
|
}
|
|
246
277
|
|
|
247
|
-
function
|
|
278
|
+
function mapCrossReferenceField(csiDocumentField: CSITypes.DocumentField): ContentStoreTypes.DocumentCrossReferenceField {
|
|
248
279
|
const unlocalizedUnset = {
|
|
249
280
|
type: 'cross-reference',
|
|
250
281
|
refType: 'document',
|
|
@@ -342,10 +373,21 @@ function mapObjectField(
|
|
|
342
373
|
modelField: FieldObjectProps,
|
|
343
374
|
context: MapContext
|
|
344
375
|
): ContentStoreTypes.DocumentObjectField {
|
|
376
|
+
const _getObjectPreview = ({ delegate, locale }: { delegate?: CSITypes.ConfigDelegate; locale?: string }) => {
|
|
377
|
+
return getObjectPreview({
|
|
378
|
+
parentDocument: context.parentDocument,
|
|
379
|
+
documentField: csiDocumentField,
|
|
380
|
+
objectModelOrObjectField: modelField,
|
|
381
|
+
srcType: context.srcType,
|
|
382
|
+
srcProjectId: context.srcProjectId,
|
|
383
|
+
delegate: delegate ?? context.createConfigDelegate(),
|
|
384
|
+
locale
|
|
385
|
+
}) as ContentStoreTypes.DocumentObjectFieldPreview;
|
|
386
|
+
};
|
|
345
387
|
if (!isLocalizedField(csiDocumentField)) {
|
|
346
388
|
return {
|
|
347
389
|
type: csiDocumentField.type,
|
|
348
|
-
|
|
390
|
+
getPreview: _getObjectPreview,
|
|
349
391
|
fields: mapCSIFieldsToStoreFields({
|
|
350
392
|
csiDocumentFields: csiDocumentField.fields ?? {},
|
|
351
393
|
modelFields: modelField.fields ?? [],
|
|
@@ -359,7 +401,7 @@ function mapObjectField(
|
|
|
359
401
|
locales: _.mapValues(csiDocumentField.locales, (locale) => {
|
|
360
402
|
return {
|
|
361
403
|
locale: locale.locale,
|
|
362
|
-
|
|
404
|
+
getPreview: _getObjectPreview,
|
|
363
405
|
fields: mapCSIFieldsToStoreFields({
|
|
364
406
|
csiDocumentFields: locale.fields ?? {},
|
|
365
407
|
modelFields: modelField.fields ?? [],
|
|
@@ -371,11 +413,24 @@ function mapObjectField(
|
|
|
371
413
|
}
|
|
372
414
|
|
|
373
415
|
function mapModelField(csiDocumentField: CSITypes.DocumentModelField, modelField: FieldModelProps, context: MapContext): ContentStoreTypes.DocumentModelField {
|
|
416
|
+
const _getObjectPreview =
|
|
417
|
+
(model: ObjectModel) =>
|
|
418
|
+
({ delegate, locale }: { delegate?: CSITypes.ConfigDelegate; locale?: string }) => {
|
|
419
|
+
return getObjectPreview({
|
|
420
|
+
parentDocument: context.parentDocument,
|
|
421
|
+
documentField: csiDocumentField,
|
|
422
|
+
objectModelOrObjectField: model,
|
|
423
|
+
srcType: context.srcType,
|
|
424
|
+
srcProjectId: context.srcProjectId,
|
|
425
|
+
delegate: delegate ?? context.createConfigDelegate(),
|
|
426
|
+
locale
|
|
427
|
+
}) as ContentStoreTypes.DocumentModelFieldPreview;
|
|
428
|
+
};
|
|
374
429
|
if (!isLocalizedField(csiDocumentField)) {
|
|
375
|
-
const model = context.modelMap[csiDocumentField.modelName]
|
|
430
|
+
const model = context.modelMap[csiDocumentField.modelName]! as ObjectModel;
|
|
376
431
|
return {
|
|
377
432
|
type: csiDocumentField.type,
|
|
378
|
-
|
|
433
|
+
getPreview: _getObjectPreview(model),
|
|
379
434
|
srcModelName: csiDocumentField.modelName,
|
|
380
435
|
srcModelLabel: model.label ?? _.startCase(model.name),
|
|
381
436
|
fields: mapCSIFieldsToStoreFields({
|
|
@@ -389,10 +444,10 @@ function mapModelField(csiDocumentField: CSITypes.DocumentModelField, modelField
|
|
|
389
444
|
type: csiDocumentField.type,
|
|
390
445
|
localized: true,
|
|
391
446
|
locales: _.mapValues(csiDocumentField.locales, (locale) => {
|
|
392
|
-
const model = context.modelMap[locale.modelName]
|
|
447
|
+
const model = context.modelMap[locale.modelName]! as ObjectModel;
|
|
393
448
|
return {
|
|
394
449
|
locale: locale.locale,
|
|
395
|
-
|
|
450
|
+
getPreview: _getObjectPreview(model),
|
|
396
451
|
srcModelName: locale.modelName,
|
|
397
452
|
srcModelLabel: model.label ?? _.startCase(model.name),
|
|
398
453
|
fields: mapCSIFieldsToStoreFields({
|
|
@@ -481,7 +536,7 @@ function mapMarkdownField(csiDocumentField: CSITypes.DocumentStringLikeField): C
|
|
|
481
536
|
};
|
|
482
537
|
}
|
|
483
538
|
|
|
484
|
-
function getMetadataFromContentStore({ contentSourceInstance }: { contentSourceInstance:
|
|
539
|
+
function getMetadataFromContentStore({ contentSourceInstance }: { contentSourceInstance: BackCompatContentSourceInterface }): {
|
|
485
540
|
srcType: string;
|
|
486
541
|
srcProjectId: string;
|
|
487
542
|
srcProjectUrl: string;
|
|
@@ -495,28 +550,186 @@ function getMetadataFromContentStore({ contentSourceInstance }: { contentSourceI
|
|
|
495
550
|
};
|
|
496
551
|
}
|
|
497
552
|
|
|
498
|
-
function
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
)
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
553
|
+
export function getDocumentLocale({ csiDocument, model }: { csiDocument: CSITypes.Document; model: Model }): string | undefined {
|
|
554
|
+
if (csiDocument.locale) {
|
|
555
|
+
return csiDocument.locale;
|
|
556
|
+
}
|
|
557
|
+
if ((model.type === 'page' || model.type === 'data') && model.localized && typeof model.locale === 'function') {
|
|
558
|
+
return model.locale({ document: csiDocument, model });
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
export function getDocumentPreview({
|
|
563
|
+
csiDocument,
|
|
564
|
+
model,
|
|
565
|
+
srcType,
|
|
566
|
+
srcProjectId,
|
|
567
|
+
delegate,
|
|
568
|
+
locale
|
|
569
|
+
}: {
|
|
570
|
+
csiDocument: CSITypes.Document;
|
|
571
|
+
model: Model;
|
|
572
|
+
srcType: string;
|
|
573
|
+
srcProjectId: string;
|
|
574
|
+
delegate: CSITypes.ConfigDelegate;
|
|
575
|
+
locale?: string;
|
|
576
|
+
}): ContentStoreTypes.DocumentPreview {
|
|
577
|
+
let previewTitle: string | undefined;
|
|
578
|
+
if ('preview' in model && model.preview && (model.type === 'page' || model.type === 'data')) {
|
|
579
|
+
if (typeof model.preview === 'function') {
|
|
580
|
+
const previewResult = model.preview({
|
|
581
|
+
document: { ...csiDocument, srcType, srcProjectId },
|
|
582
|
+
currentLocale: locale,
|
|
583
|
+
...delegate
|
|
584
|
+
});
|
|
585
|
+
previewTitle = previewResult.title;
|
|
586
|
+
} else if (model.preview.title) {
|
|
587
|
+
// do not pass locale when resolving automatically to use default locale
|
|
588
|
+
previewTitle = resolveDocumentLabelForFieldPath({
|
|
589
|
+
document: { ...csiDocument, srcType, srcProjectId },
|
|
590
|
+
fieldPath: model.preview.title,
|
|
591
|
+
delegate
|
|
592
|
+
});
|
|
513
593
|
}
|
|
514
594
|
}
|
|
515
|
-
if
|
|
516
|
-
|
|
595
|
+
// if previewTitle was not resolved, resolve using model, at the worst case the model name or label will be used
|
|
596
|
+
if (!previewTitle) {
|
|
597
|
+
previewTitle = getObjectTitleFromLabelField({
|
|
598
|
+
document: { ...csiDocument, srcType, srcProjectId },
|
|
599
|
+
modelOrObjectField: model,
|
|
600
|
+
delegate,
|
|
601
|
+
locale
|
|
602
|
+
});
|
|
603
|
+
}
|
|
604
|
+
if (!previewTitle) {
|
|
605
|
+
previewTitle = getObjectTitleFromModel(model);
|
|
606
|
+
}
|
|
607
|
+
return { previewTitle };
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
function getObjectPreview<Type extends CSITypes.DocumentModelField | CSITypes.DocumentObjectField>({
|
|
611
|
+
parentDocument,
|
|
612
|
+
documentField,
|
|
613
|
+
objectModelOrObjectField,
|
|
614
|
+
srcType,
|
|
615
|
+
srcProjectId,
|
|
616
|
+
delegate,
|
|
617
|
+
locale
|
|
618
|
+
}: {
|
|
619
|
+
parentDocument: CSITypes.Document;
|
|
620
|
+
documentField: Type;
|
|
621
|
+
objectModelOrObjectField: Type extends CSITypes.DocumentModelField ? ObjectModel : CSITypes.FieldObjectProps;
|
|
622
|
+
srcType: string;
|
|
623
|
+
srcProjectId: string;
|
|
624
|
+
delegate: CSITypes.ConfigDelegate;
|
|
625
|
+
locale?: string;
|
|
626
|
+
}): ContentStoreTypes.DocumentObjectFieldPreview {
|
|
627
|
+
let previewTitle: string | undefined;
|
|
628
|
+
if ('preview' in objectModelOrObjectField && objectModelOrObjectField.preview) {
|
|
629
|
+
if (typeof objectModelOrObjectField.preview === 'function') {
|
|
630
|
+
const previewResult = objectModelOrObjectField.preview({
|
|
631
|
+
parentDocument: { ...parentDocument, srcType, srcProjectId },
|
|
632
|
+
documentField: documentField,
|
|
633
|
+
currentLocale: locale,
|
|
634
|
+
...delegate
|
|
635
|
+
});
|
|
636
|
+
previewTitle = previewResult.title;
|
|
637
|
+
} else if (objectModelOrObjectField.preview.title) {
|
|
638
|
+
// do not pass locale when resolving automatically to use default locale
|
|
639
|
+
previewTitle = resolveDocumentLabelForFieldPath({
|
|
640
|
+
document: { ...parentDocument, srcType, srcProjectId },
|
|
641
|
+
fromField: documentField,
|
|
642
|
+
fieldPath: objectModelOrObjectField.preview.title,
|
|
643
|
+
delegate
|
|
644
|
+
});
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
if (!previewTitle) {
|
|
648
|
+
previewTitle = getObjectTitleFromLabelField({
|
|
649
|
+
document: { ...parentDocument, srcType, srcProjectId },
|
|
650
|
+
documentField,
|
|
651
|
+
modelOrObjectField: objectModelOrObjectField,
|
|
652
|
+
delegate,
|
|
653
|
+
locale
|
|
654
|
+
});
|
|
655
|
+
}
|
|
656
|
+
if (!previewTitle && 'name' in objectModelOrObjectField) {
|
|
657
|
+
previewTitle = getObjectTitleFromModel(objectModelOrObjectField);
|
|
658
|
+
}
|
|
659
|
+
return { previewTitle };
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
function resolveDocumentLabelForFieldPath({
|
|
663
|
+
document,
|
|
664
|
+
fromField,
|
|
665
|
+
fieldPath,
|
|
666
|
+
delegate
|
|
667
|
+
}: {
|
|
668
|
+
document: CSITypes.DocumentWithSource;
|
|
669
|
+
fromField?: CSITypes.DocumentModelField | CSITypes.DocumentObjectField;
|
|
670
|
+
fieldPath: string;
|
|
671
|
+
delegate: CSITypes.ConfigDelegate;
|
|
672
|
+
}): string | undefined {
|
|
673
|
+
const documentField = delegate.getDocumentFieldForFieldPath({
|
|
674
|
+
document: document,
|
|
675
|
+
fromField: fromField,
|
|
676
|
+
fieldPath: fieldPath
|
|
677
|
+
});
|
|
678
|
+
if (documentField && 'value' in documentField) {
|
|
679
|
+
return documentField.value;
|
|
680
|
+
}
|
|
681
|
+
return undefined;
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
function getObjectTitleFromLabelField({
|
|
685
|
+
document,
|
|
686
|
+
documentField,
|
|
687
|
+
modelOrObjectField,
|
|
688
|
+
delegate,
|
|
689
|
+
locale
|
|
690
|
+
}: {
|
|
691
|
+
document: CSITypes.DocumentWithSource;
|
|
692
|
+
documentField?: CSITypes.DocumentModelField | CSITypes.DocumentObjectField;
|
|
693
|
+
modelOrObjectField: Model | FieldObjectProps | ImageModel;
|
|
694
|
+
delegate: CSITypes.ConfigDelegate;
|
|
695
|
+
locale?: string;
|
|
696
|
+
}): string | undefined {
|
|
697
|
+
const labelField = modelOrObjectField.labelField;
|
|
698
|
+
if (!labelField) {
|
|
699
|
+
return;
|
|
517
700
|
}
|
|
518
|
-
|
|
519
|
-
|
|
701
|
+
return resolveDocumentLabelForFieldPath({
|
|
702
|
+
document: document,
|
|
703
|
+
fromField: documentField,
|
|
704
|
+
fieldPath: labelField,
|
|
705
|
+
delegate
|
|
706
|
+
});
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
function getAssetLabel(csiAsset: CSITypes.Asset, locale?: string): string {
|
|
710
|
+
const imageModel = IMAGE_MODEL;
|
|
711
|
+
let label = getAssetLabelFromLabelField(csiAsset, imageModel, locale);
|
|
712
|
+
if (!label) {
|
|
713
|
+
label = getObjectTitleFromModel(imageModel);
|
|
520
714
|
}
|
|
521
715
|
return label;
|
|
522
716
|
}
|
|
717
|
+
|
|
718
|
+
function getAssetLabelFromLabelField(csiAsset: CSITypes.Asset, imageModel: ImageModel, locale?: string): string | undefined {
|
|
719
|
+
const labelField = imageModel.labelField;
|
|
720
|
+
if (!labelField) {
|
|
721
|
+
return;
|
|
722
|
+
}
|
|
723
|
+
const field = _.get(csiAsset.fields, labelField);
|
|
724
|
+
if (!field) {
|
|
725
|
+
return;
|
|
726
|
+
}
|
|
727
|
+
const localizedField = getLocalizedFieldForLocale(field as CSITypes.DocumentField, locale);
|
|
728
|
+
if (localizedField && 'value' in localizedField && localizedField.value) {
|
|
729
|
+
return localizedField.value;
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
function getObjectTitleFromModel(model: Model | ImageModel): string {
|
|
734
|
+
return model.label ? model.label : _.startCase(model.name);
|
|
735
|
+
}
|
package/src/utils/site-map.ts
CHANGED
|
@@ -54,7 +54,7 @@ export async function getSiteMapEntriesFromStackbitConfig({
|
|
|
54
54
|
{ models: [], documents: [] }
|
|
55
55
|
);
|
|
56
56
|
|
|
57
|
-
const rawSiteMapEntries =
|
|
57
|
+
const rawSiteMapEntries = stackbitConfig.siteMap(siteMapOptions);
|
|
58
58
|
|
|
59
59
|
// The rawSiteMapEntries entries are provided by the user, sanitize them and filter out illegal entries
|
|
60
60
|
return sanitizeAndGroupSiteMapEntries(rawSiteMapEntries);
|
|
@@ -95,6 +95,10 @@ export async function updateSiteMapEntriesWithContentChanges({
|
|
|
95
95
|
return {};
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
+
if (contentChanges.updatedDocuments.length === 0 && contentChanges.deletedDocuments.length === 0) {
|
|
99
|
+
return siteMapEntryGroups;
|
|
100
|
+
}
|
|
101
|
+
|
|
98
102
|
// Create a map of changed documents by content source id
|
|
99
103
|
const changedDocumentsByContentSourceId = contentChanges.updatedDocuments.reduce(
|
|
100
104
|
(accum: Record<string, ContentStoreTypes.Document[]>, contentChangeResultItem) => {
|
|
@@ -177,7 +181,7 @@ function sanitizeAndGroupSiteMapEntries(siteMapEntries: SiteMapEntry[]): SiteMap
|
|
|
177
181
|
srcType: doc.srcType,
|
|
178
182
|
srcProjectId: doc.srcProjectId
|
|
179
183
|
}
|
|
180
|
-
}
|
|
184
|
+
};
|
|
181
185
|
}
|
|
182
186
|
|
|
183
187
|
if (!siteMapEntry.stableId) {
|
|
@@ -196,14 +200,22 @@ function sanitizeAndGroupSiteMapEntries(siteMapEntries: SiteMapEntry[]): SiteMap
|
|
|
196
200
|
function getSiteMapGroupKey(siteMapEntry: SiteMapEntry): string {
|
|
197
201
|
return 'document' in siteMapEntry
|
|
198
202
|
? getSiteMapGroupKeyForDocument({
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
+
srcType: siteMapEntry.document.srcType,
|
|
204
|
+
srcProjectId: siteMapEntry.document.srcProjectId,
|
|
205
|
+
srcDocumentId: siteMapEntry.document.id
|
|
206
|
+
})
|
|
203
207
|
: SiteMapStaticEntriesKey.toString();
|
|
204
208
|
}
|
|
205
209
|
|
|
206
|
-
export function getSiteMapGroupKeyForDocument({
|
|
210
|
+
export function getSiteMapGroupKeyForDocument({
|
|
211
|
+
srcType,
|
|
212
|
+
srcProjectId,
|
|
213
|
+
srcDocumentId
|
|
214
|
+
}: {
|
|
215
|
+
srcType: string;
|
|
216
|
+
srcProjectId: string;
|
|
217
|
+
srcDocumentId: string;
|
|
218
|
+
}): string {
|
|
207
219
|
return `${srcType}:${srcProjectId}:${srcDocumentId}`;
|
|
208
220
|
}
|
|
209
221
|
|