@webiny/api-headless-cms 6.4.11 → 6.4.12-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 (63) hide show
  1. package/crud/contentEntry/entryDataValidation.js +3 -4
  2. package/crud/contentEntry/entryDataValidation.js.map +1 -1
  3. package/crud/contentModel/validate/endingAllowed.js +1 -1
  4. package/crud/contentModel/validate/endingAllowed.js.map +1 -1
  5. package/crud/contentModel/validate/pluralApiName.js +1 -1
  6. package/crud/contentModel/validate/pluralApiName.js.map +1 -1
  7. package/crud/contentModel/validate/singularApiName.js +1 -1
  8. package/crud/contentModel/validate/singularApiName.js.map +1 -1
  9. package/crud/contentModel/validation.js +2 -2
  10. package/crud/contentModel/validation.js.map +1 -1
  11. package/domain/contentModel/validation/endingAllowed.js +1 -1
  12. package/domain/contentModel/validation/endingAllowed.js.map +1 -1
  13. package/domain/contentModel/validation/pluralApiName.js +1 -1
  14. package/domain/contentModel/validation/pluralApiName.js.map +1 -1
  15. package/domain/contentModel/validation/singularApiName.js +1 -1
  16. package/domain/contentModel/validation/singularApiName.js.map +1 -1
  17. package/export/crud/exporting.js +2 -2
  18. package/export/crud/exporting.js.map +1 -1
  19. package/export/crud/imports/importGroups.js +1 -2
  20. package/export/crud/imports/importGroups.js.map +1 -1
  21. package/export/crud/imports/validateModels.js +1 -1
  22. package/export/crud/imports/validateModels.js.map +1 -1
  23. package/features/contentEntry/entryDataFactories/expiresAt.js +2 -2
  24. package/features/contentEntry/entryDataFactories/expiresAt.js.map +1 -1
  25. package/features/contentModel/CreateModel/CreateModelRepository.js +1 -2
  26. package/features/contentModel/CreateModel/CreateModelRepository.js.map +1 -1
  27. package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js +1 -2
  28. package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js.map +1 -1
  29. package/features/storage/fields/CompressedTextStorageTransform.js +1 -1
  30. package/features/storage/fields/CompressedTextStorageTransform.js.map +1 -1
  31. package/features/storage/fields/DateStorageTransform.js +3 -4
  32. package/features/storage/fields/DateStorageTransform.js.map +1 -1
  33. package/features/storage/fields/DynamicZoneStorageTransform.js +2 -2
  34. package/features/storage/fields/DynamicZoneStorageTransform.js.map +1 -1
  35. package/features/storage/fields/JsonStorageTransform.js +1 -1
  36. package/features/storage/fields/JsonStorageTransform.js.map +1 -1
  37. package/features/storage/fields/LongTextStorageTransform.js +1 -1
  38. package/features/storage/fields/LongTextStorageTransform.js.map +1 -1
  39. package/features/storage/fields/RichTextStorageTransform.js +1 -1
  40. package/features/storage/fields/RichTextStorageTransform.js.map +1 -1
  41. package/features/validation/validators/DateGteValidator.js +1 -1
  42. package/features/validation/validators/DateGteValidator.js.map +1 -1
  43. package/features/validation/validators/DateLteValidator.js +1 -1
  44. package/features/validation/validators/DateLteValidator.js.map +1 -1
  45. package/features/whereMapper/WhereMapper.js +2 -3
  46. package/features/whereMapper/WhereMapper.js.map +1 -1
  47. package/graphql/getSchema/generateCacheKey.js +1 -1
  48. package/graphql/getSchema/generateCacheKey.js.map +1 -1
  49. package/graphql/scalars/RevisionId.js +1 -1
  50. package/graphql/scalars/RevisionId.js.map +1 -1
  51. package/graphql/schema/createFieldResolvers.js +1 -1
  52. package/graphql/schema/createFieldResolvers.js.map +1 -1
  53. package/package.json +27 -27
  54. package/plugins/CmsModelPlugin.js +9 -10
  55. package/plugins/CmsModelPlugin.js.map +1 -1
  56. package/utils/caching/Cache.js +1 -1
  57. package/utils/caching/Cache.js.map +1 -1
  58. package/utils/date.js +1 -1
  59. package/utils/date.js.map +1 -1
  60. package/utils/entryStorage.js +1 -1
  61. package/utils/entryStorage.js.map +1 -1
  62. package/utils/renderFields.js +1 -1
  63. package/utils/renderFields.js.map +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-headless-cms",
3
- "version": "6.4.11",
3
+ "version": "6.4.12-beta.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -23,47 +23,47 @@
23
23
  "license": "MIT",
24
24
  "dependencies": {
25
25
  "@babel/code-frame": "8.0.0",
26
- "@graphql-tools/merge": "9.2.0",
27
- "@graphql-tools/schema": "10.0.36",
28
- "@webiny/api": "6.4.11",
29
- "@webiny/api-core": "6.4.11",
30
- "@webiny/di": "1.0.2",
31
- "@webiny/error": "6.4.11",
32
- "@webiny/feature": "6.4.11",
33
- "@webiny/handler": "6.4.11",
34
- "@webiny/handler-aws": "6.4.11",
35
- "@webiny/handler-db": "6.4.11",
36
- "@webiny/handler-graphql": "6.4.11",
37
- "@webiny/plugins": "6.4.11",
38
- "@webiny/project": "6.4.11",
39
- "@webiny/utils": "6.4.11",
40
- "@webiny/validation": "6.4.11",
26
+ "@graphql-tools/merge": "9.2.4",
27
+ "@graphql-tools/schema": "10.1.1",
28
+ "@webiny/api": "6.4.12-beta.0",
29
+ "@webiny/api-core": "6.4.12-beta.0",
30
+ "@webiny/di": "1.1.0",
31
+ "@webiny/error": "6.4.12-beta.0",
32
+ "@webiny/feature": "6.4.12-beta.0",
33
+ "@webiny/handler": "6.4.12-beta.0",
34
+ "@webiny/handler-aws": "6.4.12-beta.0",
35
+ "@webiny/handler-db": "6.4.12-beta.0",
36
+ "@webiny/handler-graphql": "6.4.12-beta.0",
37
+ "@webiny/plugins": "6.4.12-beta.0",
38
+ "@webiny/project": "6.4.12-beta.0",
39
+ "@webiny/utils": "6.4.12-beta.0",
40
+ "@webiny/validation": "6.4.12-beta.0",
41
41
  "dot-prop-immutable": "2.1.1",
42
42
  "graphql": "16.14.2",
43
43
  "graphql-tag": "2.12.7",
44
44
  "lodash": "4.18.1",
45
- "p-map": "7.0.5",
45
+ "p-map": "7.0.8",
46
46
  "p-reduce": "3.0.0",
47
47
  "pluralize": "8.0.0",
48
48
  "slugify": "1.6.9",
49
- "zod": "4.4.3"
49
+ "zod": "4.6.5"
50
50
  },
51
51
  "devDependencies": {
52
52
  "@types/babel__code-frame": "7.27.0",
53
53
  "@types/pluralize": "0.0.33",
54
- "@webiny/aws-sdk": "6.4.11",
55
- "@webiny/build-tools": "6.4.11",
56
- "@webiny/db-dynamodb": "6.4.11",
57
- "@webiny/handler-db": "6.4.11",
58
- "@webiny/project-utils": "6.4.11",
59
- "@webiny/sdk": "6.4.11",
60
- "@webiny/wcp": "6.4.11",
54
+ "@webiny/aws-sdk": "6.4.12-beta.0",
55
+ "@webiny/build-tools": "6.4.12-beta.0",
56
+ "@webiny/db-dynamodb": "6.4.12-beta.0",
57
+ "@webiny/handler-db": "6.4.12-beta.0",
58
+ "@webiny/project-utils": "6.4.12-beta.0",
59
+ "@webiny/sdk": "6.4.12-beta.0",
60
+ "@webiny/wcp": "6.4.12-beta.0",
61
61
  "apollo-graphql": "0.9.7",
62
62
  "graphql": "16.14.2",
63
- "oxfmt": "0.58.0",
63
+ "oxfmt": "0.68.0",
64
64
  "rimraf": "6.1.3",
65
65
  "typescript": "6.0.3",
66
- "vitest": "4.1.10",
66
+ "vitest": "5.0.1",
67
67
  "write-json-file": "7.0.0"
68
68
  },
69
69
  "publishConfig": {
@@ -126,16 +126,15 @@ class CmsModelPlugin extends Plugin {
126
126
  };
127
127
  for (const field of model.fields){
128
128
  const total = countFieldInLayout(field.id, model.layout);
129
- if (1 !== total) {
130
- if (total > 1) throw new error(`Field "${field.id}" is in more than one layout cell.`, "DUPLICATE_FIELD_IN_LAYOUT", {
131
- model,
132
- field
133
- });
134
- throw new error(`Missing field "${field.id}" in layout.`, "MISSING_FIELD_IN_LAYOUT", {
135
- model,
136
- field
137
- });
138
- }
129
+ if (1 === total) continue;
130
+ else if (total > 1) throw new error(`Field "${field.id}" is in more than one layout cell.`, "DUPLICATE_FIELD_IN_LAYOUT", {
131
+ model,
132
+ field
133
+ });
134
+ throw new error(`Missing field "${field.id}" in layout.`, "MISSING_FIELD_IN_LAYOUT", {
135
+ model,
136
+ field
137
+ });
139
138
  }
140
139
  }
141
140
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plugins/CmsModelPlugin.js","sources":["../../src/plugins/CmsModelPlugin.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport lodashCamelCase from \"lodash/camelCase.js\";\nimport camelCase from \"lodash/camelCase.js\";\nimport upperFirst from \"lodash/upperFirst.js\";\nimport pluralize from \"pluralize\";\nimport { Plugin } from \"@webiny/plugins\";\nimport type {\n CmsModel as CmsModelBase,\n CmsModelField as CmsModelFieldBase,\n CmsModelFieldSettings as BaseCmsModelFieldSettings\n} from \"~/types/index.js\";\nimport { createFieldStorageId } from \"~/crud/contentModel/createFieldStorageId.js\";\nimport { validateStorageId } from \"~/crud/contentModel/validateStorageId.js\";\n\nconst createApiName = (name: string) => {\n return upperFirst(camelCase(name));\n};\n\nconst createPluralApiName = (name: string) => {\n return pluralize(createApiName(name));\n};\n\ninterface CmsModelFieldSettings extends Omit<BaseCmsModelFieldSettings, \"fields\"> {\n /**\n * Object field has child fields.\n */\n fields?: CmsModelFieldInput[];\n}\n\ninterface CmsModelFieldInput extends Omit<CmsModelFieldBase, \"storageId\" | \"settings\"> {\n /**\n * If defined, it must be camelCased string.\n * This is for backwards compatibility - before fields had storageId.\n *\n * This should only be populated in old model fields.\n * New ones must have this empty.\n */\n storageId?: string;\n /**\n * We must have a possibility to have a nested field defined without the storageId.\n */\n settings?: CmsModelFieldSettings;\n}\n\nexport interface CmsApiModel extends Omit<\n CmsModelPluginModel,\n \"isPrivate\" | \"fields\" | \"singularApiName\" | \"pluralApiName\" | \"isPlugin\"\n> {\n isPrivate?: never;\n noValidate?: boolean;\n singularApiName?: string;\n pluralApiName?: string;\n fields: CmsModelFieldInput[];\n}\n\nexport interface CmsApiModelFull extends Omit<CmsApiModel, \"fields\"> {\n fields: CmsModelFieldBase[];\n}\n\ninterface CmsPrivateModel extends Omit<\n CmsModelPluginModel,\n | \"isPrivate\"\n | \"singularApiName\"\n | \"pluralApiName\"\n | \"fields\"\n | \"isPlugin\"\n | \"layout\"\n | \"icon\"\n | \"titleFieldId\"\n | \"description\"\n> {\n noValidate?: boolean;\n titleFieldId?: string;\n singularApiName?: never;\n pluralApiName?: never;\n isPrivate: true;\n fields: CmsModelFieldInput[];\n}\n\nexport interface CmsPrivateModelFull extends Omit<\n CmsPrivateModel,\n \"fields\" | \"createdBy\" | \"createdOn\" | \"savedOn\"\n> {\n fields: CmsModelFieldBase[];\n}\n\nexport type CmsModelInput = CmsApiModel | CmsPrivateModel | CmsApiModelFull | CmsPrivateModelFull;\n\nexport interface CmsModelPluginModel extends Omit<CmsModelBase, \"tenant\"> {\n tenant?: string;\n}\n\ninterface CmsModelPluginOptions {\n validateLayout?: boolean;\n}\n\nexport class CmsModelPlugin extends Plugin {\n public static override readonly type: string = \"cms-content-model\";\n public readonly contentModel: CmsModelPluginModel;\n\n private readonly options: CmsModelPluginOptions;\n\n constructor(contentModel: CmsModelInput, options?: CmsModelPluginOptions) {\n super();\n this.options = options || {};\n this.contentModel = this.buildModel(contentModel);\n }\n\n private buildModel(input: CmsModelInput): CmsModelPluginModel {\n const isPrivate = input.isPrivate ?? false;\n\n const singularApiName = input.singularApiName\n ? createApiName(input.singularApiName)\n : createApiName(input.name);\n\n const pluralApiName = input.pluralApiName\n ? createApiName(input.pluralApiName)\n : createPluralApiName(input.name);\n\n const modelPlugin: CmsModelPluginModel = {\n group: input.group ?? \"ungrouped\",\n description: \"\",\n fields: [],\n isPlugin: true,\n isPrivate,\n icon: null,\n layout: [],\n modelId: input.modelId,\n name: input.name,\n pluralApiName,\n singularApiName,\n titleFieldId: \"id\"\n };\n\n if (input.noValidate) {\n /**\n * We can safely ignore this error, because we are sure noValidate is not a model field.\n */\n delete input[\"noValidate\"];\n\n return {\n ...modelPlugin,\n ...input,\n // Since `noValidate` is set, we trust the input, and cast to `CmsModelFieldBase`.\n fields: input.fields as CmsModelFieldBase[],\n pluralApiName,\n singularApiName\n };\n }\n\n const model: CmsModelPluginModel = {\n ...modelPlugin,\n ...input,\n pluralApiName,\n singularApiName,\n fields: this.buildFields(input, input.fields)\n };\n this.validateLayout(model);\n return model;\n }\n\n private buildFields(\n model: CmsModelInput,\n inputFields: CmsModelFieldInput[]\n ): CmsModelFieldBase[] {\n if (inputFields.length === 0) {\n throw new WebinyError(\n `Missing fields for the defined model \"${model.modelId}\".`,\n \"MISSING_FIELDS\",\n {\n model\n }\n );\n }\n const fields: CmsModelFieldBase[] = [];\n const storageIdList: string[] = [];\n const fieldIdList: string[] = [];\n for (const input of inputFields) {\n /**\n * Field must contain an fieldId. It is required in the graphql, but lets check it just in case\n */\n if (!(input.fieldId || \"\").trim()) {\n throw new WebinyError(\n `Field's \"storageId\" is not defined for the content model \"${model.modelId}\".`,\n \"FIELD_ID_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n const fieldId = lodashCamelCase(input.fieldId);\n /**\n * FieldID must be in correct pattern.\n */\n if (fieldId.match(/^[0-9]/) !== null) {\n throw new WebinyError(\n `Field's \"fieldId\" does not match correct pattern in the content model \"${model.modelId}\" - cannot start with a number.`,\n \"FIELD_FIELD_ID_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n /**\n * FieldID also must be camelCased.\n */\n if (fieldId !== input.fieldId) {\n throw new WebinyError(\n `Field's \"fieldId\" must be a camel cased string in the content model \"${model.modelId}\".`,\n \"FIELD_FIELD_ID_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n /**\n * ... and fieldId must be unique.\n */\n if (fieldIdList.includes(fieldId)) {\n throw new WebinyError(\n `Field's \"fieldId\" (id: ${input.id}) is not unique in the content model \"${model.modelId}\".`,\n \"FIELD_ID_NOT_UNIQUE_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n\n let storageId = input.storageId;\n if (storageId) {\n try {\n validateStorageId(storageId);\n } catch (e) {\n throw WebinyError.from(e, {\n data: { model, storageId, field: input }\n });\n }\n } else {\n storageId = createFieldStorageId(input);\n }\n\n /**\n * Fields storageId must be unique.\n */\n if (storageIdList.includes(storageId)) {\n throw new WebinyError(\n `Field's \"storageId\" is not unique in the content model \"${model.modelId}\".`,\n \"STORAGE_ID_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n\n /**\n * We can safely ignore error because we are going through the fields and making sure each has storageId.\n */\n // @ts-expect-error\n let settings: BaseCmsModelFieldSettings = input.settings;\n\n const childFields = settings?.fields || [];\n if (input.type === \"object\" && childFields.length > 0) {\n settings = {\n ...(settings || {}),\n fields: this.buildFields(model, childFields)\n };\n }\n\n const field: CmsModelFieldBase = {\n ...input,\n settings,\n storageId\n };\n /**\n * Add all relevant data to arrays.\n */\n fields.push(field);\n storageIdList.push(field.storageId);\n fieldIdList.push(field.fieldId);\n }\n return fields;\n }\n\n private validateLayout(model: CmsModelPluginModel): void {\n /**\n * Only skip validation if option.validateLayout was set as false, explicitly.\n */\n if (this.options.validateLayout === false) {\n return;\n }\n\n const countFieldInLayout = (fieldId: string, layout: any[][]): number => {\n let total = 0;\n for (const row of layout) {\n for (const cell of row) {\n if (typeof cell === \"string\") {\n if (cell === fieldId) {\n total++;\n }\n } else if (cell && typeof cell === \"object\" && Array.isArray(cell.tabs)) {\n for (const tab of cell.tabs) {\n if (Array.isArray(tab.layout)) {\n total += countFieldInLayout(fieldId, tab.layout);\n }\n }\n }\n }\n }\n return total;\n };\n\n for (const field of model.fields) {\n const total = countFieldInLayout(field.id, model.layout);\n if (total === 1) {\n continue;\n } else if (total > 1) {\n throw new WebinyError(\n `Field \"${field.id}\" is in more than one layout cell.`,\n \"DUPLICATE_FIELD_IN_LAYOUT\",\n {\n model,\n field\n }\n );\n }\n throw new WebinyError(\n `Missing field \"${field.id}\" in layout.`,\n \"MISSING_FIELD_IN_LAYOUT\",\n {\n model,\n field\n }\n );\n }\n }\n}\n\n/**\n * IMPORTANT! This function should NOT be used outside the `api-headless-cms` package!\n * @internal\n */\nexport const createModelPlugin = (\n model: CmsModelInput,\n options?: CmsModelPluginOptions\n): CmsModelPlugin => {\n return new CmsModelPlugin(model, options);\n};\n\n/**\n * IMPORTANT! This function should NOT be used outside the `api-headless-cms` package!\n * @internal\n */\nexport const createPrivateModelPlugin = (\n input: Omit<CmsPrivateModelFull, \"group\" | \"isPrivate\">\n): CmsModelPlugin => {\n return createModelPlugin(\n {\n authorization: false,\n noValidate: true,\n isPrivate: true,\n group: \"private\",\n ...input\n },\n {\n validateLayout: false\n }\n );\n};\n"],"names":["createApiName","name","upperFirst","camelCase","createPluralApiName","pluralize","CmsModelPlugin","Plugin","contentModel","options","input","isPrivate","singularApiName","pluralApiName","modelPlugin","model","inputFields","WebinyError","fields","storageIdList","fieldIdList","fieldId","lodashCamelCase","storageId","validateStorageId","e","createFieldStorageId","settings","childFields","field","countFieldInLayout","layout","total","row","cell","Array","tab","createModelPlugin","createPrivateModelPlugin"],"mappings":"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"}
1
+ {"version":3,"file":"plugins/CmsModelPlugin.js","sources":["../../src/plugins/CmsModelPlugin.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport lodashCamelCase from \"lodash/camelCase.js\";\nimport camelCase from \"lodash/camelCase.js\";\nimport upperFirst from \"lodash/upperFirst.js\";\nimport pluralize from \"pluralize\";\nimport { Plugin } from \"@webiny/plugins\";\nimport type {\n CmsModel as CmsModelBase,\n CmsModelField as CmsModelFieldBase,\n CmsModelFieldSettings as BaseCmsModelFieldSettings\n} from \"~/types/index.js\";\nimport { createFieldStorageId } from \"~/crud/contentModel/createFieldStorageId.js\";\nimport { validateStorageId } from \"~/crud/contentModel/validateStorageId.js\";\n\nconst createApiName = (name: string) => {\n return upperFirst(camelCase(name));\n};\n\nconst createPluralApiName = (name: string) => {\n return pluralize(createApiName(name));\n};\n\ninterface CmsModelFieldSettings extends Omit<BaseCmsModelFieldSettings, \"fields\"> {\n /**\n * Object field has child fields.\n */\n fields?: CmsModelFieldInput[];\n}\n\ninterface CmsModelFieldInput extends Omit<CmsModelFieldBase, \"storageId\" | \"settings\"> {\n /**\n * If defined, it must be camelCased string.\n * This is for backwards compatibility - before fields had storageId.\n *\n * This should only be populated in old model fields.\n * New ones must have this empty.\n */\n storageId?: string;\n /**\n * We must have a possibility to have a nested field defined without the storageId.\n */\n settings?: CmsModelFieldSettings;\n}\n\nexport interface CmsApiModel extends Omit<\n CmsModelPluginModel,\n \"isPrivate\" | \"fields\" | \"singularApiName\" | \"pluralApiName\" | \"isPlugin\"\n> {\n isPrivate?: never;\n noValidate?: boolean;\n singularApiName?: string;\n pluralApiName?: string;\n fields: CmsModelFieldInput[];\n}\n\nexport interface CmsApiModelFull extends Omit<CmsApiModel, \"fields\"> {\n fields: CmsModelFieldBase[];\n}\n\ninterface CmsPrivateModel extends Omit<\n CmsModelPluginModel,\n | \"isPrivate\"\n | \"singularApiName\"\n | \"pluralApiName\"\n | \"fields\"\n | \"isPlugin\"\n | \"layout\"\n | \"icon\"\n | \"titleFieldId\"\n | \"description\"\n> {\n noValidate?: boolean;\n titleFieldId?: string;\n singularApiName?: never;\n pluralApiName?: never;\n isPrivate: true;\n fields: CmsModelFieldInput[];\n}\n\nexport interface CmsPrivateModelFull extends Omit<\n CmsPrivateModel,\n \"fields\" | \"createdBy\" | \"createdOn\" | \"savedOn\"\n> {\n fields: CmsModelFieldBase[];\n}\n\nexport type CmsModelInput = CmsApiModel | CmsPrivateModel | CmsApiModelFull | CmsPrivateModelFull;\n\nexport interface CmsModelPluginModel extends Omit<CmsModelBase, \"tenant\"> {\n tenant?: string;\n}\n\ninterface CmsModelPluginOptions {\n validateLayout?: boolean;\n}\n\nexport class CmsModelPlugin extends Plugin {\n public static override readonly type: string = \"cms-content-model\";\n public readonly contentModel: CmsModelPluginModel;\n\n private readonly options: CmsModelPluginOptions;\n\n constructor(contentModel: CmsModelInput, options?: CmsModelPluginOptions) {\n super();\n this.options = options || {};\n this.contentModel = this.buildModel(contentModel);\n }\n\n private buildModel(input: CmsModelInput): CmsModelPluginModel {\n const isPrivate = input.isPrivate ?? false;\n\n const singularApiName = input.singularApiName\n ? createApiName(input.singularApiName)\n : createApiName(input.name);\n\n const pluralApiName = input.pluralApiName\n ? createApiName(input.pluralApiName)\n : createPluralApiName(input.name);\n\n const modelPlugin: CmsModelPluginModel = {\n group: input.group ?? \"ungrouped\",\n description: \"\",\n fields: [],\n isPlugin: true,\n isPrivate,\n icon: null,\n layout: [],\n modelId: input.modelId,\n name: input.name,\n pluralApiName,\n singularApiName,\n titleFieldId: \"id\"\n };\n\n if (input.noValidate) {\n /**\n * We can safely ignore this error, because we are sure noValidate is not a model field.\n */\n delete input[\"noValidate\"];\n\n return {\n ...modelPlugin,\n ...input,\n // Since `noValidate` is set, we trust the input, and cast to `CmsModelFieldBase`.\n fields: input.fields as CmsModelFieldBase[],\n pluralApiName,\n singularApiName\n };\n }\n\n const model: CmsModelPluginModel = {\n ...modelPlugin,\n ...input,\n pluralApiName,\n singularApiName,\n fields: this.buildFields(input, input.fields)\n };\n this.validateLayout(model);\n return model;\n }\n\n private buildFields(\n model: CmsModelInput,\n inputFields: CmsModelFieldInput[]\n ): CmsModelFieldBase[] {\n if (inputFields.length === 0) {\n throw new WebinyError(\n `Missing fields for the defined model \"${model.modelId}\".`,\n \"MISSING_FIELDS\",\n {\n model\n }\n );\n }\n const fields: CmsModelFieldBase[] = [];\n const storageIdList: string[] = [];\n const fieldIdList: string[] = [];\n for (const input of inputFields) {\n /**\n * Field must contain an fieldId. It is required in the graphql, but lets check it just in case\n */\n if (!(input.fieldId || \"\").trim()) {\n throw new WebinyError(\n `Field's \"storageId\" is not defined for the content model \"${model.modelId}\".`,\n \"FIELD_ID_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n const fieldId = lodashCamelCase(input.fieldId);\n /**\n * FieldID must be in correct pattern.\n */\n if (fieldId.match(/^[0-9]/) !== null) {\n throw new WebinyError(\n `Field's \"fieldId\" does not match correct pattern in the content model \"${model.modelId}\" - cannot start with a number.`,\n \"FIELD_FIELD_ID_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n /**\n * FieldID also must be camelCased.\n */\n if (fieldId !== input.fieldId) {\n throw new WebinyError(\n `Field's \"fieldId\" must be a camel cased string in the content model \"${model.modelId}\".`,\n \"FIELD_FIELD_ID_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n /**\n * ... and fieldId must be unique.\n */\n if (fieldIdList.includes(fieldId)) {\n throw new WebinyError(\n `Field's \"fieldId\" (id: ${input.id}) is not unique in the content model \"${model.modelId}\".`,\n \"FIELD_ID_NOT_UNIQUE_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n\n let storageId = input.storageId;\n if (storageId) {\n try {\n validateStorageId(storageId);\n } catch (e) {\n throw WebinyError.from(e, {\n data: { model, storageId, field: input }\n });\n }\n } else {\n storageId = createFieldStorageId(input);\n }\n\n /**\n * Fields storageId must be unique.\n */\n if (storageIdList.includes(storageId)) {\n throw new WebinyError(\n `Field's \"storageId\" is not unique in the content model \"${model.modelId}\".`,\n \"STORAGE_ID_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n\n /**\n * We can safely ignore error because we are going through the fields and making sure each has storageId.\n */\n // @ts-expect-error\n let settings: BaseCmsModelFieldSettings = input.settings;\n\n const childFields = settings?.fields || [];\n if (input.type === \"object\" && childFields.length > 0) {\n settings = {\n ...(settings || {}),\n fields: this.buildFields(model, childFields)\n };\n }\n\n const field: CmsModelFieldBase = {\n ...input,\n settings,\n storageId\n };\n /**\n * Add all relevant data to arrays.\n */\n fields.push(field);\n storageIdList.push(field.storageId);\n fieldIdList.push(field.fieldId);\n }\n return fields;\n }\n\n private validateLayout(model: CmsModelPluginModel): void {\n /**\n * Only skip validation if option.validateLayout was set as false, explicitly.\n */\n if (this.options.validateLayout === false) {\n return;\n }\n\n const countFieldInLayout = (fieldId: string, layout: any[][]): number => {\n let total = 0;\n for (const row of layout) {\n for (const cell of row) {\n if (typeof cell === \"string\") {\n if (cell === fieldId) {\n total++;\n }\n } else if (cell && typeof cell === \"object\" && Array.isArray(cell.tabs)) {\n for (const tab of cell.tabs) {\n if (Array.isArray(tab.layout)) {\n total += countFieldInLayout(fieldId, tab.layout);\n }\n }\n }\n }\n }\n return total;\n };\n\n for (const field of model.fields) {\n const total = countFieldInLayout(field.id, model.layout);\n if (total === 1) {\n continue;\n } else if (total > 1) {\n throw new WebinyError(\n `Field \"${field.id}\" is in more than one layout cell.`,\n \"DUPLICATE_FIELD_IN_LAYOUT\",\n {\n model,\n field\n }\n );\n }\n throw new WebinyError(\n `Missing field \"${field.id}\" in layout.`,\n \"MISSING_FIELD_IN_LAYOUT\",\n {\n model,\n field\n }\n );\n }\n }\n}\n\n/**\n * IMPORTANT! This function should NOT be used outside the `api-headless-cms` package!\n * @internal\n */\nexport const createModelPlugin = (\n model: CmsModelInput,\n options?: CmsModelPluginOptions\n): CmsModelPlugin => {\n return new CmsModelPlugin(model, options);\n};\n\n/**\n * IMPORTANT! This function should NOT be used outside the `api-headless-cms` package!\n * @internal\n */\nexport const createPrivateModelPlugin = (\n input: Omit<CmsPrivateModelFull, \"group\" | \"isPrivate\">\n): CmsModelPlugin => {\n return createModelPlugin(\n {\n authorization: false,\n noValidate: true,\n isPrivate: true,\n group: \"private\",\n ...input\n },\n {\n validateLayout: false\n }\n );\n};\n"],"names":["createApiName","name","upperFirst","camelCase","createPluralApiName","pluralize","CmsModelPlugin","Plugin","contentModel","options","input","isPrivate","singularApiName","pluralApiName","modelPlugin","model","inputFields","WebinyError","fields","storageIdList","fieldIdList","fieldId","lodashCamelCase","storageId","validateStorageId","e","createFieldStorageId","settings","childFields","field","countFieldInLayout","layout","total","row","cell","Array","tab","createModelPlugin","createPrivateModelPlugin"],"mappings":"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"}
@@ -21,7 +21,7 @@ class Cache {
21
21
  }
22
22
  clear(cacheKey) {
23
23
  if (!cacheKey) return void this._cache.clear();
24
- if (Array.isArray(cacheKey)) {
24
+ else if (Array.isArray(cacheKey)) {
25
25
  for (const key of cacheKey)this._cache.delete(key.get());
26
26
  return;
27
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils/caching/Cache.js","sources":["../../../src/utils/caching/Cache.ts"],"sourcesContent":["import type { ICache, ICacheKey } from \"./types.js\";\n\nexport interface ICacheParams {\n id?: string;\n}\n\nclass Cache<T> implements ICache {\n public readonly id: string | undefined;\n private readonly _cache: Map<string, T> = new Map();\n\n public constructor(params?: ICacheParams) {\n this.id = params?.id;\n }\n\n public get(cacheKey: ICacheKey): T | null {\n const key = cacheKey.get();\n const value = this._cache.get(key);\n return value || null;\n }\n\n public set(cacheKey: ICacheKey, value: T): T {\n const key = cacheKey.get();\n this._cache.set(key, value);\n return value;\n }\n\n public getOrSet(cacheKey: ICacheKey, cb: () => T): T {\n const existing = this.get(cacheKey);\n if (existing) {\n return existing;\n }\n const value = cb();\n return this.set(cacheKey, value);\n }\n\n public clear(cacheKey?: ICacheKey | ICacheKey[]) {\n if (!cacheKey) {\n this._cache.clear();\n return;\n } else if (Array.isArray(cacheKey)) {\n for (const key of cacheKey) {\n this._cache.delete(key.get());\n }\n return;\n }\n\n this._cache.delete(cacheKey.get());\n }\n}\n\nexport const createMemoryCache = <T>(params?: ICacheParams): ICache<T> => {\n return new Cache<T>(params);\n};\n"],"names":["Cache","params","Map","cacheKey","key","value","cb","existing","Array","createMemoryCache"],"mappings":"AAMA,MAAMA;IAIF,YAAmBC,MAAqB,CAAE;aAFzB,MAAM,GAAmB,IAAIC;QAG1C,IAAI,CAAC,EAAE,GAAGD,QAAQ;IACtB;IAEO,IAAIE,QAAmB,EAAY;QACtC,MAAMC,MAAMD,SAAS,GAAG;QACxB,MAAME,QAAQ,IAAI,CAAC,MAAM,CAAC,GAAG,CAACD;QAC9B,OAAOC,SAAS;IACpB;IAEO,IAAIF,QAAmB,EAAEE,KAAQ,EAAK;QACzC,MAAMD,MAAMD,SAAS,GAAG;QACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAACC,KAAKC;QACrB,OAAOA;IACX;IAEO,SAASF,QAAmB,EAAEG,EAAW,EAAK;QACjD,MAAMC,WAAW,IAAI,CAAC,GAAG,CAACJ;QAC1B,IAAII,UACA,OAAOA;QAEX,MAAMF,QAAQC;QACd,OAAO,IAAI,CAAC,GAAG,CAACH,UAAUE;IAC9B;IAEO,MAAMF,QAAkC,EAAE;QAC7C,IAAI,CAACA,UAAU,YACX,IAAI,CAAC,MAAM,CAAC,KAAK;QAEd,IAAIK,MAAM,OAAO,CAACL,WAAW;YAChC,KAAK,MAAMC,OAAOD,SACd,IAAI,CAAC,MAAM,CAAC,MAAM,CAACC,IAAI,GAAG;YAE9B;QACJ;QAEA,IAAI,CAAC,MAAM,CAAC,MAAM,CAACD,SAAS,GAAG;IACnC;AACJ;AAEO,MAAMM,oBAAoB,CAAIR,SAC1B,IAAID,MAASC"}
1
+ {"version":3,"file":"utils/caching/Cache.js","sources":["../../../src/utils/caching/Cache.ts"],"sourcesContent":["import type { ICache, ICacheKey } from \"./types.js\";\n\nexport interface ICacheParams {\n id?: string;\n}\n\nclass Cache<T> implements ICache {\n public readonly id: string | undefined;\n private readonly _cache: Map<string, T> = new Map();\n\n public constructor(params?: ICacheParams) {\n this.id = params?.id;\n }\n\n public get(cacheKey: ICacheKey): T | null {\n const key = cacheKey.get();\n const value = this._cache.get(key);\n return value || null;\n }\n\n public set(cacheKey: ICacheKey, value: T): T {\n const key = cacheKey.get();\n this._cache.set(key, value);\n return value;\n }\n\n public getOrSet(cacheKey: ICacheKey, cb: () => T): T {\n const existing = this.get(cacheKey);\n if (existing) {\n return existing;\n }\n const value = cb();\n return this.set(cacheKey, value);\n }\n\n public clear(cacheKey?: ICacheKey | ICacheKey[]) {\n if (!cacheKey) {\n this._cache.clear();\n return;\n } else if (Array.isArray(cacheKey)) {\n for (const key of cacheKey) {\n this._cache.delete(key.get());\n }\n return;\n }\n\n this._cache.delete(cacheKey.get());\n }\n}\n\nexport const createMemoryCache = <T>(params?: ICacheParams): ICache<T> => {\n return new Cache<T>(params);\n};\n"],"names":["Cache","params","Map","cacheKey","key","value","cb","existing","Array","createMemoryCache"],"mappings":"AAMA,MAAMA;IAIF,YAAmBC,MAAqB,CAAE;aAFzB,MAAM,GAAmB,IAAIC;QAG1C,IAAI,CAAC,EAAE,GAAGD,QAAQ;IACtB;IAEO,IAAIE,QAAmB,EAAY;QACtC,MAAMC,MAAMD,SAAS,GAAG;QACxB,MAAME,QAAQ,IAAI,CAAC,MAAM,CAAC,GAAG,CAACD;QAC9B,OAAOC,SAAS;IACpB;IAEO,IAAIF,QAAmB,EAAEE,KAAQ,EAAK;QACzC,MAAMD,MAAMD,SAAS,GAAG;QACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAACC,KAAKC;QACrB,OAAOA;IACX;IAEO,SAASF,QAAmB,EAAEG,EAAW,EAAK;QACjD,MAAMC,WAAW,IAAI,CAAC,GAAG,CAACJ;QAC1B,IAAII,UACA,OAAOA;QAEX,MAAMF,QAAQC;QACd,OAAO,IAAI,CAAC,GAAG,CAACH,UAAUE;IAC9B;IAEO,MAAMF,QAAkC,EAAE;QAC7C,IAAI,CAACA,UAAU,YACX,IAAI,CAAC,MAAM,CAAC,KAAK;aAEd,IAAIK,MAAM,OAAO,CAACL,WAAW;YAChC,KAAK,MAAMC,OAAOD,SACd,IAAI,CAAC,MAAM,CAAC,MAAM,CAACC,IAAI,GAAG;YAE9B;QACJ;QAEA,IAAI,CAAC,MAAM,CAAC,MAAM,CAACD,SAAS,GAAG;IACnC;AACJ;AAEO,MAAMM,oBAAoB,CAAIR,SAC1B,IAAID,MAASC"}
package/utils/date.js CHANGED
@@ -1,6 +1,6 @@
1
1
  const formatDate = (date)=>{
2
2
  if (!date) return null;
3
- if (date instanceof Date) return date.toISOString();
3
+ else if (date instanceof Date) return date.toISOString();
4
4
  return new Date(date).toISOString();
5
5
  };
6
6
  const getDate = (input, defaultValue)=>{
package/utils/date.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils/date.js","sources":["../../src/utils/date.ts"],"sourcesContent":["/**\n * Should not be used by users as method is prone to breaking changes.\n * @internal\n */\nexport const formatDate = (date?: Date | string | null): string | null => {\n if (!date) {\n return null;\n } else if (date instanceof Date) {\n return date.toISOString();\n }\n return new Date(date).toISOString();\n};\n\n/**\n * Should not be used by users as method is prone to breaking changes.\n * @internal\n */\nexport const getDate = <T extends string | null = string | null>(\n input?: Date | string | null,\n defaultValue?: Date | string | null\n): T => {\n if (!input) {\n return formatDate(defaultValue) as T;\n }\n if (input instanceof Date) {\n return formatDate(input) as T;\n }\n return formatDate(new Date(input)) as T;\n};\n"],"names":["formatDate","date","Date","getDate","input","defaultValue"],"mappings":"AAIO,MAAMA,aAAa,CAACC;IACvB,IAAI,CAACA,MACD,OAAO;IACJ,IAAIA,gBAAgBC,MACvB,OAAOD,KAAK,WAAW;IAE3B,OAAO,IAAIC,KAAKD,MAAM,WAAW;AACrC;AAMO,MAAME,UAAU,CACnBC,OACAC;IAEA,IAAI,CAACD,OACD,OAAOJ,WAAWK;IAEtB,IAAID,iBAAiBF,MACjB,OAAOF,WAAWI;IAEtB,OAAOJ,WAAW,IAAIE,KAAKE;AAC/B"}
1
+ {"version":3,"file":"utils/date.js","sources":["../../src/utils/date.ts"],"sourcesContent":["/**\n * Should not be used by users as method is prone to breaking changes.\n * @internal\n */\nexport const formatDate = (date?: Date | string | null): string | null => {\n if (!date) {\n return null;\n } else if (date instanceof Date) {\n return date.toISOString();\n }\n return new Date(date).toISOString();\n};\n\n/**\n * Should not be used by users as method is prone to breaking changes.\n * @internal\n */\nexport const getDate = <T extends string | null = string | null>(\n input?: Date | string | null,\n defaultValue?: Date | string | null\n): T => {\n if (!input) {\n return formatDate(defaultValue) as T;\n }\n if (input instanceof Date) {\n return formatDate(input) as T;\n }\n return formatDate(new Date(input)) as T;\n};\n"],"names":["formatDate","date","Date","getDate","input","defaultValue"],"mappings":"AAIO,MAAMA,aAAa,CAACC;IACvB,IAAI,CAACA,MACD,OAAO;SACJ,IAAIA,gBAAgBC,MACvB,OAAOD,KAAK,WAAW;IAE3B,OAAO,IAAIC,KAAKD,MAAM,WAAW;AACrC;AAMO,MAAME,UAAU,CACnBC,OACAC;IAEA,IAAI,CAACD,OACD,OAAOJ,WAAWK;IAEtB,IAAID,iBAAiBF,MACjB,OAAOF,WAAWI;IAEtB,OAAOJ,WAAW,IAAIE,KAAKE;AAC/B"}
@@ -14,7 +14,7 @@ const getStorageTransformFactory = (context)=>{
14
14
  type
15
15
  });
16
16
  if (result[type]) return result[type];
17
- if (fieldType !== type && result[fieldType]) return result[fieldType];
17
+ else if (fieldType !== type && result[fieldType]) return result[fieldType];
18
18
  return defaultStorageTransform;
19
19
  };
20
20
  };
@@ -1 +1 @@
1
- {"version":3,"file":"utils/entryStorage.js","sources":["../../src/utils/entryStorage.ts"],"sourcesContent":["import type {\n CmsContext,\n CmsEntry,\n CmsEntryValues,\n CmsModel,\n CmsModelField\n} from \"~/types/index.js\";\nimport { StorageTransform, StorageTransformRegistry } from \"~/features/storage/index.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { getBaseFieldType } from \"~/utils/getBaseFieldType.js\";\n\nexport interface GetStorageTransformFactory {\n (context: Pick<CmsContext, \"container\">): (fieldType: string) => StorageTransform.Interface;\n}\n\nexport const getStorageTransformFactory: GetStorageTransformFactory = context => {\n const registry = context.container.resolve(StorageTransformRegistry);\n\n const result: GenericRecord<string, StorageTransform.Interface> = {};\n let defaultStorageTransform: StorageTransform.Interface;\n\n const storageTransforms = registry.getAll().toReversed();\n\n for (const storageTransform of storageTransforms) {\n if (storageTransform.fieldType === \"*\") {\n defaultStorageTransform = storageTransform;\n }\n result[storageTransform.fieldType] = storageTransform;\n }\n\n return (type: string) => {\n const fieldType = getBaseFieldType({\n type\n });\n // first we check the exact type, then the base type, and if nothing is found, we return the default storage transform.\n if (result[type]) {\n return result[type];\n } else if (fieldType !== type && result[fieldType]) {\n return result[fieldType];\n }\n return defaultStorageTransform;\n };\n};\n\nconst doNotTouchProperty = Symbol(\"__DO_NOT_TOUCH_AS_WE_USE_IT_TO_SKIP_UNNECESSARY_OPERATIONS\");\n\n/**\n * This should be used when transforming the whole entry.\n */\nconst entryStorageTransform = async <T extends CmsEntryValues = CmsEntryValues>(\n context: Pick<CmsContext, \"container\">,\n model: CmsModel,\n operation: \"toStorage\" | \"fromStorage\",\n entry: CmsEntry<T>\n): Promise<CmsEntry<T>> => {\n /**\n * We use this property to skip unnecessary operations.\n */\n // @ts-expect-error\n if (entry[doNotTouchProperty] === operation) {\n return entry;\n }\n\n const getStorageTransform = getStorageTransformFactory(context);\n\n const fieldValues = model.fields\n .filter(field => {\n return entry.values.hasOwnProperty(field.fieldId);\n })\n .map(async field => {\n const key = field.fieldId as keyof T;\n const value = entry.values[key];\n const storageTransform = getStorageTransform(field.type);\n const transformed = await storageTransform[operation]({\n model,\n field,\n value,\n getStorageTransform\n });\n return [key, transformed] as const;\n });\n\n const results = await Promise.all(fieldValues);\n const transformedValues = Object.fromEntries(results) as T;\n\n const result = {\n ...entry,\n values: transformedValues\n };\n /**\n * We need to assign the variable so that we can skip unnecessary operations next time.\n */\n Object.defineProperty(result, doNotTouchProperty, {\n enumerable: false,\n value: operation,\n configurable: true\n });\n\n return result;\n};\n\n/**\n * A function that is used in crud to transform entry into the storage type.\n */\nexport const entryToStorageTransform = async (\n context: Pick<CmsContext, \"container\">,\n model: CmsModel,\n entry: CmsEntry\n): Promise<CmsEntry> => {\n return entryStorageTransform(context, model, \"toStorage\", entry);\n};\n\n/**\n * A function that is used to transform the whole entry from storage into its native form.\n */\nexport const entryFromStorageTransform = async (\n context: Pick<CmsContext, \"container\">,\n model: CmsModel,\n entry: CmsEntry\n): Promise<CmsEntry> => {\n return entryStorageTransform(context, model, \"fromStorage\", entry);\n};\n\ninterface EntryFieldFromStorageTransformParams {\n context: Pick<CmsContext, \"container\">;\n model: CmsModel;\n field: CmsModelField;\n value: any;\n}\n/*\n * A function that is used to transform a single field from storage\n */\nexport const entryFieldFromStorageTransform = async <T = any>(\n params: EntryFieldFromStorageTransformParams\n): Promise<T> => {\n const { context, model, field, value } = params;\n const getStorageTransform = getStorageTransformFactory(context);\n\n const storageTransform = getStorageTransform(field.type);\n\n return storageTransform.fromStorage({\n model,\n field,\n value,\n getStorageTransform\n });\n};\n"],"names":["getStorageTransformFactory","context","registry","StorageTransformRegistry","result","defaultStorageTransform","storageTransforms","storageTransform","type","fieldType","getBaseFieldType","doNotTouchProperty","Symbol","entryStorageTransform","model","operation","entry","getStorageTransform","fieldValues","field","key","value","transformed","results","Promise","transformedValues","Object","entryToStorageTransform","entryFromStorageTransform","entryFieldFromStorageTransform","params"],"mappings":";;AAeO,MAAMA,6BAAyDC,CAAAA;IAClE,MAAMC,WAAWD,QAAQ,SAAS,CAAC,OAAO,CAACE;IAE3C,MAAMC,SAA4D,CAAC;IACnE,IAAIC;IAEJ,MAAMC,oBAAoBJ,SAAS,MAAM,GAAG,UAAU;IAEtD,KAAK,MAAMK,oBAAoBD,kBAAmB;QAC9C,IAAIC,AAA+B,QAA/BA,iBAAiB,SAAS,EAC1BF,0BAA0BE;QAE9BH,MAAM,CAACG,iBAAiB,SAAS,CAAC,GAAGA;IACzC;IAEA,OAAO,CAACC;QACJ,MAAMC,YAAYC,iBAAiB;YAC/BF;QACJ;QAEA,IAAIJ,MAAM,CAACI,KAAK,EACZ,OAAOJ,MAAM,CAACI,KAAK;QAChB,IAAIC,cAAcD,QAAQJ,MAAM,CAACK,UAAU,EAC9C,OAAOL,MAAM,CAACK,UAAU;QAE5B,OAAOJ;IACX;AACJ;AAEA,MAAMM,qBAAqBC,OAAO;AAKlC,MAAMC,wBAAwB,OAC1BZ,SACAa,OACAC,WACAC;IAMA,IAAIA,KAAK,CAACL,mBAAmB,KAAKI,WAC9B,OAAOC;IAGX,MAAMC,sBAAsBjB,2BAA2BC;IAEvD,MAAMiB,cAAcJ,MAAM,MAAM,CAC3B,MAAM,CAACK,CAAAA,QACGH,MAAM,MAAM,CAAC,cAAc,CAACG,MAAM,OAAO,GAEnD,GAAG,CAAC,OAAMA;QACP,MAAMC,MAAMD,MAAM,OAAO;QACzB,MAAME,QAAQL,MAAM,MAAM,CAACI,IAAI;QAC/B,MAAMb,mBAAmBU,oBAAoBE,MAAM,IAAI;QACvD,MAAMG,cAAc,MAAMf,gBAAgB,CAACQ,UAAU,CAAC;YAClDD;YACAK;YACAE;YACAJ;QACJ;QACA,OAAO;YAACG;YAAKE;SAAY;IAC7B;IAEJ,MAAMC,UAAU,MAAMC,QAAQ,GAAG,CAACN;IAClC,MAAMO,oBAAoBC,OAAO,WAAW,CAACH;IAE7C,MAAMnB,SAAS;QACX,GAAGY,KAAK;QACR,QAAQS;IACZ;IAIAC,OAAO,cAAc,CAACtB,QAAQO,oBAAoB;QAC9C,YAAY;QACZ,OAAOI;QACP,cAAc;IAClB;IAEA,OAAOX;AACX;AAKO,MAAMuB,0BAA0B,OACnC1B,SACAa,OACAE,QAEOH,sBAAsBZ,SAASa,OAAO,aAAaE;AAMvD,MAAMY,4BAA4B,OACrC3B,SACAa,OACAE,QAEOH,sBAAsBZ,SAASa,OAAO,eAAeE;AAYzD,MAAMa,iCAAiC,OAC1CC;IAEA,MAAM,EAAE7B,OAAO,EAAEa,KAAK,EAAEK,KAAK,EAAEE,KAAK,EAAE,GAAGS;IACzC,MAAMb,sBAAsBjB,2BAA2BC;IAEvD,MAAMM,mBAAmBU,oBAAoBE,MAAM,IAAI;IAEvD,OAAOZ,iBAAiB,WAAW,CAAC;QAChCO;QACAK;QACAE;QACAJ;IACJ;AACJ"}
1
+ {"version":3,"file":"utils/entryStorage.js","sources":["../../src/utils/entryStorage.ts"],"sourcesContent":["import type {\n CmsContext,\n CmsEntry,\n CmsEntryValues,\n CmsModel,\n CmsModelField\n} from \"~/types/index.js\";\nimport { StorageTransform, StorageTransformRegistry } from \"~/features/storage/index.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { getBaseFieldType } from \"~/utils/getBaseFieldType.js\";\n\nexport interface GetStorageTransformFactory {\n (context: Pick<CmsContext, \"container\">): (fieldType: string) => StorageTransform.Interface;\n}\n\nexport const getStorageTransformFactory: GetStorageTransformFactory = context => {\n const registry = context.container.resolve(StorageTransformRegistry);\n\n const result: GenericRecord<string, StorageTransform.Interface> = {};\n let defaultStorageTransform: StorageTransform.Interface;\n\n const storageTransforms = registry.getAll().toReversed();\n\n for (const storageTransform of storageTransforms) {\n if (storageTransform.fieldType === \"*\") {\n defaultStorageTransform = storageTransform;\n }\n result[storageTransform.fieldType] = storageTransform;\n }\n\n return (type: string) => {\n const fieldType = getBaseFieldType({\n type\n });\n // first we check the exact type, then the base type, and if nothing is found, we return the default storage transform.\n if (result[type]) {\n return result[type];\n } else if (fieldType !== type && result[fieldType]) {\n return result[fieldType];\n }\n return defaultStorageTransform;\n };\n};\n\nconst doNotTouchProperty = Symbol(\"__DO_NOT_TOUCH_AS_WE_USE_IT_TO_SKIP_UNNECESSARY_OPERATIONS\");\n\n/**\n * This should be used when transforming the whole entry.\n */\nconst entryStorageTransform = async <T extends CmsEntryValues = CmsEntryValues>(\n context: Pick<CmsContext, \"container\">,\n model: CmsModel,\n operation: \"toStorage\" | \"fromStorage\",\n entry: CmsEntry<T>\n): Promise<CmsEntry<T>> => {\n /**\n * We use this property to skip unnecessary operations.\n */\n // @ts-expect-error\n if (entry[doNotTouchProperty] === operation) {\n return entry;\n }\n\n const getStorageTransform = getStorageTransformFactory(context);\n\n const fieldValues = model.fields\n .filter(field => {\n return entry.values.hasOwnProperty(field.fieldId);\n })\n .map(async field => {\n const key = field.fieldId as keyof T;\n const value = entry.values[key];\n const storageTransform = getStorageTransform(field.type);\n const transformed = await storageTransform[operation]({\n model,\n field,\n value,\n getStorageTransform\n });\n return [key, transformed] as const;\n });\n\n const results = await Promise.all(fieldValues);\n const transformedValues = Object.fromEntries(results) as T;\n\n const result = {\n ...entry,\n values: transformedValues\n };\n /**\n * We need to assign the variable so that we can skip unnecessary operations next time.\n */\n Object.defineProperty(result, doNotTouchProperty, {\n enumerable: false,\n value: operation,\n configurable: true\n });\n\n return result;\n};\n\n/**\n * A function that is used in crud to transform entry into the storage type.\n */\nexport const entryToStorageTransform = async (\n context: Pick<CmsContext, \"container\">,\n model: CmsModel,\n entry: CmsEntry\n): Promise<CmsEntry> => {\n return entryStorageTransform(context, model, \"toStorage\", entry);\n};\n\n/**\n * A function that is used to transform the whole entry from storage into its native form.\n */\nexport const entryFromStorageTransform = async (\n context: Pick<CmsContext, \"container\">,\n model: CmsModel,\n entry: CmsEntry\n): Promise<CmsEntry> => {\n return entryStorageTransform(context, model, \"fromStorage\", entry);\n};\n\ninterface EntryFieldFromStorageTransformParams {\n context: Pick<CmsContext, \"container\">;\n model: CmsModel;\n field: CmsModelField;\n value: any;\n}\n/*\n * A function that is used to transform a single field from storage\n */\nexport const entryFieldFromStorageTransform = async <T = any>(\n params: EntryFieldFromStorageTransformParams\n): Promise<T> => {\n const { context, model, field, value } = params;\n const getStorageTransform = getStorageTransformFactory(context);\n\n const storageTransform = getStorageTransform(field.type);\n\n return storageTransform.fromStorage({\n model,\n field,\n value,\n getStorageTransform\n });\n};\n"],"names":["getStorageTransformFactory","context","registry","StorageTransformRegistry","result","defaultStorageTransform","storageTransforms","storageTransform","type","fieldType","getBaseFieldType","doNotTouchProperty","Symbol","entryStorageTransform","model","operation","entry","getStorageTransform","fieldValues","field","key","value","transformed","results","Promise","transformedValues","Object","entryToStorageTransform","entryFromStorageTransform","entryFieldFromStorageTransform","params"],"mappings":";;AAeO,MAAMA,6BAAyDC,CAAAA;IAClE,MAAMC,WAAWD,QAAQ,SAAS,CAAC,OAAO,CAACE;IAE3C,MAAMC,SAA4D,CAAC;IACnE,IAAIC;IAEJ,MAAMC,oBAAoBJ,SAAS,MAAM,GAAG,UAAU;IAEtD,KAAK,MAAMK,oBAAoBD,kBAAmB;QAC9C,IAAIC,AAA+B,QAA/BA,iBAAiB,SAAS,EAC1BF,0BAA0BE;QAE9BH,MAAM,CAACG,iBAAiB,SAAS,CAAC,GAAGA;IACzC;IAEA,OAAO,CAACC;QACJ,MAAMC,YAAYC,iBAAiB;YAC/BF;QACJ;QAEA,IAAIJ,MAAM,CAACI,KAAK,EACZ,OAAOJ,MAAM,CAACI,KAAK;aAChB,IAAIC,cAAcD,QAAQJ,MAAM,CAACK,UAAU,EAC9C,OAAOL,MAAM,CAACK,UAAU;QAE5B,OAAOJ;IACX;AACJ;AAEA,MAAMM,qBAAqBC,OAAO;AAKlC,MAAMC,wBAAwB,OAC1BZ,SACAa,OACAC,WACAC;IAMA,IAAIA,KAAK,CAACL,mBAAmB,KAAKI,WAC9B,OAAOC;IAGX,MAAMC,sBAAsBjB,2BAA2BC;IAEvD,MAAMiB,cAAcJ,MAAM,MAAM,CAC3B,MAAM,CAACK,CAAAA,QACGH,MAAM,MAAM,CAAC,cAAc,CAACG,MAAM,OAAO,GAEnD,GAAG,CAAC,OAAMA;QACP,MAAMC,MAAMD,MAAM,OAAO;QACzB,MAAME,QAAQL,MAAM,MAAM,CAACI,IAAI;QAC/B,MAAMb,mBAAmBU,oBAAoBE,MAAM,IAAI;QACvD,MAAMG,cAAc,MAAMf,gBAAgB,CAACQ,UAAU,CAAC;YAClDD;YACAK;YACAE;YACAJ;QACJ;QACA,OAAO;YAACG;YAAKE;SAAY;IAC7B;IAEJ,MAAMC,UAAU,MAAMC,QAAQ,GAAG,CAACN;IAClC,MAAMO,oBAAoBC,OAAO,WAAW,CAACH;IAE7C,MAAMnB,SAAS;QACX,GAAGY,KAAK;QACR,QAAQS;IACZ;IAIAC,OAAO,cAAc,CAACtB,QAAQO,oBAAoB;QAC9C,YAAY;QACZ,OAAOI;QACP,cAAc;IAClB;IAEA,OAAOX;AACX;AAKO,MAAMuB,0BAA0B,OACnC1B,SACAa,OACAE,QAEOH,sBAAsBZ,SAASa,OAAO,aAAaE;AAMvD,MAAMY,4BAA4B,OACrC3B,SACAa,OACAE,QAEOH,sBAAsBZ,SAASa,OAAO,eAAeE;AAYzD,MAAMa,iCAAiC,OAC1CC;IAEA,MAAM,EAAE7B,OAAO,EAAEa,KAAK,EAAEK,KAAK,EAAEE,KAAK,EAAE,GAAGS;IACzC,MAAMb,sBAAsBjB,2BAA2BC;IAEvD,MAAMM,mBAAmBU,oBAAoBE,MAAM,IAAI;IAEvD,OAAOZ,iBAAiB,WAAW,CAAC;QAChCO;QACAK;QACAE;QACAJ;IACJ;AACJ"}
@@ -22,7 +22,7 @@ const renderField = ({ models, model, type, field, fieldRegistry })=>{
22
22
  fieldRegistry
23
23
  });
24
24
  if (!defs) return null;
25
- if ("string" == typeof defs) return {
25
+ else if ("string" == typeof defs) return {
26
26
  fields: defs
27
27
  };
28
28
  return defs;
@@ -1 +1 @@
1
- {"version":3,"file":"utils/renderFields.js","sources":["../../src/utils/renderFields.ts"],"sourcesContent":["import type {\n ApiEndpoint,\n CmsModel,\n CmsModelField,\n CmsModelFieldDefinition\n} from \"~/types/index.js\";\nimport { getBaseFieldType } from \"~/utils/getBaseFieldType.js\";\nimport type {\n CmsModelFieldToGraphQL,\n CmsModelFieldToGraphQLRegistry\n} from \"~/features/graphql/index.js\";\n\nconst getFieldApi = (\n field: CmsModelFieldToGraphQL.Interface,\n type: ApiEndpoint\n): CmsModelFieldToGraphQL.ManageApi => {\n if (type === \"manage\") {\n return field.manage;\n }\n /* \"read\" and \"preview\" both use the read API. */\n return field.read as CmsModelFieldToGraphQL.ManageApi;\n};\n\ninterface RenderFieldsParams {\n models: CmsModel[];\n model: CmsModel;\n fields: CmsModelField[];\n type: ApiEndpoint;\n fieldRegistry: CmsModelFieldToGraphQLRegistry.Interface;\n}\n\ninterface RenderFields {\n (params: RenderFieldsParams): CmsModelFieldDefinition[];\n}\n\nexport const renderFields: RenderFields = ({\n models,\n model,\n fields,\n type,\n fieldRegistry\n}): CmsModelFieldDefinition[] => {\n return fields\n .map(field => renderField({ models, model, type, field, fieldRegistry }))\n .filter(Boolean) as CmsModelFieldDefinition[];\n};\n\ninterface RenderFieldParams extends Omit<RenderFieldsParams, \"fields\"> {\n field: CmsModelField;\n}\n\nexport const renderField = ({\n models,\n model,\n type,\n field,\n fieldRegistry\n}: RenderFieldParams): CmsModelFieldDefinition | null => {\n const plugin = fieldRegistry.get(getBaseFieldType(field));\n if (!plugin) {\n return null;\n }\n const api = getFieldApi(plugin, type);\n const { createTypeField } = api;\n const defs = createTypeField({\n models,\n model,\n field,\n fieldRegistry\n });\n\n if (!defs) {\n return null;\n } else if (typeof defs === \"string\") {\n return {\n fields: defs\n };\n }\n\n return defs;\n};\n"],"names":["getFieldApi","field","type","renderFields","models","model","fields","fieldRegistry","renderField","Boolean","plugin","getBaseFieldType","api","createTypeField","defs"],"mappings":";AAYA,MAAMA,cAAc,CAChBC,OACAC;IAEA,IAAIA,AAAS,aAATA,MACA,OAAOD,MAAM,MAAM;IAGvB,OAAOA,MAAM,IAAI;AACrB;AAcO,MAAME,eAA6B,CAAC,EACvCC,MAAM,EACNC,KAAK,EACLC,MAAM,EACNJ,IAAI,EACJK,aAAa,EAChB,GACUD,OACF,GAAG,CAACL,CAAAA,QAASO,YAAY;YAAEJ;YAAQC;YAAOH;YAAMD;YAAOM;QAAc,IACrE,MAAM,CAACE;AAOT,MAAMD,cAAc,CAAC,EACxBJ,MAAM,EACNC,KAAK,EACLH,IAAI,EACJD,KAAK,EACLM,aAAa,EACG;IAChB,MAAMG,SAASH,cAAc,GAAG,CAACI,iBAAiBV;IAClD,IAAI,CAACS,QACD,OAAO;IAEX,MAAME,MAAMZ,YAAYU,QAAQR;IAChC,MAAM,EAAEW,eAAe,EAAE,GAAGD;IAC5B,MAAME,OAAOD,gBAAgB;QACzBT;QACAC;QACAJ;QACAM;IACJ;IAEA,IAAI,CAACO,MACD,OAAO;IACJ,IAAI,AAAgB,YAAhB,OAAOA,MACd,OAAO;QACH,QAAQA;IACZ;IAGJ,OAAOA;AACX"}
1
+ {"version":3,"file":"utils/renderFields.js","sources":["../../src/utils/renderFields.ts"],"sourcesContent":["import type {\n ApiEndpoint,\n CmsModel,\n CmsModelField,\n CmsModelFieldDefinition\n} from \"~/types/index.js\";\nimport { getBaseFieldType } from \"~/utils/getBaseFieldType.js\";\nimport type {\n CmsModelFieldToGraphQL,\n CmsModelFieldToGraphQLRegistry\n} from \"~/features/graphql/index.js\";\n\nconst getFieldApi = (\n field: CmsModelFieldToGraphQL.Interface,\n type: ApiEndpoint\n): CmsModelFieldToGraphQL.ManageApi => {\n if (type === \"manage\") {\n return field.manage;\n }\n /* \"read\" and \"preview\" both use the read API. */\n return field.read as CmsModelFieldToGraphQL.ManageApi;\n};\n\ninterface RenderFieldsParams {\n models: CmsModel[];\n model: CmsModel;\n fields: CmsModelField[];\n type: ApiEndpoint;\n fieldRegistry: CmsModelFieldToGraphQLRegistry.Interface;\n}\n\ninterface RenderFields {\n (params: RenderFieldsParams): CmsModelFieldDefinition[];\n}\n\nexport const renderFields: RenderFields = ({\n models,\n model,\n fields,\n type,\n fieldRegistry\n}): CmsModelFieldDefinition[] => {\n return fields\n .map(field => renderField({ models, model, type, field, fieldRegistry }))\n .filter(Boolean) as CmsModelFieldDefinition[];\n};\n\ninterface RenderFieldParams extends Omit<RenderFieldsParams, \"fields\"> {\n field: CmsModelField;\n}\n\nexport const renderField = ({\n models,\n model,\n type,\n field,\n fieldRegistry\n}: RenderFieldParams): CmsModelFieldDefinition | null => {\n const plugin = fieldRegistry.get(getBaseFieldType(field));\n if (!plugin) {\n return null;\n }\n const api = getFieldApi(plugin, type);\n const { createTypeField } = api;\n const defs = createTypeField({\n models,\n model,\n field,\n fieldRegistry\n });\n\n if (!defs) {\n return null;\n } else if (typeof defs === \"string\") {\n return {\n fields: defs\n };\n }\n\n return defs;\n};\n"],"names":["getFieldApi","field","type","renderFields","models","model","fields","fieldRegistry","renderField","Boolean","plugin","getBaseFieldType","api","createTypeField","defs"],"mappings":";AAYA,MAAMA,cAAc,CAChBC,OACAC;IAEA,IAAIA,AAAS,aAATA,MACA,OAAOD,MAAM,MAAM;IAGvB,OAAOA,MAAM,IAAI;AACrB;AAcO,MAAME,eAA6B,CAAC,EACvCC,MAAM,EACNC,KAAK,EACLC,MAAM,EACNJ,IAAI,EACJK,aAAa,EAChB,GACUD,OACF,GAAG,CAACL,CAAAA,QAASO,YAAY;YAAEJ;YAAQC;YAAOH;YAAMD;YAAOM;QAAc,IACrE,MAAM,CAACE;AAOT,MAAMD,cAAc,CAAC,EACxBJ,MAAM,EACNC,KAAK,EACLH,IAAI,EACJD,KAAK,EACLM,aAAa,EACG;IAChB,MAAMG,SAASH,cAAc,GAAG,CAACI,iBAAiBV;IAClD,IAAI,CAACS,QACD,OAAO;IAEX,MAAME,MAAMZ,YAAYU,QAAQR;IAChC,MAAM,EAAEW,eAAe,EAAE,GAAGD;IAC5B,MAAME,OAAOD,gBAAgB;QACzBT;QACAC;QACAJ;QACAM;IACJ;IAEA,IAAI,CAACO,MACD,OAAO;SACJ,IAAI,AAAgB,YAAhB,OAAOA,MACd,OAAO;QACH,QAAQA;IACZ;IAGJ,OAAOA;AACX"}