@webiny/api-headless-cms 6.4.12-beta.4 → 6.5.0-beta.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 (241) hide show
  1. package/crud/contentEntry/entryDataValidation.d.ts +1 -1
  2. package/crud/contentEntry/entryDataValidation.js +33 -18
  3. package/crud/contentEntry/entryDataValidation.js.map +1 -1
  4. package/crud/contentEntry.crud.js +12 -39
  5. package/crud/contentEntry.crud.js.map +1 -1
  6. package/crud/contentModel/defaultFields.js +3 -2
  7. package/crud/contentModel/defaultFields.js.map +1 -1
  8. package/crud/contentModel/validate/endingAllowed.js +1 -1
  9. package/crud/contentModel/validate/endingAllowed.js.map +1 -1
  10. package/crud/contentModel/validate/pluralApiName.js +1 -1
  11. package/crud/contentModel/validate/pluralApiName.js.map +1 -1
  12. package/crud/contentModel/validate/singularApiName.js +1 -1
  13. package/crud/contentModel/validate/singularApiName.js.map +1 -1
  14. package/crud/contentModel/validation.js +2 -2
  15. package/crud/contentModel/validation.js.map +1 -1
  16. package/domain/contentModel/schemas.d.ts +4 -0
  17. package/domain/contentModel/schemas.js +5 -2
  18. package/domain/contentModel/schemas.js.map +1 -1
  19. package/domain/contentModel/validation/endingAllowed.js +1 -1
  20. package/domain/contentModel/validation/endingAllowed.js.map +1 -1
  21. package/domain/contentModel/validation/pluralApiName.js +1 -1
  22. package/domain/contentModel/validation/pluralApiName.js.map +1 -1
  23. package/domain/contentModel/validation/singularApiName.js +1 -1
  24. package/domain/contentModel/validation/singularApiName.js.map +1 -1
  25. package/export/crud/exporting.js +2 -2
  26. package/export/crud/exporting.js.map +1 -1
  27. package/export/crud/imports/importGroups.js +2 -1
  28. package/export/crud/imports/importGroups.js.map +1 -1
  29. package/export/crud/imports/validateModels.js +1 -1
  30. package/export/crud/imports/validateModels.js.map +1 -1
  31. package/exports/api/cms/model.d.ts +4 -1
  32. package/exports/api/cms/model.js +2 -0
  33. package/extension.d.ts +3 -0
  34. package/extension.js +19 -0
  35. package/extension.js.map +1 -0
  36. package/features/contentEntry/ContentEntriesFeature.js +2 -0
  37. package/features/contentEntry/ContentEntriesFeature.js.map +1 -1
  38. package/features/contentEntry/CreateEntry/CreateEntryUseCase.js +1 -2
  39. package/features/contentEntry/CreateEntry/CreateEntryUseCase.js.map +1 -1
  40. package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js.map +1 -1
  41. package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionRepository.js +1 -0
  42. package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionRepository.js.map +1 -1
  43. package/features/contentEntry/GetSingletonEntry/GetSingletonEntryUseCase.js +1 -3
  44. package/features/contentEntry/GetSingletonEntry/GetSingletonEntryUseCase.js.map +1 -1
  45. package/features/contentEntry/PublishEntry/PublishEntryUseCase.js.map +1 -1
  46. package/features/contentEntry/UpdateRevision/UpdateRevisionRepository.d.ts +14 -0
  47. package/features/contentEntry/UpdateRevision/UpdateRevisionRepository.js +34 -0
  48. package/features/contentEntry/UpdateRevision/UpdateRevisionRepository.js.map +1 -0
  49. package/features/contentEntry/UpdateRevision/abstractions.d.ts +10 -0
  50. package/features/contentEntry/UpdateRevision/abstractions.js +5 -0
  51. package/features/contentEntry/UpdateRevision/abstractions.js.map +1 -0
  52. package/features/contentEntry/UpdateRevision/feature.d.ts +4 -0
  53. package/features/contentEntry/UpdateRevision/feature.js +11 -0
  54. package/features/contentEntry/UpdateRevision/feature.js.map +1 -0
  55. package/features/contentEntry/UpdateRevision/index.d.ts +1 -0
  56. package/features/contentEntry/UpdateRevision/index.js +1 -0
  57. package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.d.ts +2 -2
  58. package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.js +2 -2
  59. package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.js.map +1 -1
  60. package/features/contentEntry/ensureItemIds.d.ts +13 -0
  61. package/features/contentEntry/ensureItemIds.js +22 -0
  62. package/features/contentEntry/ensureItemIds.js.map +1 -0
  63. package/features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.d.ts +3 -1
  64. package/features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.js +9 -3
  65. package/features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.js.map +1 -1
  66. package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/CreateEntryRevisionFromDataFactory.d.ts +3 -3
  67. package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/CreateEntryRevisionFromDataFactory.js +10 -6
  68. package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/CreateEntryRevisionFromDataFactory.js.map +1 -1
  69. package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/UpdateEntryDataFactory.d.ts +3 -1
  70. package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/UpdateEntryDataFactory.js +9 -3
  71. package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/UpdateEntryDataFactory.js.map +1 -1
  72. package/features/contentEntry/entryDataFactories/expiresAt.js +2 -2
  73. package/features/contentEntry/entryDataFactories/expiresAt.js.map +1 -1
  74. package/features/contentModel/ComponentMapGenerator/ComponentMapGenerator.d.ts +14 -0
  75. package/features/contentModel/ComponentMapGenerator/ComponentMapGenerator.js +32 -0
  76. package/features/contentModel/ComponentMapGenerator/ComponentMapGenerator.js.map +1 -0
  77. package/features/contentModel/ComponentMapGenerator/abstractions.d.ts +8 -0
  78. package/features/contentModel/ComponentMapGenerator/abstractions.js +5 -0
  79. package/features/contentModel/ComponentMapGenerator/abstractions.js.map +1 -0
  80. package/features/contentModel/ComponentMapGenerator/feature.d.ts +4 -0
  81. package/features/contentModel/ComponentMapGenerator/feature.js +11 -0
  82. package/features/contentModel/ComponentMapGenerator/feature.js.map +1 -0
  83. package/features/contentModel/ComponentMapGenerator/index.d.ts +2 -0
  84. package/features/contentModel/ComponentMapGenerator/index.js +2 -0
  85. package/features/contentModel/ContentModelFeature.js +6 -0
  86. package/features/contentModel/ContentModelFeature.js.map +1 -1
  87. package/features/contentModel/CreateModel/CreateModelRepository.js +2 -1
  88. package/features/contentModel/CreateModel/CreateModelRepository.js.map +1 -1
  89. package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js +2 -1
  90. package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js.map +1 -1
  91. package/features/contentModel/RefModelsGenerator/RefModelsGenerator.d.ts +19 -0
  92. package/features/contentModel/RefModelsGenerator/RefModelsGenerator.js +56 -0
  93. package/features/contentModel/RefModelsGenerator/RefModelsGenerator.js.map +1 -0
  94. package/features/contentModel/RefModelsGenerator/abstractions.d.ts +11 -0
  95. package/features/contentModel/RefModelsGenerator/abstractions.js +5 -0
  96. package/features/contentModel/RefModelsGenerator/abstractions.js.map +1 -0
  97. package/features/contentModel/RefModelsGenerator/feature.d.ts +4 -0
  98. package/features/contentModel/RefModelsGenerator/feature.js +11 -0
  99. package/features/contentModel/RefModelsGenerator/feature.js.map +1 -0
  100. package/features/contentModel/RefModelsGenerator/index.d.ts +2 -0
  101. package/features/contentModel/RefModelsGenerator/index.js +2 -0
  102. package/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.d.ts +16 -0
  103. package/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.js +54 -0
  104. package/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.js.map +1 -0
  105. package/features/contentModel/ValuesSelectionGenerator/abstractions.d.ts +8 -0
  106. package/features/contentModel/ValuesSelectionGenerator/abstractions.js +5 -0
  107. package/features/contentModel/ValuesSelectionGenerator/abstractions.js.map +1 -0
  108. package/features/contentModel/ValuesSelectionGenerator/feature.d.ts +4 -0
  109. package/features/contentModel/ValuesSelectionGenerator/feature.js +11 -0
  110. package/features/contentModel/ValuesSelectionGenerator/feature.js.map +1 -0
  111. package/features/contentModel/ValuesSelectionGenerator/index.d.ts +1 -0
  112. package/features/contentModel/ValuesSelectionGenerator/index.js +1 -0
  113. package/features/graphql/feature.js +2 -0
  114. package/features/graphql/feature.js.map +1 -1
  115. package/features/graphql/fields/base/AssetToGraphQL.d.ts +26 -0
  116. package/features/graphql/fields/base/AssetToGraphQL.js +148 -0
  117. package/features/graphql/fields/base/AssetToGraphQL.js.map +1 -0
  118. package/features/graphql/fields/base/DynamicZoneToGraphQL.js +12 -2
  119. package/features/graphql/fields/base/DynamicZoneToGraphQL.js.map +1 -1
  120. package/features/graphql/fields/base/ObjectToGraphQL.js +8 -5
  121. package/features/graphql/fields/base/ObjectToGraphQL.js.map +1 -1
  122. package/features/modelBuilder/abstractions.d.ts +9 -0
  123. package/features/modelBuilder/abstractions.js.map +1 -1
  124. package/features/modelBuilder/feature.js +2 -0
  125. package/features/modelBuilder/feature.js.map +1 -1
  126. package/features/modelBuilder/fields/AssetFieldType.d.ts +20 -0
  127. package/features/modelBuilder/fields/AssetFieldType.js +46 -0
  128. package/features/modelBuilder/fields/AssetFieldType.js.map +1 -0
  129. package/features/modelBuilder/fields/DataFieldBuilder.d.ts +62 -18
  130. package/features/modelBuilder/fields/DataFieldBuilder.js +8 -0
  131. package/features/modelBuilder/fields/DataFieldBuilder.js.map +1 -1
  132. package/features/modelBuilder/fields/DynamicZoneFieldType.d.ts +1 -0
  133. package/features/modelBuilder/fields/DynamicZoneFieldType.js +2 -6
  134. package/features/modelBuilder/fields/DynamicZoneFieldType.js.map +1 -1
  135. package/features/modelBuilder/fields/resolveAssetUrl.d.ts +35 -0
  136. package/features/modelBuilder/fields/resolveAssetUrl.js +26 -0
  137. package/features/modelBuilder/fields/resolveAssetUrl.js.map +1 -0
  138. package/features/modelBuilder/index.d.ts +1 -1
  139. package/features/modelBuilder/models/BaseModelBuilder.d.ts +3 -1
  140. package/features/modelBuilder/models/BaseModelBuilder.js +7 -0
  141. package/features/modelBuilder/models/BaseModelBuilder.js.map +1 -1
  142. package/features/modelBuilder/models/PrivateModelBuilder.js +2 -1
  143. package/features/modelBuilder/models/PrivateModelBuilder.js.map +1 -1
  144. package/features/modelBuilder/models/PublicModelBuilder.js +2 -1
  145. package/features/modelBuilder/models/PublicModelBuilder.js.map +1 -1
  146. package/features/sortMapper/SortMapper.js +2 -5
  147. package/features/sortMapper/SortMapper.js.map +1 -1
  148. package/features/storage/fields/CompressedTextStorageTransform.js +1 -1
  149. package/features/storage/fields/CompressedTextStorageTransform.js.map +1 -1
  150. package/features/storage/fields/DateStorageTransform.js +4 -3
  151. package/features/storage/fields/DateStorageTransform.js.map +1 -1
  152. package/features/storage/fields/DynamicZoneStorageTransform.js +2 -2
  153. package/features/storage/fields/DynamicZoneStorageTransform.js.map +1 -1
  154. package/features/storage/fields/JsonStorageTransform.js +1 -1
  155. package/features/storage/fields/JsonStorageTransform.js.map +1 -1
  156. package/features/storage/fields/LongTextStorageTransform.js +1 -1
  157. package/features/storage/fields/LongTextStorageTransform.js.map +1 -1
  158. package/features/storage/fields/ObjectStorageTransform.js +27 -7
  159. package/features/storage/fields/ObjectStorageTransform.js.map +1 -1
  160. package/features/storage/fields/RichTextStorageTransform.js +1 -1
  161. package/features/storage/fields/RichTextStorageTransform.js.map +1 -1
  162. package/features/validation/validators/DateGteValidator.js +1 -1
  163. package/features/validation/validators/DateGteValidator.js.map +1 -1
  164. package/features/validation/validators/DateLteValidator.js +1 -1
  165. package/features/validation/validators/DateLteValidator.js.map +1 -1
  166. package/features/validation/validators/PatternValidator.js +1 -1
  167. package/features/validation/validators/PatternValidator.js.map +1 -1
  168. package/features/whereMapper/WhereMapper.js +10 -7
  169. package/features/whereMapper/WhereMapper.js.map +1 -1
  170. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js +8 -2
  171. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js.map +1 -1
  172. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js +8 -2
  173. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js.map +1 -1
  174. package/fieldConverters/index.d.ts +1 -1
  175. package/graphql/getSchema/generateCacheKey.js +1 -1
  176. package/graphql/getSchema/generateCacheKey.js.map +1 -1
  177. package/graphql/scalars/RevisionId.js +1 -1
  178. package/graphql/scalars/RevisionId.js.map +1 -1
  179. package/graphql/schema/baseSchema.js +5 -25
  180. package/graphql/schema/baseSchema.js.map +1 -1
  181. package/graphql/schema/cms/getEntryResolver.js +3 -2
  182. package/graphql/schema/cms/getEntryResolver.js.map +1 -1
  183. package/graphql/schema/cms/getModelResolver.d.ts +35 -0
  184. package/graphql/schema/cms/getModelResolver.js +49 -0
  185. package/graphql/schema/cms/getModelResolver.js.map +1 -0
  186. package/graphql/schema/cms/helpers/buildFieldsSelection.js +9 -2
  187. package/graphql/schema/cms/helpers/buildFieldsSelection.js.map +1 -1
  188. package/graphql/schema/cms/helpers/expandFieldWildcards.d.ts +2 -0
  189. package/graphql/schema/cms/helpers/expandFieldWildcards.js +13 -0
  190. package/graphql/schema/cms/helpers/expandFieldWildcards.js.map +1 -0
  191. package/graphql/schema/cms/helpers/index.d.ts +1 -0
  192. package/graphql/schema/cms/helpers/index.js +1 -0
  193. package/graphql/schema/cms/helpers.d.ts +1 -0
  194. package/graphql/schema/cms/helpers.js +1 -0
  195. package/graphql/schema/cms/index.js +2 -1
  196. package/graphql/schema/cms/index.js.map +1 -1
  197. package/graphql/schema/cms/listEntriesResolver.js +3 -2
  198. package/graphql/schema/cms/listEntriesResolver.js.map +1 -1
  199. package/graphql/schema/cms/resolvers/getModel.d.ts +8 -0
  200. package/graphql/schema/cms/resolvers/getModel.js +18 -0
  201. package/graphql/schema/cms/resolvers/getModel.js.map +1 -0
  202. package/graphql/schema/cms/resolvers/index.d.ts +1 -0
  203. package/graphql/schema/cms/resolvers/index.js +1 -0
  204. package/graphql/schema/cms/typeDefs/query.js +1 -0
  205. package/graphql/schema/cms/typeDefs/query.js.map +1 -1
  206. package/graphql/schema/cms/typeDefs/responses.js +5 -0
  207. package/graphql/schema/cms/typeDefs/responses.js.map +1 -1
  208. package/graphql/schema/contentModels.js +40 -1
  209. package/graphql/schema/contentModels.js.map +1 -1
  210. package/graphql/schema/createFieldResolvers.js +1 -1
  211. package/graphql/schema/createFieldResolvers.js.map +1 -1
  212. package/index.d.ts +2 -5
  213. package/index.js +1 -21
  214. package/package.json +26 -29
  215. package/plugins/CmsModelPlugin.js +12 -10
  216. package/plugins/CmsModelPlugin.js.map +1 -1
  217. package/types/fields/dynamicZoneField.d.ts +1 -0
  218. package/types/model.d.ts +6 -0
  219. package/types/modelField.d.ts +13 -0
  220. package/types/types.d.ts +8 -4
  221. package/types/types.js.map +1 -1
  222. package/utils/caching/Cache.js +1 -1
  223. package/utils/caching/Cache.js.map +1 -1
  224. package/utils/contentModelToJsonSchema/CmsModelToJsonSchemaConverter.d.ts +28 -0
  225. package/utils/contentModelToJsonSchema/CmsModelToJsonSchemaConverter.js +324 -0
  226. package/utils/contentModelToJsonSchema/CmsModelToJsonSchemaConverter.js.map +1 -0
  227. package/utils/contentModelToJsonSchema/index.d.ts +2 -0
  228. package/utils/contentModelToJsonSchema/index.js +1 -0
  229. package/utils/contentModelToJsonSchema/types.d.ts +24 -0
  230. package/utils/contentModelToJsonSchema/types.js +0 -0
  231. package/utils/createModelField.js +2 -1
  232. package/utils/createModelField.js.map +1 -1
  233. package/utils/date.js +1 -1
  234. package/utils/date.js.map +1 -1
  235. package/utils/entryStorage.js +1 -1
  236. package/utils/entryStorage.js.map +1 -1
  237. package/utils/index.d.ts +1 -0
  238. package/utils/index.js +1 -0
  239. package/utils/renderFields.js +1 -1
  240. package/utils/renderFields.js.map +1 -1
  241. package/index.js.map +0 -1
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Build the turnkey delivery URL for a stored Asset field value.
3
+ *
4
+ * The Asset field stores `src` as the file's **base delivery URL** (the pristine
5
+ * original) with the per-usage crop kept beside it in `image.crop`. The delivery
6
+ * pipeline frames the image only when the URL carries a `?crop=` param, so a raw
7
+ * `src` never reflects the per-usage crop. This helper bakes that crop into the URL
8
+ * — it is what the generated `url` field on the Asset GraphQL type resolves to, so a
9
+ * headless consumer (any framework) gets a ready-to-use URL without having to know
10
+ * the delivery param contract.
11
+ *
12
+ * Note: only the per-usage crop is added here. Any **asset-level** crop (set in File
13
+ * Manager, stored on the file's metadata) is already baked in by the delivery on any
14
+ * GET of the base `src`, and a per-usage crop replaces — not composes with — it, so
15
+ * `src` + `?crop=<per-usage>` is the correct combined result.
16
+ */
17
+ interface AssetImageCrop {
18
+ top?: number | null;
19
+ left?: number | null;
20
+ bottom?: number | null;
21
+ right?: number | null;
22
+ }
23
+ interface AssetValue {
24
+ src?: string | null;
25
+ image?: {
26
+ crop?: AssetImageCrop | null;
27
+ } | null;
28
+ }
29
+ /**
30
+ * The stored `src` with the per-usage crop baked in as a `?crop=` delivery param.
31
+ * Returns `src` unchanged when there is no per-usage crop, and `null` when the value
32
+ * has no source.
33
+ */
34
+ export declare const resolveAssetUrl: (asset: AssetValue | null | undefined) => string | null;
35
+ export {};
@@ -0,0 +1,26 @@
1
+ const round = (n)=>Math.round(10000 * n) / 10000;
2
+ const cropParam = (crop)=>{
3
+ if (!crop) return;
4
+ const top = crop.top ?? 0;
5
+ const left = crop.left ?? 0;
6
+ const bottom = crop.bottom ?? 0;
7
+ const right = crop.right ?? 0;
8
+ if (0 === top && 0 === left && 0 === bottom && 0 === right) return;
9
+ return [
10
+ top,
11
+ left,
12
+ bottom,
13
+ right
14
+ ].map(round).join(",");
15
+ };
16
+ const resolveAssetUrl = (asset)=>{
17
+ const src = asset?.src;
18
+ if (!src) return null;
19
+ const param = cropParam(asset?.image?.crop);
20
+ if (!param) return src;
21
+ const separator = src.includes("?") ? "&" : "?";
22
+ return `${src}${separator}crop=${param}`;
23
+ };
24
+ export { resolveAssetUrl };
25
+
26
+ //# sourceMappingURL=resolveAssetUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/modelBuilder/fields/resolveAssetUrl.js","sources":["../../../../src/features/modelBuilder/fields/resolveAssetUrl.ts"],"sourcesContent":["/**\n * Build the turnkey delivery URL for a stored Asset field value.\n *\n * The Asset field stores `src` as the file's **base delivery URL** (the pristine\n * original) with the per-usage crop kept beside it in `image.crop`. The delivery\n * pipeline frames the image only when the URL carries a `?crop=` param, so a raw\n * `src` never reflects the per-usage crop. This helper bakes that crop into the URL\n * — it is what the generated `url` field on the Asset GraphQL type resolves to, so a\n * headless consumer (any framework) gets a ready-to-use URL without having to know\n * the delivery param contract.\n *\n * Note: only the per-usage crop is added here. Any **asset-level** crop (set in File\n * Manager, stored on the file's metadata) is already baked in by the delivery on any\n * GET of the base `src`, and a per-usage crop replaces — not composes with — it, so\n * `src` + `?crop=<per-usage>` is the correct combined result.\n */\n\ninterface AssetImageCrop {\n top?: number | null;\n left?: number | null;\n bottom?: number | null;\n right?: number | null;\n}\n\ninterface AssetValue {\n src?: string | null;\n image?: { crop?: AssetImageCrop | null } | null;\n}\n\nconst round = (n: number): number => Math.round(n * 10000) / 10000;\n\n/** `top,left,bottom,right` crop param, or `undefined` for a missing/full (no-op) crop. */\nconst cropParam = (crop: AssetImageCrop | null | undefined): string | undefined => {\n if (!crop) {\n return undefined;\n }\n const top = crop.top ?? 0;\n const left = crop.left ?? 0;\n const bottom = crop.bottom ?? 0;\n const right = crop.right ?? 0;\n if (top === 0 && left === 0 && bottom === 0 && right === 0) {\n return undefined;\n }\n return [top, left, bottom, right].map(round).join(\",\");\n};\n\n/**\n * The stored `src` with the per-usage crop baked in as a `?crop=` delivery param.\n * Returns `src` unchanged when there is no per-usage crop, and `null` when the value\n * has no source.\n */\nexport const resolveAssetUrl = (asset: AssetValue | null | undefined): string | null => {\n const src = asset?.src;\n if (!src) {\n return null;\n }\n const param = cropParam(asset?.image?.crop);\n if (!param) {\n return src;\n }\n const separator = src.includes(\"?\") ? \"&\" : \"?\";\n return `${src}${separator}crop=${param}`;\n};\n"],"names":["round","n","Math","cropParam","crop","top","left","bottom","right","resolveAssetUrl","asset","src","param","separator"],"mappings":"AA6BA,MAAMA,QAAQ,CAACC,IAAsBC,KAAK,KAAK,CAACD,AAAI,QAAJA,KAAa;AAG7D,MAAME,YAAY,CAACC;IACf,IAAI,CAACA,MACD;IAEJ,MAAMC,MAAMD,KAAK,GAAG,IAAI;IACxB,MAAME,OAAOF,KAAK,IAAI,IAAI;IAC1B,MAAMG,SAASH,KAAK,MAAM,IAAI;IAC9B,MAAMI,QAAQJ,KAAK,KAAK,IAAI;IAC5B,IAAIC,AAAQ,MAARA,OAAaC,AAAS,MAATA,QAAcC,AAAW,MAAXA,UAAgBC,AAAU,MAAVA,OAC3C;IAEJ,OAAO;QAACH;QAAKC;QAAMC;QAAQC;KAAM,CAAC,GAAG,CAACR,OAAO,IAAI,CAAC;AACtD;AAOO,MAAMS,kBAAkB,CAACC;IAC5B,MAAMC,MAAMD,OAAO;IACnB,IAAI,CAACC,KACD,OAAO;IAEX,MAAMC,QAAQT,UAAUO,OAAO,OAAO;IACtC,IAAI,CAACE,OACD,OAAOD;IAEX,MAAME,YAAYF,IAAI,QAAQ,CAAC,OAAO,MAAM;IAC5C,OAAO,GAAGA,MAAME,UAAU,KAAK,EAAED,OAAO;AAC5C"}
@@ -1,4 +1,4 @@
1
- export { ModelFactory } from "./abstractions.js";
1
+ export { ModelFactory, type IModelSettings } from "./abstractions.js";
2
2
  export * from "./models/BaseModelBuilder.js";
3
3
  export * from "./models/ModelBuilder.js";
4
4
  export * from "./models/PrivateModelBuilder.js";
@@ -1,6 +1,6 @@
1
1
  import { BaseFieldBuilder } from "../../../features/modelBuilder/index.js";
2
2
  import { CmsModelPlugin } from "../../../plugins/CmsModelPlugin.js";
3
- import { FieldBuilderRegistry } from "../abstractions.js";
3
+ import { FieldBuilderRegistry, type IModelSettings } from "../abstractions.js";
4
4
  import type { CmsModelField, CmsModelLayoutCell } from "../../../types/index.js";
5
5
  /**
6
6
  * Base class for all model builders, containing shared logic.
@@ -12,6 +12,7 @@ export declare abstract class BaseModelBuilder<TBuild = CmsModelPlugin> {
12
12
  modelId?: string;
13
13
  name?: string;
14
14
  tags?: string[];
15
+ settings?: IModelSettings;
15
16
  };
16
17
  protected isSingleEntry: boolean;
17
18
  protected fieldBuildersMap: Map<string, BaseFieldBuilder<any>>;
@@ -20,6 +21,7 @@ export declare abstract class BaseModelBuilder<TBuild = CmsModelPlugin> {
20
21
  name(name: string): this;
21
22
  singleEntry(): this;
22
23
  tags(tags: string[]): this;
24
+ settings(settings: Partial<IModelSettings>): this;
23
25
  fields(builder: (registry: FieldBuilderRegistry.Interface) => Record<string, BaseFieldBuilder<any>>): this;
24
26
  /**
25
27
  * Merge field operations from extension builder into existing builder.
@@ -21,6 +21,13 @@ class BaseModelBuilder {
21
21
  this.config.tags = tags;
22
22
  return this;
23
23
  }
24
+ settings(settings) {
25
+ this.config.settings = {
26
+ ...this.config.settings || {},
27
+ ...settings
28
+ };
29
+ return this;
30
+ }
24
31
  fields(builder) {
25
32
  this.registry.existingFields = this.fieldBuildersMap;
26
33
  const fieldBuilders = builder(this.registry);
@@ -1 +1 @@
1
- {"version":3,"file":"features/modelBuilder/models/BaseModelBuilder.js","sources":["../../../../src/features/modelBuilder/models/BaseModelBuilder.ts"],"sourcesContent":["import { BaseFieldBuilder } from \"~/features/modelBuilder/index.js\";\nimport { CmsModelPlugin } from \"~/plugins/CmsModelPlugin.js\";\nimport { FieldBuilderRegistry } from \"../abstractions.js\";\nimport type { CmsModelField, CmsModelLayoutCell } from \"~/types/index.js\";\n\n/**\n * Base class for all model builders, containing shared logic.\n * Concrete builders (PrivateModelBuilder, PublicModelBuilder) extend this.\n */\nexport abstract class BaseModelBuilder<TBuild = CmsModelPlugin> {\n protected config: {\n modelId?: string;\n name?: string;\n tags?: string[];\n } = {};\n\n protected isSingleEntry = false;\n protected fieldBuildersMap = new Map<string, BaseFieldBuilder<any>>();\n\n public constructor(protected registry: FieldBuilderRegistry.Interface) {}\n\n modelId(id: string): this {\n this.config.modelId = id;\n return this;\n }\n\n name(name: string): this {\n this.config.name = name;\n return this;\n }\n\n singleEntry(): this {\n this.isSingleEntry = true;\n return this;\n }\n\n tags(tags: string[]): this {\n this.config.tags = tags;\n return this;\n }\n\n fields(\n builder: (registry: FieldBuilderRegistry.Interface) => Record<string, BaseFieldBuilder<any>>\n ): this {\n // Pass existing fields to registry so it can return them when extending\n (this.registry as any).existingFields = this.fieldBuildersMap;\n\n const fieldBuilders = builder(this.registry);\n\n for (const [key, fieldBuilder] of Object.entries(fieldBuilders)) {\n // Set the fieldId from the object key\n fieldBuilder.fieldId(key);\n\n const existingBuilder = this.fieldBuildersMap.get(key);\n const isExtendMode = (fieldBuilder as any)._extendMode;\n\n if (isExtendMode && existingBuilder) {\n // Extension mode - validate type and merge operations\n if (existingBuilder.type !== fieldBuilder.type) {\n throw new Error(\n `Cannot extend field \"${key}\": type mismatch. Expected \"${existingBuilder.type}\", got \"${fieldBuilder.type}\".`\n );\n }\n // Merge operations from temporary new builder into existing builder\n this.mergeFieldOperations(key, existingBuilder, fieldBuilder);\n } else if (existingBuilder && !isExtendMode) {\n // Replacement mode - validate type\n if (existingBuilder.type !== fieldBuilder.type) {\n throw new Error(\n `Cannot redefine field \"${key}\": type mismatch. Expected \"${existingBuilder.type}\", got \"${fieldBuilder.type}\".`\n );\n }\n // Replace with new builder\n this.fieldBuildersMap.set(key, fieldBuilder);\n } else if (!existingBuilder && !isExtendMode) {\n // New field - store builder\n this.fieldBuildersMap.set(key, fieldBuilder);\n } else {\n // isExtendMode but no existingBuilder - this is an error\n throw new Error(\n `Cannot extend field \"${key}\": field does not exist. Use .extend() only for existing fields.`\n );\n }\n }\n\n return this;\n }\n\n /**\n * Merge field operations from extension builder into existing builder.\n * This handles the case where multiple fields of the same type exist,\n * and we need to transfer operations from the temporary new builder\n * to the existing builder.\n * @internal\n */\n private mergeFieldOperations(\n fieldId: string,\n existing: BaseFieldBuilder<any>,\n extension: BaseFieldBuilder<any>\n ): void {\n // For object fields, merge nested fields and layout operations\n if (existing.type === \"object\" && extension.type === \"object\") {\n const existingFieldMap = (existing as any).fieldBuildersMap;\n const extensionFieldMap = (extension as any).fieldBuildersMap;\n\n // Merge nested field builders\n if (extensionFieldMap) {\n for (const [nestedKey, nestedBuilder] of extensionFieldMap.entries()) {\n existingFieldMap.set(nestedKey, nestedBuilder);\n }\n }\n\n // Merge layout operations\n const existingLayoutBuilder = (existing as any).layoutBuilder;\n const extensionLayoutBuilder = (extension as any).layoutBuilder;\n\n if (extensionLayoutBuilder) {\n const snapshot = extensionLayoutBuilder.getSnapshot();\n\n // If extension called setLayout() with an array, apply it to existing\n // We detect this by checking if there's a layout but no modifiers\n if (snapshot.layout.length > 0 && snapshot.modifiers.length === 0) {\n existingLayoutBuilder.setLayout(snapshot.layout);\n }\n\n // Apply all modifiers from extension to existing\n for (const modifier of snapshot.modifiers) {\n existingLayoutBuilder.addModifier(modifier);\n }\n }\n }\n }\n\n protected buildFields(): {\n fields: CmsModelField[];\n layoutReplacements: Map<string, CmsModelLayoutCell>;\n } {\n const fields: CmsModelField[] = [];\n const layoutReplacements = new Map<string, CmsModelLayoutCell>();\n\n for (const [fieldId, builder] of this.fieldBuildersMap) {\n const result = builder.build();\n if (result.type === \"layout\") {\n layoutReplacements.set(fieldId, result.layoutCell);\n if (result.fields) {\n fields.push(...result.fields);\n }\n } else {\n fields.push(result.field);\n }\n }\n\n return { fields, layoutReplacements };\n }\n\n /**\n * Get tags with common defaults applied.\n * Always includes \"type:model\" and optionally \"singleEntry\".\n */\n protected getTags(): string[] {\n const tagsSet = new Set(this.config.tags || []);\n tagsSet.add(\"type:model\");\n if (this.isSingleEntry) {\n tagsSet.add(\"singleEntry\");\n }\n return Array.from(tagsSet);\n }\n\n /**\n * Build the final model configuration.\n * Must be implemented by concrete builders.\n */\n abstract build(): TBuild;\n}\n"],"names":["BaseModelBuilder","registry","Map","id","name","tags","builder","fieldBuilders","key","fieldBuilder","Object","existingBuilder","isExtendMode","Error","fieldId","existing","extension","existingFieldMap","extensionFieldMap","nestedKey","nestedBuilder","existingLayoutBuilder","extensionLayoutBuilder","snapshot","modifier","fields","layoutReplacements","result","tagsSet","Set","Array"],"mappings":"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"}
1
+ {"version":3,"file":"features/modelBuilder/models/BaseModelBuilder.js","sources":["../../../../src/features/modelBuilder/models/BaseModelBuilder.ts"],"sourcesContent":["import { BaseFieldBuilder } from \"~/features/modelBuilder/index.js\";\nimport { CmsModelPlugin } from \"~/plugins/CmsModelPlugin.js\";\nimport { FieldBuilderRegistry, type IModelSettings } from \"../abstractions.js\";\nimport type { CmsModelField, CmsModelLayoutCell } from \"~/types/index.js\";\n\n/**\n * Base class for all model builders, containing shared logic.\n * Concrete builders (PrivateModelBuilder, PublicModelBuilder) extend this.\n */\nexport abstract class BaseModelBuilder<TBuild = CmsModelPlugin> {\n protected config: {\n modelId?: string;\n name?: string;\n tags?: string[];\n settings?: IModelSettings;\n } = {};\n\n protected isSingleEntry = false;\n protected fieldBuildersMap = new Map<string, BaseFieldBuilder<any>>();\n\n public constructor(protected registry: FieldBuilderRegistry.Interface) {}\n\n modelId(id: string): this {\n this.config.modelId = id;\n return this;\n }\n\n name(name: string): this {\n this.config.name = name;\n return this;\n }\n\n singleEntry(): this {\n this.isSingleEntry = true;\n return this;\n }\n\n tags(tags: string[]): this {\n this.config.tags = tags;\n return this;\n }\n\n settings(settings: Partial<IModelSettings>): this {\n this.config.settings = { ...(this.config.settings || {}), ...settings };\n return this;\n }\n\n fields(\n builder: (registry: FieldBuilderRegistry.Interface) => Record<string, BaseFieldBuilder<any>>\n ): this {\n // Pass existing fields to registry so it can return them when extending\n (this.registry as any).existingFields = this.fieldBuildersMap;\n\n const fieldBuilders = builder(this.registry);\n\n for (const [key, fieldBuilder] of Object.entries(fieldBuilders)) {\n // Set the fieldId from the object key\n fieldBuilder.fieldId(key);\n\n const existingBuilder = this.fieldBuildersMap.get(key);\n const isExtendMode = (fieldBuilder as any)._extendMode;\n\n if (isExtendMode && existingBuilder) {\n // Extension mode - validate type and merge operations\n if (existingBuilder.type !== fieldBuilder.type) {\n throw new Error(\n `Cannot extend field \"${key}\": type mismatch. Expected \"${existingBuilder.type}\", got \"${fieldBuilder.type}\".`\n );\n }\n // Merge operations from temporary new builder into existing builder\n this.mergeFieldOperations(key, existingBuilder, fieldBuilder);\n } else if (existingBuilder && !isExtendMode) {\n // Replacement mode - validate type\n if (existingBuilder.type !== fieldBuilder.type) {\n throw new Error(\n `Cannot redefine field \"${key}\": type mismatch. Expected \"${existingBuilder.type}\", got \"${fieldBuilder.type}\".`\n );\n }\n // Replace with new builder\n this.fieldBuildersMap.set(key, fieldBuilder);\n } else if (!existingBuilder && !isExtendMode) {\n // New field - store builder\n this.fieldBuildersMap.set(key, fieldBuilder);\n } else {\n // isExtendMode but no existingBuilder - this is an error\n throw new Error(\n `Cannot extend field \"${key}\": field does not exist. Use .extend() only for existing fields.`\n );\n }\n }\n\n return this;\n }\n\n /**\n * Merge field operations from extension builder into existing builder.\n * This handles the case where multiple fields of the same type exist,\n * and we need to transfer operations from the temporary new builder\n * to the existing builder.\n * @internal\n */\n private mergeFieldOperations(\n fieldId: string,\n existing: BaseFieldBuilder<any>,\n extension: BaseFieldBuilder<any>\n ): void {\n // For object fields, merge nested fields and layout operations\n if (existing.type === \"object\" && extension.type === \"object\") {\n const existingFieldMap = (existing as any).fieldBuildersMap;\n const extensionFieldMap = (extension as any).fieldBuildersMap;\n\n // Merge nested field builders\n if (extensionFieldMap) {\n for (const [nestedKey, nestedBuilder] of extensionFieldMap.entries()) {\n existingFieldMap.set(nestedKey, nestedBuilder);\n }\n }\n\n // Merge layout operations\n const existingLayoutBuilder = (existing as any).layoutBuilder;\n const extensionLayoutBuilder = (extension as any).layoutBuilder;\n\n if (extensionLayoutBuilder) {\n const snapshot = extensionLayoutBuilder.getSnapshot();\n\n // If extension called setLayout() with an array, apply it to existing\n // We detect this by checking if there's a layout but no modifiers\n if (snapshot.layout.length > 0 && snapshot.modifiers.length === 0) {\n existingLayoutBuilder.setLayout(snapshot.layout);\n }\n\n // Apply all modifiers from extension to existing\n for (const modifier of snapshot.modifiers) {\n existingLayoutBuilder.addModifier(modifier);\n }\n }\n }\n }\n\n protected buildFields(): {\n fields: CmsModelField[];\n layoutReplacements: Map<string, CmsModelLayoutCell>;\n } {\n const fields: CmsModelField[] = [];\n const layoutReplacements = new Map<string, CmsModelLayoutCell>();\n\n for (const [fieldId, builder] of this.fieldBuildersMap) {\n const result = builder.build();\n if (result.type === \"layout\") {\n layoutReplacements.set(fieldId, result.layoutCell);\n if (result.fields) {\n fields.push(...result.fields);\n }\n } else {\n fields.push(result.field);\n }\n }\n\n return { fields, layoutReplacements };\n }\n\n /**\n * Get tags with common defaults applied.\n * Always includes \"type:model\" and optionally \"singleEntry\".\n */\n protected getTags(): string[] {\n const tagsSet = new Set(this.config.tags || []);\n tagsSet.add(\"type:model\");\n if (this.isSingleEntry) {\n tagsSet.add(\"singleEntry\");\n }\n return Array.from(tagsSet);\n }\n\n /**\n * Build the final model configuration.\n * Must be implemented by concrete builders.\n */\n abstract build(): TBuild;\n}\n"],"names":["BaseModelBuilder","registry","Map","id","name","tags","settings","builder","fieldBuilders","key","fieldBuilder","Object","existingBuilder","isExtendMode","Error","fieldId","existing","extension","existingFieldMap","extensionFieldMap","nestedKey","nestedBuilder","existingLayoutBuilder","extensionLayoutBuilder","snapshot","modifier","fields","layoutReplacements","result","tagsSet","Set","Array"],"mappings":"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"}
@@ -12,7 +12,8 @@ class PrivateModelBuilder extends BaseModelBuilder {
12
12
  fields,
13
13
  authorization: false,
14
14
  noValidate: true,
15
- tags: this.getTags()
15
+ tags: this.getTags(),
16
+ settings: this.config.settings || {}
16
17
  });
17
18
  }
18
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"features/modelBuilder/models/PrivateModelBuilder.js","sources":["../../../../src/features/modelBuilder/models/PrivateModelBuilder.ts"],"sourcesContent":["import { createPrivateModelPlugin } from \"~/plugins/CmsModelPlugin.js\";\nimport { BaseModelBuilder } from \"./BaseModelBuilder.js\";\n\nexport class PrivateModelBuilder extends BaseModelBuilder {\n public build() {\n if (!this.config.modelId) {\n throw new Error(\"modelId is required\");\n }\n if (!this.config.name) {\n throw new Error(\"name is required\");\n }\n if (this.fieldBuildersMap.size === 0) {\n throw new Error(\"fields are required\");\n }\n\n // Build all fields from field builders (layout replacements ignored for private models)\n const { fields } = this.buildFields();\n\n return createPrivateModelPlugin({\n modelId: this.config.modelId,\n name: this.config.name,\n fields,\n authorization: false,\n noValidate: true,\n tags: this.getTags()\n });\n }\n}\n"],"names":["PrivateModelBuilder","BaseModelBuilder","Error","fields","createPrivateModelPlugin"],"mappings":";;AAGO,MAAMA,4BAA4BC;IAC9B,QAAQ;QACX,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EACpB,MAAM,IAAIC,MAAM;QAEpB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EACjB,MAAM,IAAIA,MAAM;QAEpB,IAAI,AAA+B,MAA/B,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAC1B,MAAM,IAAIA,MAAM;QAIpB,MAAM,EAAEC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW;QAEnC,OAAOC,yBAAyB;YAC5B,SAAS,IAAI,CAAC,MAAM,CAAC,OAAO;YAC5B,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI;YACtBD;YACA,eAAe;YACf,YAAY;YACZ,MAAM,IAAI,CAAC,OAAO;QACtB;IACJ;AACJ"}
1
+ {"version":3,"file":"features/modelBuilder/models/PrivateModelBuilder.js","sources":["../../../../src/features/modelBuilder/models/PrivateModelBuilder.ts"],"sourcesContent":["import { createPrivateModelPlugin } from \"~/plugins/CmsModelPlugin.js\";\nimport { BaseModelBuilder } from \"./BaseModelBuilder.js\";\n\nexport class PrivateModelBuilder extends BaseModelBuilder {\n public build() {\n if (!this.config.modelId) {\n throw new Error(\"modelId is required\");\n }\n if (!this.config.name) {\n throw new Error(\"name is required\");\n }\n if (this.fieldBuildersMap.size === 0) {\n throw new Error(\"fields are required\");\n }\n\n // Build all fields from field builders (layout replacements ignored for private models)\n const { fields } = this.buildFields();\n\n return createPrivateModelPlugin({\n modelId: this.config.modelId,\n name: this.config.name,\n fields,\n authorization: false,\n noValidate: true,\n tags: this.getTags(),\n settings: this.config.settings || {}\n });\n }\n}\n"],"names":["PrivateModelBuilder","BaseModelBuilder","Error","fields","createPrivateModelPlugin"],"mappings":";;AAGO,MAAMA,4BAA4BC;IAC9B,QAAQ;QACX,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EACpB,MAAM,IAAIC,MAAM;QAEpB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EACjB,MAAM,IAAIA,MAAM;QAEpB,IAAI,AAA+B,MAA/B,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAC1B,MAAM,IAAIA,MAAM;QAIpB,MAAM,EAAEC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW;QAEnC,OAAOC,yBAAyB;YAC5B,SAAS,IAAI,CAAC,MAAM,CAAC,OAAO;YAC5B,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI;YACtBD;YACA,eAAe;YACf,YAAY;YACZ,MAAM,IAAI,CAAC,OAAO;YAClB,UAAU,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC;QACvC;IACJ;AACJ"}
@@ -92,7 +92,8 @@ class PublicModelBuilder extends BaseModelBuilder {
92
92
  imageFieldId: this.publicConfig.imageFieldId,
93
93
  layout,
94
94
  fields,
95
- tags: this.getTags()
95
+ tags: this.getTags(),
96
+ settings: this.config.settings || {}
96
97
  }, {
97
98
  validateLayout: false
98
99
  });
@@ -1 +1 @@
1
- {"version":3,"file":"features/modelBuilder/models/PublicModelBuilder.js","sources":["../../../../src/features/modelBuilder/models/PublicModelBuilder.ts"],"sourcesContent":["import upperFirst from \"lodash/upperFirst.js\";\nimport camelCase from \"lodash/camelCase.js\";\nimport pluralize from \"pluralize\";\nimport { createModelPlugin } from \"~/plugins/CmsModelPlugin.js\";\nimport { BaseModelBuilder } from \"./BaseModelBuilder.js\";\nimport type { CmsIcon, CmsModelField } from \"~/types/index.js\";\nimport { LayoutBuilder } from \"../LayoutBuilder.js\";\n\nconst createApiName = (name: string) => {\n return upperFirst(camelCase(name));\n};\n\nconst createPluralApiName = (name: string) => {\n return pluralize(createApiName(name));\n};\n\nclass Icon {\n static from(icon: string | CmsIcon): CmsIcon {\n if (typeof icon === \"string\") {\n return {\n type: \"icon\",\n name: icon\n };\n }\n\n return icon;\n }\n}\n\nexport class PublicModelBuilder extends BaseModelBuilder {\n private publicConfig: {\n singularApiName?: string;\n pluralApiName?: string;\n group?: string;\n icon?: CmsIcon;\n description?: string;\n titleFieldId?: string;\n descriptionFieldId?: string;\n imageFieldId?: string;\n } = {};\n private layoutBuilder: LayoutBuilder;\n\n singularApiName(name: string): this {\n this.publicConfig.singularApiName = name;\n return this;\n }\n\n pluralApiName(name: string): this {\n this.publicConfig.pluralApiName = name;\n return this;\n }\n\n group(slug: string): this {\n this.publicConfig.group = slug;\n return this;\n }\n\n icon(icon: string | CmsIcon): this {\n this.publicConfig.icon = Icon.from(icon);\n return this;\n }\n\n description(description: string): this {\n this.publicConfig.description = description;\n return this;\n }\n\n titleFieldId(fieldId: string): this {\n this.publicConfig.titleFieldId = fieldId;\n return this;\n }\n\n descriptionFieldId(fieldId: string): this {\n this.publicConfig.descriptionFieldId = fieldId;\n return this;\n }\n\n imageFieldId(fieldId: string): this {\n this.publicConfig.imageFieldId = fieldId;\n return this;\n }\n /**\n * It just creates problems if we import the FieldBuilderRegistry.\n * TODO: figure out\n */\n constructor(registry: any) {\n super(registry);\n this.layoutBuilder = new LayoutBuilder();\n }\n\n layout(layoutOrBuilder: string[][] | ((builder: LayoutBuilder) => void)): this {\n if (Array.isArray(layoutOrBuilder)) {\n // Replace layout with array\n this.layoutBuilder.setLayout(layoutOrBuilder);\n } else {\n // Queue the modifier callback\n this.layoutBuilder.addModifier(layoutOrBuilder);\n }\n return this;\n }\n\n build() {\n if (!this.config.modelId) {\n throw new Error(\"modelId is required\");\n }\n if (!this.config.name) {\n throw new Error(\"name is required\");\n }\n if (this.fieldBuildersMap.size === 0) {\n this.fields(builder => ({\n alert: builder\n .uiAlert()\n .label(\n \"No fields defined in the code content model. Please ensure you have the fields property correctly defined.\"\n ),\n emptyPlaceholder: builder.text().label(\"Empty\").renderer(\"hidden\")\n }));\n this.titleFieldId(\"emptyPlaceholder\");\n this.layoutBuilder.setLayout([[\"alert\"], [\"emptyPlaceholder\"]]);\n }\n if (!this.publicConfig.group) {\n throw new Error(\"group is required\");\n }\n\n // Build all fields from field builders, separating data and layout results\n const { fields, layoutReplacements } = this.buildFields();\n\n // Build and apply layout replacements (tabs → rich descriptors)\n const rawLayout = this.layoutBuilder.build();\n const layout = rawLayout.map(row => row.map(cell => layoutReplacements.get(cell) ?? cell));\n\n return createModelPlugin(\n {\n modelId: this.config.modelId,\n name: this.config.name,\n singularApiName:\n this.publicConfig.singularApiName || createApiName(this.config.name),\n pluralApiName:\n this.publicConfig.pluralApiName || createPluralApiName(this.config.name),\n group: this.publicConfig.group,\n icon: this.publicConfig.icon ?? null,\n description: this.publicConfig.description || null,\n titleFieldId:\n this.publicConfig.titleFieldId ?? this.findFirstFieldId(fields, \"text\"),\n descriptionFieldId: this.publicConfig.descriptionFieldId,\n imageFieldId: this.publicConfig.imageFieldId,\n layout,\n fields,\n tags: this.getTags()\n },\n { validateLayout: false }\n );\n }\n\n private findFirstFieldId(fields: CmsModelField[], type: string): string {\n for (const field of fields) {\n if (field.type === type) {\n return field.fieldId;\n }\n }\n return fields.find(field => field.type === \"text\")?.fieldId || \"\";\n }\n}\n"],"names":["createApiName","name","upperFirst","camelCase","createPluralApiName","pluralize","Icon","icon","PublicModelBuilder","BaseModelBuilder","slug","description","fieldId","registry","LayoutBuilder","layoutOrBuilder","Array","Error","builder","fields","layoutReplacements","rawLayout","layout","row","cell","createModelPlugin","type","field"],"mappings":"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"}
1
+ {"version":3,"file":"features/modelBuilder/models/PublicModelBuilder.js","sources":["../../../../src/features/modelBuilder/models/PublicModelBuilder.ts"],"sourcesContent":["import upperFirst from \"lodash/upperFirst.js\";\nimport camelCase from \"lodash/camelCase.js\";\nimport pluralize from \"pluralize\";\nimport { createModelPlugin } from \"~/plugins/CmsModelPlugin.js\";\nimport { BaseModelBuilder } from \"./BaseModelBuilder.js\";\nimport type { CmsIcon, CmsModelField } from \"~/types/index.js\";\nimport { LayoutBuilder } from \"../LayoutBuilder.js\";\n\nconst createApiName = (name: string) => {\n return upperFirst(camelCase(name));\n};\n\nconst createPluralApiName = (name: string) => {\n return pluralize(createApiName(name));\n};\n\nclass Icon {\n static from(icon: string | CmsIcon): CmsIcon {\n if (typeof icon === \"string\") {\n return {\n type: \"icon\",\n name: icon\n };\n }\n\n return icon;\n }\n}\n\nexport class PublicModelBuilder extends BaseModelBuilder {\n private publicConfig: {\n singularApiName?: string;\n pluralApiName?: string;\n group?: string;\n icon?: CmsIcon;\n description?: string;\n titleFieldId?: string;\n descriptionFieldId?: string;\n imageFieldId?: string;\n } = {};\n private layoutBuilder: LayoutBuilder;\n\n singularApiName(name: string): this {\n this.publicConfig.singularApiName = name;\n return this;\n }\n\n pluralApiName(name: string): this {\n this.publicConfig.pluralApiName = name;\n return this;\n }\n\n group(slug: string): this {\n this.publicConfig.group = slug;\n return this;\n }\n\n icon(icon: string | CmsIcon): this {\n this.publicConfig.icon = Icon.from(icon);\n return this;\n }\n\n description(description: string): this {\n this.publicConfig.description = description;\n return this;\n }\n\n titleFieldId(fieldId: string): this {\n this.publicConfig.titleFieldId = fieldId;\n return this;\n }\n\n descriptionFieldId(fieldId: string): this {\n this.publicConfig.descriptionFieldId = fieldId;\n return this;\n }\n\n imageFieldId(fieldId: string): this {\n this.publicConfig.imageFieldId = fieldId;\n return this;\n }\n /**\n * It just creates problems if we import the FieldBuilderRegistry.\n * TODO: figure out\n */\n constructor(registry: any) {\n super(registry);\n this.layoutBuilder = new LayoutBuilder();\n }\n\n layout(layoutOrBuilder: string[][] | ((builder: LayoutBuilder) => void)): this {\n if (Array.isArray(layoutOrBuilder)) {\n // Replace layout with array\n this.layoutBuilder.setLayout(layoutOrBuilder);\n } else {\n // Queue the modifier callback\n this.layoutBuilder.addModifier(layoutOrBuilder);\n }\n return this;\n }\n\n build() {\n if (!this.config.modelId) {\n throw new Error(\"modelId is required\");\n }\n if (!this.config.name) {\n throw new Error(\"name is required\");\n }\n if (this.fieldBuildersMap.size === 0) {\n this.fields(builder => ({\n alert: builder\n .uiAlert()\n .label(\n \"No fields defined in the code content model. Please ensure you have the fields property correctly defined.\"\n ),\n emptyPlaceholder: builder.text().label(\"Empty\").renderer(\"hidden\")\n }));\n this.titleFieldId(\"emptyPlaceholder\");\n this.layoutBuilder.setLayout([[\"alert\"], [\"emptyPlaceholder\"]]);\n }\n if (!this.publicConfig.group) {\n throw new Error(\"group is required\");\n }\n\n // Build all fields from field builders, separating data and layout results\n const { fields, layoutReplacements } = this.buildFields();\n\n // Build and apply layout replacements (tabs → rich descriptors)\n const rawLayout = this.layoutBuilder.build();\n const layout = rawLayout.map(row => row.map(cell => layoutReplacements.get(cell) ?? cell));\n\n return createModelPlugin(\n {\n modelId: this.config.modelId,\n name: this.config.name,\n singularApiName:\n this.publicConfig.singularApiName || createApiName(this.config.name),\n pluralApiName:\n this.publicConfig.pluralApiName || createPluralApiName(this.config.name),\n group: this.publicConfig.group,\n icon: this.publicConfig.icon ?? null,\n description: this.publicConfig.description || null,\n titleFieldId:\n this.publicConfig.titleFieldId ?? this.findFirstFieldId(fields, \"text\"),\n descriptionFieldId: this.publicConfig.descriptionFieldId,\n imageFieldId: this.publicConfig.imageFieldId,\n layout,\n fields,\n tags: this.getTags(),\n settings: this.config.settings || {}\n },\n { validateLayout: false }\n );\n }\n\n private findFirstFieldId(fields: CmsModelField[], type: string): string {\n for (const field of fields) {\n if (field.type === type) {\n return field.fieldId;\n }\n }\n return fields.find(field => field.type === \"text\")?.fieldId || \"\";\n }\n}\n"],"names":["createApiName","name","upperFirst","camelCase","createPluralApiName","pluralize","Icon","icon","PublicModelBuilder","BaseModelBuilder","slug","description","fieldId","registry","LayoutBuilder","layoutOrBuilder","Array","Error","builder","fields","layoutReplacements","rawLayout","layout","row","cell","createModelPlugin","type","field"],"mappings":"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"}
@@ -4,10 +4,7 @@ class SortImpl {
4
4
  const { fields: modelFields, input } = params;
5
5
  if (!input) return;
6
6
  const fields = modelFields.map((field)=>field.fieldId);
7
- const isField = (key)=>{
8
- const field = key.split("_")[0];
9
- return fields.includes(field);
10
- };
7
+ const isField = (key)=>fields.includes(key);
11
8
  return this.mapSort({
12
9
  input,
13
10
  isField
@@ -16,7 +13,7 @@ class SortImpl {
16
13
  mapSort(params) {
17
14
  const { input, isField } = params;
18
15
  return input.map((sort)=>{
19
- const match = sort.match(/^(values_)?([a-zA-Z][a-zA-Z0-9]*)_(ASC|DESC)$/);
16
+ const match = sort.match(/^(values_)?([a-zA-Z][a-zA-Z0-9_]*)_(ASC|DESC)$/);
20
17
  if (!match) return null;
21
18
  const [, hasValues, field, direction] = match;
22
19
  if (hasValues) return sort;
@@ -1 +1 @@
1
- {"version":3,"file":"features/sortMapper/SortMapper.js","sources":["../../../src/features/sortMapper/SortMapper.ts"],"sourcesContent":["/**\n * Used to map sorting for custom CMS Models.\n */\nimport { type CmsEntryListSort } from \"~/types/types.js\";\nimport { CmsSortMapper, ICmsSortMapperParams } from \"./abstractions.js\";\n\ninterface IMapSortParams {\n input: CmsEntryListSort;\n isField: (key: string) => boolean;\n}\n\nclass SortImpl implements CmsSortMapper.Interface {\n map(params: ICmsSortMapperParams): CmsEntryListSort | undefined {\n const { fields: modelFields, input } = params;\n if (!input) {\n return undefined;\n }\n\n const fields = modelFields.map(field => {\n return field.fieldId;\n });\n\n const isField = (key: string): boolean => {\n const field = key.split(\"_\")[0];\n return fields.includes(field);\n };\n\n return this.mapSort({\n input,\n isField\n });\n }\n\n private mapSort(params: IMapSortParams): CmsEntryListSort {\n const { input, isField } = params;\n\n return input\n .map(sort => {\n const match = sort.match(/^(values_)?([a-zA-Z][a-zA-Z0-9]*)_(ASC|DESC)$/);\n if (!match) {\n return null;\n }\n\n const [, hasValues, field, direction] = match;\n\n if (hasValues) {\n return sort;\n }\n\n if (isField(field)) {\n return `values_${field}_${direction}` as unknown as CmsEntryListSort[0];\n }\n\n return sort;\n })\n .filter((item): item is CmsEntryListSort[0] => !!item);\n }\n}\n\nexport const SortMapper = CmsSortMapper.createImplementation({\n implementation: SortImpl,\n dependencies: []\n});\n"],"names":["SortImpl","params","modelFields","input","fields","field","isField","key","sort","match","hasValues","direction","item","SortMapper","CmsSortMapper"],"mappings":";AAWA,MAAMA;IACF,IAAIC,MAA4B,EAAgC;QAC5D,MAAM,EAAE,QAAQC,WAAW,EAAEC,KAAK,EAAE,GAAGF;QACvC,IAAI,CAACE,OACD;QAGJ,MAAMC,SAASF,YAAY,GAAG,CAACG,CAAAA,QACpBA,MAAM,OAAO;QAGxB,MAAMC,UAAU,CAACC;YACb,MAAMF,QAAQE,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE;YAC/B,OAAOH,OAAO,QAAQ,CAACC;QAC3B;QAEA,OAAO,IAAI,CAAC,OAAO,CAAC;YAChBF;YACAG;QACJ;IACJ;IAEQ,QAAQL,MAAsB,EAAoB;QACtD,MAAM,EAAEE,KAAK,EAAEG,OAAO,EAAE,GAAGL;QAE3B,OAAOE,MACF,GAAG,CAACK,CAAAA;YACD,MAAMC,QAAQD,KAAK,KAAK,CAAC;YACzB,IAAI,CAACC,OACD,OAAO;YAGX,MAAM,GAAGC,WAAWL,OAAOM,UAAU,GAAGF;YAExC,IAAIC,WACA,OAAOF;YAGX,IAAIF,QAAQD,QACR,OAAO,CAAC,OAAO,EAAEA,MAAM,CAAC,EAAEM,WAAW;YAGzC,OAAOH;QACX,GACC,MAAM,CAAC,CAACI,OAAsC,CAAC,CAACA;IACzD;AACJ;AAEO,MAAMC,aAAaC,cAAc,oBAAoB,CAAC;IACzD,gBAAgBd;IAChB,cAAc,EAAE;AACpB"}
1
+ {"version":3,"file":"features/sortMapper/SortMapper.js","sources":["../../../src/features/sortMapper/SortMapper.ts"],"sourcesContent":["/**\n * Used to map sorting for custom CMS Models.\n */\nimport { type CmsEntryListSort } from \"~/types/types.js\";\nimport { CmsSortMapper, ICmsSortMapperParams } from \"./abstractions.js\";\n\ninterface IMapSortParams {\n input: CmsEntryListSort;\n isField: (key: string) => boolean;\n}\n\nclass SortImpl implements CmsSortMapper.Interface {\n map(params: ICmsSortMapperParams): CmsEntryListSort | undefined {\n const { fields: modelFields, input } = params;\n if (!input) {\n return undefined;\n }\n\n const fields = modelFields.map(field => {\n return field.fieldId;\n });\n\n /*\n * `mapSort` has already stripped the direction, so what arrives here is a bare fieldId and\n * is compared whole. Taking the segment before the first `_` would fail every fieldId that\n * contains one: `on_sale` would be looked up as `on`.\n */\n const isField = (key: string): boolean => {\n return fields.includes(key);\n };\n\n return this.mapSort({\n input,\n isField\n });\n }\n\n private mapSort(params: IMapSortParams): CmsEntryListSort {\n const { input, isField } = params;\n\n return input\n .map(sort => {\n // `_` is allowed inside the fieldId: excluding it made `on_sale_DESC` unmatchable,\n // and an unmatched directive is dropped from the sort entirely.\n const match = sort.match(/^(values_)?([a-zA-Z][a-zA-Z0-9_]*)_(ASC|DESC)$/);\n if (!match) {\n return null;\n }\n\n const [, hasValues, field, direction] = match;\n\n if (hasValues) {\n return sort;\n }\n\n if (isField(field)) {\n return `values_${field}_${direction}` as unknown as CmsEntryListSort[0];\n }\n\n return sort;\n })\n .filter((item): item is CmsEntryListSort[0] => !!item);\n }\n}\n\nexport const SortMapper = CmsSortMapper.createImplementation({\n implementation: SortImpl,\n dependencies: []\n});\n"],"names":["SortImpl","params","modelFields","input","fields","field","isField","key","sort","match","hasValues","direction","item","SortMapper","CmsSortMapper"],"mappings":";AAWA,MAAMA;IACF,IAAIC,MAA4B,EAAgC;QAC5D,MAAM,EAAE,QAAQC,WAAW,EAAEC,KAAK,EAAE,GAAGF;QACvC,IAAI,CAACE,OACD;QAGJ,MAAMC,SAASF,YAAY,GAAG,CAACG,CAAAA,QACpBA,MAAM,OAAO;QAQxB,MAAMC,UAAU,CAACC,MACNH,OAAO,QAAQ,CAACG;QAG3B,OAAO,IAAI,CAAC,OAAO,CAAC;YAChBJ;YACAG;QACJ;IACJ;IAEQ,QAAQL,MAAsB,EAAoB;QACtD,MAAM,EAAEE,KAAK,EAAEG,OAAO,EAAE,GAAGL;QAE3B,OAAOE,MACF,GAAG,CAACK,CAAAA;YAGD,MAAMC,QAAQD,KAAK,KAAK,CAAC;YACzB,IAAI,CAACC,OACD,OAAO;YAGX,MAAM,GAAGC,WAAWL,OAAOM,UAAU,GAAGF;YAExC,IAAIC,WACA,OAAOF;YAGX,IAAIF,QAAQD,QACR,OAAO,CAAC,OAAO,EAAEA,MAAM,CAAC,EAAEM,WAAW;YAGzC,OAAOH;QACX,GACC,MAAM,CAAC,CAACI,OAAsC,CAAC,CAACA;IACzD;AACJ;AAEO,MAAMC,aAAaC,cAAc,oBAAoB,CAAC;IACzD,gBAAgBd;IAChB,cAAc,EAAE;AACpB"}
@@ -9,7 +9,7 @@ class CompressedTextStorageTransformImpl {
9
9
  async fromStorage(params) {
10
10
  const { value } = params;
11
11
  if ("string" != typeof value) return value;
12
- else if (!value.includes("compression")) return value;
12
+ if (!value.includes("compression")) return value;
13
13
  try {
14
14
  const parsed = JSON.parse(value);
15
15
  return await this.compressionHandler.decompress(parsed);
@@ -1 +1 @@
1
- {"version":3,"file":"features/storage/fields/CompressedTextStorageTransform.js","sources":["../../../../src/features/storage/fields/CompressedTextStorageTransform.ts"],"sourcesContent":["import { StorageTransform } from \"../abstractions/StorageTransform.js\";\nimport { CompressionHandler } from \"@webiny/utils/exports/api.js\";\nimport { TextFieldTypes } from \"~/features/modelBuilder/index.js\";\n\nclass CompressedTextStorageTransformImpl implements StorageTransform.Interface<string, string> {\n public readonly fieldType = TextFieldTypes.COMPRESSED;\n\n public constructor(private readonly compressionHandler: CompressionHandler.Interface) {}\n\n public async fromStorage(\n params: StorageTransform.FromStorageParams<unknown, string>\n ): StorageTransform.FromStorageResponse<string> {\n const { value } = params;\n if (typeof value !== \"string\") {\n return value as string;\n } else if (!value.includes(\"compression\")) {\n return value;\n }\n try {\n const parsed = JSON.parse(value);\n return await this.compressionHandler.decompress<string>(parsed);\n } catch {\n return value;\n }\n }\n\n public async toStorage(\n params: StorageTransform.ToStorageParams<unknown, string>\n ): StorageTransform.ToStorageResponse<string> {\n const { value } = params;\n if (typeof value !== \"string\") {\n return value as string;\n }\n\n try {\n return JSON.stringify(await this.compressionHandler.compress(value));\n } catch {\n return value;\n }\n }\n}\n\nexport const CompressedTextStorageTransform = StorageTransform.createImplementation({\n implementation: CompressedTextStorageTransformImpl,\n dependencies: [CompressionHandler]\n});\n"],"names":["CompressedTextStorageTransformImpl","compressionHandler","TextFieldTypes","params","value","parsed","JSON","CompressedTextStorageTransform","StorageTransform","CompressionHandler"],"mappings":";;;AAIA,MAAMA;IAGF,YAAoCC,kBAAgD,CAAE;aAAlDA,kBAAkB,GAAlBA;aAFpB,SAAS,GAAGC,eAAe,UAAU;IAEkC;IAEvF,MAAa,YACTC,MAA2D,EACf;QAC5C,MAAM,EAAEC,KAAK,EAAE,GAAGD;QAClB,IAAI,AAAiB,YAAjB,OAAOC,OACP,OAAOA;aACJ,IAAI,CAACA,MAAM,QAAQ,CAAC,gBACvB,OAAOA;QAEX,IAAI;YACA,MAAMC,SAASC,KAAK,KAAK,CAACF;YAC1B,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAASC;QAC5D,EAAE,OAAM;YACJ,OAAOD;QACX;IACJ;IAEA,MAAa,UACTD,MAAyD,EACf;QAC1C,MAAM,EAAEC,KAAK,EAAE,GAAGD;QAClB,IAAI,AAAiB,YAAjB,OAAOC,OACP,OAAOA;QAGX,IAAI;YACA,OAAOE,KAAK,SAAS,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAACF;QACjE,EAAE,OAAM;YACJ,OAAOA;QACX;IACJ;AACJ;AAEO,MAAMG,iCAAiCC,iBAAiB,oBAAoB,CAAC;IAChF,gBAAgBR;IAChB,cAAc;QAACS;KAAmB;AACtC"}
1
+ {"version":3,"file":"features/storage/fields/CompressedTextStorageTransform.js","sources":["../../../../src/features/storage/fields/CompressedTextStorageTransform.ts"],"sourcesContent":["import { StorageTransform } from \"../abstractions/StorageTransform.js\";\nimport { CompressionHandler } from \"@webiny/utils/exports/api.js\";\nimport { TextFieldTypes } from \"~/features/modelBuilder/index.js\";\n\nclass CompressedTextStorageTransformImpl implements StorageTransform.Interface<string, string> {\n public readonly fieldType = TextFieldTypes.COMPRESSED;\n\n public constructor(private readonly compressionHandler: CompressionHandler.Interface) {}\n\n public async fromStorage(\n params: StorageTransform.FromStorageParams<unknown, string>\n ): StorageTransform.FromStorageResponse<string> {\n const { value } = params;\n if (typeof value !== \"string\") {\n return value as string;\n } else if (!value.includes(\"compression\")) {\n return value;\n }\n try {\n const parsed = JSON.parse(value);\n return await this.compressionHandler.decompress<string>(parsed);\n } catch {\n return value;\n }\n }\n\n public async toStorage(\n params: StorageTransform.ToStorageParams<unknown, string>\n ): StorageTransform.ToStorageResponse<string> {\n const { value } = params;\n if (typeof value !== \"string\") {\n return value as string;\n }\n\n try {\n return JSON.stringify(await this.compressionHandler.compress(value));\n } catch {\n return value;\n }\n }\n}\n\nexport const CompressedTextStorageTransform = StorageTransform.createImplementation({\n implementation: CompressedTextStorageTransformImpl,\n dependencies: [CompressionHandler]\n});\n"],"names":["CompressedTextStorageTransformImpl","compressionHandler","TextFieldTypes","params","value","parsed","JSON","CompressedTextStorageTransform","StorageTransform","CompressionHandler"],"mappings":";;;AAIA,MAAMA;IAGF,YAAoCC,kBAAgD,CAAE;aAAlDA,kBAAkB,GAAlBA;aAFpB,SAAS,GAAGC,eAAe,UAAU;IAEkC;IAEvF,MAAa,YACTC,MAA2D,EACf;QAC5C,MAAM,EAAEC,KAAK,EAAE,GAAGD;QAClB,IAAI,AAAiB,YAAjB,OAAOC,OACP,OAAOA;QACJ,IAAI,CAACA,MAAM,QAAQ,CAAC,gBACvB,OAAOA;QAEX,IAAI;YACA,MAAMC,SAASC,KAAK,KAAK,CAACF;YAC1B,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAASC;QAC5D,EAAE,OAAM;YACJ,OAAOD;QACX;IACJ;IAEA,MAAa,UACTD,MAAyD,EACf;QAC1C,MAAM,EAAEC,KAAK,EAAE,GAAGD;QAClB,IAAI,AAAiB,YAAjB,OAAOC,OACP,OAAOA;QAGX,IAAI;YACA,OAAOE,KAAK,SAAS,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAACF;QACjE,EAAE,OAAM;YACJ,OAAOA;QACX;IACJ;AACJ;AAEO,MAAMG,iCAAiCC,iBAAiB,oBAAoB,CAAC;IAChF,gBAAgBR;IAChB,cAAc;QAACS;KAAmB;AACtC"}
@@ -22,7 +22,7 @@ const convertFromStorage = (value)=>{
22
22
  };
23
23
  const convertValueToStorage = (field, value)=>{
24
24
  if (value instanceof Date || value?.toISOString) return value.toISOString();
25
- else if ("string" == typeof value) return value;
25
+ if ("string" == typeof value) return value;
26
26
  throw new error("Error converting value to a storage type.", "TO_STORAGE_ERROR", {
27
27
  value: value,
28
28
  fieldId: field.fieldId,
@@ -50,7 +50,7 @@ class DateStorageTransformImpl {
50
50
  const { value, field } = params;
51
51
  const { type } = field.settings || {};
52
52
  if (!value || !type || excludeTypes.includes(type)) return value;
53
- else if (field.list) {
53
+ if (field.list) {
54
54
  if (!Array.isArray(value)) return [];
55
55
  const list = value;
56
56
  const results = [];
@@ -59,7 +59,8 @@ class DateStorageTransformImpl {
59
59
  if (isNaN(input.getTime())) continue;
60
60
  results.push(input);
61
61
  continue;
62
- } else if (!input || "object" == typeof input && 0 === Object.keys(input).length) continue;
62
+ }
63
+ if (!input || "object" == typeof input && 0 === Object.keys(input).length) continue;
63
64
  const output = convertFromStorage(input);
64
65
  if (output) results.push(output);
65
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"features/storage/fields/DateStorageTransform.js","sources":["../../../../src/features/storage/fields/DateStorageTransform.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type { CmsModelField } from \"~/types/index.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { StorageTransform } from \"../abstractions/StorageTransform.js\";\n\nconst excludeTypes = [\"time\", \"dateTimeWithTimezone\"];\n\nconst convertFromStorage = (value: unknown): Date | unknown => {\n if (!value) {\n return value === null ? null : undefined;\n }\n try {\n const output = new Date(value as string);\n if (isNaN(output.getTime())) {\n if (process.env.DEBUG !== \"true\") {\n return null;\n }\n console.warn(`Could not transform \"${value}\" to date.`);\n return null;\n }\n return output;\n } catch {\n if (process.env.DEBUG !== \"true\") {\n return null;\n }\n console.warn(`Could not transform \"${value}\" from storage for date field type.`);\n return null;\n }\n};\n\nconst convertValueToStorage = (field: CmsModelField, value: Date | string | unknown): string => {\n if (value instanceof Date || (value as GenericRecord)?.toISOString) {\n return (value as Date).toISOString();\n } else if (typeof value === \"string\") {\n return value as string;\n }\n throw new WebinyError(\"Error converting value to a storage type.\", \"TO_STORAGE_ERROR\", {\n value: value,\n fieldId: field.fieldId,\n storageId: field.storageId\n });\n};\n\nclass DateStorageTransformImpl implements StorageTransform.Interface {\n public readonly fieldType = \"datetime\";\n\n public async toStorage(\n params: StorageTransform.ToStorageParams\n ): StorageTransform.ToStorageResponse {\n const { value, field } = params;\n const { type } = field.settings || {};\n if (!value || !type || excludeTypes.includes(type)) {\n return value;\n }\n if (field.list) {\n const list = value as (string | Date | null | undefined)[];\n const results: string[] = [];\n for (const input of list) {\n if (!input) {\n continue;\n }\n const output = convertValueToStorage(field, input);\n if (!output) {\n continue;\n }\n results.push(output);\n }\n return results;\n }\n return convertValueToStorage(field, value);\n }\n\n public async fromStorage(\n params: StorageTransform.FromStorageParams\n ): StorageTransform.FromStorageResponse {\n const { value, field } = params;\n const { type } = field.settings || {};\n if (!value || !type || excludeTypes.includes(type)) {\n return value;\n } else if (field.list) {\n if (!Array.isArray(value)) {\n return [];\n }\n const list = value as unknown[];\n const results: (Date | unknown)[] = [];\n for (const input of list) {\n if (input instanceof Date) {\n if (isNaN(input.getTime())) {\n continue;\n }\n results.push(input);\n continue;\n } else if (\n !input ||\n (typeof input === \"object\" && Object.keys(input).length === 0)\n ) {\n continue;\n }\n const output = convertFromStorage(input);\n if (!output) {\n continue;\n }\n results.push(output);\n }\n return results;\n }\n return convertFromStorage(value);\n }\n}\n\nexport const DateStorageTransform = StorageTransform.createImplementation({\n implementation: DateStorageTransformImpl,\n dependencies: []\n});\n"],"names":["excludeTypes","convertFromStorage","value","undefined","output","Date","isNaN","process","console","convertValueToStorage","field","WebinyError","DateStorageTransformImpl","params","type","list","results","input","Array","Object","DateStorageTransform","StorageTransform"],"mappings":";;AAKA,MAAMA,eAAe;IAAC;IAAQ;CAAuB;AAErD,MAAMC,qBAAqB,CAACC;IACxB,IAAI,CAACA,OACD,OAAOA,AAAU,SAAVA,QAAiB,OAAOC;IAEnC,IAAI;QACA,MAAMC,SAAS,IAAIC,KAAKH;QACxB,IAAII,MAAMF,OAAO,OAAO,KAAK;YACzB,IAAIG,AAAsB,WAAtBA,QAAQ,GAAG,CAAC,KAAK,EACjB,OAAO;YAEXC,QAAQ,IAAI,CAAC,CAAC,qBAAqB,EAAEN,MAAM,UAAU,CAAC;YACtD,OAAO;QACX;QACA,OAAOE;IACX,EAAE,OAAM;QACJ,IAAIG,AAAsB,WAAtBA,QAAQ,GAAG,CAAC,KAAK,EACjB,OAAO;QAEXC,QAAQ,IAAI,CAAC,CAAC,qBAAqB,EAAEN,MAAM,mCAAmC,CAAC;QAC/E,OAAO;IACX;AACJ;AAEA,MAAMO,wBAAwB,CAACC,OAAsBR;IACjD,IAAIA,iBAAiBG,QAASH,OAAyB,aACnD,OAAQA,MAAe,WAAW;SAC/B,IAAI,AAAiB,YAAjB,OAAOA,OACd,OAAOA;IAEX,MAAM,IAAIS,MAAY,6CAA6C,oBAAoB;QACnF,OAAOT;QACP,SAASQ,MAAM,OAAO;QACtB,WAAWA,MAAM,SAAS;IAC9B;AACJ;AAEA,MAAME;IAGF,MAAa,UACTC,MAAwC,EACN;QAClC,MAAM,EAAEX,KAAK,EAAEQ,KAAK,EAAE,GAAGG;QACzB,MAAM,EAAEC,IAAI,EAAE,GAAGJ,MAAM,QAAQ,IAAI,CAAC;QACpC,IAAI,CAACR,SAAS,CAACY,QAAQd,aAAa,QAAQ,CAACc,OACzC,OAAOZ;QAEX,IAAIQ,MAAM,IAAI,EAAE;YACZ,MAAMK,OAAOb;YACb,MAAMc,UAAoB,EAAE;YAC5B,KAAK,MAAMC,SAASF,KAAM;gBACtB,IAAI,CAACE,OACD;gBAEJ,MAAMb,SAASK,sBAAsBC,OAAOO;gBAC5C,IAAKb,QAGLY,QAAQ,IAAI,CAACZ;YACjB;YACA,OAAOY;QACX;QACA,OAAOP,sBAAsBC,OAAOR;IACxC;IAEA,MAAa,YACTW,MAA0C,EACN;QACpC,MAAM,EAAEX,KAAK,EAAEQ,KAAK,EAAE,GAAGG;QACzB,MAAM,EAAEC,IAAI,EAAE,GAAGJ,MAAM,QAAQ,IAAI,CAAC;QACpC,IAAI,CAACR,SAAS,CAACY,QAAQd,aAAa,QAAQ,CAACc,OACzC,OAAOZ;aACJ,IAAIQ,MAAM,IAAI,EAAE;YACnB,IAAI,CAACQ,MAAM,OAAO,CAAChB,QACf,OAAO,EAAE;YAEb,MAAMa,OAAOb;YACb,MAAMc,UAA8B,EAAE;YACtC,KAAK,MAAMC,SAASF,KAAM;gBACtB,IAAIE,iBAAiBZ,MAAM;oBACvB,IAAIC,MAAMW,MAAM,OAAO,KACnB;oBAEJD,QAAQ,IAAI,CAACC;oBACb;gBACJ,OAAO,IACH,CAACA,SACA,AAAiB,YAAjB,OAAOA,SAAsBE,AAA8B,MAA9BA,OAAO,IAAI,CAACF,OAAO,MAAM,EAEvD;gBAEJ,MAAMb,SAASH,mBAAmBgB;gBAClC,IAAKb,QAGLY,QAAQ,IAAI,CAACZ;YACjB;YACA,OAAOY;QACX;QACA,OAAOf,mBAAmBC;IAC9B;;aA/DgB,SAAS,GAAG;;AAgEhC;AAEO,MAAMkB,uBAAuBC,iBAAiB,oBAAoB,CAAC;IACtE,gBAAgBT;IAChB,cAAc,EAAE;AACpB"}
1
+ {"version":3,"file":"features/storage/fields/DateStorageTransform.js","sources":["../../../../src/features/storage/fields/DateStorageTransform.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type { CmsModelField } from \"~/types/index.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { StorageTransform } from \"../abstractions/StorageTransform.js\";\n\nconst excludeTypes = [\"time\", \"dateTimeWithTimezone\"];\n\nconst convertFromStorage = (value: unknown): Date | unknown => {\n if (!value) {\n return value === null ? null : undefined;\n }\n try {\n const output = new Date(value as string);\n if (isNaN(output.getTime())) {\n if (process.env.DEBUG !== \"true\") {\n return null;\n }\n console.warn(`Could not transform \"${value}\" to date.`);\n return null;\n }\n return output;\n } catch {\n if (process.env.DEBUG !== \"true\") {\n return null;\n }\n console.warn(`Could not transform \"${value}\" from storage for date field type.`);\n return null;\n }\n};\n\nconst convertValueToStorage = (field: CmsModelField, value: Date | string | unknown): string => {\n if (value instanceof Date || (value as GenericRecord)?.toISOString) {\n return (value as Date).toISOString();\n } else if (typeof value === \"string\") {\n return value as string;\n }\n throw new WebinyError(\"Error converting value to a storage type.\", \"TO_STORAGE_ERROR\", {\n value: value,\n fieldId: field.fieldId,\n storageId: field.storageId\n });\n};\n\nclass DateStorageTransformImpl implements StorageTransform.Interface {\n public readonly fieldType = \"datetime\";\n\n public async toStorage(\n params: StorageTransform.ToStorageParams\n ): StorageTransform.ToStorageResponse {\n const { value, field } = params;\n const { type } = field.settings || {};\n if (!value || !type || excludeTypes.includes(type)) {\n return value;\n }\n if (field.list) {\n const list = value as (string | Date | null | undefined)[];\n const results: string[] = [];\n for (const input of list) {\n if (!input) {\n continue;\n }\n const output = convertValueToStorage(field, input);\n if (!output) {\n continue;\n }\n results.push(output);\n }\n return results;\n }\n return convertValueToStorage(field, value);\n }\n\n public async fromStorage(\n params: StorageTransform.FromStorageParams\n ): StorageTransform.FromStorageResponse {\n const { value, field } = params;\n const { type } = field.settings || {};\n if (!value || !type || excludeTypes.includes(type)) {\n return value;\n } else if (field.list) {\n if (!Array.isArray(value)) {\n return [];\n }\n const list = value as unknown[];\n const results: (Date | unknown)[] = [];\n for (const input of list) {\n if (input instanceof Date) {\n if (isNaN(input.getTime())) {\n continue;\n }\n results.push(input);\n continue;\n } else if (\n !input ||\n (typeof input === \"object\" && Object.keys(input).length === 0)\n ) {\n continue;\n }\n const output = convertFromStorage(input);\n if (!output) {\n continue;\n }\n results.push(output);\n }\n return results;\n }\n return convertFromStorage(value);\n }\n}\n\nexport const DateStorageTransform = StorageTransform.createImplementation({\n implementation: DateStorageTransformImpl,\n dependencies: []\n});\n"],"names":["excludeTypes","convertFromStorage","value","undefined","output","Date","isNaN","process","console","convertValueToStorage","field","WebinyError","DateStorageTransformImpl","params","type","list","results","input","Array","Object","DateStorageTransform","StorageTransform"],"mappings":";;AAKA,MAAMA,eAAe;IAAC;IAAQ;CAAuB;AAErD,MAAMC,qBAAqB,CAACC;IACxB,IAAI,CAACA,OACD,OAAOA,AAAU,SAAVA,QAAiB,OAAOC;IAEnC,IAAI;QACA,MAAMC,SAAS,IAAIC,KAAKH;QACxB,IAAII,MAAMF,OAAO,OAAO,KAAK;YACzB,IAAIG,AAAsB,WAAtBA,QAAQ,GAAG,CAAC,KAAK,EACjB,OAAO;YAEXC,QAAQ,IAAI,CAAC,CAAC,qBAAqB,EAAEN,MAAM,UAAU,CAAC;YACtD,OAAO;QACX;QACA,OAAOE;IACX,EAAE,OAAM;QACJ,IAAIG,AAAsB,WAAtBA,QAAQ,GAAG,CAAC,KAAK,EACjB,OAAO;QAEXC,QAAQ,IAAI,CAAC,CAAC,qBAAqB,EAAEN,MAAM,mCAAmC,CAAC;QAC/E,OAAO;IACX;AACJ;AAEA,MAAMO,wBAAwB,CAACC,OAAsBR;IACjD,IAAIA,iBAAiBG,QAASH,OAAyB,aACnD,OAAQA,MAAe,WAAW;IAC/B,IAAI,AAAiB,YAAjB,OAAOA,OACd,OAAOA;IAEX,MAAM,IAAIS,MAAY,6CAA6C,oBAAoB;QACnF,OAAOT;QACP,SAASQ,MAAM,OAAO;QACtB,WAAWA,MAAM,SAAS;IAC9B;AACJ;AAEA,MAAME;IAGF,MAAa,UACTC,MAAwC,EACN;QAClC,MAAM,EAAEX,KAAK,EAAEQ,KAAK,EAAE,GAAGG;QACzB,MAAM,EAAEC,IAAI,EAAE,GAAGJ,MAAM,QAAQ,IAAI,CAAC;QACpC,IAAI,CAACR,SAAS,CAACY,QAAQd,aAAa,QAAQ,CAACc,OACzC,OAAOZ;QAEX,IAAIQ,MAAM,IAAI,EAAE;YACZ,MAAMK,OAAOb;YACb,MAAMc,UAAoB,EAAE;YAC5B,KAAK,MAAMC,SAASF,KAAM;gBACtB,IAAI,CAACE,OACD;gBAEJ,MAAMb,SAASK,sBAAsBC,OAAOO;gBAC5C,IAAKb,QAGLY,QAAQ,IAAI,CAACZ;YACjB;YACA,OAAOY;QACX;QACA,OAAOP,sBAAsBC,OAAOR;IACxC;IAEA,MAAa,YACTW,MAA0C,EACN;QACpC,MAAM,EAAEX,KAAK,EAAEQ,KAAK,EAAE,GAAGG;QACzB,MAAM,EAAEC,IAAI,EAAE,GAAGJ,MAAM,QAAQ,IAAI,CAAC;QACpC,IAAI,CAACR,SAAS,CAACY,QAAQd,aAAa,QAAQ,CAACc,OACzC,OAAOZ;QACJ,IAAIQ,MAAM,IAAI,EAAE;YACnB,IAAI,CAACQ,MAAM,OAAO,CAAChB,QACf,OAAO,EAAE;YAEb,MAAMa,OAAOb;YACb,MAAMc,UAA8B,EAAE;YACtC,KAAK,MAAMC,SAASF,KAAM;gBACtB,IAAIE,iBAAiBZ,MAAM;oBACvB,IAAIC,MAAMW,MAAM,OAAO,KACnB;oBAEJD,QAAQ,IAAI,CAACC;oBACb;gBACJ;gBAAO,IACH,CAACA,SACA,AAAiB,YAAjB,OAAOA,SAAsBE,AAA8B,MAA9BA,OAAO,IAAI,CAACF,OAAO,MAAM,EAEvD;gBAEJ,MAAMb,SAASH,mBAAmBgB;gBAClC,IAAKb,QAGLY,QAAQ,IAAI,CAACZ;YACjB;YACA,OAAOY;QACX;QACA,OAAOf,mBAAmBC;IAC9B;;aA/DgB,SAAS,GAAG;;AAgEhC;AAEO,MAAMkB,uBAAuBC,iBAAiB,oBAAoB,CAAC;IACtE,gBAAgBT;IAChB,cAAc,EAAE;AACpB"}
@@ -55,7 +55,7 @@ class DynamicZoneStorageTransformImpl {
55
55
  async toStorage(params) {
56
56
  const { value: input, field, model, getStorageTransform } = params;
57
57
  if (!input) return input;
58
- else if (field.list) {
58
+ if (field.list) {
59
59
  if (!Array.isArray(input)) return input;
60
60
  const values = input;
61
61
  return Promise.all(values.map(async (value)=>await processToStorage({
@@ -75,7 +75,7 @@ class DynamicZoneStorageTransformImpl {
75
75
  async fromStorage(params) {
76
76
  const { value: input, field, model, getStorageTransform } = params;
77
77
  if (!input) return input;
78
- else if (field.list) {
78
+ if (field.list) {
79
79
  if (!Array.isArray(input)) return input;
80
80
  const values = input;
81
81
  return await Promise.all(values.map(async (value)=>await processFromStorage({
@@ -1 +1 @@
1
- {"version":3,"file":"features/storage/fields/DynamicZoneStorageTransform.js","sources":["../../../../src/features/storage/fields/DynamicZoneStorageTransform.ts"],"sourcesContent":["import { StorageTransform } from \"../abstractions/StorageTransform.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport type { CmsModel, CmsModelDynamicZoneField } from \"~/types/index.js\";\nimport pReduce from \"p-reduce\";\n\ninterface IProcessParams {\n model: CmsModel;\n field: CmsModelDynamicZoneField;\n value: GenericRecord;\n getStorageTransform: (fieldType: string) => StorageTransform.Interface;\n}\n\nconst processToStorage = async (params: IProcessParams): Promise<GenericRecord> => {\n const { model, field: parentField, value: input, getStorageTransform } = params;\n\n const output: GenericRecord = structuredClone(input);\n\n if (!output._templateId) {\n return output;\n }\n const template = parentField.settings.templates.find(t => t.id === output._templateId);\n if (!template || !template.fields.length) {\n return output;\n }\n\n return await pReduce(\n template.fields,\n async (values, field) => {\n const value = values[field.fieldId];\n\n if (!value) {\n values[field.fieldId] = value;\n return values;\n }\n const storageTransform = getStorageTransform(field.type);\n if (!storageTransform) {\n console.error(`Missing storage transform for field type \"${field.type}\".`);\n delete values[field.fieldId];\n return values;\n }\n values[field.fieldId] = await storageTransform.toStorage({\n getStorageTransform,\n model,\n field,\n value\n });\n\n return values;\n },\n output\n );\n};\n\nconst processFromStorage = async (params: IProcessParams): Promise<GenericRecord> => {\n const { model, field: parentField, value: input, getStorageTransform } = params;\n\n const output: GenericRecord = structuredClone(input);\n\n if (!output._templateId) {\n return output;\n }\n const template = parentField.settings.templates.find(t => t.id === output._templateId);\n if (!template || !template.fields.length) {\n return output;\n }\n\n return await pReduce(\n template.fields,\n async (values, field) => {\n const value = values[field.fieldId];\n\n if (!value) {\n return values;\n }\n const storageTransform = getStorageTransform(field.type);\n if (!storageTransform) {\n console.error(`Missing storage transform for field type \"${field.type}\".`);\n delete values[field.fieldId];\n return values;\n }\n values[field.fieldId] = await storageTransform.fromStorage({\n getStorageTransform,\n model,\n field,\n value\n });\n\n return values;\n },\n output\n );\n};\n\nclass DynamicZoneStorageTransformImpl implements StorageTransform.Interface {\n public readonly fieldType = \"dynamicZone\";\n\n public async toStorage(\n params: StorageTransform.ToStorageParams\n ): StorageTransform.ToStorageResponse {\n const { value: input, field, model, getStorageTransform } = params;\n if (!input) {\n return input;\n } else if (field.list) {\n if (!Array.isArray(input)) {\n return input;\n }\n const values = input as GenericRecord[];\n return Promise.all(\n values.map(async value => {\n return await processToStorage({\n model,\n field: field as CmsModelDynamicZoneField,\n value,\n getStorageTransform\n });\n })\n );\n }\n return await processToStorage({\n model,\n field: field as CmsModelDynamicZoneField,\n value: input,\n getStorageTransform\n });\n }\n\n public async fromStorage(\n params: StorageTransform.FromStorageParams\n ): StorageTransform.FromStorageResponse {\n const { value: input, field, model, getStorageTransform } = params;\n if (!input) {\n return input;\n } else if (field.list) {\n if (!Array.isArray(input)) {\n return input;\n }\n const values = input as GenericRecord[];\n\n return await Promise.all(\n values.map(async value => {\n return await processFromStorage({\n model,\n field: field as CmsModelDynamicZoneField,\n value,\n getStorageTransform\n });\n })\n );\n }\n return await processFromStorage({\n model,\n field: field as CmsModelDynamicZoneField,\n value: input,\n getStorageTransform\n });\n }\n}\n\nexport const DynamicZoneStorageTransform = StorageTransform.createImplementation({\n implementation: DynamicZoneStorageTransformImpl,\n dependencies: []\n});\n"],"names":["processToStorage","params","model","parentField","input","getStorageTransform","output","structuredClone","template","t","pReduce","values","field","value","storageTransform","console","processFromStorage","DynamicZoneStorageTransformImpl","Array","Promise","DynamicZoneStorageTransform","StorageTransform"],"mappings":"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"}
1
+ {"version":3,"file":"features/storage/fields/DynamicZoneStorageTransform.js","sources":["../../../../src/features/storage/fields/DynamicZoneStorageTransform.ts"],"sourcesContent":["import { StorageTransform } from \"../abstractions/StorageTransform.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport type { CmsModel, CmsModelDynamicZoneField } from \"~/types/index.js\";\nimport pReduce from \"p-reduce\";\n\ninterface IProcessParams {\n model: CmsModel;\n field: CmsModelDynamicZoneField;\n value: GenericRecord;\n getStorageTransform: (fieldType: string) => StorageTransform.Interface;\n}\n\nconst processToStorage = async (params: IProcessParams): Promise<GenericRecord> => {\n const { model, field: parentField, value: input, getStorageTransform } = params;\n\n const output: GenericRecord = structuredClone(input);\n\n if (!output._templateId) {\n return output;\n }\n const template = parentField.settings.templates.find(t => t.id === output._templateId);\n if (!template || !template.fields.length) {\n return output;\n }\n\n return await pReduce(\n template.fields,\n async (values, field) => {\n const value = values[field.fieldId];\n\n if (!value) {\n values[field.fieldId] = value;\n return values;\n }\n const storageTransform = getStorageTransform(field.type);\n if (!storageTransform) {\n console.error(`Missing storage transform for field type \"${field.type}\".`);\n delete values[field.fieldId];\n return values;\n }\n values[field.fieldId] = await storageTransform.toStorage({\n getStorageTransform,\n model,\n field,\n value\n });\n\n return values;\n },\n output\n );\n};\n\nconst processFromStorage = async (params: IProcessParams): Promise<GenericRecord> => {\n const { model, field: parentField, value: input, getStorageTransform } = params;\n\n const output: GenericRecord = structuredClone(input);\n\n if (!output._templateId) {\n return output;\n }\n const template = parentField.settings.templates.find(t => t.id === output._templateId);\n if (!template || !template.fields.length) {\n return output;\n }\n\n return await pReduce(\n template.fields,\n async (values, field) => {\n const value = values[field.fieldId];\n\n if (!value) {\n return values;\n }\n const storageTransform = getStorageTransform(field.type);\n if (!storageTransform) {\n console.error(`Missing storage transform for field type \"${field.type}\".`);\n delete values[field.fieldId];\n return values;\n }\n values[field.fieldId] = await storageTransform.fromStorage({\n getStorageTransform,\n model,\n field,\n value\n });\n\n return values;\n },\n output\n );\n};\n\nclass DynamicZoneStorageTransformImpl implements StorageTransform.Interface {\n public readonly fieldType = \"dynamicZone\";\n\n public async toStorage(\n params: StorageTransform.ToStorageParams\n ): StorageTransform.ToStorageResponse {\n const { value: input, field, model, getStorageTransform } = params;\n if (!input) {\n return input;\n } else if (field.list) {\n if (!Array.isArray(input)) {\n return input;\n }\n const values = input as GenericRecord[];\n return Promise.all(\n values.map(async value => {\n return await processToStorage({\n model,\n field: field as CmsModelDynamicZoneField,\n value,\n getStorageTransform\n });\n })\n );\n }\n return await processToStorage({\n model,\n field: field as CmsModelDynamicZoneField,\n value: input,\n getStorageTransform\n });\n }\n\n public async fromStorage(\n params: StorageTransform.FromStorageParams\n ): StorageTransform.FromStorageResponse {\n const { value: input, field, model, getStorageTransform } = params;\n if (!input) {\n return input;\n } else if (field.list) {\n if (!Array.isArray(input)) {\n return input;\n }\n const values = input as GenericRecord[];\n\n return await Promise.all(\n values.map(async value => {\n return await processFromStorage({\n model,\n field: field as CmsModelDynamicZoneField,\n value,\n getStorageTransform\n });\n })\n );\n }\n return await processFromStorage({\n model,\n field: field as CmsModelDynamicZoneField,\n value: input,\n getStorageTransform\n });\n }\n}\n\nexport const DynamicZoneStorageTransform = StorageTransform.createImplementation({\n implementation: DynamicZoneStorageTransformImpl,\n dependencies: []\n});\n"],"names":["processToStorage","params","model","parentField","input","getStorageTransform","output","structuredClone","template","t","pReduce","values","field","value","storageTransform","console","processFromStorage","DynamicZoneStorageTransformImpl","Array","Promise","DynamicZoneStorageTransform","StorageTransform"],"mappings":"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"}
@@ -8,7 +8,7 @@ class JsonStorageTransformImpl {
8
8
  }
9
9
  async fromStorage({ field, value }) {
10
10
  if (!value) return value;
11
- else if ("object" != typeof value) throw new WebinyError(`JSON value received in "fromStorage" function is not an object in field "${field.storageId}" - ${field.fieldId}.`);
11
+ if ("object" != typeof value) throw new WebinyError(`JSON value received in "fromStorage" function is not an object in field "${field.storageId}" - ${field.fieldId}.`);
12
12
  return await this.compressorHandler.decompress(value);
13
13
  }
14
14
  async toStorage({ value }) {
@@ -1 +1 @@
1
- {"version":3,"file":"features/storage/fields/JsonStorageTransform.js","sources":["../../../../src/features/storage/fields/JsonStorageTransform.ts"],"sourcesContent":["import { StorageTransform } from \"../abstractions/StorageTransform.js\";\nimport { WebinyError } from \"@webiny/error\";\nimport { CompressionHandler } from \"@webiny/utils/exports/api.js\";\n\nclass JsonStorageTransformImpl implements StorageTransform.Interface {\n public fieldType = \"json\";\n\n public constructor(private readonly compressorHandler: CompressionHandler.Interface) {}\n\n public async fromStorage({\n field,\n value\n }: StorageTransform.FromStorageParams): StorageTransform.FromStorageResponse {\n if (!value) {\n return value;\n } else if (typeof value !== \"object\") {\n throw new WebinyError(\n `JSON value received in \"fromStorage\" function is not an object in field \"${field.storageId}\" - ${field.fieldId}.`\n );\n }\n\n return await this.compressorHandler.decompress(value);\n }\n\n public async toStorage({\n value\n }: StorageTransform.ToStorageParams): StorageTransform.ToStorageResponse {\n return await this.compressorHandler.compress(value);\n }\n}\n\nexport const JsonStorageTransform = StorageTransform.createImplementation({\n implementation: JsonStorageTransformImpl,\n dependencies: [CompressionHandler]\n});\n"],"names":["JsonStorageTransformImpl","compressorHandler","field","value","WebinyError","JsonStorageTransform","StorageTransform","CompressionHandler"],"mappings":";;;AAIA,MAAMA;IAGF,YAAoCC,iBAA+C,CAAE;aAAjDA,iBAAiB,GAAjBA;aAF7B,SAAS,GAAG;IAEmE;IAEtF,MAAa,YAAY,EACrBC,KAAK,EACLC,KAAK,EAC4B,EAAwC;QACzE,IAAI,CAACA,OACD,OAAOA;aACJ,IAAI,AAAiB,YAAjB,OAAOA,OACd,MAAM,IAAIC,YACN,CAAC,yEAAyE,EAAEF,MAAM,SAAS,CAAC,IAAI,EAAEA,MAAM,OAAO,CAAC,CAAC,CAAC;QAI1H,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAACC;IACnD;IAEA,MAAa,UAAU,EACnBA,KAAK,EAC0B,EAAsC;QACrE,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAACA;IACjD;AACJ;AAEO,MAAME,uBAAuBC,iBAAiB,oBAAoB,CAAC;IACtE,gBAAgBN;IAChB,cAAc;QAACO;KAAmB;AACtC"}
1
+ {"version":3,"file":"features/storage/fields/JsonStorageTransform.js","sources":["../../../../src/features/storage/fields/JsonStorageTransform.ts"],"sourcesContent":["import { StorageTransform } from \"../abstractions/StorageTransform.js\";\nimport { WebinyError } from \"@webiny/error\";\nimport { CompressionHandler } from \"@webiny/utils/exports/api.js\";\n\nclass JsonStorageTransformImpl implements StorageTransform.Interface {\n public fieldType = \"json\";\n\n public constructor(private readonly compressorHandler: CompressionHandler.Interface) {}\n\n public async fromStorage({\n field,\n value\n }: StorageTransform.FromStorageParams): StorageTransform.FromStorageResponse {\n if (!value) {\n return value;\n } else if (typeof value !== \"object\") {\n throw new WebinyError(\n `JSON value received in \"fromStorage\" function is not an object in field \"${field.storageId}\" - ${field.fieldId}.`\n );\n }\n\n return await this.compressorHandler.decompress(value);\n }\n\n public async toStorage({\n value\n }: StorageTransform.ToStorageParams): StorageTransform.ToStorageResponse {\n return await this.compressorHandler.compress(value);\n }\n}\n\nexport const JsonStorageTransform = StorageTransform.createImplementation({\n implementation: JsonStorageTransformImpl,\n dependencies: [CompressionHandler]\n});\n"],"names":["JsonStorageTransformImpl","compressorHandler","field","value","WebinyError","JsonStorageTransform","StorageTransform","CompressionHandler"],"mappings":";;;AAIA,MAAMA;IAGF,YAAoCC,iBAA+C,CAAE;aAAjDA,iBAAiB,GAAjBA;aAF7B,SAAS,GAAG;IAEmE;IAEtF,MAAa,YAAY,EACrBC,KAAK,EACLC,KAAK,EAC4B,EAAwC;QACzE,IAAI,CAACA,OACD,OAAOA;QACJ,IAAI,AAAiB,YAAjB,OAAOA,OACd,MAAM,IAAIC,YACN,CAAC,yEAAyE,EAAEF,MAAM,SAAS,CAAC,IAAI,EAAEA,MAAM,OAAO,CAAC,CAAC,CAAC;QAI1H,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAACC;IACnD;IAEA,MAAa,UAAU,EACnBA,KAAK,EAC0B,EAAsC;QACrE,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAACA;IACjD;AACJ;AAEO,MAAME,uBAAuBC,iBAAiB,oBAAoB,CAAC;IACtE,gBAAgBN;IAChB,cAAc;QAACO;KAAmB;AACtC"}
@@ -9,7 +9,7 @@ class LongTextStorageTransformImpl {
9
9
  async fromStorage({ field, value: storageValue }) {
10
10
  const typeOf = typeof storageValue;
11
11
  if (!storageValue || "string" === typeOf || "number" === typeOf || true === Array.isArray(storageValue)) return storageValue;
12
- else if ("object" !== typeOf) throw new WebinyError(`LongText value received in "fromStorage" function is not an object in field "${field.storageId}" - ${field.fieldId}.`);
12
+ if ("object" !== typeOf) throw new WebinyError(`LongText value received in "fromStorage" function is not an object in field "${field.storageId}" - ${field.fieldId}.`);
13
13
  try {
14
14
  const sv = storageValue;
15
15
  const result = await this.compressionHandler.decompress(storageValue);
@@ -1 +1 @@
1
- {"version":3,"file":"features/storage/fields/LongTextStorageTransform.js","sources":["../../../../src/features/storage/fields/LongTextStorageTransform.ts"],"sourcesContent":["import { StorageTransform } from \"../abstractions/StorageTransform.js\";\nimport { WebinyError } from \"@webiny/error\";\nimport { CompressionHandler } from \"@webiny/utils/exports/api.js\";\n\ninterface StorageValue {\n compression: string;\n value: string;\n isArray?: boolean;\n}\n\nclass LongTextStorageTransformImpl implements StorageTransform.Interface<\n string | string[],\n StorageValue\n> {\n public readonly fieldType = \"long-text\";\n\n public constructor(private readonly compressionHandler: CompressionHandler.Interface) {}\n\n public async fromStorage({\n field,\n value: storageValue\n }: StorageTransform.FromStorageParams<\n string | string[],\n StorageValue\n >): StorageTransform.FromStorageResponse<string | string[]> {\n const typeOf = typeof storageValue;\n if (\n !storageValue ||\n typeOf === \"string\" ||\n typeOf === \"number\" ||\n Array.isArray(storageValue) === true\n ) {\n return storageValue as unknown as string | string[];\n } else if (typeOf !== \"object\") {\n throw new WebinyError(\n `LongText value received in \"fromStorage\" function is not an object in field \"${field.storageId}\" - ${field.fieldId}.`\n );\n }\n\n try {\n const sv = storageValue as unknown as StorageValue;\n const result = await this.compressionHandler.decompress<string>(storageValue);\n if (!sv.isArray) {\n return result;\n }\n return JSON.parse(result);\n } catch (ex) {\n console.log(\"Error while transforming long-text.\");\n console.log(ex.message);\n return \"\";\n }\n }\n\n public async toStorage({\n value: initialValue\n }: StorageTransform.ToStorageParams<\n string | string[],\n StorageValue\n >): StorageTransform.ToStorageResponse<StorageValue> {\n if (initialValue && (initialValue as unknown as StorageValue).compression) {\n return initialValue as unknown as StorageValue;\n }\n const isArray = Array.isArray(initialValue);\n const value = isArray ? JSON.stringify(initialValue) : initialValue;\n const compressed = await this.compressionHandler.compress(value);\n\n if (!isArray) {\n return compressed as unknown as StorageValue;\n }\n return { ...compressed, isArray } as unknown as StorageValue;\n }\n}\n\nexport const LongTextStorageTransform = StorageTransform.createImplementation({\n implementation: LongTextStorageTransformImpl,\n dependencies: [CompressionHandler]\n});\n"],"names":["LongTextStorageTransformImpl","compressionHandler","field","storageValue","typeOf","Array","WebinyError","sv","result","JSON","ex","console","initialValue","isArray","value","compressed","LongTextStorageTransform","StorageTransform","CompressionHandler"],"mappings":";;;AAUA,MAAMA;IAMF,YAAoCC,kBAAgD,CAAE;aAAlDA,kBAAkB,GAAlBA;aAFpB,SAAS,GAAG;IAE2D;IAEvF,MAAa,YAAY,EACrBC,KAAK,EACL,OAAOC,YAAY,EAItB,EAA2D;QACxD,MAAMC,SAAS,OAAOD;QACtB,IACI,CAACA,gBACDC,AAAW,aAAXA,UACAA,AAAW,aAAXA,UACAC,AAAgC,SAAhCA,MAAM,OAAO,CAACF,eAEd,OAAOA;aACJ,IAAIC,AAAW,aAAXA,QACP,MAAM,IAAIE,YACN,CAAC,6EAA6E,EAAEJ,MAAM,SAAS,CAAC,IAAI,EAAEA,MAAM,OAAO,CAAC,CAAC,CAAC;QAI9H,IAAI;YACA,MAAMK,KAAKJ;YACX,MAAMK,SAAS,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAASL;YAChE,IAAI,CAACI,GAAG,OAAO,EACX,OAAOC;YAEX,OAAOC,KAAK,KAAK,CAACD;QACtB,EAAE,OAAOE,IAAI;YACTC,QAAQ,GAAG,CAAC;YACZA,QAAQ,GAAG,CAACD,GAAG,OAAO;YACtB,OAAO;QACX;IACJ;IAEA,MAAa,UAAU,EACnB,OAAOE,YAAY,EAItB,EAAoD;QACjD,IAAIA,gBAAiBA,aAAyC,WAAW,EACrE,OAAOA;QAEX,MAAMC,UAAUR,MAAM,OAAO,CAACO;QAC9B,MAAME,QAAQD,UAAUJ,KAAK,SAAS,CAACG,gBAAgBA;QACvD,MAAMG,aAAa,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAACD;QAE1D,IAAI,CAACD,SACD,OAAOE;QAEX,OAAO;YAAE,GAAGA,UAAU;YAAEF;QAAQ;IACpC;AACJ;AAEO,MAAMG,2BAA2BC,iBAAiB,oBAAoB,CAAC;IAC1E,gBAAgBjB;IAChB,cAAc;QAACkB;KAAmB;AACtC"}
1
+ {"version":3,"file":"features/storage/fields/LongTextStorageTransform.js","sources":["../../../../src/features/storage/fields/LongTextStorageTransform.ts"],"sourcesContent":["import { StorageTransform } from \"../abstractions/StorageTransform.js\";\nimport { WebinyError } from \"@webiny/error\";\nimport { CompressionHandler } from \"@webiny/utils/exports/api.js\";\n\ninterface StorageValue {\n compression: string;\n value: string;\n isArray?: boolean;\n}\n\nclass LongTextStorageTransformImpl implements StorageTransform.Interface<\n string | string[],\n StorageValue\n> {\n public readonly fieldType = \"long-text\";\n\n public constructor(private readonly compressionHandler: CompressionHandler.Interface) {}\n\n public async fromStorage({\n field,\n value: storageValue\n }: StorageTransform.FromStorageParams<\n string | string[],\n StorageValue\n >): StorageTransform.FromStorageResponse<string | string[]> {\n const typeOf = typeof storageValue;\n if (\n !storageValue ||\n typeOf === \"string\" ||\n typeOf === \"number\" ||\n Array.isArray(storageValue) === true\n ) {\n return storageValue as unknown as string | string[];\n } else if (typeOf !== \"object\") {\n throw new WebinyError(\n `LongText value received in \"fromStorage\" function is not an object in field \"${field.storageId}\" - ${field.fieldId}.`\n );\n }\n\n try {\n const sv = storageValue as unknown as StorageValue;\n const result = await this.compressionHandler.decompress<string>(storageValue);\n if (!sv.isArray) {\n return result;\n }\n return JSON.parse(result);\n } catch (ex) {\n console.log(\"Error while transforming long-text.\");\n console.log(ex.message);\n return \"\";\n }\n }\n\n public async toStorage({\n value: initialValue\n }: StorageTransform.ToStorageParams<\n string | string[],\n StorageValue\n >): StorageTransform.ToStorageResponse<StorageValue> {\n if (initialValue && (initialValue as unknown as StorageValue).compression) {\n return initialValue as unknown as StorageValue;\n }\n const isArray = Array.isArray(initialValue);\n const value = isArray ? JSON.stringify(initialValue) : initialValue;\n const compressed = await this.compressionHandler.compress(value);\n\n if (!isArray) {\n return compressed as unknown as StorageValue;\n }\n return { ...compressed, isArray } as unknown as StorageValue;\n }\n}\n\nexport const LongTextStorageTransform = StorageTransform.createImplementation({\n implementation: LongTextStorageTransformImpl,\n dependencies: [CompressionHandler]\n});\n"],"names":["LongTextStorageTransformImpl","compressionHandler","field","storageValue","typeOf","Array","WebinyError","sv","result","JSON","ex","console","initialValue","isArray","value","compressed","LongTextStorageTransform","StorageTransform","CompressionHandler"],"mappings":";;;AAUA,MAAMA;IAMF,YAAoCC,kBAAgD,CAAE;aAAlDA,kBAAkB,GAAlBA;aAFpB,SAAS,GAAG;IAE2D;IAEvF,MAAa,YAAY,EACrBC,KAAK,EACL,OAAOC,YAAY,EAItB,EAA2D;QACxD,MAAMC,SAAS,OAAOD;QACtB,IACI,CAACA,gBACDC,AAAW,aAAXA,UACAA,AAAW,aAAXA,UACAC,AAAgC,SAAhCA,MAAM,OAAO,CAACF,eAEd,OAAOA;QACJ,IAAIC,AAAW,aAAXA,QACP,MAAM,IAAIE,YACN,CAAC,6EAA6E,EAAEJ,MAAM,SAAS,CAAC,IAAI,EAAEA,MAAM,OAAO,CAAC,CAAC,CAAC;QAI9H,IAAI;YACA,MAAMK,KAAKJ;YACX,MAAMK,SAAS,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAASL;YAChE,IAAI,CAACI,GAAG,OAAO,EACX,OAAOC;YAEX,OAAOC,KAAK,KAAK,CAACD;QACtB,EAAE,OAAOE,IAAI;YACTC,QAAQ,GAAG,CAAC;YACZA,QAAQ,GAAG,CAACD,GAAG,OAAO;YACtB,OAAO;QACX;IACJ;IAEA,MAAa,UAAU,EACnB,OAAOE,YAAY,EAItB,EAAoD;QACjD,IAAIA,gBAAiBA,aAAyC,WAAW,EACrE,OAAOA;QAEX,MAAMC,UAAUR,MAAM,OAAO,CAACO;QAC9B,MAAME,QAAQD,UAAUJ,KAAK,SAAS,CAACG,gBAAgBA;QACvD,MAAMG,aAAa,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAACD;QAE1D,IAAI,CAACD,SACD,OAAOE;QAEX,OAAO;YAAE,GAAGA,UAAU;YAAEF;QAAQ;IACpC;AACJ;AAEO,MAAMG,2BAA2BC,iBAAiB,oBAAoB,CAAC;IAC1E,gBAAgBjB;IAChB,cAAc;QAACkB;KAAmB;AACtC"}
@@ -26,20 +26,30 @@ class StorageTransformImpl {
26
26
  const { value, field, getStorageTransform, model } = params;
27
27
  if (!value) return null;
28
28
  const fields = field.settings?.fields || [];
29
- if (field.list) return await p_map(value, (value)=>processValue({
30
- sourceValue: value,
29
+ if (field.list) return await p_map(value, async (itemValue)=>{
30
+ const processed = await processValue({
31
+ sourceValue: itemValue,
31
32
  getStorageTransform,
32
33
  model,
33
34
  operation: "toStorage",
34
35
  fields
35
- }));
36
- return await processValue({
36
+ });
37
+ return itemValue._id ? {
38
+ _id: itemValue._id,
39
+ ...processed
40
+ } : processed;
41
+ });
42
+ const processed = await processValue({
37
43
  sourceValue: value,
38
44
  getStorageTransform,
39
45
  model,
40
46
  operation: "toStorage",
41
47
  fields
42
48
  });
49
+ return value._id ? {
50
+ _id: value._id,
51
+ ...processed
52
+ } : processed;
43
53
  }
44
54
  async fromStorage(params) {
45
55
  const { field, value: input, getStorageTransform, model } = params;
@@ -47,21 +57,31 @@ class StorageTransformImpl {
47
57
  const fields = field.settings?.fields || [];
48
58
  if (field.list) {
49
59
  const values = input;
50
- return await Promise.all(values.map(async (value)=>await processValue({
60
+ return await Promise.all(values.map(async (value)=>{
61
+ const processed = await processValue({
51
62
  sourceValue: value,
52
63
  getStorageTransform,
53
64
  model,
54
65
  operation: "fromStorage",
55
66
  fields
56
- })));
67
+ });
68
+ return value._id ? {
69
+ _id: value._id,
70
+ ...processed
71
+ } : processed;
72
+ }));
57
73
  }
58
- return await processValue({
74
+ const processed = await processValue({
59
75
  sourceValue: input,
60
76
  getStorageTransform,
61
77
  model,
62
78
  operation: "fromStorage",
63
79
  fields
64
80
  });
81
+ return input._id ? {
82
+ _id: input._id,
83
+ ...processed
84
+ } : processed;
65
85
  }
66
86
  constructor(){
67
87
  this.fieldType = "object";