@webiny/api-headless-cms 6.4.4-beta.0 → 6.4.4-beta.2

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.
@@ -109,20 +109,20 @@ export declare const createModelCreateValidation: () => zod.ZodObject<{
109
109
  rules: zod.ZodPipe<zod.ZodDefault<zod.ZodOptional<zod.ZodNullable<zod.ZodOptional<zod.ZodArray<zod.ZodObject<{
110
110
  type: zod.ZodEnum<{
111
111
  accessControl: "accessControl";
112
- entryValue: "entryValue";
112
+ condition: "condition";
113
113
  }>;
114
114
  target: zod.ZodString;
115
115
  operator: zod.ZodString;
116
116
  value: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber, zod.ZodBoolean, zod.ZodNull]>;
117
117
  action: zod.ZodString;
118
118
  }, zod.core.$strip>>>>>>, zod.ZodTransform<{
119
- type: "accessControl" | "entryValue";
119
+ type: "accessControl" | "condition";
120
120
  target: string;
121
121
  operator: string;
122
122
  value: string | number | boolean | null;
123
123
  action: string;
124
124
  }[], {
125
- type: "accessControl" | "entryValue";
125
+ type: "accessControl" | "condition";
126
126
  target: string;
127
127
  operator: string;
128
128
  value: string | number | boolean | null;
@@ -245,20 +245,20 @@ export declare const createModelUpdateValidation: () => zod.ZodObject<{
245
245
  rules: zod.ZodPipe<zod.ZodDefault<zod.ZodOptional<zod.ZodNullable<zod.ZodOptional<zod.ZodArray<zod.ZodObject<{
246
246
  type: zod.ZodEnum<{
247
247
  accessControl: "accessControl";
248
- entryValue: "entryValue";
248
+ condition: "condition";
249
249
  }>;
250
250
  target: zod.ZodString;
251
251
  operator: zod.ZodString;
252
252
  value: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber, zod.ZodBoolean, zod.ZodNull]>;
253
253
  action: zod.ZodString;
254
254
  }, zod.core.$strip>>>>>>, zod.ZodTransform<{
255
- type: "accessControl" | "entryValue";
255
+ type: "accessControl" | "condition";
256
256
  target: string;
257
257
  operator: string;
258
258
  value: string | number | boolean | null;
259
259
  action: string;
260
260
  }[], {
261
- type: "accessControl" | "entryValue";
261
+ type: "accessControl" | "condition";
262
262
  target: string;
263
263
  operator: string;
264
264
  value: string | number | boolean | null;
@@ -64,7 +64,7 @@ const fieldSchema = zod.object({
64
64
  rules: zod.array(zod.object({
65
65
  type: zod["enum"]([
66
66
  "accessControl",
67
- "entryValue"
67
+ "condition"
68
68
  ]),
69
69
  target: shortString,
70
70
  operator: shortString,
@@ -1 +1 @@
1
- {"version":3,"file":"domain/contentModel/schemas.js","sources":["../../../src/domain/contentModel/schemas.ts"],"sourcesContent":["import zod from \"zod\";\nimport upperFirst from \"lodash/upperFirst.js\";\nimport camelCase from \"lodash/camelCase.js\";\n\nconst str = zod.string().trim();\nconst shortString = str.max(255);\nconst longString = str;\nconst optionalShortString = shortString.optional();\nconst optionalLongString = longString.optional();\nconst optionalNullishShortString = optionalShortString.nullish().default(null);\nconst optionalNullishLongString = optionalLongString.nullish().default(null);\n\nconst icon = zod\n .looseObject({\n type: zod.string(),\n name: zod.string(),\n value: zod.string().optional()\n })\n .optional()\n .nullish()\n .default(null)\n .transform(value => {\n if (typeof value === \"string\") {\n return {\n type: \"icon\",\n name: value\n };\n }\n return value;\n });\n\nconst fieldSchema = zod.object({\n id: shortString,\n storageId: zod\n .string()\n .optional()\n .transform(() => {\n return \"\";\n }),\n fieldId: shortString\n .max(100)\n .regex(/^!?[a-zA-Z]/, {\n message: `Must not start with a number.`\n })\n .regex(/^(^[a-zA-Z0-9]+)$/, {\n message: `Must be alphanumeric string.`\n }),\n label: shortString,\n help: optionalNullishLongString,\n description: optionalNullishShortString,\n note: optionalNullishShortString,\n placeholder: optionalNullishShortString,\n type: shortString,\n tags: zod.array(shortString).optional().default([]),\n list: zod\n .boolean()\n .optional()\n .nullish()\n .transform(value => {\n return !!value;\n })\n .default(false),\n predefinedValues: zod\n .object({\n enabled: zod.boolean(),\n values: zod\n .array(\n zod.object({\n value: shortString,\n label: shortString,\n selected: zod.boolean().optional().default(false)\n })\n )\n .default([])\n })\n .default({\n enabled: false,\n values: []\n })\n .nullish()\n .optional()\n .transform(value => {\n return value || undefined;\n }),\n renderer: zod\n .object({\n name: shortString,\n settings: zod.looseObject({}).nullish().optional()\n })\n .optional()\n .nullable()\n .default(null),\n validation: zod\n .array(\n zod.object({\n name: shortString,\n message: optionalShortString.default(\"Value is required.\"),\n settings: zod\n .looseObject({})\n .optional()\n .nullish()\n .transform(value => {\n return value || {};\n })\n .default({})\n })\n )\n .nullish()\n .optional()\n .default([])\n .transform(value => value || []),\n listValidation: zod\n .array(\n zod.object({\n name: shortString,\n message: optionalShortString.default(\"Value is required.\"),\n settings: zod\n .looseObject({})\n .optional()\n .nullish()\n .transform(value => {\n return value || {};\n })\n .default({})\n })\n )\n .nullish()\n .optional()\n .default([])\n .transform(value => value || []),\n settings: zod\n .looseObject({})\n .optional()\n .nullish()\n .transform(value => {\n return value || {};\n })\n .default({}),\n rules: zod\n .array(\n zod.object({\n type: zod.enum([\"accessControl\", \"entryValue\"]),\n target: shortString,\n operator: shortString,\n value: zod.union([zod.string(), zod.number(), zod.boolean(), zod.null()]),\n action: shortString\n })\n )\n .optional()\n .nullish()\n .default([])\n .transform(value => value || [])\n});\n\nconst apiNameRefinementValidation = (value: string): boolean => {\n if (value.match(/^[A-Z]/) === null) {\n return false;\n }\n return value === upperFirst(camelCase(value));\n};\nconst refinementSingularValidationMessage = (value?: string) => {\n return {\n message: `The Singular API Name value \"${\n value || \"undefined\"\n }\" is not valid. It must in Upper First + Camel Cased form. For example: \"ArticleCategory\" or \"CarMake\".`\n };\n};\nconst refinementPluralValidationMessage = (value?: string) => {\n return {\n message: `The Plural API Name value \"${\n value || \"undefined\"\n }\" is not valid. It must in Upper First + Camel Cased form. For example: \"ArticleCategories\" or \"CarMakes\".`\n };\n};\n\nconst refineSingularApiName = (value: string, ctx: zod.RefinementCtx) => {\n if (!apiNameRefinementValidation(value)) {\n ctx.addIssue({\n code: zod.ZodIssueCode.custom,\n ...refinementSingularValidationMessage(value)\n });\n }\n};\n\nconst refinePluralApiName = (value: string, ctx: zod.RefinementCtx) => {\n if (!apiNameRefinementValidation(value)) {\n ctx.addIssue({\n code: zod.ZodIssueCode.custom,\n ...refinementPluralValidationMessage(value)\n });\n }\n};\n\nconst modelIdTransformation = (value?: string) => {\n if (!value) {\n return value;\n }\n const camelCasedValue = camelCase(value);\n if (camelCasedValue.toLowerCase() === value.toLowerCase()) {\n return value;\n }\n return camelCasedValue;\n};\n\nexport const createModelCreateValidation = () => {\n return zod.object({\n name: shortString,\n modelId: optionalShortString.transform(modelIdTransformation),\n singularApiName: shortString.min(1).superRefine(refineSingularApiName),\n pluralApiName: shortString.min(1).superRefine(refinePluralApiName),\n description: optionalNullishShortString.transform(value => {\n return value || \"\";\n }),\n group: shortString,\n icon,\n fields: zod.array(fieldSchema).default([]),\n layout: zod.array(zod.array(zod.any())).default([]),\n tags: zod.array(shortString).optional(),\n titleFieldId: optionalShortString.nullish(),\n descriptionFieldId: optionalShortString.nullish(),\n imageFieldId: optionalShortString.nullish(),\n defaultFields: zod.boolean().nullish()\n });\n};\n\nexport const createModelUpdateValidation = () => {\n return zod.object({\n name: optionalShortString,\n singularApiName: optionalShortString.superRefine((value, ctx) => {\n if (value) {\n refineSingularApiName(value, ctx);\n }\n }),\n pluralApiName: optionalShortString.superRefine((value, ctx) => {\n if (value) {\n refinePluralApiName(value, ctx);\n }\n }),\n description: optionalNullishShortString,\n group: optionalShortString,\n icon,\n fields: zod.array(fieldSchema),\n layout: zod.array(zod.array(zod.any())),\n titleFieldId: optionalShortString.nullish(),\n descriptionFieldId: optionalShortString.nullish(),\n imageFieldId: optionalShortString.nullish(),\n tags: zod.array(shortString).optional()\n });\n};\n\nexport const createModelCreateFromValidation = () => {\n return zod.object({\n name: shortString,\n modelId: optionalShortString.transform(modelIdTransformation),\n singularApiName: shortString.superRefine(refineSingularApiName),\n pluralApiName: shortString.superRefine(refinePluralApiName),\n description: optionalNullishShortString,\n group: shortString,\n icon\n });\n};\n"],"names":["str","zod","shortString","longString","optionalShortString","optionalLongString","optionalNullishShortString","optionalNullishLongString","icon","value","fieldSchema","undefined","apiNameRefinementValidation","upperFirst","camelCase","refinementSingularValidationMessage","refinementPluralValidationMessage","refineSingularApiName","ctx","refinePluralApiName","modelIdTransformation","camelCasedValue","createModelCreateValidation","createModelUpdateValidation","createModelCreateFromValidation"],"mappings":"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"}
1
+ {"version":3,"file":"domain/contentModel/schemas.js","sources":["../../../src/domain/contentModel/schemas.ts"],"sourcesContent":["import zod from \"zod\";\nimport upperFirst from \"lodash/upperFirst.js\";\nimport camelCase from \"lodash/camelCase.js\";\n\nconst str = zod.string().trim();\nconst shortString = str.max(255);\nconst longString = str;\nconst optionalShortString = shortString.optional();\nconst optionalLongString = longString.optional();\nconst optionalNullishShortString = optionalShortString.nullish().default(null);\nconst optionalNullishLongString = optionalLongString.nullish().default(null);\n\nconst icon = zod\n .looseObject({\n type: zod.string(),\n name: zod.string(),\n value: zod.string().optional()\n })\n .optional()\n .nullish()\n .default(null)\n .transform(value => {\n if (typeof value === \"string\") {\n return {\n type: \"icon\",\n name: value\n };\n }\n return value;\n });\n\nconst fieldSchema = zod.object({\n id: shortString,\n storageId: zod\n .string()\n .optional()\n .transform(() => {\n return \"\";\n }),\n fieldId: shortString\n .max(100)\n .regex(/^!?[a-zA-Z]/, {\n message: `Must not start with a number.`\n })\n .regex(/^(^[a-zA-Z0-9]+)$/, {\n message: `Must be alphanumeric string.`\n }),\n label: shortString,\n help: optionalNullishLongString,\n description: optionalNullishShortString,\n note: optionalNullishShortString,\n placeholder: optionalNullishShortString,\n type: shortString,\n tags: zod.array(shortString).optional().default([]),\n list: zod\n .boolean()\n .optional()\n .nullish()\n .transform(value => {\n return !!value;\n })\n .default(false),\n predefinedValues: zod\n .object({\n enabled: zod.boolean(),\n values: zod\n .array(\n zod.object({\n value: shortString,\n label: shortString,\n selected: zod.boolean().optional().default(false)\n })\n )\n .default([])\n })\n .default({\n enabled: false,\n values: []\n })\n .nullish()\n .optional()\n .transform(value => {\n return value || undefined;\n }),\n renderer: zod\n .object({\n name: shortString,\n settings: zod.looseObject({}).nullish().optional()\n })\n .optional()\n .nullable()\n .default(null),\n validation: zod\n .array(\n zod.object({\n name: shortString,\n message: optionalShortString.default(\"Value is required.\"),\n settings: zod\n .looseObject({})\n .optional()\n .nullish()\n .transform(value => {\n return value || {};\n })\n .default({})\n })\n )\n .nullish()\n .optional()\n .default([])\n .transform(value => value || []),\n listValidation: zod\n .array(\n zod.object({\n name: shortString,\n message: optionalShortString.default(\"Value is required.\"),\n settings: zod\n .looseObject({})\n .optional()\n .nullish()\n .transform(value => {\n return value || {};\n })\n .default({})\n })\n )\n .nullish()\n .optional()\n .default([])\n .transform(value => value || []),\n settings: zod\n .looseObject({})\n .optional()\n .nullish()\n .transform(value => {\n return value || {};\n })\n .default({}),\n rules: zod\n .array(\n zod.object({\n type: zod.enum([\"accessControl\", \"condition\"]),\n target: shortString,\n operator: shortString,\n value: zod.union([zod.string(), zod.number(), zod.boolean(), zod.null()]),\n action: shortString\n })\n )\n .optional()\n .nullish()\n .default([])\n .transform(value => value || [])\n});\n\nconst apiNameRefinementValidation = (value: string): boolean => {\n if (value.match(/^[A-Z]/) === null) {\n return false;\n }\n return value === upperFirst(camelCase(value));\n};\nconst refinementSingularValidationMessage = (value?: string) => {\n return {\n message: `The Singular API Name value \"${\n value || \"undefined\"\n }\" is not valid. It must in Upper First + Camel Cased form. For example: \"ArticleCategory\" or \"CarMake\".`\n };\n};\nconst refinementPluralValidationMessage = (value?: string) => {\n return {\n message: `The Plural API Name value \"${\n value || \"undefined\"\n }\" is not valid. It must in Upper First + Camel Cased form. For example: \"ArticleCategories\" or \"CarMakes\".`\n };\n};\n\nconst refineSingularApiName = (value: string, ctx: zod.RefinementCtx) => {\n if (!apiNameRefinementValidation(value)) {\n ctx.addIssue({\n code: zod.ZodIssueCode.custom,\n ...refinementSingularValidationMessage(value)\n });\n }\n};\n\nconst refinePluralApiName = (value: string, ctx: zod.RefinementCtx) => {\n if (!apiNameRefinementValidation(value)) {\n ctx.addIssue({\n code: zod.ZodIssueCode.custom,\n ...refinementPluralValidationMessage(value)\n });\n }\n};\n\nconst modelIdTransformation = (value?: string) => {\n if (!value) {\n return value;\n }\n const camelCasedValue = camelCase(value);\n if (camelCasedValue.toLowerCase() === value.toLowerCase()) {\n return value;\n }\n return camelCasedValue;\n};\n\nexport const createModelCreateValidation = () => {\n return zod.object({\n name: shortString,\n modelId: optionalShortString.transform(modelIdTransformation),\n singularApiName: shortString.min(1).superRefine(refineSingularApiName),\n pluralApiName: shortString.min(1).superRefine(refinePluralApiName),\n description: optionalNullishShortString.transform(value => {\n return value || \"\";\n }),\n group: shortString,\n icon,\n fields: zod.array(fieldSchema).default([]),\n layout: zod.array(zod.array(zod.any())).default([]),\n tags: zod.array(shortString).optional(),\n titleFieldId: optionalShortString.nullish(),\n descriptionFieldId: optionalShortString.nullish(),\n imageFieldId: optionalShortString.nullish(),\n defaultFields: zod.boolean().nullish()\n });\n};\n\nexport const createModelUpdateValidation = () => {\n return zod.object({\n name: optionalShortString,\n singularApiName: optionalShortString.superRefine((value, ctx) => {\n if (value) {\n refineSingularApiName(value, ctx);\n }\n }),\n pluralApiName: optionalShortString.superRefine((value, ctx) => {\n if (value) {\n refinePluralApiName(value, ctx);\n }\n }),\n description: optionalNullishShortString,\n group: optionalShortString,\n icon,\n fields: zod.array(fieldSchema),\n layout: zod.array(zod.array(zod.any())),\n titleFieldId: optionalShortString.nullish(),\n descriptionFieldId: optionalShortString.nullish(),\n imageFieldId: optionalShortString.nullish(),\n tags: zod.array(shortString).optional()\n });\n};\n\nexport const createModelCreateFromValidation = () => {\n return zod.object({\n name: shortString,\n modelId: optionalShortString.transform(modelIdTransformation),\n singularApiName: shortString.superRefine(refineSingularApiName),\n pluralApiName: shortString.superRefine(refinePluralApiName),\n description: optionalNullishShortString,\n group: shortString,\n icon\n });\n};\n"],"names":["str","zod","shortString","longString","optionalShortString","optionalLongString","optionalNullishShortString","optionalNullishLongString","icon","value","fieldSchema","undefined","apiNameRefinementValidation","upperFirst","camelCase","refinementSingularValidationMessage","refinementPluralValidationMessage","refineSingularApiName","ctx","refinePluralApiName","modelIdTransformation","camelCasedValue","createModelCreateValidation","createModelUpdateValidation","createModelCreateFromValidation"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { CmsModelField, CmsModelLayoutCell } from "../../../types/index.js";
1
+ import type { CmsModelField, CmsModelLayoutCell, FieldRule } from "../../../types/index.js";
2
2
  export interface DataFieldBuildResult {
3
3
  type: "data";
4
4
  field: CmsModelField;
@@ -15,6 +15,7 @@ export interface BaseFieldBuilderConfig {
15
15
  description?: string | null;
16
16
  note?: string | null;
17
17
  _fieldId?: string;
18
+ rules?: FieldRule[];
18
19
  }
19
20
  /**
20
21
  * Minimal shared base class for all field builders (data and layout).
@@ -30,6 +31,7 @@ export declare abstract class BaseFieldBuilder<TType extends string = string> {
30
31
  description(text: string): this;
31
32
  note(text: string): this;
32
33
  fieldId(id: string): this;
34
+ rules(rules: FieldRule[]): this;
33
35
  protected setSubType(subType: string): this;
34
36
  /**
35
37
  * Build the final field result.
@@ -31,6 +31,10 @@ class BaseFieldBuilder {
31
31
  this.config._fieldId = id;
32
32
  return this;
33
33
  }
34
+ rules(rules) {
35
+ this.config.rules = rules;
36
+ return this;
37
+ }
34
38
  setSubType(subType) {
35
39
  this._fieldSubType = subType;
36
40
  return this;
@@ -1 +1 @@
1
- {"version":3,"file":"features/modelBuilder/fields/BaseFieldBuilder.js","sources":["../../../../src/features/modelBuilder/fields/BaseFieldBuilder.ts"],"sourcesContent":["import type { CmsModelField, CmsModelLayoutCell } from \"~/types/index.js\";\n\nexport interface DataFieldBuildResult {\n type: \"data\";\n field: CmsModelField;\n}\n\nexport interface LayoutFieldBuildResult {\n type: \"layout\";\n layoutCell: CmsModelLayoutCell;\n fields?: CmsModelField[];\n}\n\nexport type FieldBuildResult = DataFieldBuildResult | LayoutFieldBuildResult;\n\nexport interface BaseFieldBuilderConfig {\n label: string;\n help?: string | null;\n description?: string | null;\n note?: string | null;\n _fieldId?: string;\n}\n\n/**\n * Minimal shared base class for all field builders (data and layout).\n */\nexport abstract class BaseFieldBuilder<TType extends string = string> {\n public readonly type: TType;\n private _fieldSubType?: string;\n protected config: BaseFieldBuilderConfig;\n\n public get subType(): string | undefined {\n return this._fieldSubType;\n }\n\n public constructor(type: TType, label?: string) {\n this.type = type;\n this.config = {\n label: label || \"\",\n help: null,\n description: null,\n note: null\n };\n }\n\n public label(text: string): this {\n this.config.label = text;\n return this;\n }\n\n public help(text: string): this {\n this.config.help = text;\n return this;\n }\n\n public description(text: string): this {\n this.config.description = text;\n return this;\n }\n\n public note(text: string): this {\n this.config.note = text;\n return this;\n }\n\n public fieldId(id: string): this {\n this.config._fieldId = id;\n return this;\n }\n\n protected setSubType(subType: string): this {\n this._fieldSubType = subType;\n return this;\n }\n\n /**\n * Build the final field result.\n * @internal\n */\n public abstract build(): FieldBuildResult;\n}\n"],"names":["BaseFieldBuilder","type","label","text","id","subType"],"mappings":"AA0BO,MAAeA;IAKlB,IAAW,UAA8B;QACrC,OAAO,IAAI,CAAC,aAAa;IAC7B;IAEA,YAAmBC,IAAW,EAAEC,KAAc,CAAE;QAC5C,IAAI,CAAC,IAAI,GAAGD;QACZ,IAAI,CAAC,MAAM,GAAG;YACV,OAAOC,SAAS;YAChB,MAAM;YACN,aAAa;YACb,MAAM;QACV;IACJ;IAEO,MAAMC,IAAY,EAAQ;QAC7B,IAAI,CAAC,MAAM,CAAC,KAAK,GAAGA;QACpB,OAAO,IAAI;IACf;IAEO,KAAKA,IAAY,EAAQ;QAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,GAAGA;QACnB,OAAO,IAAI;IACf;IAEO,YAAYA,IAAY,EAAQ;QACnC,IAAI,CAAC,MAAM,CAAC,WAAW,GAAGA;QAC1B,OAAO,IAAI;IACf;IAEO,KAAKA,IAAY,EAAQ;QAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,GAAGA;QACnB,OAAO,IAAI;IACf;IAEO,QAAQC,EAAU,EAAQ;QAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAGA;QACvB,OAAO,IAAI;IACf;IAEU,WAAWC,OAAe,EAAQ;QACxC,IAAI,CAAC,aAAa,GAAGA;QACrB,OAAO,IAAI;IACf;AAOJ"}
1
+ {"version":3,"file":"features/modelBuilder/fields/BaseFieldBuilder.js","sources":["../../../../src/features/modelBuilder/fields/BaseFieldBuilder.ts"],"sourcesContent":["import type { CmsModelField, CmsModelLayoutCell, FieldRule } from \"~/types/index.js\";\n\nexport interface DataFieldBuildResult {\n type: \"data\";\n field: CmsModelField;\n}\n\nexport interface LayoutFieldBuildResult {\n type: \"layout\";\n layoutCell: CmsModelLayoutCell;\n fields?: CmsModelField[];\n}\n\nexport type FieldBuildResult = DataFieldBuildResult | LayoutFieldBuildResult;\n\nexport interface BaseFieldBuilderConfig {\n label: string;\n help?: string | null;\n description?: string | null;\n note?: string | null;\n _fieldId?: string;\n rules?: FieldRule[];\n}\n\n/**\n * Minimal shared base class for all field builders (data and layout).\n */\nexport abstract class BaseFieldBuilder<TType extends string = string> {\n public readonly type: TType;\n private _fieldSubType?: string;\n protected config: BaseFieldBuilderConfig;\n\n public get subType(): string | undefined {\n return this._fieldSubType;\n }\n\n public constructor(type: TType, label?: string) {\n this.type = type;\n this.config = {\n label: label || \"\",\n help: null,\n description: null,\n note: null\n };\n }\n\n public label(text: string): this {\n this.config.label = text;\n return this;\n }\n\n public help(text: string): this {\n this.config.help = text;\n return this;\n }\n\n public description(text: string): this {\n this.config.description = text;\n return this;\n }\n\n public note(text: string): this {\n this.config.note = text;\n return this;\n }\n\n public fieldId(id: string): this {\n this.config._fieldId = id;\n return this;\n }\n\n public rules(rules: FieldRule[]): this {\n this.config.rules = rules;\n return this;\n }\n\n protected setSubType(subType: string): this {\n this._fieldSubType = subType;\n return this;\n }\n\n /**\n * Build the final field result.\n * @internal\n */\n public abstract build(): FieldBuildResult;\n}\n"],"names":["BaseFieldBuilder","type","label","text","id","rules","subType"],"mappings":"AA2BO,MAAeA;IAKlB,IAAW,UAA8B;QACrC,OAAO,IAAI,CAAC,aAAa;IAC7B;IAEA,YAAmBC,IAAW,EAAEC,KAAc,CAAE;QAC5C,IAAI,CAAC,IAAI,GAAGD;QACZ,IAAI,CAAC,MAAM,GAAG;YACV,OAAOC,SAAS;YAChB,MAAM;YACN,aAAa;YACb,MAAM;QACV;IACJ;IAEO,MAAMC,IAAY,EAAQ;QAC7B,IAAI,CAAC,MAAM,CAAC,KAAK,GAAGA;QACpB,OAAO,IAAI;IACf;IAEO,KAAKA,IAAY,EAAQ;QAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,GAAGA;QACnB,OAAO,IAAI;IACf;IAEO,YAAYA,IAAY,EAAQ;QACnC,IAAI,CAAC,MAAM,CAAC,WAAW,GAAGA;QAC1B,OAAO,IAAI;IACf;IAEO,KAAKA,IAAY,EAAQ;QAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,GAAGA;QACnB,OAAO,IAAI;IACf;IAEO,QAAQC,EAAU,EAAQ;QAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAGA;QACvB,OAAO,IAAI;IACf;IAEO,MAAMC,KAAkB,EAAQ;QACnC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAGA;QACpB,OAAO,IAAI;IACf;IAEU,WAAWC,OAAe,EAAQ;QACxC,IAAI,CAAC,aAAa,GAAGA;QACrB,OAAO,IAAI;IACf;AAOJ"}
@@ -157,7 +157,8 @@ class DataFieldBuilder extends BaseFieldBuilder {
157
157
  note: this.config.note || null,
158
158
  renderer: this.config.renderer || null,
159
159
  settings: this.config.settings || {},
160
- tags: this.config.tags || []
160
+ tags: this.config.tags || [],
161
+ rules: this.config.rules
161
162
  }
162
163
  };
163
164
  }
@@ -1 +1 @@
1
- {"version":3,"file":"features/modelBuilder/fields/DataFieldBuilder.js","sources":["../../../../src/features/modelBuilder/fields/DataFieldBuilder.ts"],"sourcesContent":["import camelCase from \"lodash/camelCase.js\";\nimport type {\n CmsModelField,\n CmsModelFieldPredefinedValues,\n CmsModelFieldValidation\n} from \"~/types/index.js\";\nimport { getBaseFieldType } from \"~/utils/getBaseFieldType.js\";\nimport { BaseFieldBuilder, type DataFieldBuildResult } from \"./BaseFieldBuilder.js\";\n\nexport interface FieldBuilderConfig extends Omit<\n CmsModelField,\n \"id\" | \"fieldId\" | \"storageId\" | \"type\"\n> {\n _storageId?: string;\n _fieldId?: string;\n description?: string | null;\n note?: string | null;\n}\n\n/**\n * Augmentable renderer registry. Each entry maps a renderer name to its applicable field type(s) and settings.\n */\nexport interface IFieldRendererRegistry {\n switch: {\n fieldType: \"boolean\";\n settings: undefined;\n };\n checkboxes: {\n fieldType: \"text\" | \"number\";\n settings: undefined;\n };\n dateTimeInput: {\n fieldType: \"datetime\";\n settings: undefined;\n };\n dateTimeInputs: {\n fieldType: \"datetime\";\n settings?: {\n multiValue?: {\n addValueButtonLabel?: string;\n };\n };\n };\n dynamicZone: {\n fieldType: \"dynamicZone\";\n settings?: {\n open?: boolean;\n };\n };\n hidden: {\n fieldType: string;\n settings: undefined;\n };\n lexicalEditor: {\n fieldType: \"rich-text\";\n settings: undefined;\n };\n lexicalEditors: {\n fieldType: \"rich-text\";\n settings?: {\n multiValue?: {\n addValueButtonLabel?: string;\n };\n };\n };\n textarea: {\n fieldType: \"long-text\";\n settings: undefined;\n };\n textareas: {\n fieldType: \"long-text\";\n settings: {\n multiValue?: {\n addValueButtonLabel?: string;\n };\n };\n };\n numberInput: {\n fieldType: \"number\";\n settings: undefined;\n };\n numberInputs: {\n fieldType: \"number\";\n settings?: {\n multiValue?: {\n addValueButtonLabel?: string;\n };\n };\n };\n objectAccordionSingle: {\n fieldType: \"object\";\n settings?: {\n open?: boolean;\n };\n };\n objectAccordionMultiple: {\n fieldType: \"object\";\n settings?: {\n open?: boolean;\n multiValue?: {\n addValueButtonLabel?: string;\n };\n };\n };\n passthrough: {\n fieldType: string;\n settings: undefined;\n };\n radioButtons: {\n fieldType: \"text\" | \"number\";\n settings: undefined;\n };\n refDialogSingle: {\n fieldType: \"ref\";\n settings: undefined;\n };\n refDialogMultiple: {\n fieldType: \"ref\";\n settings?: {\n newItemPosition?: \"first\" | \"last\";\n };\n };\n refAutocompleteSingle: {\n fieldType: \"ref\";\n settings: undefined;\n };\n refAutocompleteMultiple: {\n fieldType: \"ref\";\n settings: undefined;\n };\n refCheckboxes: {\n fieldType: \"ref\";\n settings: undefined;\n };\n refRadioButtons: {\n fieldType: \"ref\";\n settings: undefined;\n };\n dropdown: {\n fieldType: \"text\" | \"number\";\n settings: undefined;\n };\n tags: {\n fieldType: \"text\";\n settings: undefined;\n };\n textInput: {\n fieldType: \"text\";\n settings: undefined;\n };\n textInputs: {\n fieldType: \"text\";\n settings?: {\n multiValue?: {\n addValueButtonLabel?: string;\n };\n };\n };\n file: {\n fieldType: \"file\";\n settings?: {\n imagesOnly?: boolean;\n };\n };\n files: {\n fieldType: \"file\";\n settings?: {\n imagesOnly?: boolean;\n };\n };\n uiSeparator: {\n fieldType: \"ui\";\n settings: undefined;\n };\n uiAlert: {\n fieldType: \"ui\";\n settings: {\n type: \"info\" | \"success\" | \"warning\" | \"danger\";\n };\n };\n uiTabs: {\n fieldType: \"ui\";\n settings: undefined;\n };\n}\n\n/**\n * Maps camelCase renderer names (used in the builder API) to the\n * kebab-case names expected by the frontend renderer registry.\n */\nconst rendererNameMap: Record<keyof IFieldRendererRegistry, string> = {\n switch: \"boolean-input\",\n checkboxes: \"checkboxes\",\n dateTimeInput: \"date-time-input\",\n dateTimeInputs: \"date-time-inputs\",\n dynamicZone: \"dynamicZone\",\n hidden: \"hidden\",\n lexicalEditor: \"lexical-text-input\",\n lexicalEditors: \"lexical-text-inputs\",\n textarea: \"long-text-text-area\",\n textareas: \"long-text-inputs\",\n numberInput: \"number-input\",\n numberInputs: \"number-inputs\",\n objectAccordionSingle: \"object-accordion\",\n objectAccordionMultiple: \"objects-accordion\",\n passthrough: \"passthrough\",\n radioButtons: \"radio-buttons\",\n refDialogSingle: \"ref-advanced-single\",\n refDialogMultiple: \"ref-advanced-multiple\",\n refAutocompleteSingle: \"ref-input\",\n refAutocompleteMultiple: \"ref-inputs\",\n refCheckboxes: \"ref-simple-multiple\",\n refRadioButtons: \"ref-simple-single\",\n dropdown: \"select-box\",\n tags: \"tags\",\n textInput: \"text-input\",\n textInputs: \"text-inputs\",\n file: \"file-input\",\n files: \"file-inputs\",\n uiSeparator: \"uiSeparator\",\n uiAlert: \"uiAlert\",\n uiTabs: \"uiTabs\"\n};\n\n/**\n * Resolves a camelCase renderer name to the kebab-case name used by the frontend.\n */\nfunction resolveRendererName(name: string): string {\n return rendererNameMap[name as keyof IFieldRendererRegistry] ?? name;\n}\n\n/**\n * Extracts renderer names valid for the given field type.\n * When TType is a broad `string`, all renderer names are returned.\n */\nexport type FieldRendererName<TType extends string = string> = string extends TType\n ? keyof IFieldRendererRegistry & string\n : {\n [K in keyof IFieldRendererRegistry]: TType extends IFieldRendererRegistry[K][\"fieldType\"]\n ? K\n : never;\n }[keyof IFieldRendererRegistry] &\n string;\n\nexport type FieldRendererSettings<TName extends string> = TName extends keyof IFieldRendererRegistry\n ? IFieldRendererRegistry[TName][\"settings\"]\n : Record<string, any> | undefined;\n\n/**\n * DataFieldBuilder class for data fields that produce CmsModelField instances.\n * Provides storageId, list, validation, renderer, and other data-field methods.\n */\nexport class DataFieldBuilder<TType extends string = string> extends BaseFieldBuilder<TType> {\n protected override config: FieldBuilderConfig;\n\n public constructor(type: TType, label?: string) {\n super(type, label);\n this.config = {\n label: label || \"\",\n validation: [],\n listValidation: [],\n list: false,\n predefinedValues: {\n enabled: false,\n values: []\n },\n help: null,\n placeholder: null,\n description: null,\n note: null,\n renderer: null,\n settings: {},\n tags: []\n };\n }\n\n placeholder(text: string): this {\n this.config.placeholder = text;\n return this;\n }\n\n storageId(id: string): this {\n // We do not allow developers to specify the field type!\n this.config._storageId = id.split(\"@\").pop();\n return this;\n }\n\n defaultValue(value: any): this {\n this.config.settings = { ...this.config.settings, defaultValue: value };\n return this;\n }\n\n list(): this {\n this.config.list = true;\n return this as this;\n }\n\n tags(tags: string[]): this {\n this.config.tags = tags;\n return this;\n }\n\n /**\n * List validators - these methods are available after calling list()\n */\n listMinLength(value: number, message?: string): this {\n return this.listValidation({\n name: \"minLength\",\n message: message || `At least ${value} item(s) required.`,\n settings: { value }\n });\n }\n\n listMaxLength(value: number, message?: string): this {\n return this.listValidation({\n name: \"maxLength\",\n message: message || `At most ${value} item(s) allowed.`,\n settings: { value }\n });\n }\n\n /**\n * Add a validation rule to this field.\n * This method is protected and should only be used by field-specific validator methods.\n * @internal\n */\n protected validation(validation: CmsModelFieldValidation): this {\n this.config.validation = this.config.validation || [];\n this.config.validation.push(validation);\n return this;\n }\n\n /**\n * Add a list validation rule to this field (for list fields).\n * This method is protected and should only be used by field-specific validator methods.\n * @internal\n */\n protected listValidation(validation: CmsModelFieldValidation): this {\n this.config.listValidation = this.config.listValidation || [];\n this.config.listValidation.push(validation);\n return this;\n }\n\n predefinedValues(values: CmsModelFieldPredefinedValues[\"values\"]): this {\n this.config.predefinedValues = {\n enabled: true,\n values\n };\n return this;\n }\n\n renderer<TName extends FieldRendererName<TType>>(\n name: TName,\n ...args: undefined extends FieldRendererSettings<TName>\n ? [settings?: FieldRendererSettings<TName>]\n : FieldRendererSettings<TName> extends undefined\n ? []\n : [settings: FieldRendererSettings<TName>]\n ): this {\n this.config.renderer = {\n name: resolveRendererName(name),\n settings: args[0] ?? null\n };\n return this;\n }\n\n settings(settings: Record<string, any>): this {\n this.config.settings = { ...this.config.settings, ...settings };\n return this;\n }\n\n /**\n * Build the final CmsModelField\n * @internal\n */\n build(): DataFieldBuildResult {\n const fieldId = this.config._fieldId || camelCase(this.config.label);\n const baseType = getBaseFieldType({\n type: this.type\n });\n const storageId = `${baseType}@${this.config._storageId ?? fieldId}`;\n\n return {\n type: \"data\",\n field: {\n id: fieldId,\n fieldId,\n storageId,\n type: this.getFieldType(),\n label: this.config.label,\n validation: this.config.validation || [],\n listValidation: this.config.listValidation || [],\n list: this.config.list || false,\n predefinedValues: this.config.predefinedValues || {\n enabled: false,\n values: []\n },\n help: this.config.help || null,\n placeholder: this.config.placeholder || null,\n description: this.config.description || null,\n note: this.config.note || null,\n renderer: this.config.renderer || null,\n settings: this.config.settings || {},\n tags: this.config.tags || []\n }\n };\n }\n\n private getFieldType(): string {\n if (!this.subType?.length) {\n return this.type;\n }\n return `${this.type}:${this.subType}`;\n }\n}\n"],"names":["rendererNameMap","resolveRendererName","name","DataFieldBuilder","BaseFieldBuilder","type","label","text","id","value","tags","message","validation","values","args","settings","fieldId","camelCase","baseType","getBaseFieldType","storageId"],"mappings":"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"}
1
+ {"version":3,"file":"features/modelBuilder/fields/DataFieldBuilder.js","sources":["../../../../src/features/modelBuilder/fields/DataFieldBuilder.ts"],"sourcesContent":["import camelCase from \"lodash/camelCase.js\";\nimport type {\n CmsModelField,\n CmsModelFieldPredefinedValues,\n CmsModelFieldValidation\n} from \"~/types/index.js\";\nimport { getBaseFieldType } from \"~/utils/getBaseFieldType.js\";\nimport { BaseFieldBuilder, type DataFieldBuildResult } from \"./BaseFieldBuilder.js\";\n\nexport interface FieldBuilderConfig extends Omit<\n CmsModelField,\n \"id\" | \"fieldId\" | \"storageId\" | \"type\"\n> {\n _storageId?: string;\n _fieldId?: string;\n description?: string | null;\n note?: string | null;\n}\n\n/**\n * Augmentable renderer registry. Each entry maps a renderer name to its applicable field type(s) and settings.\n */\nexport interface IFieldRendererRegistry {\n switch: {\n fieldType: \"boolean\";\n settings: undefined;\n };\n checkboxes: {\n fieldType: \"text\" | \"number\";\n settings: undefined;\n };\n dateTimeInput: {\n fieldType: \"datetime\";\n settings: undefined;\n };\n dateTimeInputs: {\n fieldType: \"datetime\";\n settings?: {\n multiValue?: {\n addValueButtonLabel?: string;\n };\n };\n };\n dynamicZone: {\n fieldType: \"dynamicZone\";\n settings?: {\n open?: boolean;\n };\n };\n hidden: {\n fieldType: string;\n settings: undefined;\n };\n lexicalEditor: {\n fieldType: \"rich-text\";\n settings: undefined;\n };\n lexicalEditors: {\n fieldType: \"rich-text\";\n settings?: {\n multiValue?: {\n addValueButtonLabel?: string;\n };\n };\n };\n textarea: {\n fieldType: \"long-text\";\n settings: undefined;\n };\n textareas: {\n fieldType: \"long-text\";\n settings: {\n multiValue?: {\n addValueButtonLabel?: string;\n };\n };\n };\n numberInput: {\n fieldType: \"number\";\n settings: undefined;\n };\n numberInputs: {\n fieldType: \"number\";\n settings?: {\n multiValue?: {\n addValueButtonLabel?: string;\n };\n };\n };\n objectAccordionSingle: {\n fieldType: \"object\";\n settings?: {\n open?: boolean;\n };\n };\n objectAccordionMultiple: {\n fieldType: \"object\";\n settings?: {\n open?: boolean;\n multiValue?: {\n addValueButtonLabel?: string;\n };\n };\n };\n passthrough: {\n fieldType: string;\n settings: undefined;\n };\n radioButtons: {\n fieldType: \"text\" | \"number\";\n settings: undefined;\n };\n refDialogSingle: {\n fieldType: \"ref\";\n settings: undefined;\n };\n refDialogMultiple: {\n fieldType: \"ref\";\n settings?: {\n newItemPosition?: \"first\" | \"last\";\n };\n };\n refAutocompleteSingle: {\n fieldType: \"ref\";\n settings: undefined;\n };\n refAutocompleteMultiple: {\n fieldType: \"ref\";\n settings: undefined;\n };\n refCheckboxes: {\n fieldType: \"ref\";\n settings: undefined;\n };\n refRadioButtons: {\n fieldType: \"ref\";\n settings: undefined;\n };\n dropdown: {\n fieldType: \"text\" | \"number\";\n settings: undefined;\n };\n tags: {\n fieldType: \"text\";\n settings: undefined;\n };\n textInput: {\n fieldType: \"text\";\n settings: undefined;\n };\n textInputs: {\n fieldType: \"text\";\n settings?: {\n multiValue?: {\n addValueButtonLabel?: string;\n };\n };\n };\n file: {\n fieldType: \"file\";\n settings?: {\n imagesOnly?: boolean;\n };\n };\n files: {\n fieldType: \"file\";\n settings?: {\n imagesOnly?: boolean;\n };\n };\n uiSeparator: {\n fieldType: \"ui\";\n settings: undefined;\n };\n uiAlert: {\n fieldType: \"ui\";\n settings: {\n type: \"info\" | \"success\" | \"warning\" | \"danger\";\n };\n };\n uiTabs: {\n fieldType: \"ui\";\n settings: undefined;\n };\n}\n\n/**\n * Maps camelCase renderer names (used in the builder API) to the\n * kebab-case names expected by the frontend renderer registry.\n */\nconst rendererNameMap: Record<keyof IFieldRendererRegistry, string> = {\n switch: \"boolean-input\",\n checkboxes: \"checkboxes\",\n dateTimeInput: \"date-time-input\",\n dateTimeInputs: \"date-time-inputs\",\n dynamicZone: \"dynamicZone\",\n hidden: \"hidden\",\n lexicalEditor: \"lexical-text-input\",\n lexicalEditors: \"lexical-text-inputs\",\n textarea: \"long-text-text-area\",\n textareas: \"long-text-inputs\",\n numberInput: \"number-input\",\n numberInputs: \"number-inputs\",\n objectAccordionSingle: \"object-accordion\",\n objectAccordionMultiple: \"objects-accordion\",\n passthrough: \"passthrough\",\n radioButtons: \"radio-buttons\",\n refDialogSingle: \"ref-advanced-single\",\n refDialogMultiple: \"ref-advanced-multiple\",\n refAutocompleteSingle: \"ref-input\",\n refAutocompleteMultiple: \"ref-inputs\",\n refCheckboxes: \"ref-simple-multiple\",\n refRadioButtons: \"ref-simple-single\",\n dropdown: \"select-box\",\n tags: \"tags\",\n textInput: \"text-input\",\n textInputs: \"text-inputs\",\n file: \"file-input\",\n files: \"file-inputs\",\n uiSeparator: \"uiSeparator\",\n uiAlert: \"uiAlert\",\n uiTabs: \"uiTabs\"\n};\n\n/**\n * Resolves a camelCase renderer name to the kebab-case name used by the frontend.\n */\nfunction resolveRendererName(name: string): string {\n return rendererNameMap[name as keyof IFieldRendererRegistry] ?? name;\n}\n\n/**\n * Extracts renderer names valid for the given field type.\n * When TType is a broad `string`, all renderer names are returned.\n */\nexport type FieldRendererName<TType extends string = string> = string extends TType\n ? keyof IFieldRendererRegistry & string\n : {\n [K in keyof IFieldRendererRegistry]: TType extends IFieldRendererRegistry[K][\"fieldType\"]\n ? K\n : never;\n }[keyof IFieldRendererRegistry] &\n string;\n\nexport type FieldRendererSettings<TName extends string> = TName extends keyof IFieldRendererRegistry\n ? IFieldRendererRegistry[TName][\"settings\"]\n : Record<string, any> | undefined;\n\n/**\n * DataFieldBuilder class for data fields that produce CmsModelField instances.\n * Provides storageId, list, validation, renderer, and other data-field methods.\n */\nexport class DataFieldBuilder<TType extends string = string> extends BaseFieldBuilder<TType> {\n protected override config: FieldBuilderConfig;\n\n public constructor(type: TType, label?: string) {\n super(type, label);\n this.config = {\n label: label || \"\",\n validation: [],\n listValidation: [],\n list: false,\n predefinedValues: {\n enabled: false,\n values: []\n },\n help: null,\n placeholder: null,\n description: null,\n note: null,\n renderer: null,\n settings: {},\n tags: []\n };\n }\n\n placeholder(text: string): this {\n this.config.placeholder = text;\n return this;\n }\n\n storageId(id: string): this {\n // We do not allow developers to specify the field type!\n this.config._storageId = id.split(\"@\").pop();\n return this;\n }\n\n defaultValue(value: any): this {\n this.config.settings = { ...this.config.settings, defaultValue: value };\n return this;\n }\n\n list(): this {\n this.config.list = true;\n return this as this;\n }\n\n tags(tags: string[]): this {\n this.config.tags = tags;\n return this;\n }\n\n /**\n * List validators - these methods are available after calling list()\n */\n listMinLength(value: number, message?: string): this {\n return this.listValidation({\n name: \"minLength\",\n message: message || `At least ${value} item(s) required.`,\n settings: { value }\n });\n }\n\n listMaxLength(value: number, message?: string): this {\n return this.listValidation({\n name: \"maxLength\",\n message: message || `At most ${value} item(s) allowed.`,\n settings: { value }\n });\n }\n\n /**\n * Add a validation rule to this field.\n * This method is protected and should only be used by field-specific validator methods.\n * @internal\n */\n protected validation(validation: CmsModelFieldValidation): this {\n this.config.validation = this.config.validation || [];\n this.config.validation.push(validation);\n return this;\n }\n\n /**\n * Add a list validation rule to this field (for list fields).\n * This method is protected and should only be used by field-specific validator methods.\n * @internal\n */\n protected listValidation(validation: CmsModelFieldValidation): this {\n this.config.listValidation = this.config.listValidation || [];\n this.config.listValidation.push(validation);\n return this;\n }\n\n predefinedValues(values: CmsModelFieldPredefinedValues[\"values\"]): this {\n this.config.predefinedValues = {\n enabled: true,\n values\n };\n return this;\n }\n\n renderer<TName extends FieldRendererName<TType>>(\n name: TName,\n ...args: undefined extends FieldRendererSettings<TName>\n ? [settings?: FieldRendererSettings<TName>]\n : FieldRendererSettings<TName> extends undefined\n ? []\n : [settings: FieldRendererSettings<TName>]\n ): this {\n this.config.renderer = {\n name: resolveRendererName(name),\n settings: args[0] ?? null\n };\n return this;\n }\n\n settings(settings: Record<string, any>): this {\n this.config.settings = { ...this.config.settings, ...settings };\n return this;\n }\n\n /**\n * Build the final CmsModelField\n * @internal\n */\n build(): DataFieldBuildResult {\n const fieldId = this.config._fieldId || camelCase(this.config.label);\n const baseType = getBaseFieldType({\n type: this.type\n });\n const storageId = `${baseType}@${this.config._storageId ?? fieldId}`;\n\n return {\n type: \"data\",\n field: {\n id: fieldId,\n fieldId,\n storageId,\n type: this.getFieldType(),\n label: this.config.label,\n validation: this.config.validation || [],\n listValidation: this.config.listValidation || [],\n list: this.config.list || false,\n predefinedValues: this.config.predefinedValues || {\n enabled: false,\n values: []\n },\n help: this.config.help || null,\n placeholder: this.config.placeholder || null,\n description: this.config.description || null,\n note: this.config.note || null,\n renderer: this.config.renderer || null,\n settings: this.config.settings || {},\n tags: this.config.tags || [],\n rules: this.config.rules\n }\n };\n }\n\n private getFieldType(): string {\n if (!this.subType?.length) {\n return this.type;\n }\n return `${this.type}:${this.subType}`;\n }\n}\n"],"names":["rendererNameMap","resolveRendererName","name","DataFieldBuilder","BaseFieldBuilder","type","label","text","id","value","tags","message","validation","values","args","settings","fieldId","camelCase","baseType","getBaseFieldType","storageId"],"mappings":"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"}
@@ -14,12 +14,17 @@ class DynamicZoneFieldBuilder extends DataFieldBuilder {
14
14
  template(id, config) {
15
15
  const fieldBuilders = config.fields(this.registry);
16
16
  const fields = [];
17
+ const layoutReplacements = new Map();
17
18
  for (const [key, fieldBuilder] of Object.entries(fieldBuilders)){
18
19
  fieldBuilder.fieldId(key);
19
20
  const result = fieldBuilder.build();
20
- if ("data" === result.type) fields.push(result.field);
21
- else if (result.fields) fields.push(...result.fields);
21
+ if ("layout" === result.type) {
22
+ layoutReplacements.set(key, result.layoutCell);
23
+ if (result.fields) fields.push(...result.fields);
24
+ } else fields.push(result.field);
22
25
  }
26
+ const rawLayout = config.layout || [];
27
+ const layout = rawLayout.map((row)=>row.map((cell)=>layoutReplacements.get(cell) ?? cell));
23
28
  this.templates.push({
24
29
  id,
25
30
  name: config.name,
@@ -27,7 +32,7 @@ class DynamicZoneFieldBuilder extends DataFieldBuilder {
27
32
  icon: config.icon,
28
33
  description: config.description || "",
29
34
  fields,
30
- layout: config.layout || [],
35
+ layout,
31
36
  validation: []
32
37
  });
33
38
  return this;
@@ -1 +1 @@
1
- {"version":3,"file":"features/modelBuilder/fields/DynamicZoneFieldType.js","sources":["../../../../src/features/modelBuilder/fields/DynamicZoneFieldType.ts"],"sourcesContent":["import { FieldType, type IFieldTypeFactory } from \"./abstractions.js\";\nimport { type FieldBuildResult } from \"./BaseFieldBuilder.js\";\nimport { DataFieldBuilder, type BaseFieldBuilder } from \"./FieldBuilder.js\";\nimport { type IFieldBuilderRegistry } from \"../abstractions.js\";\nimport type { CmsIcon, CmsModelField, CmsModelFieldValidation } from \"~/types/index.js\";\n\ninterface IDynamicZoneTemplate {\n id: string;\n name: string;\n gqlTypeName: string;\n icon: CmsIcon | undefined;\n description: string;\n fields: any[];\n layout: string[][];\n validation: CmsModelFieldValidation[];\n}\n\nexport interface IDynamicZoneFieldBuilder extends DataFieldBuilder<\"dynamicZone\"> {\n required(message?: string): this;\n template(\n id: string,\n config: {\n name: string;\n gqlTypeName: string;\n icon?: CmsIcon;\n description?: string;\n fields: (registry: IFieldBuilderRegistry) => Record<string, BaseFieldBuilder<any>>;\n layout?: string[][];\n }\n ): this;\n}\n\ninterface IDynamicZoneFieldBuilderTemplateConfig {\n name: string;\n gqlTypeName: string;\n icon?: CmsIcon;\n description?: string;\n fields: (registry: IFieldBuilderRegistry) => Record<string, BaseFieldBuilder<any>>;\n layout?: string[][];\n}\n\nclass DynamicZoneFieldBuilder\n extends DataFieldBuilder<\"dynamicZone\">\n implements IDynamicZoneFieldBuilder\n{\n private readonly templates: IDynamicZoneTemplate[] = [];\n\n public constructor(private registry: IFieldBuilderRegistry) {\n super(\"dynamicZone\");\n }\n\n public required(message?: string): this {\n return this.validation({\n name: \"required\",\n message: message || \"Field is required\",\n settings: {}\n });\n }\n\n public template(id: string, config: IDynamicZoneFieldBuilderTemplateConfig): this {\n const fieldBuilders = config.fields(this.registry);\n const fields: CmsModelField[] = [];\n\n for (const [key, fieldBuilder] of Object.entries(fieldBuilders)) {\n fieldBuilder.fieldId(key);\n const result: FieldBuildResult = (fieldBuilder as any).build();\n if (result.type === \"data\") {\n fields.push(result.field);\n } else if (result.fields) {\n fields.push(...result.fields);\n }\n }\n\n this.templates.push({\n id,\n name: config.name,\n gqlTypeName: config.gqlTypeName,\n icon: config.icon,\n description: config.description || \"\",\n fields,\n layout: config.layout || [],\n validation: []\n });\n\n return this;\n }\n\n public override build() {\n // Set templates in settings before building\n this.config.settings = this.config.settings || {};\n this.config.settings.templates = this.templates;\n this.config.listValidation = [{ name: \"dynamicZone\", message: \"\" }];\n return super.build();\n }\n}\n\nclass DynamicZoneFieldTypeFactory implements IFieldTypeFactory {\n public readonly type = \"dynamicZone\";\n\n public create(registry: IFieldBuilderRegistry): IDynamicZoneFieldBuilder {\n return new DynamicZoneFieldBuilder(registry);\n }\n}\n\nexport const DynamicZoneFieldType = FieldType.createImplementation({\n implementation: DynamicZoneFieldTypeFactory,\n dependencies: []\n});\n\n// Module augmentation for TypeScript autocomplete\ndeclare module \"../abstractions.js\" {\n interface IFieldBuilderRegistry {\n dynamicZone(): IDynamicZoneFieldBuilder;\n }\n}\n"],"names":["DynamicZoneFieldBuilder","DataFieldBuilder","registry","message","id","config","fieldBuilders","fields","key","fieldBuilder","Object","result","DynamicZoneFieldTypeFactory","DynamicZoneFieldType","FieldType"],"mappings":";;AAyCA,MAAMA,gCACMC;IAKR,YAA2BC,QAA+B,CAAE;QACxD,KAAK,CAAC,qBADiBA,QAAQ,GAARA,UAAAA,IAAAA,CAFV,SAAS,GAA2B,EAAE;IAIvD;IAEO,SAASC,OAAgB,EAAQ;QACpC,OAAO,IAAI,CAAC,UAAU,CAAC;YACnB,MAAM;YACN,SAASA,WAAW;YACpB,UAAU,CAAC;QACf;IACJ;IAEO,SAASC,EAAU,EAAEC,MAA8C,EAAQ;QAC9E,MAAMC,gBAAgBD,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ;QACjD,MAAME,SAA0B,EAAE;QAElC,KAAK,MAAM,CAACC,KAAKC,aAAa,IAAIC,OAAO,OAAO,CAACJ,eAAgB;YAC7DG,aAAa,OAAO,CAACD;YACrB,MAAMG,SAA4BF,aAAqB,KAAK;YAC5D,IAAIE,AAAgB,WAAhBA,OAAO,IAAI,EACXJ,OAAO,IAAI,CAACI,OAAO,KAAK;iBACrB,IAAIA,OAAO,MAAM,EACpBJ,OAAO,IAAI,IAAII,OAAO,MAAM;QAEpC;QAEA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAChBP;YACA,MAAMC,OAAO,IAAI;YACjB,aAAaA,OAAO,WAAW;YAC/B,MAAMA,OAAO,IAAI;YACjB,aAAaA,OAAO,WAAW,IAAI;YACnCE;YACA,QAAQF,OAAO,MAAM,IAAI,EAAE;YAC3B,YAAY,EAAE;QAClB;QAEA,OAAO,IAAI;IACf;IAEgB,QAAQ;QAEpB,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;QAC/C,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG;YAAC;gBAAE,MAAM;gBAAe,SAAS;YAAG;SAAE;QACnE,OAAO,KAAK,CAAC;IACjB;AACJ;AAEA,MAAMO;IAGK,OAAOV,QAA+B,EAA4B;QACrE,OAAO,IAAIF,wBAAwBE;IACvC;;aAJgB,IAAI,GAAG;;AAK3B;AAEO,MAAMW,uBAAuBC,UAAU,oBAAoB,CAAC;IAC/D,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
1
+ {"version":3,"file":"features/modelBuilder/fields/DynamicZoneFieldType.js","sources":["../../../../src/features/modelBuilder/fields/DynamicZoneFieldType.ts"],"sourcesContent":["import { FieldType, type IFieldTypeFactory } from \"./abstractions.js\";\nimport { type FieldBuildResult } from \"./BaseFieldBuilder.js\";\nimport { DataFieldBuilder, type BaseFieldBuilder } from \"./FieldBuilder.js\";\nimport { type IFieldBuilderRegistry } from \"../abstractions.js\";\nimport type {\n CmsIcon,\n CmsModelField,\n CmsModelFieldValidation,\n CmsModelLayoutCell\n} from \"~/types/index.js\";\n\ninterface IDynamicZoneTemplate {\n id: string;\n name: string;\n gqlTypeName: string;\n icon: CmsIcon | undefined;\n description: string;\n fields: any[];\n layout: CmsModelLayoutCell[][];\n validation: CmsModelFieldValidation[];\n}\n\nexport interface IDynamicZoneFieldBuilder extends DataFieldBuilder<\"dynamicZone\"> {\n required(message?: string): this;\n template(\n id: string,\n config: {\n name: string;\n gqlTypeName: string;\n icon?: CmsIcon;\n description?: string;\n fields: (registry: IFieldBuilderRegistry) => Record<string, BaseFieldBuilder<any>>;\n layout?: string[][];\n }\n ): this;\n}\n\ninterface IDynamicZoneFieldBuilderTemplateConfig {\n name: string;\n gqlTypeName: string;\n icon?: CmsIcon;\n description?: string;\n fields: (registry: IFieldBuilderRegistry) => Record<string, BaseFieldBuilder<any>>;\n layout?: string[][];\n}\n\nclass DynamicZoneFieldBuilder\n extends DataFieldBuilder<\"dynamicZone\">\n implements IDynamicZoneFieldBuilder\n{\n private readonly templates: IDynamicZoneTemplate[] = [];\n\n public constructor(private registry: IFieldBuilderRegistry) {\n super(\"dynamicZone\");\n }\n\n public required(message?: string): this {\n return this.validation({\n name: \"required\",\n message: message || \"Field is required\",\n settings: {}\n });\n }\n\n public template(id: string, config: IDynamicZoneFieldBuilderTemplateConfig): this {\n const fieldBuilders = config.fields(this.registry);\n const fields: CmsModelField[] = [];\n const layoutReplacements = new Map<string, CmsModelLayoutCell>();\n\n for (const [key, fieldBuilder] of Object.entries(fieldBuilders)) {\n fieldBuilder.fieldId(key);\n const result: FieldBuildResult = (fieldBuilder as any).build();\n if (result.type === \"layout\") {\n layoutReplacements.set(key, result.layoutCell);\n if (result.fields) {\n fields.push(...result.fields);\n }\n } else {\n fields.push(result.field);\n }\n }\n\n const rawLayout: string[][] = config.layout || [];\n const layout = rawLayout.map(row => row.map(cell => layoutReplacements.get(cell) ?? cell));\n\n this.templates.push({\n id,\n name: config.name,\n gqlTypeName: config.gqlTypeName,\n icon: config.icon,\n description: config.description || \"\",\n fields,\n layout,\n validation: []\n });\n\n return this;\n }\n\n public override build() {\n // Set templates in settings before building\n this.config.settings = this.config.settings || {};\n this.config.settings.templates = this.templates;\n this.config.listValidation = [{ name: \"dynamicZone\", message: \"\" }];\n return super.build();\n }\n}\n\nclass DynamicZoneFieldTypeFactory implements IFieldTypeFactory {\n public readonly type = \"dynamicZone\";\n\n public create(registry: IFieldBuilderRegistry): IDynamicZoneFieldBuilder {\n return new DynamicZoneFieldBuilder(registry);\n }\n}\n\nexport const DynamicZoneFieldType = FieldType.createImplementation({\n implementation: DynamicZoneFieldTypeFactory,\n dependencies: []\n});\n\n// Module augmentation for TypeScript autocomplete\ndeclare module \"../abstractions.js\" {\n interface IFieldBuilderRegistry {\n dynamicZone(): IDynamicZoneFieldBuilder;\n }\n}\n"],"names":["DynamicZoneFieldBuilder","DataFieldBuilder","registry","message","id","config","fieldBuilders","fields","layoutReplacements","Map","key","fieldBuilder","Object","result","rawLayout","layout","row","cell","DynamicZoneFieldTypeFactory","DynamicZoneFieldType","FieldType"],"mappings":";;AA8CA,MAAMA,gCACMC;IAKR,YAA2BC,QAA+B,CAAE;QACxD,KAAK,CAAC,qBADiBA,QAAQ,GAARA,UAAAA,IAAAA,CAFV,SAAS,GAA2B,EAAE;IAIvD;IAEO,SAASC,OAAgB,EAAQ;QACpC,OAAO,IAAI,CAAC,UAAU,CAAC;YACnB,MAAM;YACN,SAASA,WAAW;YACpB,UAAU,CAAC;QACf;IACJ;IAEO,SAASC,EAAU,EAAEC,MAA8C,EAAQ;QAC9E,MAAMC,gBAAgBD,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ;QACjD,MAAME,SAA0B,EAAE;QAClC,MAAMC,qBAAqB,IAAIC;QAE/B,KAAK,MAAM,CAACC,KAAKC,aAAa,IAAIC,OAAO,OAAO,CAACN,eAAgB;YAC7DK,aAAa,OAAO,CAACD;YACrB,MAAMG,SAA4BF,aAAqB,KAAK;YAC5D,IAAIE,AAAgB,aAAhBA,OAAO,IAAI,EAAe;gBAC1BL,mBAAmB,GAAG,CAACE,KAAKG,OAAO,UAAU;gBAC7C,IAAIA,OAAO,MAAM,EACbN,OAAO,IAAI,IAAIM,OAAO,MAAM;YAEpC,OACIN,OAAO,IAAI,CAACM,OAAO,KAAK;QAEhC;QAEA,MAAMC,YAAwBT,OAAO,MAAM,IAAI,EAAE;QACjD,MAAMU,SAASD,UAAU,GAAG,CAACE,CAAAA,MAAOA,IAAI,GAAG,CAACC,CAAAA,OAAQT,mBAAmB,GAAG,CAACS,SAASA;QAEpF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAChBb;YACA,MAAMC,OAAO,IAAI;YACjB,aAAaA,OAAO,WAAW;YAC/B,MAAMA,OAAO,IAAI;YACjB,aAAaA,OAAO,WAAW,IAAI;YACnCE;YACAQ;YACA,YAAY,EAAE;QAClB;QAEA,OAAO,IAAI;IACf;IAEgB,QAAQ;QAEpB,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;QAC/C,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG;YAAC;gBAAE,MAAM;gBAAe,SAAS;YAAG;SAAE;QACnE,OAAO,KAAK,CAAC;IACjB;AACJ;AAEA,MAAMG;IAGK,OAAOhB,QAA+B,EAA4B;QACrE,OAAO,IAAIF,wBAAwBE;IACvC;;aAJgB,IAAI,GAAG;;AAK3B;AAEO,MAAMiB,uBAAuBC,UAAU,oBAAoB,CAAC;IAC/D,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
@@ -14,7 +14,8 @@ class AlertFieldBuilder extends LayoutFieldBuilder {
14
14
  layoutCell: {
15
15
  type: "alert",
16
16
  label: this.config.label,
17
- alertType: this._alertType
17
+ alertType: this._alertType,
18
+ rules: this.config.rules
18
19
  }
19
20
  };
20
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"features/modelBuilder/fields/UiAlertFieldType.js","sources":["../../../../src/features/modelBuilder/fields/UiAlertFieldType.ts"],"sourcesContent":["import { FieldType, type IFieldTypeFactory } from \"./abstractions.js\";\nimport { type LayoutFieldBuildResult } from \"./BaseFieldBuilder.js\";\nimport { LayoutFieldBuilder } from \"./LayoutFieldBuilder.js\";\n\ntype AlertType = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface IUiAlertFieldBuilder extends LayoutFieldBuilder<\"uiAlert\"> {\n alertType(type: AlertType): this;\n}\n\nclass AlertFieldBuilder extends LayoutFieldBuilder<\"uiAlert\"> implements IUiAlertFieldBuilder {\n private _alertType: AlertType = \"warning\";\n\n public constructor() {\n super(\"uiAlert\");\n }\n\n public alertType(type: AlertType): this {\n this._alertType = type;\n return this;\n }\n\n public override build(): LayoutFieldBuildResult {\n return {\n type: \"layout\",\n layoutCell: {\n type: \"alert\",\n label: this.config.label,\n alertType: this._alertType\n }\n };\n }\n}\n\nclass UiAlertFieldTypeFactory implements IFieldTypeFactory {\n public readonly type = \"uiAlert\";\n\n public create(): IUiAlertFieldBuilder {\n return new AlertFieldBuilder();\n }\n}\n\nexport const UiAlertFieldType = FieldType.createImplementation({\n implementation: UiAlertFieldTypeFactory,\n dependencies: []\n});\n\n// Module augmentation for TypeScript autocomplete\ndeclare module \"../abstractions.js\" {\n interface IFieldBuilderRegistry {\n uiAlert(): IUiAlertFieldBuilder;\n }\n}\n"],"names":["AlertFieldBuilder","LayoutFieldBuilder","type","UiAlertFieldTypeFactory","UiAlertFieldType","FieldType"],"mappings":";;AAUA,MAAMA,0BAA0BC;IAG5B,aAAqB;QACjB,KAAK,CAAC,iBAHF,UAAU,GAAc;IAIhC;IAEO,UAAUC,IAAe,EAAQ;QACpC,IAAI,CAAC,UAAU,GAAGA;QAClB,OAAO,IAAI;IACf;IAEgB,QAAgC;QAC5C,OAAO;YACH,MAAM;YACN,YAAY;gBACR,MAAM;gBACN,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK;gBACxB,WAAW,IAAI,CAAC,UAAU;YAC9B;QACJ;IACJ;AACJ;AAEA,MAAMC;IAGK,SAA+B;QAClC,OAAO,IAAIH;IACf;;aAJgB,IAAI,GAAG;;AAK3B;AAEO,MAAMI,mBAAmBC,UAAU,oBAAoB,CAAC;IAC3D,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
1
+ {"version":3,"file":"features/modelBuilder/fields/UiAlertFieldType.js","sources":["../../../../src/features/modelBuilder/fields/UiAlertFieldType.ts"],"sourcesContent":["import { FieldType, type IFieldTypeFactory } from \"./abstractions.js\";\nimport { type LayoutFieldBuildResult } from \"./BaseFieldBuilder.js\";\nimport { LayoutFieldBuilder } from \"./LayoutFieldBuilder.js\";\n\ntype AlertType = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface IUiAlertFieldBuilder extends LayoutFieldBuilder<\"uiAlert\"> {\n alertType(type: AlertType): this;\n}\n\nclass AlertFieldBuilder extends LayoutFieldBuilder<\"uiAlert\"> implements IUiAlertFieldBuilder {\n private _alertType: AlertType = \"warning\";\n\n public constructor() {\n super(\"uiAlert\");\n }\n\n public alertType(type: AlertType): this {\n this._alertType = type;\n return this;\n }\n\n public override build(): LayoutFieldBuildResult {\n return {\n type: \"layout\",\n layoutCell: {\n type: \"alert\",\n label: this.config.label,\n alertType: this._alertType,\n rules: this.config.rules\n }\n };\n }\n}\n\nclass UiAlertFieldTypeFactory implements IFieldTypeFactory {\n public readonly type = \"uiAlert\";\n\n public create(): IUiAlertFieldBuilder {\n return new AlertFieldBuilder();\n }\n}\n\nexport const UiAlertFieldType = FieldType.createImplementation({\n implementation: UiAlertFieldTypeFactory,\n dependencies: []\n});\n\n// Module augmentation for TypeScript autocomplete\ndeclare module \"../abstractions.js\" {\n interface IFieldBuilderRegistry {\n uiAlert(): IUiAlertFieldBuilder;\n }\n}\n"],"names":["AlertFieldBuilder","LayoutFieldBuilder","type","UiAlertFieldTypeFactory","UiAlertFieldType","FieldType"],"mappings":";;AAUA,MAAMA,0BAA0BC;IAG5B,aAAqB;QACjB,KAAK,CAAC,iBAHF,UAAU,GAAc;IAIhC;IAEO,UAAUC,IAAe,EAAQ;QACpC,IAAI,CAAC,UAAU,GAAGA;QAClB,OAAO,IAAI;IACf;IAEgB,QAAgC;QAC5C,OAAO;YACH,MAAM;YACN,YAAY;gBACR,MAAM;gBACN,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK;gBACxB,WAAW,IAAI,CAAC,UAAU;gBAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK;YAC5B;QACJ;IACJ;AACJ;AAEA,MAAMC;IAGK,SAA+B;QAClC,OAAO,IAAIH;IACf;;aAJgB,IAAI,GAAG;;AAK3B;AAEO,MAAMI,mBAAmBC,UAAU,oBAAoB,CAAC;IAC3D,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
@@ -10,7 +10,8 @@ class SeparatorFieldBuilder extends LayoutFieldBuilder {
10
10
  layoutCell: {
11
11
  type: "separator",
12
12
  label: this.config.label,
13
- description: this.config.description
13
+ description: this.config.description,
14
+ rules: this.config.rules
14
15
  }
15
16
  };
16
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"features/modelBuilder/fields/UiSeparatorFieldType.js","sources":["../../../../src/features/modelBuilder/fields/UiSeparatorFieldType.ts"],"sourcesContent":["import { FieldType, type IFieldTypeFactory } from \"./abstractions.js\";\nimport { type LayoutFieldBuildResult } from \"./BaseFieldBuilder.js\";\nimport { LayoutFieldBuilder } from \"./LayoutFieldBuilder.js\";\n\nexport interface IUiSeparatorFieldBuilder extends LayoutFieldBuilder<\"uiSeparator\"> {}\n\nclass SeparatorFieldBuilder\n extends LayoutFieldBuilder<\"uiSeparator\">\n implements IUiSeparatorFieldBuilder\n{\n public constructor() {\n super(\"uiSeparator\");\n }\n\n public override build(): LayoutFieldBuildResult {\n return {\n type: \"layout\",\n layoutCell: {\n type: \"separator\",\n label: this.config.label,\n description: this.config.description\n }\n };\n }\n}\n\nclass UiSeparatorFieldTypeFactory implements IFieldTypeFactory {\n public readonly type = \"uiSeparator\";\n\n public create(): IUiSeparatorFieldBuilder {\n return new SeparatorFieldBuilder();\n }\n}\n\nexport const UiSeparatorFieldType = FieldType.createImplementation({\n implementation: UiSeparatorFieldTypeFactory,\n dependencies: []\n});\n\n// Module augmentation for TypeScript autocomplete\ndeclare module \"../abstractions.js\" {\n interface IFieldBuilderRegistry {\n uiSeparator(): IUiSeparatorFieldBuilder;\n }\n}\n"],"names":["SeparatorFieldBuilder","LayoutFieldBuilder","UiSeparatorFieldTypeFactory","UiSeparatorFieldType","FieldType"],"mappings":";;AAMA,MAAMA,8BACMC;IAGR,aAAqB;QACjB,KAAK,CAAC;IACV;IAEgB,QAAgC;QAC5C,OAAO;YACH,MAAM;YACN,YAAY;gBACR,MAAM;gBACN,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK;gBACxB,aAAa,IAAI,CAAC,MAAM,CAAC,WAAW;YACxC;QACJ;IACJ;AACJ;AAEA,MAAMC;IAGK,SAAmC;QACtC,OAAO,IAAIF;IACf;;aAJgB,IAAI,GAAG;;AAK3B;AAEO,MAAMG,uBAAuBC,UAAU,oBAAoB,CAAC;IAC/D,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
1
+ {"version":3,"file":"features/modelBuilder/fields/UiSeparatorFieldType.js","sources":["../../../../src/features/modelBuilder/fields/UiSeparatorFieldType.ts"],"sourcesContent":["import { FieldType, type IFieldTypeFactory } from \"./abstractions.js\";\nimport { type LayoutFieldBuildResult } from \"./BaseFieldBuilder.js\";\nimport { LayoutFieldBuilder } from \"./LayoutFieldBuilder.js\";\n\nexport interface IUiSeparatorFieldBuilder extends LayoutFieldBuilder<\"uiSeparator\"> {}\n\nclass SeparatorFieldBuilder\n extends LayoutFieldBuilder<\"uiSeparator\">\n implements IUiSeparatorFieldBuilder\n{\n public constructor() {\n super(\"uiSeparator\");\n }\n\n public override build(): LayoutFieldBuildResult {\n return {\n type: \"layout\",\n layoutCell: {\n type: \"separator\",\n label: this.config.label,\n description: this.config.description,\n rules: this.config.rules\n }\n };\n }\n}\n\nclass UiSeparatorFieldTypeFactory implements IFieldTypeFactory {\n public readonly type = \"uiSeparator\";\n\n public create(): IUiSeparatorFieldBuilder {\n return new SeparatorFieldBuilder();\n }\n}\n\nexport const UiSeparatorFieldType = FieldType.createImplementation({\n implementation: UiSeparatorFieldTypeFactory,\n dependencies: []\n});\n\n// Module augmentation for TypeScript autocomplete\ndeclare module \"../abstractions.js\" {\n interface IFieldBuilderRegistry {\n uiSeparator(): IUiSeparatorFieldBuilder;\n }\n}\n"],"names":["SeparatorFieldBuilder","LayoutFieldBuilder","UiSeparatorFieldTypeFactory","UiSeparatorFieldType","FieldType"],"mappings":";;AAMA,MAAMA,8BACMC;IAGR,aAAqB;QACjB,KAAK,CAAC;IACV;IAEgB,QAAgC;QAC5C,OAAO;YACH,MAAM;YACN,YAAY;gBACR,MAAM;gBACN,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK;gBACxB,aAAa,IAAI,CAAC,MAAM,CAAC,WAAW;gBACpC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK;YAC5B;QACJ;IACJ;AACJ;AAEA,MAAMC;IAGK,SAAmC;QACtC,OAAO,IAAIF;IACf;;aAJgB,IAAI,GAAG;;AAK3B;AAEO,MAAMG,uBAAuBC,UAAU,oBAAoB,CAAC;IAC/D,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
@@ -2,13 +2,14 @@ import { type IFieldTypeFactory } from "./abstractions.js";
2
2
  import { BaseFieldBuilder } from "./BaseFieldBuilder.js";
3
3
  import { LayoutFieldBuilder } from "./LayoutFieldBuilder.js";
4
4
  import { type IFieldBuilderRegistry } from "../abstractions.js";
5
- import type { CmsIcon } from "../../../types/index.js";
5
+ import type { CmsIcon, FieldRule } from "../../../types/index.js";
6
6
  interface ITabConfig {
7
7
  label: string;
8
8
  icon?: CmsIcon;
9
9
  description?: string;
10
10
  fields: (registry: IFieldBuilderRegistry) => Record<string, BaseFieldBuilder<any>>;
11
11
  layout?: string[][];
12
+ rules?: FieldRule[];
12
13
  }
13
14
  export interface IUiTabsFieldBuilder extends LayoutFieldBuilder<"uiTabs"> {
14
15
  tab(id: string, config: ITabConfig): this;
@@ -24,7 +24,8 @@ class TabsFieldBuilder extends LayoutFieldBuilder {
24
24
  icon: config.icon,
25
25
  description: config.description || "",
26
26
  fields,
27
- layout
27
+ layout,
28
+ rules: config.rules
28
29
  });
29
30
  return this;
30
31
  }
@@ -37,7 +38,8 @@ class TabsFieldBuilder extends LayoutFieldBuilder {
37
38
  id: tab.id,
38
39
  label: tab.label,
39
40
  icon: tab.icon || null,
40
- layout: tab.layout
41
+ layout: tab.layout,
42
+ rules: tab.rules
41
43
  });
42
44
  }
43
45
  return {
@@ -47,7 +49,8 @@ class TabsFieldBuilder extends LayoutFieldBuilder {
47
49
  label: this.config.label,
48
50
  description: this.config.description || null,
49
51
  help: this.config.help || null,
50
- tabs: layoutTabs
52
+ tabs: layoutTabs,
53
+ rules: this.config.rules
51
54
  },
52
55
  fields: hoistedFields
53
56
  };
@@ -1 +1 @@
1
- {"version":3,"file":"features/modelBuilder/fields/UiTabsFieldType.js","sources":["../../../../src/features/modelBuilder/fields/UiTabsFieldType.ts"],"sourcesContent":["import { FieldType, type IFieldTypeFactory } from \"./abstractions.js\";\nimport {\n BaseFieldBuilder,\n type FieldBuildResult,\n type LayoutFieldBuildResult\n} from \"./BaseFieldBuilder.js\";\nimport { LayoutFieldBuilder } from \"./LayoutFieldBuilder.js\";\nimport { type IFieldBuilderRegistry } from \"../abstractions.js\";\nimport type { CmsIcon, CmsModelField, CmsModelLayout, CmsModelLayoutCell } from \"~/types/index.js\";\n\ninterface ITab {\n id: string;\n label: string;\n icon: CmsIcon | undefined;\n description: string;\n fields: CmsModelField[];\n layout: CmsModelLayout;\n}\n\ninterface ITabConfig {\n label: string;\n icon?: CmsIcon;\n description?: string;\n fields: (registry: IFieldBuilderRegistry) => Record<string, BaseFieldBuilder<any>>;\n layout?: string[][];\n}\n\nexport interface IUiTabsFieldBuilder extends LayoutFieldBuilder<\"uiTabs\"> {\n tab(id: string, config: ITabConfig): this;\n}\n\nclass TabsFieldBuilder extends LayoutFieldBuilder<\"uiTabs\"> implements IUiTabsFieldBuilder {\n private readonly tabs: ITab[] = [];\n\n public constructor(private registry: IFieldBuilderRegistry) {\n super(\"uiTabs\");\n }\n\n public tab(id: string, config: ITabConfig): this {\n const fieldBuilders = config.fields(this.registry);\n const fields: CmsModelField[] = [];\n const layoutReplacements = new Map<string, CmsModelLayoutCell>();\n\n for (const [key, fieldBuilder] of Object.entries(fieldBuilders)) {\n fieldBuilder.fieldId(key);\n const result: FieldBuildResult = (fieldBuilder as any).build();\n if (result.type === \"layout\") {\n layoutReplacements.set(key, result.layoutCell);\n if (result.fields) {\n fields.push(...result.fields);\n }\n } else {\n fields.push(result.field);\n }\n }\n\n const rawLayout: string[][] = config.layout || [];\n const layout: CmsModelLayout = rawLayout.map(row =>\n row.map(cell => layoutReplacements.get(cell) ?? cell)\n );\n\n this.tabs.push({\n id,\n label: config.label,\n icon: config.icon,\n description: config.description || \"\",\n fields,\n layout\n });\n\n return this;\n }\n\n public override build(): LayoutFieldBuildResult {\n const hoistedFields: CmsModelField[] = [];\n const layoutTabs = [];\n\n for (const tab of this.tabs) {\n hoistedFields.push(...tab.fields);\n layoutTabs.push({\n id: tab.id,\n label: tab.label,\n icon: tab.icon || null,\n layout: tab.layout\n });\n }\n\n return {\n type: \"layout\",\n layoutCell: {\n type: \"tabs\",\n label: this.config.label,\n description: this.config.description || null,\n help: this.config.help || null,\n tabs: layoutTabs\n },\n fields: hoistedFields\n };\n }\n}\n\nclass TabsFieldTypeFactory implements IFieldTypeFactory {\n public readonly type = \"uiTabs\";\n\n public create(registry: IFieldBuilderRegistry): IUiTabsFieldBuilder {\n return new TabsFieldBuilder(registry);\n }\n}\n\nexport const UiTabsFieldType = FieldType.createImplementation({\n implementation: TabsFieldTypeFactory,\n dependencies: []\n});\n\n// Module augmentation for TypeScript autocomplete\ndeclare module \"../abstractions.js\" {\n interface IFieldBuilderRegistry {\n uiTabs(): IUiTabsFieldBuilder;\n }\n}\n"],"names":["TabsFieldBuilder","LayoutFieldBuilder","registry","id","config","fieldBuilders","fields","layoutReplacements","Map","key","fieldBuilder","Object","result","rawLayout","layout","row","cell","hoistedFields","layoutTabs","tab","TabsFieldTypeFactory","UiTabsFieldType","FieldType"],"mappings":";;AA+BA,MAAMA,yBAAyBC;IAG3B,YAA2BC,QAA+B,CAAE;QACxD,KAAK,CAAC,gBADiBA,QAAQ,GAARA,UAAAA,IAAAA,CAFV,IAAI,GAAW,EAAE;IAIlC;IAEO,IAAIC,EAAU,EAAEC,MAAkB,EAAQ;QAC7C,MAAMC,gBAAgBD,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ;QACjD,MAAME,SAA0B,EAAE;QAClC,MAAMC,qBAAqB,IAAIC;QAE/B,KAAK,MAAM,CAACC,KAAKC,aAAa,IAAIC,OAAO,OAAO,CAACN,eAAgB;YAC7DK,aAAa,OAAO,CAACD;YACrB,MAAMG,SAA4BF,aAAqB,KAAK;YAC5D,IAAIE,AAAgB,aAAhBA,OAAO,IAAI,EAAe;gBAC1BL,mBAAmB,GAAG,CAACE,KAAKG,OAAO,UAAU;gBAC7C,IAAIA,OAAO,MAAM,EACbN,OAAO,IAAI,IAAIM,OAAO,MAAM;YAEpC,OACIN,OAAO,IAAI,CAACM,OAAO,KAAK;QAEhC;QAEA,MAAMC,YAAwBT,OAAO,MAAM,IAAI,EAAE;QACjD,MAAMU,SAAyBD,UAAU,GAAG,CAACE,CAAAA,MACzCA,IAAI,GAAG,CAACC,CAAAA,OAAQT,mBAAmB,GAAG,CAACS,SAASA;QAGpD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YACXb;YACA,OAAOC,OAAO,KAAK;YACnB,MAAMA,OAAO,IAAI;YACjB,aAAaA,OAAO,WAAW,IAAI;YACnCE;YACAQ;QACJ;QAEA,OAAO,IAAI;IACf;IAEgB,QAAgC;QAC5C,MAAMG,gBAAiC,EAAE;QACzC,MAAMC,aAAa,EAAE;QAErB,KAAK,MAAMC,OAAO,IAAI,CAAC,IAAI,CAAE;YACzBF,cAAc,IAAI,IAAIE,IAAI,MAAM;YAChCD,WAAW,IAAI,CAAC;gBACZ,IAAIC,IAAI,EAAE;gBACV,OAAOA,IAAI,KAAK;gBAChB,MAAMA,IAAI,IAAI,IAAI;gBAClB,QAAQA,IAAI,MAAM;YACtB;QACJ;QAEA,OAAO;YACH,MAAM;YACN,YAAY;gBACR,MAAM;gBACN,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK;gBACxB,aAAa,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI;gBACxC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI;gBAC1B,MAAMD;YACV;YACA,QAAQD;QACZ;IACJ;AACJ;AAEA,MAAMG;IAGK,OAAOlB,QAA+B,EAAuB;QAChE,OAAO,IAAIF,iBAAiBE;IAChC;;aAJgB,IAAI,GAAG;;AAK3B;AAEO,MAAMmB,kBAAkBC,UAAU,oBAAoB,CAAC;IAC1D,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
1
+ {"version":3,"file":"features/modelBuilder/fields/UiTabsFieldType.js","sources":["../../../../src/features/modelBuilder/fields/UiTabsFieldType.ts"],"sourcesContent":["import { FieldType, type IFieldTypeFactory } from \"./abstractions.js\";\nimport {\n BaseFieldBuilder,\n type FieldBuildResult,\n type LayoutFieldBuildResult\n} from \"./BaseFieldBuilder.js\";\nimport { LayoutFieldBuilder } from \"./LayoutFieldBuilder.js\";\nimport { type IFieldBuilderRegistry } from \"../abstractions.js\";\nimport type {\n CmsIcon,\n CmsModelField,\n CmsModelLayout,\n CmsModelLayoutCell,\n FieldRule\n} from \"~/types/index.js\";\n\ninterface ITab {\n id: string;\n label: string;\n icon: CmsIcon | undefined;\n description: string;\n fields: CmsModelField[];\n layout: CmsModelLayout;\n rules?: FieldRule[];\n}\n\ninterface ITabConfig {\n label: string;\n icon?: CmsIcon;\n description?: string;\n fields: (registry: IFieldBuilderRegistry) => Record<string, BaseFieldBuilder<any>>;\n layout?: string[][];\n rules?: FieldRule[];\n}\n\nexport interface IUiTabsFieldBuilder extends LayoutFieldBuilder<\"uiTabs\"> {\n tab(id: string, config: ITabConfig): this;\n}\n\nclass TabsFieldBuilder extends LayoutFieldBuilder<\"uiTabs\"> implements IUiTabsFieldBuilder {\n private readonly tabs: ITab[] = [];\n\n public constructor(private registry: IFieldBuilderRegistry) {\n super(\"uiTabs\");\n }\n\n public tab(id: string, config: ITabConfig): this {\n const fieldBuilders = config.fields(this.registry);\n const fields: CmsModelField[] = [];\n const layoutReplacements = new Map<string, CmsModelLayoutCell>();\n\n for (const [key, fieldBuilder] of Object.entries(fieldBuilders)) {\n fieldBuilder.fieldId(key);\n const result: FieldBuildResult = (fieldBuilder as any).build();\n if (result.type === \"layout\") {\n layoutReplacements.set(key, result.layoutCell);\n if (result.fields) {\n fields.push(...result.fields);\n }\n } else {\n fields.push(result.field);\n }\n }\n\n const rawLayout: string[][] = config.layout || [];\n const layout: CmsModelLayout = rawLayout.map(row =>\n row.map(cell => layoutReplacements.get(cell) ?? cell)\n );\n\n this.tabs.push({\n id,\n label: config.label,\n icon: config.icon,\n description: config.description || \"\",\n fields,\n layout,\n rules: config.rules\n });\n\n return this;\n }\n\n public override build(): LayoutFieldBuildResult {\n const hoistedFields: CmsModelField[] = [];\n const layoutTabs = [];\n\n for (const tab of this.tabs) {\n hoistedFields.push(...tab.fields);\n layoutTabs.push({\n id: tab.id,\n label: tab.label,\n icon: tab.icon || null,\n layout: tab.layout,\n rules: tab.rules\n });\n }\n\n return {\n type: \"layout\",\n layoutCell: {\n type: \"tabs\",\n label: this.config.label,\n description: this.config.description || null,\n help: this.config.help || null,\n tabs: layoutTabs,\n rules: this.config.rules\n },\n fields: hoistedFields\n };\n }\n}\n\nclass TabsFieldTypeFactory implements IFieldTypeFactory {\n public readonly type = \"uiTabs\";\n\n public create(registry: IFieldBuilderRegistry): IUiTabsFieldBuilder {\n return new TabsFieldBuilder(registry);\n }\n}\n\nexport const UiTabsFieldType = FieldType.createImplementation({\n implementation: TabsFieldTypeFactory,\n dependencies: []\n});\n\n// Module augmentation for TypeScript autocomplete\ndeclare module \"../abstractions.js\" {\n interface IFieldBuilderRegistry {\n uiTabs(): IUiTabsFieldBuilder;\n }\n}\n"],"names":["TabsFieldBuilder","LayoutFieldBuilder","registry","id","config","fieldBuilders","fields","layoutReplacements","Map","key","fieldBuilder","Object","result","rawLayout","layout","row","cell","hoistedFields","layoutTabs","tab","TabsFieldTypeFactory","UiTabsFieldType","FieldType"],"mappings":";;AAuCA,MAAMA,yBAAyBC;IAG3B,YAA2BC,QAA+B,CAAE;QACxD,KAAK,CAAC,gBADiBA,QAAQ,GAARA,UAAAA,IAAAA,CAFV,IAAI,GAAW,EAAE;IAIlC;IAEO,IAAIC,EAAU,EAAEC,MAAkB,EAAQ;QAC7C,MAAMC,gBAAgBD,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ;QACjD,MAAME,SAA0B,EAAE;QAClC,MAAMC,qBAAqB,IAAIC;QAE/B,KAAK,MAAM,CAACC,KAAKC,aAAa,IAAIC,OAAO,OAAO,CAACN,eAAgB;YAC7DK,aAAa,OAAO,CAACD;YACrB,MAAMG,SAA4BF,aAAqB,KAAK;YAC5D,IAAIE,AAAgB,aAAhBA,OAAO,IAAI,EAAe;gBAC1BL,mBAAmB,GAAG,CAACE,KAAKG,OAAO,UAAU;gBAC7C,IAAIA,OAAO,MAAM,EACbN,OAAO,IAAI,IAAIM,OAAO,MAAM;YAEpC,OACIN,OAAO,IAAI,CAACM,OAAO,KAAK;QAEhC;QAEA,MAAMC,YAAwBT,OAAO,MAAM,IAAI,EAAE;QACjD,MAAMU,SAAyBD,UAAU,GAAG,CAACE,CAAAA,MACzCA,IAAI,GAAG,CAACC,CAAAA,OAAQT,mBAAmB,GAAG,CAACS,SAASA;QAGpD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YACXb;YACA,OAAOC,OAAO,KAAK;YACnB,MAAMA,OAAO,IAAI;YACjB,aAAaA,OAAO,WAAW,IAAI;YACnCE;YACAQ;YACA,OAAOV,OAAO,KAAK;QACvB;QAEA,OAAO,IAAI;IACf;IAEgB,QAAgC;QAC5C,MAAMa,gBAAiC,EAAE;QACzC,MAAMC,aAAa,EAAE;QAErB,KAAK,MAAMC,OAAO,IAAI,CAAC,IAAI,CAAE;YACzBF,cAAc,IAAI,IAAIE,IAAI,MAAM;YAChCD,WAAW,IAAI,CAAC;gBACZ,IAAIC,IAAI,EAAE;gBACV,OAAOA,IAAI,KAAK;gBAChB,MAAMA,IAAI,IAAI,IAAI;gBAClB,QAAQA,IAAI,MAAM;gBAClB,OAAOA,IAAI,KAAK;YACpB;QACJ;QAEA,OAAO;YACH,MAAM;YACN,YAAY;gBACR,MAAM;gBACN,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK;gBACxB,aAAa,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI;gBACxC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI;gBAC1B,MAAMD;gBACN,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK;YAC5B;YACA,QAAQD;QACZ;IACJ;AACJ;AAEA,MAAMG;IAGK,OAAOlB,QAA+B,EAAuB;QAChE,OAAO,IAAIF,iBAAiBE;IAChC;;aAJgB,IAAI,GAAG;;AAK3B;AAEO,MAAMmB,kBAAkBC,UAAU,oBAAoB,CAAC;IAC1D,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-headless-cms",
3
- "version": "6.4.4-beta.0",
3
+ "version": "6.4.4-beta.2",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -25,19 +25,19 @@
25
25
  "@babel/code-frame": "7.29.7",
26
26
  "@graphql-tools/merge": "9.1.9",
27
27
  "@graphql-tools/schema": "10.0.33",
28
- "@webiny/api": "6.4.4-beta.0",
29
- "@webiny/api-core": "6.4.4-beta.0",
28
+ "@webiny/api": "6.4.4-beta.2",
29
+ "@webiny/api-core": "6.4.4-beta.2",
30
30
  "@webiny/di": "1.0.1",
31
- "@webiny/error": "6.4.4-beta.0",
32
- "@webiny/feature": "6.4.4-beta.0",
33
- "@webiny/handler": "6.4.4-beta.0",
34
- "@webiny/handler-aws": "6.4.4-beta.0",
35
- "@webiny/handler-db": "6.4.4-beta.0",
36
- "@webiny/handler-graphql": "6.4.4-beta.0",
37
- "@webiny/plugins": "6.4.4-beta.0",
38
- "@webiny/project": "6.4.4-beta.0",
39
- "@webiny/utils": "6.4.4-beta.0",
40
- "@webiny/validation": "6.4.4-beta.0",
31
+ "@webiny/error": "6.4.4-beta.2",
32
+ "@webiny/feature": "6.4.4-beta.2",
33
+ "@webiny/handler": "6.4.4-beta.2",
34
+ "@webiny/handler-aws": "6.4.4-beta.2",
35
+ "@webiny/handler-db": "6.4.4-beta.2",
36
+ "@webiny/handler-graphql": "6.4.4-beta.2",
37
+ "@webiny/plugins": "6.4.4-beta.2",
38
+ "@webiny/project": "6.4.4-beta.2",
39
+ "@webiny/utils": "6.4.4-beta.2",
40
+ "@webiny/validation": "6.4.4-beta.2",
41
41
  "dot-prop-immutable": "2.1.1",
42
42
  "graphql": "16.14.2",
43
43
  "graphql-tag": "2.12.6",
@@ -51,13 +51,13 @@
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.4-beta.0",
55
- "@webiny/build-tools": "6.4.4-beta.0",
56
- "@webiny/db-dynamodb": "6.4.4-beta.0",
57
- "@webiny/handler-db": "6.4.4-beta.0",
58
- "@webiny/project-utils": "6.4.4-beta.0",
59
- "@webiny/sdk": "6.4.4-beta.0",
60
- "@webiny/wcp": "6.4.4-beta.0",
54
+ "@webiny/aws-sdk": "6.4.4-beta.2",
55
+ "@webiny/build-tools": "6.4.4-beta.2",
56
+ "@webiny/db-dynamodb": "6.4.4-beta.2",
57
+ "@webiny/handler-db": "6.4.4-beta.2",
58
+ "@webiny/project-utils": "6.4.4-beta.2",
59
+ "@webiny/sdk": "6.4.4-beta.2",
60
+ "@webiny/wcp": "6.4.4-beta.2",
61
61
  "apollo-graphql": "0.9.7",
62
62
  "graphql": "16.14.2",
63
63
  "oxfmt": "0.51.0",
@@ -1,5 +1,5 @@
1
1
  import type { CmsModelField, CmsModelFieldValidation } from "../modelField.js";
2
- import type { CmsIcon } from "../../types/index.js";
2
+ import type { CmsIcon, CmsModelLayoutCell } from "../../types/index.js";
3
3
  export interface CmsDynamicZoneTemplate {
4
4
  id: string;
5
5
  name: string;
@@ -7,7 +7,7 @@ export interface CmsDynamicZoneTemplate {
7
7
  description: string;
8
8
  icon?: CmsIcon;
9
9
  fields: CmsModelField[];
10
- layout: string[][];
10
+ layout: CmsModelLayoutCell[][];
11
11
  validation: CmsModelFieldValidation[];
12
12
  tags?: string[];
13
13
  }
@@ -3,7 +3,7 @@ import type { GenericRecord } from "@webiny/api/types.js";
3
3
  import type { CmsDynamicZoneTemplate } from "../types/fields/dynamicZoneField.js";
4
4
  export type FieldRuleAction = "hide" | "disable" | string;
5
5
  export interface FieldRule {
6
- type: "accessControl" | "entryValue";
6
+ type: "accessControl" | "condition";
7
7
  target: string;
8
8
  operator: string;
9
9
  value: string | number | boolean | null;