@stackbit/cms-core 0.2.1 → 0.3.0-develop.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 (54) hide show
  1. package/dist/content-store-utils.d.ts +5 -1
  2. package/dist/content-store-utils.d.ts.map +1 -1
  3. package/dist/content-store-utils.js +28 -3
  4. package/dist/content-store-utils.js.map +1 -1
  5. package/dist/content-store.d.ts +12 -1
  6. package/dist/content-store.d.ts.map +1 -1
  7. package/dist/content-store.js +399 -177
  8. package/dist/content-store.js.map +1 -1
  9. package/dist/types/content-store-document-fields.d.ts +26 -4
  10. package/dist/types/content-store-document-fields.d.ts.map +1 -1
  11. package/dist/types/content-store-documents.d.ts +14 -3
  12. package/dist/types/content-store-documents.d.ts.map +1 -1
  13. package/dist/types/content-store-types.d.ts +7 -1
  14. package/dist/types/content-store-types.d.ts.map +1 -1
  15. package/dist/utils/backward-compatibility.d.ts +184 -0
  16. package/dist/utils/backward-compatibility.d.ts.map +1 -0
  17. package/dist/utils/backward-compatibility.js +151 -0
  18. package/dist/utils/backward-compatibility.js.map +1 -0
  19. package/dist/utils/config-delegate.d.ts +11 -0
  20. package/dist/utils/config-delegate.d.ts.map +1 -0
  21. package/dist/utils/config-delegate.js +226 -0
  22. package/dist/utils/config-delegate.js.map +1 -0
  23. package/dist/utils/create-update-csi-docs.d.ts +7 -5
  24. package/dist/utils/create-update-csi-docs.d.ts.map +1 -1
  25. package/dist/utils/create-update-csi-docs.js +24 -24
  26. package/dist/utils/create-update-csi-docs.js.map +1 -1
  27. package/dist/utils/csi-to-store-docs-converter.d.ts +17 -3
  28. package/dist/utils/csi-to-store-docs-converter.d.ts.map +1 -1
  29. package/dist/utils/csi-to-store-docs-converter.js +187 -47
  30. package/dist/utils/csi-to-store-docs-converter.js.map +1 -1
  31. package/dist/utils/site-map.d.ts.map +1 -1
  32. package/dist/utils/site-map.js +4 -1
  33. package/dist/utils/site-map.js.map +1 -1
  34. package/dist/utils/store-to-api-docs-converter.d.ts +6 -1
  35. package/dist/utils/store-to-api-docs-converter.d.ts.map +1 -1
  36. package/dist/utils/store-to-api-docs-converter.js +140 -51
  37. package/dist/utils/store-to-api-docs-converter.js.map +1 -1
  38. package/dist/utils/store-to-csi-docs-converter.d.ts +1 -0
  39. package/dist/utils/store-to-csi-docs-converter.d.ts.map +1 -1
  40. package/dist/utils/store-to-csi-docs-converter.js +2 -1
  41. package/dist/utils/store-to-csi-docs-converter.js.map +1 -1
  42. package/package.json +5 -5
  43. package/src/content-store-utils.ts +40 -6
  44. package/src/content-store.ts +552 -299
  45. package/src/types/content-store-document-fields.ts +16 -4
  46. package/src/types/content-store-documents.ts +12 -3
  47. package/src/types/content-store-types.ts +4 -1
  48. package/src/utils/backward-compatibility.ts +269 -0
  49. package/src/utils/config-delegate.ts +277 -0
  50. package/src/utils/create-update-csi-docs.ts +47 -50
  51. package/src/utils/csi-to-store-docs-converter.ts +256 -43
  52. package/src/utils/site-map.ts +19 -7
  53. package/src/utils/store-to-api-docs-converter.ts +185 -52
  54. 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 { Field, FieldSpecificProps, FieldList, FieldModelProps, FieldObjectProps, isLocalizedField, isDocumentFieldOneOfFieldTypes } from '@stackbit/types';
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 { omitByNil } from '@stackbit/utils';
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: CSITypes.ContentSourceInterface;
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: getObjectLabel(csiAsset.fields, IMAGE_MODEL, defaultLocaleCode),
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: CSITypes.ContentSourceInterface;
104
+ contentSourceInstance: BackCompatContentSourceInterface;
94
105
  modelMap: Record<string, Model>;
95
106
  defaultLocaleCode?: string;
107
+ createConfigDelegate: () => CSITypes.ConfigDelegate;
96
108
  }): ContentStoreTypes.Document[] {
97
- const extra = getMetadataFromContentStore({ contentSourceInstance });
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
- extra
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
- extra
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
- extra: { srcType: string; srcProjectId: string; srcProjectUrl: string; srcEnvironment: string };
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
- ...extra,
139
+ ...meta,
125
140
  srcObjectId: csiDocument.id,
126
141
  srcObjectUrl: csiDocument.manageUrl,
127
- srcObjectLabel: getObjectLabel(csiDocument.fields, model, defaultLocaleCode),
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.locale,
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 mapReferenceField(csiDocumentField);
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 mapReferenceField(csiDocumentField: CSITypes.DocumentField): ContentStoreTypes.DocumentCrossReferenceField {
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
- srcObjectLabel: getObjectLabel(csiDocumentField.fields ?? {}, modelField ?? [], context.defaultLocaleCode),
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
- srcObjectLabel: getObjectLabel(locale.fields ?? {}, modelField, locale.locale),
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
- srcObjectLabel: getObjectLabel(csiDocumentField.fields ?? {}, model, context.defaultLocaleCode),
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
- srcObjectLabel: getObjectLabel(locale.fields ?? {}, model, locale.locale),
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: CSITypes.ContentSourceInterface }): {
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 getObjectLabel(
499
- documentFields: Record<string, CSITypes.DocumentField | CSITypes.AssetFileField>,
500
- modelOrObjectField: Model | FieldObjectProps | ImageModel,
501
- locale?: string
502
- ): string {
503
- const labelField = modelOrObjectField.labelField;
504
- let label = null;
505
- if (labelField) {
506
- const field = _.get(documentFields, labelField, null);
507
- if (field && ['string', 'url', 'slug', 'text', 'markdown', 'number', 'enum', 'date', 'datetime', 'color', 'image', 'file'].includes(field.type)) {
508
- if (isLocalizedField(field) && locale) {
509
- label = _.get(field, ['locales', locale, 'value'], null);
510
- } else if (!isLocalizedField(field)) {
511
- label = _.get(field, 'value', null);
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 (!label) {
516
- label = _.get(modelOrObjectField, 'label');
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
- if (!label && _.has(modelOrObjectField, 'name')) {
519
- label = _.startCase(_.get(modelOrObjectField, 'name'));
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
+ }
@@ -54,7 +54,7 @@ export async function getSiteMapEntriesFromStackbitConfig({
54
54
  { models: [], documents: [] }
55
55
  );
56
56
 
57
- const rawSiteMapEntries = await stackbitConfig.siteMap(siteMapOptions);
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
- srcType: siteMapEntry.document.srcType,
200
- srcProjectId: siteMapEntry.document.srcProjectId,
201
- srcDocumentId: siteMapEntry.document.id
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({ srcType, srcProjectId, srcDocumentId }: { srcType: string; srcProjectId: string; srcDocumentId: string }): string {
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