@stackbit/cms-core 0.1.3 → 0.1.4-alpha.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.
Files changed (57) hide show
  1. package/dist/common/common-types.d.ts +1 -9
  2. package/dist/common/common-types.d.ts.map +1 -1
  3. package/dist/consts.d.ts +1 -24
  4. package/dist/consts.d.ts.map +1 -1
  5. package/dist/consts.js +5 -25
  6. package/dist/consts.js.map +1 -1
  7. package/dist/content-store-types.d.ts +42 -39
  8. package/dist/content-store-types.d.ts.map +1 -1
  9. package/dist/content-store-utils.d.ts +10 -0
  10. package/dist/content-store-utils.d.ts.map +1 -0
  11. package/dist/content-store-utils.js +139 -0
  12. package/dist/content-store-utils.js.map +1 -0
  13. package/dist/content-store.d.ts +18 -5
  14. package/dist/content-store.d.ts.map +1 -1
  15. package/dist/content-store.js +177 -962
  16. package/dist/content-store.js.map +1 -1
  17. package/dist/index.d.ts +2 -1
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +3 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/types/search-filter.d.ts +42 -0
  22. package/dist/types/search-filter.d.ts.map +1 -0
  23. package/dist/types/search-filter.js +3 -0
  24. package/dist/types/search-filter.js.map +1 -0
  25. package/dist/utils/create-update-csi-docs.d.ts +69 -0
  26. package/dist/utils/create-update-csi-docs.d.ts.map +1 -0
  27. package/dist/utils/create-update-csi-docs.js +386 -0
  28. package/dist/utils/create-update-csi-docs.js.map +1 -0
  29. package/dist/utils/csi-to-store-docs-converter.d.ts +15 -0
  30. package/dist/utils/csi-to-store-docs-converter.d.ts.map +1 -0
  31. package/dist/utils/csi-to-store-docs-converter.js +287 -0
  32. package/dist/utils/csi-to-store-docs-converter.js.map +1 -0
  33. package/dist/utils/search-utils.d.ts +21 -0
  34. package/dist/utils/search-utils.d.ts.map +1 -0
  35. package/dist/utils/search-utils.js +323 -0
  36. package/dist/utils/search-utils.js.map +1 -0
  37. package/dist/utils/store-to-api-docs-converter.d.ts +5 -0
  38. package/dist/utils/store-to-api-docs-converter.d.ts.map +1 -0
  39. package/dist/utils/store-to-api-docs-converter.js +247 -0
  40. package/dist/utils/store-to-api-docs-converter.js.map +1 -0
  41. package/package.json +7 -5
  42. package/src/common/common-types.ts +1 -10
  43. package/src/consts.ts +1 -26
  44. package/src/content-store-types.ts +59 -45
  45. package/src/content-store-utils.ts +150 -0
  46. package/src/content-store.ts +168 -1090
  47. package/src/index.ts +3 -2
  48. package/src/types/search-filter.ts +53 -0
  49. package/src/utils/create-update-csi-docs.ts +457 -0
  50. package/src/utils/csi-to-store-docs-converter.ts +366 -0
  51. package/src/utils/search-utils.ts +437 -0
  52. package/src/utils/store-to-api-docs-converter.ts +246 -0
  53. package/dist/content-source-interface.d.ts +0 -338
  54. package/dist/content-source-interface.d.ts.map +0 -1
  55. package/dist/content-source-interface.js +0 -28
  56. package/dist/content-source-interface.js.map +0 -1
  57. package/src/content-source-interface.ts +0 -495
@@ -0,0 +1,150 @@
1
+ import _ from 'lodash';
2
+ import { Model } from '@stackbit/sdk';
3
+ import { Field, FieldList, FieldListItems, FieldListProps, FieldObjectProps, FieldSpecificProps } from '@stackbit/types';
4
+ import * as CSITypes from '@stackbit/types';
5
+
6
+ import * as ContentStoreTypes from './content-store-types';
7
+
8
+ export function getContentSourceIdForContentSource(contentSource: CSITypes.ContentSourceInterface): string {
9
+ return getContentSourceId(contentSource.getContentSourceType(), contentSource.getProjectId());
10
+ }
11
+
12
+ export function getContentSourceId(contentSourceType: string, srcProjectId: string) {
13
+ return contentSourceType + ':' + srcProjectId;
14
+ }
15
+
16
+ export function getUserContextForSrcType(srcType: string, user?: ContentStoreTypes.User): unknown {
17
+ return user?.connections?.find((connection) => connection.type === srcType);
18
+ }
19
+
20
+ export function getDocumentFieldForLocale<Type extends ContentStoreTypes.FieldType>(
21
+ docField: ContentStoreTypes.DocumentFieldForType<Type>,
22
+ locale?: string
23
+ ): ContentStoreTypes.DocumentFieldNonLocalizedForType<Type> | null {
24
+ if (docField.localized) {
25
+ if (!locale) {
26
+ return null;
27
+ }
28
+ const { localized, locales, ...base } = docField;
29
+ const localizedField = locales[locale];
30
+ if (!localizedField) {
31
+ return null;
32
+ }
33
+ return ({
34
+ ...base,
35
+ ...localizedField
36
+ } as unknown) as ContentStoreTypes.DocumentFieldNonLocalizedForType<Type>;
37
+ } else {
38
+ return docField;
39
+ }
40
+ }
41
+
42
+ export function getModelFieldForFieldAtPath(
43
+ document: ContentStoreTypes.Document,
44
+ model: Model,
45
+ fieldPath: (string | number)[],
46
+ modelMap: Record<string, Model>,
47
+ locale?: string
48
+ ): Field {
49
+ if (_.isEmpty(fieldPath)) {
50
+ throw new Error('the fieldPath can not be empty');
51
+ }
52
+
53
+ function getField(docField: ContentStoreTypes.DocumentField, modelField: FieldSpecificProps, fieldPath: (string | number)[]): Field {
54
+ const fieldName = _.head(fieldPath);
55
+ if (typeof fieldName === 'undefined') {
56
+ throw new Error('the first fieldPath item must be string');
57
+ }
58
+ const childFieldPath = _.tail(fieldPath);
59
+ let childDocField: ContentStoreTypes.DocumentField | undefined;
60
+ let childModelField: Field | undefined;
61
+ switch (docField.type) {
62
+ case 'object':
63
+ const localizedObjectField = getDocumentFieldForLocale(docField, locale);
64
+ if (!localizedObjectField) {
65
+ throw new Error(`locale for field was not found`);
66
+ }
67
+ if (localizedObjectField.isUnset) {
68
+ throw new Error(`field is not set`);
69
+ }
70
+ childDocField = localizedObjectField.fields[fieldName];
71
+ childModelField = _.find((modelField as FieldObjectProps).fields, (field) => field.name === fieldName);
72
+ if (!childDocField || !childModelField) {
73
+ throw new Error(`field ${fieldName} doesn't exist`);
74
+ }
75
+ if (childFieldPath.length === 0) {
76
+ return childModelField;
77
+ }
78
+ return getField(childDocField, childModelField, childFieldPath);
79
+ case 'model':
80
+ const localizedModelField = getDocumentFieldForLocale(docField, locale);
81
+ if (!localizedModelField) {
82
+ throw new Error(`locale for field was not found`);
83
+ }
84
+ if (localizedModelField.isUnset) {
85
+ throw new Error(`field is not set`);
86
+ }
87
+ const modelName = localizedModelField.srcModelName;
88
+ const childModel = modelMap[modelName];
89
+ if (!childModel) {
90
+ throw new Error(`model ${modelName} doesn't exist`);
91
+ }
92
+ childModelField = _.find(childModel.fields, (field) => field.name === fieldName);
93
+ childDocField = localizedModelField.fields![fieldName];
94
+ if (!childDocField || !childModelField) {
95
+ throw new Error(`field ${fieldName} doesn't exist`);
96
+ }
97
+ if (childFieldPath.length === 0) {
98
+ return childModelField;
99
+ }
100
+ return getField(childDocField, childModelField!, childFieldPath);
101
+ case 'list':
102
+ const localizedListField = getDocumentFieldForLocale(docField, locale);
103
+ if (!localizedListField) {
104
+ throw new Error(`locale for field was not found`);
105
+ }
106
+ const listItem = localizedListField.items && localizedListField.items[fieldName as number];
107
+ const listItemsModel = (modelField as FieldListProps).items;
108
+ if (!listItem || !listItemsModel) {
109
+ throw new Error(`field ${fieldName} doesn't exist`);
110
+ }
111
+ if (childFieldPath.length === 0) {
112
+ return modelField as FieldList;
113
+ }
114
+ if (!Array.isArray(listItemsModel)) {
115
+ return getField(listItem, listItemsModel, childFieldPath);
116
+ } else {
117
+ const fieldListItems = (listItemsModel as FieldListItems[]).find((listItemsModel) => listItemsModel.type === listItem.type);
118
+ if (!fieldListItems) {
119
+ throw new Error('cannot find matching field model');
120
+ }
121
+ return getField(listItem, fieldListItems, childFieldPath);
122
+ }
123
+ default:
124
+ if (!_.isEmpty(childFieldPath)) {
125
+ throw new Error('illegal fieldPath');
126
+ }
127
+ return modelField as Field;
128
+ }
129
+ }
130
+
131
+ const fieldName = _.head(fieldPath);
132
+ const childFieldPath = _.tail(fieldPath);
133
+
134
+ if (typeof fieldName !== 'string') {
135
+ throw new Error('the first fieldPath item must be string');
136
+ }
137
+
138
+ const childDocField = document.fields[fieldName];
139
+ const childModelField = _.find(model.fields, { name: fieldName });
140
+
141
+ if (!childDocField || !childModelField) {
142
+ throw new Error(`field ${fieldName} doesn't exist`);
143
+ }
144
+
145
+ if (childFieldPath.length === 0) {
146
+ return childModelField;
147
+ }
148
+
149
+ return getField(childDocField, childModelField, childFieldPath);
150
+ }