@webiny/api-headless-cms 6.0.0-rc.2 → 6.0.0-rc.4
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.
- package/crud/contentEntry/searchableFields.js +6 -2
- package/crud/contentEntry/searchableFields.js.map +1 -1
- package/crud/contentModel/validation.d.ts +9 -9
- package/crud/contentModel/validation.js +3 -3
- package/crud/contentModel/validation.js.map +1 -1
- package/domain/contentModel/errors.d.ts +1 -1
- package/domain/contentModel/errors.js.map +1 -1
- package/domain/contentModel/schemas.d.ts +126 -8
- package/domain/contentModel/schemas.js +12 -13
- package/domain/contentModel/schemas.js.map +1 -1
- package/export/graphql/index.js +1 -1
- package/export/graphql/index.js.map +1 -1
- package/features/contentEntry/GetUniqueFieldValues/GetUniqueFieldValuesUseCase.d.ts +2 -2
- package/features/contentEntry/GetUniqueFieldValues/GetUniqueFieldValuesUseCase.js +3 -4
- package/features/contentEntry/GetUniqueFieldValues/GetUniqueFieldValuesUseCase.js.map +1 -1
- package/features/contentModel/CreateModel/CreateModelRepository.js +4 -1
- package/features/contentModel/CreateModel/CreateModelRepository.js.map +1 -1
- package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js +12 -3
- package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js.map +1 -1
- package/features/contentModel/UpdateModel/UpdateModelRepository.js +8 -2
- package/features/contentModel/UpdateModel/UpdateModelRepository.js.map +1 -1
- package/features/contentModel/UpdateModel/UpdateModelUseCase.js +4 -1
- package/features/contentModel/UpdateModel/UpdateModelUseCase.js.map +1 -1
- package/features/modelBuilder/feature.js +2 -2
- package/features/modelBuilder/feature.js.map +1 -1
- package/features/modelBuilder/fields/BaseFieldBuilder.d.ts +36 -0
- package/features/modelBuilder/fields/BaseFieldBuilder.js +41 -0
- package/features/modelBuilder/fields/BaseFieldBuilder.js.map +1 -0
- package/features/modelBuilder/fields/DataFieldBuilder.d.ts +228 -0
- package/features/modelBuilder/fields/DataFieldBuilder.js +219 -0
- package/features/modelBuilder/fields/DataFieldBuilder.js.map +1 -0
- package/features/modelBuilder/fields/DynamicZoneFieldType.d.ts +2 -2
- package/features/modelBuilder/fields/DynamicZoneFieldType.js +6 -3
- package/features/modelBuilder/fields/DynamicZoneFieldType.js.map +1 -1
- package/features/modelBuilder/fields/FieldBuilder.d.ts +5 -228
- package/features/modelBuilder/fields/FieldBuilder.js +3 -231
- package/features/modelBuilder/fields/FieldBuilder.js.map +1 -1
- package/features/modelBuilder/fields/LayoutFieldBuilder.d.ts +7 -0
- package/features/modelBuilder/fields/LayoutFieldBuilder.js +9 -0
- package/features/modelBuilder/fields/LayoutFieldBuilder.js.map +1 -0
- package/features/modelBuilder/fields/ObjectFieldType.d.ts +4 -3
- package/features/modelBuilder/fields/ObjectFieldType.js +19 -4
- package/features/modelBuilder/fields/ObjectFieldType.js.map +1 -1
- package/features/modelBuilder/fields/UiAlertFieldType.d.ts +8 -4
- package/features/modelBuilder/fields/UiAlertFieldType.js +23 -6
- package/features/modelBuilder/fields/UiAlertFieldType.js.map +1 -1
- package/features/modelBuilder/fields/UiSeparatorFieldType.d.ts +6 -4
- package/features/modelBuilder/fields/UiSeparatorFieldType.js +18 -4
- package/features/modelBuilder/fields/UiSeparatorFieldType.js.map +1 -1
- package/features/modelBuilder/fields/UiTabsFieldType.d.ts +28 -0
- package/features/modelBuilder/fields/UiTabsFieldType.js +75 -0
- package/features/modelBuilder/fields/UiTabsFieldType.js.map +1 -0
- package/features/modelBuilder/fields/abstractions.d.ts +2 -2
- package/features/modelBuilder/fields/abstractions.js.map +1 -1
- package/features/modelBuilder/index.d.ts +2 -0
- package/features/modelBuilder/index.js +2 -0
- package/features/modelBuilder/index.js.map +1 -1
- package/features/modelBuilder/models/BaseModelBuilder.d.ts +8 -3
- package/features/modelBuilder/models/BaseModelBuilder.js +19 -0
- package/features/modelBuilder/models/BaseModelBuilder.js.map +1 -1
- package/features/modelBuilder/models/PrivateModelBuilder.js +4 -2
- package/features/modelBuilder/models/PrivateModelBuilder.js.map +1 -1
- package/features/modelBuilder/models/PublicModelBuilder.js +16 -11
- package/features/modelBuilder/models/PublicModelBuilder.js.map +1 -1
- package/graphql/schema/cms/helpers/index.d.ts +1 -0
- package/graphql/schema/cms/helpers/index.js +1 -0
- package/graphql/schema/cms/helpers/index.js.map +1 -1
- package/graphql/schema/cms/helpers/transformWhereToNested.d.ts +17 -0
- package/graphql/schema/cms/helpers/transformWhereToNested.js +54 -0
- package/graphql/schema/cms/helpers/transformWhereToNested.js.map +1 -0
- package/graphql/schema/cms/helpers.d.ts +1 -0
- package/graphql/schema/cms/helpers.js +1 -0
- package/graphql/schema/cms/helpers.js.map +1 -1
- package/graphql/schema/cms/listEntriesResolver.js +6 -2
- package/graphql/schema/cms/listEntriesResolver.js.map +1 -1
- package/graphql/schema/contentModels.js +21 -3
- package/graphql/schema/contentModels.js.map +1 -1
- package/graphqlFields/index.js +1 -2
- package/graphqlFields/index.js.map +1 -1
- package/package.json +20 -20
- package/plugins/CmsModelPlugin.js +19 -4
- package/plugins/CmsModelPlugin.js.map +1 -1
- package/types/fields/objectField.d.ts +2 -0
- package/types/fields/objectField.js.map +1 -1
- package/types/model.d.ts +32 -3
- package/types/model.js.map +1 -1
- package/types/modelField.d.ts +19 -3
- package/types/modelField.js.map +1 -1
- package/utils/createModelField.js +4 -2
- package/utils/createModelField.js.map +1 -1
- package/features/modelBuilder/fields/UiFieldType.d.ts +0 -18
- package/features/modelBuilder/fields/UiFieldType.js +0 -25
- package/features/modelBuilder/fields/UiFieldType.js.map +0 -1
- package/graphqlFields/ui.d.ts +0 -2
- package/graphqlFields/ui.js +0 -32
- package/graphqlFields/ui.js.map +0 -1
|
@@ -1,12 +1,29 @@
|
|
|
1
1
|
import { FieldType } from "./abstractions.js";
|
|
2
|
-
import {
|
|
2
|
+
import { LayoutFieldBuilder } from "./LayoutFieldBuilder.js";
|
|
3
|
+
class AlertFieldBuilder extends LayoutFieldBuilder {
|
|
4
|
+
_alertType = "warning";
|
|
5
|
+
constructor() {
|
|
6
|
+
super("uiAlert");
|
|
7
|
+
}
|
|
8
|
+
alertType(type) {
|
|
9
|
+
this._alertType = type;
|
|
10
|
+
return this;
|
|
11
|
+
}
|
|
12
|
+
build() {
|
|
13
|
+
return {
|
|
14
|
+
type: "layout",
|
|
15
|
+
layoutCell: {
|
|
16
|
+
type: "alert",
|
|
17
|
+
label: this.config.label,
|
|
18
|
+
alertType: this._alertType
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
3
23
|
class UiAlertFieldTypeFactory {
|
|
4
|
-
type = "
|
|
24
|
+
type = "uiAlert";
|
|
5
25
|
create() {
|
|
6
|
-
|
|
7
|
-
return builder.renderer("uiAlert", {
|
|
8
|
-
type: "warning"
|
|
9
|
-
}).label("Alert!");
|
|
26
|
+
return new AlertFieldBuilder();
|
|
10
27
|
}
|
|
11
28
|
}
|
|
12
29
|
export const UiAlertFieldType = FieldType.createImplementation({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["FieldType","
|
|
1
|
+
{"version":3,"names":["FieldType","LayoutFieldBuilder","AlertFieldBuilder","_alertType","constructor","alertType","type","build","layoutCell","label","config","UiAlertFieldTypeFactory","create","UiAlertFieldType","createImplementation","implementation","dependencies"],"sources":["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"],"mappings":"AAAA,SAASA,SAAS;AAElB,SAASC,kBAAkB;AAQ3B,MAAMC,iBAAiB,SAASD,kBAAkB,CAA4C;EAClFE,UAAU,GAAc,SAAS;EAElCC,WAAWA,CAAA,EAAG;IACjB,KAAK,CAAC,SAAS,CAAC;EACpB;EAEOC,SAASA,CAACC,IAAe,EAAQ;IACpC,IAAI,CAACH,UAAU,GAAGG,IAAI;IACtB,OAAO,IAAI;EACf;EAEgBC,KAAKA,CAAA,EAA2B;IAC5C,OAAO;MACHD,IAAI,EAAE,QAAQ;MACdE,UAAU,EAAE;QACRF,IAAI,EAAE,OAAO;QACbG,KAAK,EAAE,IAAI,CAACC,MAAM,CAACD,KAAK;QACxBJ,SAAS,EAAE,IAAI,CAACF;MACpB;IACJ,CAAC;EACL;AACJ;AAEA,MAAMQ,uBAAuB,CAA8B;EACvCL,IAAI,GAAG,SAAS;EAEzBM,MAAMA,CAAA,EAAyB;IAClC,OAAO,IAAIV,iBAAiB,CAAC,CAAC;EAClC;AACJ;AAEA,OAAO,MAAMW,gBAAgB,GAAGb,SAAS,CAACc,oBAAoB,CAAC;EAC3DC,cAAc,EAAEJ,uBAAuB;EACvCK,YAAY,EAAE;AAClB,CAAC,CAAC;;AAEF","ignoreList":[]}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { type IFieldTypeFactory } from "./abstractions.js";
|
|
2
|
-
import {
|
|
2
|
+
import { LayoutFieldBuilder } from "./LayoutFieldBuilder.js";
|
|
3
|
+
export interface IUiSeparatorFieldBuilder extends LayoutFieldBuilder<"uiSeparator"> {
|
|
4
|
+
}
|
|
3
5
|
declare class UiSeparatorFieldTypeFactory implements IFieldTypeFactory {
|
|
4
|
-
readonly type = "
|
|
5
|
-
create():
|
|
6
|
+
readonly type = "uiSeparator";
|
|
7
|
+
create(): IUiSeparatorFieldBuilder;
|
|
6
8
|
}
|
|
7
9
|
export declare const UiSeparatorFieldType: typeof UiSeparatorFieldTypeFactory & {
|
|
8
10
|
__abstraction: import("@webiny/di").Abstraction<IFieldTypeFactory>;
|
|
9
11
|
};
|
|
10
12
|
declare module "../abstractions.js" {
|
|
11
13
|
interface IFieldBuilderRegistry {
|
|
12
|
-
uiSeparator():
|
|
14
|
+
uiSeparator(): IUiSeparatorFieldBuilder;
|
|
13
15
|
}
|
|
14
16
|
}
|
|
15
17
|
export {};
|
|
@@ -1,10 +1,24 @@
|
|
|
1
1
|
import { FieldType } from "./abstractions.js";
|
|
2
|
-
import {
|
|
2
|
+
import { LayoutFieldBuilder } from "./LayoutFieldBuilder.js";
|
|
3
|
+
class SeparatorFieldBuilder extends LayoutFieldBuilder {
|
|
4
|
+
constructor() {
|
|
5
|
+
super("uiSeparator");
|
|
6
|
+
}
|
|
7
|
+
build() {
|
|
8
|
+
return {
|
|
9
|
+
type: "layout",
|
|
10
|
+
layoutCell: {
|
|
11
|
+
type: "separator",
|
|
12
|
+
label: this.config.label,
|
|
13
|
+
description: this.config.description
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
3
18
|
class UiSeparatorFieldTypeFactory {
|
|
4
|
-
type = "
|
|
19
|
+
type = "uiSeparator";
|
|
5
20
|
create() {
|
|
6
|
-
|
|
7
|
-
return builder.renderer("uiSeparator").label("Separator");
|
|
21
|
+
return new SeparatorFieldBuilder();
|
|
8
22
|
}
|
|
9
23
|
}
|
|
10
24
|
export const UiSeparatorFieldType = FieldType.createImplementation({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["FieldType","
|
|
1
|
+
{"version":3,"names":["FieldType","LayoutFieldBuilder","SeparatorFieldBuilder","constructor","build","type","layoutCell","label","config","description","UiSeparatorFieldTypeFactory","create","UiSeparatorFieldType","createImplementation","implementation","dependencies"],"sources":["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"],"mappings":"AAAA,SAASA,SAAS;AAElB,SAASC,kBAAkB;AAI3B,MAAMC,qBAAqB,SACfD,kBAAkB,CAE9B;EACWE,WAAWA,CAAA,EAAG;IACjB,KAAK,CAAC,aAAa,CAAC;EACxB;EAEgBC,KAAKA,CAAA,EAA2B;IAC5C,OAAO;MACHC,IAAI,EAAE,QAAQ;MACdC,UAAU,EAAE;QACRD,IAAI,EAAE,WAAW;QACjBE,KAAK,EAAE,IAAI,CAACC,MAAM,CAACD,KAAK;QACxBE,WAAW,EAAE,IAAI,CAACD,MAAM,CAACC;MAC7B;IACJ,CAAC;EACL;AACJ;AAEA,MAAMC,2BAA2B,CAA8B;EAC3CL,IAAI,GAAG,aAAa;EAE7BM,MAAMA,CAAA,EAA6B;IACtC,OAAO,IAAIT,qBAAqB,CAAC,CAAC;EACtC;AACJ;AAEA,OAAO,MAAMU,oBAAoB,GAAGZ,SAAS,CAACa,oBAAoB,CAAC;EAC/DC,cAAc,EAAEJ,2BAA2B;EAC3CK,YAAY,EAAE;AAClB,CAAC,CAAC;;AAEF","ignoreList":[]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type IFieldTypeFactory } from "./abstractions.js";
|
|
2
|
+
import { BaseFieldBuilder } from "./BaseFieldBuilder.js";
|
|
3
|
+
import { LayoutFieldBuilder } from "./LayoutFieldBuilder.js";
|
|
4
|
+
import { type IFieldBuilderRegistry } from "../abstractions.js";
|
|
5
|
+
import type { CmsIcon } from "../../../types/index.js";
|
|
6
|
+
interface ITabConfig {
|
|
7
|
+
label: string;
|
|
8
|
+
icon?: CmsIcon;
|
|
9
|
+
description?: string;
|
|
10
|
+
fields: (registry: IFieldBuilderRegistry) => Record<string, BaseFieldBuilder<any>>;
|
|
11
|
+
layout?: string[][];
|
|
12
|
+
}
|
|
13
|
+
export interface IUiTabsFieldBuilder extends LayoutFieldBuilder<"uiTabs"> {
|
|
14
|
+
tab(id: string, config: ITabConfig): this;
|
|
15
|
+
}
|
|
16
|
+
declare class TabsFieldTypeFactory implements IFieldTypeFactory {
|
|
17
|
+
readonly type = "uiTabs";
|
|
18
|
+
create(registry: IFieldBuilderRegistry): IUiTabsFieldBuilder;
|
|
19
|
+
}
|
|
20
|
+
export declare const UiTabsFieldType: typeof TabsFieldTypeFactory & {
|
|
21
|
+
__abstraction: import("@webiny/di").Abstraction<IFieldTypeFactory>;
|
|
22
|
+
};
|
|
23
|
+
declare module "../abstractions.js" {
|
|
24
|
+
interface IFieldBuilderRegistry {
|
|
25
|
+
uiTabs(): IUiTabsFieldBuilder;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export {};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { FieldType } from "./abstractions.js";
|
|
2
|
+
import { LayoutFieldBuilder } from "./LayoutFieldBuilder.js";
|
|
3
|
+
class TabsFieldBuilder extends LayoutFieldBuilder {
|
|
4
|
+
tabs = [];
|
|
5
|
+
constructor(registry) {
|
|
6
|
+
super("uiTabs");
|
|
7
|
+
this.registry = registry;
|
|
8
|
+
}
|
|
9
|
+
tab(id, config) {
|
|
10
|
+
const fieldBuilders = config.fields(this.registry);
|
|
11
|
+
const fields = [];
|
|
12
|
+
const layoutReplacements = new Map();
|
|
13
|
+
for (const [key, fieldBuilder] of Object.entries(fieldBuilders)) {
|
|
14
|
+
fieldBuilder.fieldId(key);
|
|
15
|
+
const result = fieldBuilder.build();
|
|
16
|
+
if (result.type === "layout") {
|
|
17
|
+
layoutReplacements.set(key, result.layoutCell);
|
|
18
|
+
if (result.fields) {
|
|
19
|
+
fields.push(...result.fields);
|
|
20
|
+
}
|
|
21
|
+
} else {
|
|
22
|
+
fields.push(result.field);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const rawLayout = config.layout || [];
|
|
26
|
+
const layout = rawLayout.map(row => row.map(cell => layoutReplacements.get(cell) ?? cell));
|
|
27
|
+
this.tabs.push({
|
|
28
|
+
id,
|
|
29
|
+
label: config.label,
|
|
30
|
+
icon: config.icon,
|
|
31
|
+
description: config.description || "",
|
|
32
|
+
fields,
|
|
33
|
+
layout
|
|
34
|
+
});
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
build() {
|
|
38
|
+
const hoistedFields = [];
|
|
39
|
+
const layoutTabs = [];
|
|
40
|
+
for (const tab of this.tabs) {
|
|
41
|
+
hoistedFields.push(...tab.fields);
|
|
42
|
+
layoutTabs.push({
|
|
43
|
+
id: tab.id,
|
|
44
|
+
label: tab.label,
|
|
45
|
+
icon: tab.icon || null,
|
|
46
|
+
layout: tab.layout
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
type: "layout",
|
|
51
|
+
layoutCell: {
|
|
52
|
+
type: "tabs",
|
|
53
|
+
label: this.config.label,
|
|
54
|
+
description: this.config.description || null,
|
|
55
|
+
help: this.config.help || null,
|
|
56
|
+
tabs: layoutTabs
|
|
57
|
+
},
|
|
58
|
+
fields: hoistedFields
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
class TabsFieldTypeFactory {
|
|
63
|
+
type = "uiTabs";
|
|
64
|
+
create(registry) {
|
|
65
|
+
return new TabsFieldBuilder(registry);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export const UiTabsFieldType = FieldType.createImplementation({
|
|
69
|
+
implementation: TabsFieldTypeFactory,
|
|
70
|
+
dependencies: []
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
// Module augmentation for TypeScript autocomplete
|
|
74
|
+
|
|
75
|
+
//# sourceMappingURL=UiTabsFieldType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["FieldType","LayoutFieldBuilder","TabsFieldBuilder","tabs","constructor","registry","tab","id","config","fieldBuilders","fields","layoutReplacements","Map","key","fieldBuilder","Object","entries","fieldId","result","build","type","set","layoutCell","push","field","rawLayout","layout","map","row","cell","get","label","icon","description","hoistedFields","layoutTabs","help","TabsFieldTypeFactory","create","UiTabsFieldType","createImplementation","implementation","dependencies"],"sources":["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"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { BaseFieldBuilder } from "./BaseFieldBuilder.js";
|
|
2
2
|
import type { IFieldBuilderRegistry } from "../abstractions.js";
|
|
3
3
|
/**
|
|
4
4
|
* Field Type Factory - creates a field builder instance
|
|
@@ -7,7 +7,7 @@ export interface IFieldTypeFactory {
|
|
|
7
7
|
/** Unique identifier for this field type */
|
|
8
8
|
readonly type: string;
|
|
9
9
|
/** Create a new field builder instance */
|
|
10
|
-
create(registry: IFieldBuilderRegistry):
|
|
10
|
+
create(registry: IFieldBuilderRegistry): BaseFieldBuilder<any>;
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
13
|
* Field Type abstraction - use with { multiple: true } in DI
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createAbstraction","FieldType"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type {
|
|
1
|
+
{"version":3,"names":["createAbstraction","FieldType"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { BaseFieldBuilder } from \"./BaseFieldBuilder.js\";\nimport type { IFieldBuilderRegistry } from \"../abstractions.js\";\n\n/**\n * Field Type Factory - creates a field builder instance\n */\nexport interface IFieldTypeFactory {\n /** Unique identifier for this field type */\n readonly type: string;\n\n /** Create a new field builder instance */\n create(registry: IFieldBuilderRegistry): BaseFieldBuilder<any>;\n}\n\n/**\n * Field Type abstraction - use with { multiple: true } in DI\n */\nexport const FieldType = createAbstraction<IFieldTypeFactory>(\"FieldType\");\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;;AAIvD;AACA;AACA;;AASA;AACA;AACA;AACA,OAAO,MAAMC,SAAS,GAAGD,iBAAiB,CAAoB,WAAW,CAAC","ignoreList":[]}
|
|
@@ -19,4 +19,6 @@ import "./fields/RefFieldType.js";
|
|
|
19
19
|
import "./fields/DynamicZoneFieldType.js";
|
|
20
20
|
import "./fields/JsonFieldType.js";
|
|
21
21
|
import "./fields/SearchableJsonFieldType.js";
|
|
22
|
+
import "./fields/UiSeparatorFieldType.js";
|
|
23
|
+
import "./fields/UiTabsFieldType.js";
|
|
22
24
|
import "./fields/UiAlertFieldType.js";
|
|
@@ -23,6 +23,8 @@ import "./fields/DynamicZoneFieldType.js";
|
|
|
23
23
|
// import "./fields/LocationFieldType.js";
|
|
24
24
|
import "./fields/JsonFieldType.js";
|
|
25
25
|
import "./fields/SearchableJsonFieldType.js";
|
|
26
|
+
import "./fields/UiSeparatorFieldType.js";
|
|
27
|
+
import "./fields/UiTabsFieldType.js";
|
|
26
28
|
import "./fields/UiAlertFieldType.js";
|
|
27
29
|
|
|
28
30
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ModelFactory"],"sources":["index.ts"],"sourcesContent":["export { ModelFactory } from \"./abstractions.js\";\nexport * from \"./models/BaseModelBuilder.js\";\nexport * from \"./models/ModelBuilder.js\";\nexport * from \"./models/PrivateModelBuilder.js\";\nexport * from \"./models/PublicModelBuilder.js\";\nexport * from \"./feature.js\";\nexport * from \"./fields/FieldBuilder.js\";\nexport * from \"./fields/abstractions.js\";\nexport * from \"./models/abstractions.js\";\n\n// Import all field types to ensure their module augmentations are applied\n// These imports have side effects that add methods to IFieldBuilderRegistry\nimport \"./fields/TextFieldType.js\";\nimport \"./fields/LongTextFieldType.js\";\nimport \"./fields/RichTextFieldType.js\";\nimport \"./fields/NumberFieldType.js\";\nimport \"./fields/BooleanFieldType.js\";\nimport \"./fields/FileFieldType.js\";\nimport \"./fields/DateTimeFieldType.js\";\nimport \"./fields/ObjectFieldType.js\";\nimport \"./fields/RefFieldType.js\";\nimport \"./fields/DynamicZoneFieldType.js\";\n// import \"./fields/LocationFieldType.js\";\nimport \"./fields/JsonFieldType.js\";\nimport \"./fields/SearchableJsonFieldType.js\";\nimport \"./fields/UiAlertFieldType.js\";\n"],"mappings":"AAAA,SAASA,YAAY;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["ModelFactory"],"sources":["index.ts"],"sourcesContent":["export { ModelFactory } from \"./abstractions.js\";\nexport * from \"./models/BaseModelBuilder.js\";\nexport * from \"./models/ModelBuilder.js\";\nexport * from \"./models/PrivateModelBuilder.js\";\nexport * from \"./models/PublicModelBuilder.js\";\nexport * from \"./feature.js\";\nexport * from \"./fields/FieldBuilder.js\";\nexport * from \"./fields/abstractions.js\";\nexport * from \"./models/abstractions.js\";\n\n// Import all field types to ensure their module augmentations are applied\n// These imports have side effects that add methods to IFieldBuilderRegistry\nimport \"./fields/TextFieldType.js\";\nimport \"./fields/LongTextFieldType.js\";\nimport \"./fields/RichTextFieldType.js\";\nimport \"./fields/NumberFieldType.js\";\nimport \"./fields/BooleanFieldType.js\";\nimport \"./fields/FileFieldType.js\";\nimport \"./fields/DateTimeFieldType.js\";\nimport \"./fields/ObjectFieldType.js\";\nimport \"./fields/RefFieldType.js\";\nimport \"./fields/DynamicZoneFieldType.js\";\n// import \"./fields/LocationFieldType.js\";\nimport \"./fields/JsonFieldType.js\";\nimport \"./fields/SearchableJsonFieldType.js\";\nimport \"./fields/UiSeparatorFieldType.js\";\nimport \"./fields/UiTabsFieldType.js\";\nimport \"./fields/UiAlertFieldType.js\";\n"],"mappings":"AAAA,SAASA,YAAY;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","ignoreList":[]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseFieldBuilder } from "../../../features/modelBuilder/index.js";
|
|
2
2
|
import { CmsModelPlugin } from "../../../plugins/CmsModelPlugin.js";
|
|
3
3
|
import { FieldBuilderRegistry } from "../abstractions.js";
|
|
4
|
+
import type { CmsModelField, CmsModelLayoutCell } from "../../../types/index.js";
|
|
4
5
|
/**
|
|
5
6
|
* Base class for all model builders, containing shared logic.
|
|
6
7
|
* Concrete builders (PrivateModelBuilder, PublicModelBuilder) extend this.
|
|
@@ -13,13 +14,13 @@ export declare abstract class BaseModelBuilder<TBuild = CmsModelPlugin> {
|
|
|
13
14
|
tags?: string[];
|
|
14
15
|
};
|
|
15
16
|
protected isSingleEntry: boolean;
|
|
16
|
-
protected fieldBuildersMap: Map<string,
|
|
17
|
+
protected fieldBuildersMap: Map<string, BaseFieldBuilder<any>>;
|
|
17
18
|
constructor(registry: FieldBuilderRegistry.Interface);
|
|
18
19
|
modelId(id: string): this;
|
|
19
20
|
name(name: string): this;
|
|
20
21
|
singleEntry(): this;
|
|
21
22
|
tags(tags: string[]): this;
|
|
22
|
-
fields(builder: (registry: FieldBuilderRegistry.Interface) => Record<string,
|
|
23
|
+
fields(builder: (registry: FieldBuilderRegistry.Interface) => Record<string, BaseFieldBuilder<any>>): this;
|
|
23
24
|
/**
|
|
24
25
|
* Merge field operations from extension builder into existing builder.
|
|
25
26
|
* This handles the case where multiple fields of the same type exist,
|
|
@@ -28,6 +29,10 @@ export declare abstract class BaseModelBuilder<TBuild = CmsModelPlugin> {
|
|
|
28
29
|
* @internal
|
|
29
30
|
*/
|
|
30
31
|
private mergeFieldOperations;
|
|
32
|
+
protected buildFields(): {
|
|
33
|
+
fields: CmsModelField[];
|
|
34
|
+
layoutReplacements: Map<string, CmsModelLayoutCell>;
|
|
35
|
+
};
|
|
31
36
|
/**
|
|
32
37
|
* Get tags with common defaults applied.
|
|
33
38
|
* Always includes "type:model" and optionally "singleEntry".
|
|
@@ -98,6 +98,25 @@ export class BaseModelBuilder {
|
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
|
+
buildFields() {
|
|
102
|
+
const fields = [];
|
|
103
|
+
const layoutReplacements = new Map();
|
|
104
|
+
for (const [fieldId, builder] of this.fieldBuildersMap) {
|
|
105
|
+
const result = builder.build();
|
|
106
|
+
if (result.type === "layout") {
|
|
107
|
+
layoutReplacements.set(fieldId, result.layoutCell);
|
|
108
|
+
if (result.fields) {
|
|
109
|
+
fields.push(...result.fields);
|
|
110
|
+
}
|
|
111
|
+
} else {
|
|
112
|
+
fields.push(result.field);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
fields,
|
|
117
|
+
layoutReplacements
|
|
118
|
+
};
|
|
119
|
+
}
|
|
101
120
|
|
|
102
121
|
/**
|
|
103
122
|
* Get tags with common defaults applied.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BaseModelBuilder","config","isSingleEntry","fieldBuildersMap","Map","constructor","registry","modelId","id","name","singleEntry","tags","fields","builder","existingFields","fieldBuilders","key","fieldBuilder","Object","entries","fieldId","existingBuilder","get","isExtendMode","_extendMode","type","Error","mergeFieldOperations","set","existing","extension","existingFieldMap","extensionFieldMap","nestedKey","nestedBuilder","existingLayoutBuilder","layoutBuilder","extensionLayoutBuilder","snapshot","getSnapshot","layout","length","modifiers","setLayout","modifier","addModifier","getTags","tagsSet","Set","add","Array","from"],"sources":["BaseModelBuilder.ts"],"sourcesContent":["import { FieldBuilder } from \"~/features/modelBuilder/index.js\";\nimport { CmsModelPlugin } from \"~/plugins/CmsModelPlugin.js\";\nimport { FieldBuilderRegistry } from \"../abstractions.js\";\n\n/**\n * Base class for all model builders, containing shared logic.\n * Concrete builders (PrivateModelBuilder, PublicModelBuilder) extend this.\n */\nexport abstract class BaseModelBuilder<TBuild = CmsModelPlugin> {\n protected config: {\n modelId?: string;\n name?: string;\n tags?: string[];\n } = {};\n\n protected isSingleEntry = false;\n protected fieldBuildersMap = new Map<string, FieldBuilder<any>>();\n\n public constructor(protected registry: FieldBuilderRegistry.Interface) {}\n\n modelId(id: string): this {\n this.config.modelId = id;\n return this;\n }\n\n name(name: string): this {\n this.config.name = name;\n return this;\n }\n\n singleEntry(): this {\n this.isSingleEntry = true;\n return this;\n }\n\n tags(tags: string[]): this {\n this.config.tags = tags;\n return this;\n }\n\n fields(\n builder: (registry: FieldBuilderRegistry.Interface) => Record<string, FieldBuilder<any>>\n ): this {\n // Pass existing fields to registry so it can return them when extending\n (this.registry as any).existingFields = this.fieldBuildersMap;\n\n const fieldBuilders = builder(this.registry);\n\n for (const [key, fieldBuilder] of Object.entries(fieldBuilders)) {\n // Set the fieldId from the object key\n fieldBuilder.fieldId(key);\n\n const existingBuilder = this.fieldBuildersMap.get(key);\n const isExtendMode = (fieldBuilder as any)._extendMode;\n\n if (isExtendMode && existingBuilder) {\n // Extension mode - validate type and merge operations\n if (existingBuilder.type !== fieldBuilder.type) {\n throw new Error(\n `Cannot extend field \"${key}\": type mismatch. Expected \"${existingBuilder.type}\", got \"${fieldBuilder.type}\".`\n );\n }\n // Merge operations from temporary new builder into existing builder\n this.mergeFieldOperations(key, existingBuilder, fieldBuilder);\n } else if (existingBuilder && !isExtendMode) {\n // Replacement mode - validate type\n if (existingBuilder.type !== fieldBuilder.type) {\n throw new Error(\n `Cannot redefine field \"${key}\": type mismatch. Expected \"${existingBuilder.type}\", got \"${fieldBuilder.type}\".`\n );\n }\n // Replace with new builder\n this.fieldBuildersMap.set(key, fieldBuilder);\n } else if (!existingBuilder && !isExtendMode) {\n // New field - store builder\n this.fieldBuildersMap.set(key, fieldBuilder);\n } else {\n // isExtendMode but no existingBuilder - this is an error\n throw new Error(\n `Cannot extend field \"${key}\": field does not exist. Use .extend() only for existing fields.`\n );\n }\n }\n\n return this;\n }\n\n /**\n * Merge field operations from extension builder into existing builder.\n * This handles the case where multiple fields of the same type exist,\n * and we need to transfer operations from the temporary new builder\n * to the existing builder.\n * @internal\n */\n private mergeFieldOperations(\n fieldId: string,\n existing: FieldBuilder<any>,\n extension: FieldBuilder<any>\n ): void {\n // For object fields, merge nested fields and layout operations\n if (existing.type === \"object\" && extension.type === \"object\") {\n const existingFieldMap = (existing as any).fieldBuildersMap;\n const extensionFieldMap = (extension as any).fieldBuildersMap;\n\n // Merge nested field builders\n if (extensionFieldMap) {\n for (const [nestedKey, nestedBuilder] of extensionFieldMap.entries()) {\n existingFieldMap.set(nestedKey, nestedBuilder);\n }\n }\n\n // Merge layout operations\n const existingLayoutBuilder = (existing as any).layoutBuilder;\n const extensionLayoutBuilder = (extension as any).layoutBuilder;\n\n if (extensionLayoutBuilder) {\n const snapshot = extensionLayoutBuilder.getSnapshot();\n\n // If extension called setLayout() with an array, apply it to existing\n // We detect this by checking if there's a layout but no modifiers\n if (snapshot.layout.length > 0 && snapshot.modifiers.length === 0) {\n existingLayoutBuilder.setLayout(snapshot.layout);\n }\n\n // Apply all modifiers from extension to existing\n for (const modifier of snapshot.modifiers) {\n existingLayoutBuilder.addModifier(modifier);\n }\n }\n }\n }\n\n /**\n * Get tags with common defaults applied.\n * Always includes \"type:model\" and optionally \"singleEntry\".\n */\n protected getTags(): string[] {\n const tagsSet = new Set(this.config.tags || []);\n tagsSet.add(\"type:model\");\n if (this.isSingleEntry) {\n tagsSet.add(\"singleEntry\");\n }\n return Array.from(tagsSet);\n }\n\n /**\n * Build the final model configuration.\n * Must be implemented by concrete builders.\n */\n abstract build(): TBuild;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["BaseModelBuilder","config","isSingleEntry","fieldBuildersMap","Map","constructor","registry","modelId","id","name","singleEntry","tags","fields","builder","existingFields","fieldBuilders","key","fieldBuilder","Object","entries","fieldId","existingBuilder","get","isExtendMode","_extendMode","type","Error","mergeFieldOperations","set","existing","extension","existingFieldMap","extensionFieldMap","nestedKey","nestedBuilder","existingLayoutBuilder","layoutBuilder","extensionLayoutBuilder","snapshot","getSnapshot","layout","length","modifiers","setLayout","modifier","addModifier","buildFields","layoutReplacements","result","build","layoutCell","push","field","getTags","tagsSet","Set","add","Array","from"],"sources":["BaseModelBuilder.ts"],"sourcesContent":["import { BaseFieldBuilder } from \"~/features/modelBuilder/index.js\";\nimport { CmsModelPlugin } from \"~/plugins/CmsModelPlugin.js\";\nimport { FieldBuilderRegistry } from \"../abstractions.js\";\nimport type { CmsModelField, CmsModelLayoutCell } from \"~/types/index.js\";\n\n/**\n * Base class for all model builders, containing shared logic.\n * Concrete builders (PrivateModelBuilder, PublicModelBuilder) extend this.\n */\nexport abstract class BaseModelBuilder<TBuild = CmsModelPlugin> {\n protected config: {\n modelId?: string;\n name?: string;\n tags?: string[];\n } = {};\n\n protected isSingleEntry = false;\n protected fieldBuildersMap = new Map<string, BaseFieldBuilder<any>>();\n\n public constructor(protected registry: FieldBuilderRegistry.Interface) {}\n\n modelId(id: string): this {\n this.config.modelId = id;\n return this;\n }\n\n name(name: string): this {\n this.config.name = name;\n return this;\n }\n\n singleEntry(): this {\n this.isSingleEntry = true;\n return this;\n }\n\n tags(tags: string[]): this {\n this.config.tags = tags;\n return this;\n }\n\n fields(\n builder: (registry: FieldBuilderRegistry.Interface) => Record<string, BaseFieldBuilder<any>>\n ): this {\n // Pass existing fields to registry so it can return them when extending\n (this.registry as any).existingFields = this.fieldBuildersMap;\n\n const fieldBuilders = builder(this.registry);\n\n for (const [key, fieldBuilder] of Object.entries(fieldBuilders)) {\n // Set the fieldId from the object key\n fieldBuilder.fieldId(key);\n\n const existingBuilder = this.fieldBuildersMap.get(key);\n const isExtendMode = (fieldBuilder as any)._extendMode;\n\n if (isExtendMode && existingBuilder) {\n // Extension mode - validate type and merge operations\n if (existingBuilder.type !== fieldBuilder.type) {\n throw new Error(\n `Cannot extend field \"${key}\": type mismatch. Expected \"${existingBuilder.type}\", got \"${fieldBuilder.type}\".`\n );\n }\n // Merge operations from temporary new builder into existing builder\n this.mergeFieldOperations(key, existingBuilder, fieldBuilder);\n } else if (existingBuilder && !isExtendMode) {\n // Replacement mode - validate type\n if (existingBuilder.type !== fieldBuilder.type) {\n throw new Error(\n `Cannot redefine field \"${key}\": type mismatch. Expected \"${existingBuilder.type}\", got \"${fieldBuilder.type}\".`\n );\n }\n // Replace with new builder\n this.fieldBuildersMap.set(key, fieldBuilder);\n } else if (!existingBuilder && !isExtendMode) {\n // New field - store builder\n this.fieldBuildersMap.set(key, fieldBuilder);\n } else {\n // isExtendMode but no existingBuilder - this is an error\n throw new Error(\n `Cannot extend field \"${key}\": field does not exist. Use .extend() only for existing fields.`\n );\n }\n }\n\n return this;\n }\n\n /**\n * Merge field operations from extension builder into existing builder.\n * This handles the case where multiple fields of the same type exist,\n * and we need to transfer operations from the temporary new builder\n * to the existing builder.\n * @internal\n */\n private mergeFieldOperations(\n fieldId: string,\n existing: BaseFieldBuilder<any>,\n extension: BaseFieldBuilder<any>\n ): void {\n // For object fields, merge nested fields and layout operations\n if (existing.type === \"object\" && extension.type === \"object\") {\n const existingFieldMap = (existing as any).fieldBuildersMap;\n const extensionFieldMap = (extension as any).fieldBuildersMap;\n\n // Merge nested field builders\n if (extensionFieldMap) {\n for (const [nestedKey, nestedBuilder] of extensionFieldMap.entries()) {\n existingFieldMap.set(nestedKey, nestedBuilder);\n }\n }\n\n // Merge layout operations\n const existingLayoutBuilder = (existing as any).layoutBuilder;\n const extensionLayoutBuilder = (extension as any).layoutBuilder;\n\n if (extensionLayoutBuilder) {\n const snapshot = extensionLayoutBuilder.getSnapshot();\n\n // If extension called setLayout() with an array, apply it to existing\n // We detect this by checking if there's a layout but no modifiers\n if (snapshot.layout.length > 0 && snapshot.modifiers.length === 0) {\n existingLayoutBuilder.setLayout(snapshot.layout);\n }\n\n // Apply all modifiers from extension to existing\n for (const modifier of snapshot.modifiers) {\n existingLayoutBuilder.addModifier(modifier);\n }\n }\n }\n }\n\n protected buildFields(): {\n fields: CmsModelField[];\n layoutReplacements: Map<string, CmsModelLayoutCell>;\n } {\n const fields: CmsModelField[] = [];\n const layoutReplacements = new Map<string, CmsModelLayoutCell>();\n\n for (const [fieldId, builder] of this.fieldBuildersMap) {\n const result = builder.build();\n if (result.type === \"layout\") {\n layoutReplacements.set(fieldId, result.layoutCell);\n if (result.fields) {\n fields.push(...result.fields);\n }\n } else {\n fields.push(result.field);\n }\n }\n\n return { fields, layoutReplacements };\n }\n\n /**\n * Get tags with common defaults applied.\n * Always includes \"type:model\" and optionally \"singleEntry\".\n */\n protected getTags(): string[] {\n const tagsSet = new Set(this.config.tags || []);\n tagsSet.add(\"type:model\");\n if (this.isSingleEntry) {\n tagsSet.add(\"singleEntry\");\n }\n return Array.from(tagsSet);\n }\n\n /**\n * Build the final model configuration.\n * Must be implemented by concrete builders.\n */\n abstract build(): TBuild;\n}\n"],"mappings":"AAKA;AACA;AACA;AACA;AACA,OAAO,MAAeA,gBAAgB,CAA0B;EAClDC,MAAM,GAIZ,CAAC,CAAC;EAEIC,aAAa,GAAG,KAAK;EACrBC,gBAAgB,GAAG,IAAIC,GAAG,CAAgC,CAAC;EAE9DC,WAAWA,CAAWC,QAAwC,EAAE;IAAA,KAA1CA,QAAwC,GAAxCA,QAAwC;EAAG;EAExEC,OAAOA,CAACC,EAAU,EAAQ;IACtB,IAAI,CAACP,MAAM,CAACM,OAAO,GAAGC,EAAE;IACxB,OAAO,IAAI;EACf;EAEAC,IAAIA,CAACA,IAAY,EAAQ;IACrB,IAAI,CAACR,MAAM,CAACQ,IAAI,GAAGA,IAAI;IACvB,OAAO,IAAI;EACf;EAEAC,WAAWA,CAAA,EAAS;IAChB,IAAI,CAACR,aAAa,GAAG,IAAI;IACzB,OAAO,IAAI;EACf;EAEAS,IAAIA,CAACA,IAAc,EAAQ;IACvB,IAAI,CAACV,MAAM,CAACU,IAAI,GAAGA,IAAI;IACvB,OAAO,IAAI;EACf;EAEAC,MAAMA,CACFC,OAA4F,EACxF;IACJ;IACC,IAAI,CAACP,QAAQ,CAASQ,cAAc,GAAG,IAAI,CAACX,gBAAgB;IAE7D,MAAMY,aAAa,GAAGF,OAAO,CAAC,IAAI,CAACP,QAAQ,CAAC;IAE5C,KAAK,MAAM,CAACU,GAAG,EAAEC,YAAY,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACJ,aAAa,CAAC,EAAE;MAC7D;MACAE,YAAY,CAACG,OAAO,CAACJ,GAAG,CAAC;MAEzB,MAAMK,eAAe,GAAG,IAAI,CAAClB,gBAAgB,CAACmB,GAAG,CAACN,GAAG,CAAC;MACtD,MAAMO,YAAY,GAAIN,YAAY,CAASO,WAAW;MAEtD,IAAID,YAAY,IAAIF,eAAe,EAAE;QACjC;QACA,IAAIA,eAAe,CAACI,IAAI,KAAKR,YAAY,CAACQ,IAAI,EAAE;UAC5C,MAAM,IAAIC,KAAK,CACX,wBAAwBV,GAAG,+BAA+BK,eAAe,CAACI,IAAI,WAAWR,YAAY,CAACQ,IAAI,IAC9G,CAAC;QACL;QACA;QACA,IAAI,CAACE,oBAAoB,CAACX,GAAG,EAAEK,eAAe,EAAEJ,YAAY,CAAC;MACjE,CAAC,MAAM,IAAII,eAAe,IAAI,CAACE,YAAY,EAAE;QACzC;QACA,IAAIF,eAAe,CAACI,IAAI,KAAKR,YAAY,CAACQ,IAAI,EAAE;UAC5C,MAAM,IAAIC,KAAK,CACX,0BAA0BV,GAAG,+BAA+BK,eAAe,CAACI,IAAI,WAAWR,YAAY,CAACQ,IAAI,IAChH,CAAC;QACL;QACA;QACA,IAAI,CAACtB,gBAAgB,CAACyB,GAAG,CAACZ,GAAG,EAAEC,YAAY,CAAC;MAChD,CAAC,MAAM,IAAI,CAACI,eAAe,IAAI,CAACE,YAAY,EAAE;QAC1C;QACA,IAAI,CAACpB,gBAAgB,CAACyB,GAAG,CAACZ,GAAG,EAAEC,YAAY,CAAC;MAChD,CAAC,MAAM;QACH;QACA,MAAM,IAAIS,KAAK,CACX,wBAAwBV,GAAG,kEAC/B,CAAC;MACL;IACJ;IAEA,OAAO,IAAI;EACf;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;EACYW,oBAAoBA,CACxBP,OAAe,EACfS,QAA+B,EAC/BC,SAAgC,EAC5B;IACJ;IACA,IAAID,QAAQ,CAACJ,IAAI,KAAK,QAAQ,IAAIK,SAAS,CAACL,IAAI,KAAK,QAAQ,EAAE;MAC3D,MAAMM,gBAAgB,GAAIF,QAAQ,CAAS1B,gBAAgB;MAC3D,MAAM6B,iBAAiB,GAAIF,SAAS,CAAS3B,gBAAgB;;MAE7D;MACA,IAAI6B,iBAAiB,EAAE;QACnB,KAAK,MAAM,CAACC,SAAS,EAAEC,aAAa,CAAC,IAAIF,iBAAiB,CAACb,OAAO,CAAC,CAAC,EAAE;UAClEY,gBAAgB,CAACH,GAAG,CAACK,SAAS,EAAEC,aAAa,CAAC;QAClD;MACJ;;MAEA;MACA,MAAMC,qBAAqB,GAAIN,QAAQ,CAASO,aAAa;MAC7D,MAAMC,sBAAsB,GAAIP,SAAS,CAASM,aAAa;MAE/D,IAAIC,sBAAsB,EAAE;QACxB,MAAMC,QAAQ,GAAGD,sBAAsB,CAACE,WAAW,CAAC,CAAC;;QAErD;QACA;QACA,IAAID,QAAQ,CAACE,MAAM,CAACC,MAAM,GAAG,CAAC,IAAIH,QAAQ,CAACI,SAAS,CAACD,MAAM,KAAK,CAAC,EAAE;UAC/DN,qBAAqB,CAACQ,SAAS,CAACL,QAAQ,CAACE,MAAM,CAAC;QACpD;;QAEA;QACA,KAAK,MAAMI,QAAQ,IAAIN,QAAQ,CAACI,SAAS,EAAE;UACvCP,qBAAqB,CAACU,WAAW,CAACD,QAAQ,CAAC;QAC/C;MACJ;IACJ;EACJ;EAEUE,WAAWA,CAAA,EAGnB;IACE,MAAMlC,MAAuB,GAAG,EAAE;IAClC,MAAMmC,kBAAkB,GAAG,IAAI3C,GAAG,CAA6B,CAAC;IAEhE,KAAK,MAAM,CAACgB,OAAO,EAAEP,OAAO,CAAC,IAAI,IAAI,CAACV,gBAAgB,EAAE;MACpD,MAAM6C,MAAM,GAAGnC,OAAO,CAACoC,KAAK,CAAC,CAAC;MAC9B,IAAID,MAAM,CAACvB,IAAI,KAAK,QAAQ,EAAE;QAC1BsB,kBAAkB,CAACnB,GAAG,CAACR,OAAO,EAAE4B,MAAM,CAACE,UAAU,CAAC;QAClD,IAAIF,MAAM,CAACpC,MAAM,EAAE;UACfA,MAAM,CAACuC,IAAI,CAAC,GAAGH,MAAM,CAACpC,MAAM,CAAC;QACjC;MACJ,CAAC,MAAM;QACHA,MAAM,CAACuC,IAAI,CAACH,MAAM,CAACI,KAAK,CAAC;MAC7B;IACJ;IAEA,OAAO;MAAExC,MAAM;MAAEmC;IAAmB,CAAC;EACzC;;EAEA;AACJ;AACA;AACA;EACcM,OAAOA,CAAA,EAAa;IAC1B,MAAMC,OAAO,GAAG,IAAIC,GAAG,CAAC,IAAI,CAACtD,MAAM,CAACU,IAAI,IAAI,EAAE,CAAC;IAC/C2C,OAAO,CAACE,GAAG,CAAC,YAAY,CAAC;IACzB,IAAI,IAAI,CAACtD,aAAa,EAAE;MACpBoD,OAAO,CAACE,GAAG,CAAC,aAAa,CAAC;IAC9B;IACA,OAAOC,KAAK,CAACC,IAAI,CAACJ,OAAO,CAAC;EAC9B;;EAEA;AACJ;AACA;AACA;AAEA","ignoreList":[]}
|
|
@@ -12,8 +12,10 @@ export class PrivateModelBuilder extends BaseModelBuilder {
|
|
|
12
12
|
throw new Error("fields are required");
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
// Build all fields from field builders
|
|
16
|
-
const
|
|
15
|
+
// Build all fields from field builders (layout replacements ignored for private models)
|
|
16
|
+
const {
|
|
17
|
+
fields
|
|
18
|
+
} = this.buildFields();
|
|
17
19
|
return createPrivateModelPlugin({
|
|
18
20
|
modelId: this.config.modelId,
|
|
19
21
|
name: this.config.name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createPrivateModelPlugin","BaseModelBuilder","PrivateModelBuilder","build","config","modelId","Error","name","fieldBuildersMap","size","fields","
|
|
1
|
+
{"version":3,"names":["createPrivateModelPlugin","BaseModelBuilder","PrivateModelBuilder","build","config","modelId","Error","name","fieldBuildersMap","size","fields","buildFields","authorization","noValidate","tags","getTags"],"sources":["PrivateModelBuilder.ts"],"sourcesContent":["import { createPrivateModelPlugin } from \"~/plugins/CmsModelPlugin.js\";\nimport { BaseModelBuilder } from \"./BaseModelBuilder.js\";\n\nexport class PrivateModelBuilder extends BaseModelBuilder {\n public build() {\n if (!this.config.modelId) {\n throw new Error(\"modelId is required\");\n }\n if (!this.config.name) {\n throw new Error(\"name is required\");\n }\n if (this.fieldBuildersMap.size === 0) {\n throw new Error(\"fields are required\");\n }\n\n // Build all fields from field builders (layout replacements ignored for private models)\n const { fields } = this.buildFields();\n\n return createPrivateModelPlugin({\n modelId: this.config.modelId,\n name: this.config.name,\n fields,\n authorization: false,\n noValidate: true,\n tags: this.getTags()\n });\n }\n}\n"],"mappings":"AAAA,SAASA,wBAAwB;AACjC,SAASC,gBAAgB;AAEzB,OAAO,MAAMC,mBAAmB,SAASD,gBAAgB,CAAC;EAC/CE,KAAKA,CAAA,EAAG;IACX,IAAI,CAAC,IAAI,CAACC,MAAM,CAACC,OAAO,EAAE;MACtB,MAAM,IAAIC,KAAK,CAAC,qBAAqB,CAAC;IAC1C;IACA,IAAI,CAAC,IAAI,CAACF,MAAM,CAACG,IAAI,EAAE;MACnB,MAAM,IAAID,KAAK,CAAC,kBAAkB,CAAC;IACvC;IACA,IAAI,IAAI,CAACE,gBAAgB,CAACC,IAAI,KAAK,CAAC,EAAE;MAClC,MAAM,IAAIH,KAAK,CAAC,qBAAqB,CAAC;IAC1C;;IAEA;IACA,MAAM;MAAEI;IAAO,CAAC,GAAG,IAAI,CAACC,WAAW,CAAC,CAAC;IAErC,OAAOX,wBAAwB,CAAC;MAC5BK,OAAO,EAAE,IAAI,CAACD,MAAM,CAACC,OAAO;MAC5BE,IAAI,EAAE,IAAI,CAACH,MAAM,CAACG,IAAI;MACtBG,MAAM;MACNE,aAAa,EAAE,KAAK;MACpBC,UAAU,EAAE,IAAI;MAChBC,IAAI,EAAE,IAAI,CAACC,OAAO,CAAC;IACvB,CAAC,CAAC;EACN;AACJ","ignoreList":[]}
|
|
@@ -81,21 +81,26 @@ export class PublicModelBuilder extends BaseModelBuilder {
|
|
|
81
81
|
throw new Error("name is required");
|
|
82
82
|
}
|
|
83
83
|
if (this.fieldBuildersMap.size === 0) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
this.titleFieldId(fieldId);
|
|
91
|
-
this.layoutBuilder.setLayout([[fieldId]]);
|
|
84
|
+
this.fields(builder => ({
|
|
85
|
+
alert: builder.uiAlert().label("No fields defined in the code content model. Please ensure you have the fields property correctly defined."),
|
|
86
|
+
emptyPlaceholder: builder.text().label("Empty").renderer("hidden")
|
|
87
|
+
}));
|
|
88
|
+
this.titleFieldId("emptyPlaceholder");
|
|
89
|
+
this.layoutBuilder.setLayout([["alert"], ["emptyPlaceholder"]]);
|
|
92
90
|
}
|
|
93
91
|
if (!this.publicConfig.group) {
|
|
94
92
|
throw new Error("group is required");
|
|
95
93
|
}
|
|
96
94
|
|
|
97
|
-
// Build all fields from field builders
|
|
98
|
-
const
|
|
95
|
+
// Build all fields from field builders, separating data and layout results
|
|
96
|
+
const {
|
|
97
|
+
fields,
|
|
98
|
+
layoutReplacements
|
|
99
|
+
} = this.buildFields();
|
|
100
|
+
|
|
101
|
+
// Build and apply layout replacements (tabs → rich descriptors)
|
|
102
|
+
const rawLayout = this.layoutBuilder.build();
|
|
103
|
+
const layout = rawLayout.map(row => row.map(cell => layoutReplacements.get(cell) ?? cell));
|
|
99
104
|
return createModelPlugin({
|
|
100
105
|
modelId: this.config.modelId,
|
|
101
106
|
name: this.config.name,
|
|
@@ -107,7 +112,7 @@ export class PublicModelBuilder extends BaseModelBuilder {
|
|
|
107
112
|
titleFieldId: this.publicConfig.titleFieldId ?? this.findFirstFieldId(fields, "text"),
|
|
108
113
|
descriptionFieldId: this.publicConfig.descriptionFieldId,
|
|
109
114
|
imageFieldId: this.publicConfig.imageFieldId,
|
|
110
|
-
layout
|
|
115
|
+
layout,
|
|
111
116
|
fields,
|
|
112
117
|
tags: this.getTags()
|
|
113
118
|
}, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["upperFirst","camelCase","pluralize","createModelPlugin","BaseModelBuilder","LayoutBuilder","createApiName","name","createPluralApiName","Icon","from","icon","type","PublicModelBuilder","publicConfig","singularApiName","pluralApiName","group","slug","description","titleFieldId","fieldId","descriptionFieldId","imageFieldId","constructor","registry","layoutBuilder","layout","layoutOrBuilder","Array","isArray","setLayout","addModifier","build","config","modelId","Error","fieldBuildersMap","size","fields","builder","uiAlert","label","values","map","findFirstFieldId","tags","getTags","validateLayout","field","find"],"sources":["PublicModelBuilder.ts"],"sourcesContent":["import upperFirst from \"lodash/upperFirst.js\";\nimport camelCase from \"lodash/camelCase.js\";\nimport pluralize from \"pluralize\";\nimport { createModelPlugin } from \"~/plugins/CmsModelPlugin.js\";\nimport { BaseModelBuilder } from \"./BaseModelBuilder.js\";\nimport type { CmsIcon, CmsModelField } from \"~/types/index.js\";\nimport { LayoutBuilder } from \"../LayoutBuilder.js\";\n\nconst createApiName = (name: string) => {\n return upperFirst(camelCase(name));\n};\n\nconst createPluralApiName = (name: string) => {\n return pluralize(createApiName(name));\n};\n\nclass Icon {\n static from(icon: string | CmsIcon): CmsIcon {\n if (typeof icon === \"string\") {\n return {\n type: \"icon\",\n name: icon\n };\n }\n\n return icon;\n }\n}\n\nexport class PublicModelBuilder extends BaseModelBuilder {\n private publicConfig: {\n singularApiName?: string;\n pluralApiName?: string;\n group?: string;\n icon?: CmsIcon;\n description?: string;\n titleFieldId?: string;\n descriptionFieldId?: string;\n imageFieldId?: string;\n } = {};\n private layoutBuilder: LayoutBuilder;\n\n singularApiName(name: string): this {\n this.publicConfig.singularApiName = name;\n return this;\n }\n\n pluralApiName(name: string): this {\n this.publicConfig.pluralApiName = name;\n return this;\n }\n\n group(slug: string): this {\n this.publicConfig.group = slug;\n return this;\n }\n\n icon(icon: string | CmsIcon): this {\n this.publicConfig.icon = Icon.from(icon);\n return this;\n }\n\n description(description: string): this {\n this.publicConfig.description = description;\n return this;\n }\n\n titleFieldId(fieldId: string): this {\n this.publicConfig.titleFieldId = fieldId;\n return this;\n }\n\n descriptionFieldId(fieldId: string): this {\n this.publicConfig.descriptionFieldId = fieldId;\n return this;\n }\n\n imageFieldId(fieldId: string): this {\n this.publicConfig.imageFieldId = fieldId;\n return this;\n }\n /**\n * It just creates problems if we import the FieldBuilderRegistry.\n * TODO: figure out\n */\n constructor(registry: any) {\n super(registry);\n this.layoutBuilder = new LayoutBuilder();\n }\n\n layout(layoutOrBuilder: string[][] | ((builder: LayoutBuilder) => void)): this {\n if (Array.isArray(layoutOrBuilder)) {\n // Replace layout with array\n this.layoutBuilder.setLayout(layoutOrBuilder);\n } else {\n // Queue the modifier callback\n this.layoutBuilder.addModifier(layoutOrBuilder);\n }\n return this;\n }\n\n build() {\n if (!this.config.modelId) {\n throw new Error(\"modelId is required\");\n }\n if (!this.config.name) {\n throw new Error(\"name is required\");\n }\n if (this.fieldBuildersMap.size === 0) {\n const fieldId = \"alert\";\n this.fields(builder => {\n return {\n [fieldId]: builder\n .uiAlert()\n .label(\n \"No fields defined in the code content model. Please ensure you have the fields property correctly defined.\"\n )\n };\n });\n this.titleFieldId(fieldId);\n this.layoutBuilder.setLayout([[fieldId]]);\n }\n if (!this.publicConfig.group) {\n throw new Error(\"group is required\");\n }\n\n // Build all fields from field builders\n const fields = Array.from(this.fieldBuildersMap.values()).map(builder => builder.build());\n\n return createModelPlugin(\n {\n modelId: this.config.modelId,\n name: this.config.name,\n singularApiName:\n this.publicConfig.singularApiName || createApiName(this.config.name),\n pluralApiName:\n this.publicConfig.pluralApiName || createPluralApiName(this.config.name),\n group: this.publicConfig.group,\n icon: this.publicConfig.icon ?? null,\n description: this.publicConfig.description || null,\n titleFieldId:\n this.publicConfig.titleFieldId ?? this.findFirstFieldId(fields, \"text\"),\n descriptionFieldId: this.publicConfig.descriptionFieldId,\n imageFieldId: this.publicConfig.imageFieldId,\n layout: this.layoutBuilder.build(),\n fields,\n tags: this.getTags()\n },\n { validateLayout: false }\n );\n }\n\n private findFirstFieldId(fields: CmsModelField[], type: string): string {\n for (const field of fields) {\n if (field.type === type) {\n return field.fieldId;\n }\n }\n return fields.find(field => field.type === \"text\")?.fieldId || \"\";\n }\n}\n"],"mappings":"AAAA,OAAOA,UAAU,MAAM,sBAAsB;AAC7C,OAAOC,SAAS,MAAM,qBAAqB;AAC3C,OAAOC,SAAS,MAAM,WAAW;AACjC,SAASC,iBAAiB;AAC1B,SAASC,gBAAgB;AAEzB,SAASC,aAAa;AAEtB,MAAMC,aAAa,GAAIC,IAAY,IAAK;EACpC,OAAOP,UAAU,CAACC,SAAS,CAACM,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,MAAMC,mBAAmB,GAAID,IAAY,IAAK;EAC1C,OAAOL,SAAS,CAACI,aAAa,CAACC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,MAAME,IAAI,CAAC;EACP,OAAOC,IAAIA,CAACC,IAAsB,EAAW;IACzC,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE;MAC1B,OAAO;QACHC,IAAI,EAAE,MAAM;QACZL,IAAI,EAAEI;MACV,CAAC;IACL;IAEA,OAAOA,IAAI;EACf;AACJ;AAEA,OAAO,MAAME,kBAAkB,SAAST,gBAAgB,CAAC;EAC7CU,YAAY,GAShB,CAAC,CAAC;EAGNC,eAAeA,CAACR,IAAY,EAAQ;IAChC,IAAI,CAACO,YAAY,CAACC,eAAe,GAAGR,IAAI;IACxC,OAAO,IAAI;EACf;EAEAS,aAAaA,CAACT,IAAY,EAAQ;IAC9B,IAAI,CAACO,YAAY,CAACE,aAAa,GAAGT,IAAI;IACtC,OAAO,IAAI;EACf;EAEAU,KAAKA,CAACC,IAAY,EAAQ;IACtB,IAAI,CAACJ,YAAY,CAACG,KAAK,GAAGC,IAAI;IAC9B,OAAO,IAAI;EACf;EAEAP,IAAIA,CAACA,IAAsB,EAAQ;IAC/B,IAAI,CAACG,YAAY,CAACH,IAAI,GAAGF,IAAI,CAACC,IAAI,CAACC,IAAI,CAAC;IACxC,OAAO,IAAI;EACf;EAEAQ,WAAWA,CAACA,WAAmB,EAAQ;IACnC,IAAI,CAACL,YAAY,CAACK,WAAW,GAAGA,WAAW;IAC3C,OAAO,IAAI;EACf;EAEAC,YAAYA,CAACC,OAAe,EAAQ;IAChC,IAAI,CAACP,YAAY,CAACM,YAAY,GAAGC,OAAO;IACxC,OAAO,IAAI;EACf;EAEAC,kBAAkBA,CAACD,OAAe,EAAQ;IACtC,IAAI,CAACP,YAAY,CAACQ,kBAAkB,GAAGD,OAAO;IAC9C,OAAO,IAAI;EACf;EAEAE,YAAYA,CAACF,OAAe,EAAQ;IAChC,IAAI,CAACP,YAAY,CAACS,YAAY,GAAGF,OAAO;IACxC,OAAO,IAAI;EACf;EACA;AACJ;AACA;AACA;EACIG,WAAWA,CAACC,QAAa,EAAE;IACvB,KAAK,CAACA,QAAQ,CAAC;IACf,IAAI,CAACC,aAAa,GAAG,IAAIrB,aAAa,CAAC,CAAC;EAC5C;EAEAsB,MAAMA,CAACC,eAAgE,EAAQ;IAC3E,IAAIC,KAAK,CAACC,OAAO,CAACF,eAAe,CAAC,EAAE;MAChC;MACA,IAAI,CAACF,aAAa,CAACK,SAAS,CAACH,eAAe,CAAC;IACjD,CAAC,MAAM;MACH;MACA,IAAI,CAACF,aAAa,CAACM,WAAW,CAACJ,eAAe,CAAC;IACnD;IACA,OAAO,IAAI;EACf;EAEAK,KAAKA,CAAA,EAAG;IACJ,IAAI,CAAC,IAAI,CAACC,MAAM,CAACC,OAAO,EAAE;MACtB,MAAM,IAAIC,KAAK,CAAC,qBAAqB,CAAC;IAC1C;IACA,IAAI,CAAC,IAAI,CAACF,MAAM,CAAC3B,IAAI,EAAE;MACnB,MAAM,IAAI6B,KAAK,CAAC,kBAAkB,CAAC;IACvC;IACA,IAAI,IAAI,CAACC,gBAAgB,CAACC,IAAI,KAAK,CAAC,EAAE;MAClC,MAAMjB,OAAO,GAAG,OAAO;MACvB,IAAI,CAACkB,MAAM,CAACC,OAAO,IAAI;QACnB,OAAO;UACH,CAACnB,OAAO,GAAGmB,OAAO,CACbC,OAAO,CAAC,CAAC,CACTC,KAAK,CACF,4GACJ;QACR,CAAC;MACL,CAAC,CAAC;MACF,IAAI,CAACtB,YAAY,CAACC,OAAO,CAAC;MAC1B,IAAI,CAACK,aAAa,CAACK,SAAS,CAAC,CAAC,CAACV,OAAO,CAAC,CAAC,CAAC;IAC7C;IACA,IAAI,CAAC,IAAI,CAACP,YAAY,CAACG,KAAK,EAAE;MAC1B,MAAM,IAAImB,KAAK,CAAC,mBAAmB,CAAC;IACxC;;IAEA;IACA,MAAMG,MAAM,GAAGV,KAAK,CAACnB,IAAI,CAAC,IAAI,CAAC2B,gBAAgB,CAACM,MAAM,CAAC,CAAC,CAAC,CAACC,GAAG,CAACJ,OAAO,IAAIA,OAAO,CAACP,KAAK,CAAC,CAAC,CAAC;IAEzF,OAAO9B,iBAAiB,CACpB;MACIgC,OAAO,EAAE,IAAI,CAACD,MAAM,CAACC,OAAO;MAC5B5B,IAAI,EAAE,IAAI,CAAC2B,MAAM,CAAC3B,IAAI;MACtBQ,eAAe,EACX,IAAI,CAACD,YAAY,CAACC,eAAe,IAAIT,aAAa,CAAC,IAAI,CAAC4B,MAAM,CAAC3B,IAAI,CAAC;MACxES,aAAa,EACT,IAAI,CAACF,YAAY,CAACE,aAAa,IAAIR,mBAAmB,CAAC,IAAI,CAAC0B,MAAM,CAAC3B,IAAI,CAAC;MAC5EU,KAAK,EAAE,IAAI,CAACH,YAAY,CAACG,KAAK;MAC9BN,IAAI,EAAE,IAAI,CAACG,YAAY,CAACH,IAAI,IAAI,IAAI;MACpCQ,WAAW,EAAE,IAAI,CAACL,YAAY,CAACK,WAAW,IAAI,IAAI;MAClDC,YAAY,EACR,IAAI,CAACN,YAAY,CAACM,YAAY,IAAI,IAAI,CAACyB,gBAAgB,CAACN,MAAM,EAAE,MAAM,CAAC;MAC3EjB,kBAAkB,EAAE,IAAI,CAACR,YAAY,CAACQ,kBAAkB;MACxDC,YAAY,EAAE,IAAI,CAACT,YAAY,CAACS,YAAY;MAC5CI,MAAM,EAAE,IAAI,CAACD,aAAa,CAACO,KAAK,CAAC,CAAC;MAClCM,MAAM;MACNO,IAAI,EAAE,IAAI,CAACC,OAAO,CAAC;IACvB,CAAC,EACD;MAAEC,cAAc,EAAE;IAAM,CAC5B,CAAC;EACL;EAEQH,gBAAgBA,CAACN,MAAuB,EAAE3B,IAAY,EAAU;IACpE,KAAK,MAAMqC,KAAK,IAAIV,MAAM,EAAE;MACxB,IAAIU,KAAK,CAACrC,IAAI,KAAKA,IAAI,EAAE;QACrB,OAAOqC,KAAK,CAAC5B,OAAO;MACxB;IACJ;IACA,OAAOkB,MAAM,CAACW,IAAI,CAACD,KAAK,IAAIA,KAAK,CAACrC,IAAI,KAAK,MAAM,CAAC,EAAES,OAAO,IAAI,EAAE;EACrE;AACJ","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["upperFirst","camelCase","pluralize","createModelPlugin","BaseModelBuilder","LayoutBuilder","createApiName","name","createPluralApiName","Icon","from","icon","type","PublicModelBuilder","publicConfig","singularApiName","pluralApiName","group","slug","description","titleFieldId","fieldId","descriptionFieldId","imageFieldId","constructor","registry","layoutBuilder","layout","layoutOrBuilder","Array","isArray","setLayout","addModifier","build","config","modelId","Error","fieldBuildersMap","size","fields","builder","alert","uiAlert","label","emptyPlaceholder","text","renderer","layoutReplacements","buildFields","rawLayout","map","row","cell","get","findFirstFieldId","tags","getTags","validateLayout","field","find"],"sources":["PublicModelBuilder.ts"],"sourcesContent":["import upperFirst from \"lodash/upperFirst.js\";\nimport camelCase from \"lodash/camelCase.js\";\nimport pluralize from \"pluralize\";\nimport { createModelPlugin } from \"~/plugins/CmsModelPlugin.js\";\nimport { BaseModelBuilder } from \"./BaseModelBuilder.js\";\nimport type { CmsIcon, CmsModelField } from \"~/types/index.js\";\nimport { LayoutBuilder } from \"../LayoutBuilder.js\";\n\nconst createApiName = (name: string) => {\n return upperFirst(camelCase(name));\n};\n\nconst createPluralApiName = (name: string) => {\n return pluralize(createApiName(name));\n};\n\nclass Icon {\n static from(icon: string | CmsIcon): CmsIcon {\n if (typeof icon === \"string\") {\n return {\n type: \"icon\",\n name: icon\n };\n }\n\n return icon;\n }\n}\n\nexport class PublicModelBuilder extends BaseModelBuilder {\n private publicConfig: {\n singularApiName?: string;\n pluralApiName?: string;\n group?: string;\n icon?: CmsIcon;\n description?: string;\n titleFieldId?: string;\n descriptionFieldId?: string;\n imageFieldId?: string;\n } = {};\n private layoutBuilder: LayoutBuilder;\n\n singularApiName(name: string): this {\n this.publicConfig.singularApiName = name;\n return this;\n }\n\n pluralApiName(name: string): this {\n this.publicConfig.pluralApiName = name;\n return this;\n }\n\n group(slug: string): this {\n this.publicConfig.group = slug;\n return this;\n }\n\n icon(icon: string | CmsIcon): this {\n this.publicConfig.icon = Icon.from(icon);\n return this;\n }\n\n description(description: string): this {\n this.publicConfig.description = description;\n return this;\n }\n\n titleFieldId(fieldId: string): this {\n this.publicConfig.titleFieldId = fieldId;\n return this;\n }\n\n descriptionFieldId(fieldId: string): this {\n this.publicConfig.descriptionFieldId = fieldId;\n return this;\n }\n\n imageFieldId(fieldId: string): this {\n this.publicConfig.imageFieldId = fieldId;\n return this;\n }\n /**\n * It just creates problems if we import the FieldBuilderRegistry.\n * TODO: figure out\n */\n constructor(registry: any) {\n super(registry);\n this.layoutBuilder = new LayoutBuilder();\n }\n\n layout(layoutOrBuilder: string[][] | ((builder: LayoutBuilder) => void)): this {\n if (Array.isArray(layoutOrBuilder)) {\n // Replace layout with array\n this.layoutBuilder.setLayout(layoutOrBuilder);\n } else {\n // Queue the modifier callback\n this.layoutBuilder.addModifier(layoutOrBuilder);\n }\n return this;\n }\n\n build() {\n if (!this.config.modelId) {\n throw new Error(\"modelId is required\");\n }\n if (!this.config.name) {\n throw new Error(\"name is required\");\n }\n if (this.fieldBuildersMap.size === 0) {\n this.fields(builder => ({\n alert: builder\n .uiAlert()\n .label(\n \"No fields defined in the code content model. Please ensure you have the fields property correctly defined.\"\n ),\n emptyPlaceholder: builder.text().label(\"Empty\").renderer(\"hidden\")\n }));\n this.titleFieldId(\"emptyPlaceholder\");\n this.layoutBuilder.setLayout([[\"alert\"], [\"emptyPlaceholder\"]]);\n }\n if (!this.publicConfig.group) {\n throw new Error(\"group is required\");\n }\n\n // Build all fields from field builders, separating data and layout results\n const { fields, layoutReplacements } = this.buildFields();\n\n // Build and apply layout replacements (tabs → rich descriptors)\n const rawLayout = this.layoutBuilder.build();\n const layout = rawLayout.map(row => row.map(cell => layoutReplacements.get(cell) ?? cell));\n\n return createModelPlugin(\n {\n modelId: this.config.modelId,\n name: this.config.name,\n singularApiName:\n this.publicConfig.singularApiName || createApiName(this.config.name),\n pluralApiName:\n this.publicConfig.pluralApiName || createPluralApiName(this.config.name),\n group: this.publicConfig.group,\n icon: this.publicConfig.icon ?? null,\n description: this.publicConfig.description || null,\n titleFieldId:\n this.publicConfig.titleFieldId ?? this.findFirstFieldId(fields, \"text\"),\n descriptionFieldId: this.publicConfig.descriptionFieldId,\n imageFieldId: this.publicConfig.imageFieldId,\n layout,\n fields,\n tags: this.getTags()\n },\n { validateLayout: false }\n );\n }\n\n private findFirstFieldId(fields: CmsModelField[], type: string): string {\n for (const field of fields) {\n if (field.type === type) {\n return field.fieldId;\n }\n }\n return fields.find(field => field.type === \"text\")?.fieldId || \"\";\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,3 +2,4 @@ export { getErrorMessage } from "./getErrorMessage.js";
|
|
|
2
2
|
export { getModel } from "./getModel.js";
|
|
3
3
|
export { transformSortToArray } from "./transformSortToArray.js";
|
|
4
4
|
export { buildFieldsSelection } from "./buildFieldsSelection.js";
|
|
5
|
+
export { transformWhereToNested } from "./transformWhereToNested.js";
|
|
@@ -2,5 +2,6 @@ export { getErrorMessage } from "./getErrorMessage.js";
|
|
|
2
2
|
export { getModel } from "./getModel.js";
|
|
3
3
|
export { transformSortToArray } from "./transformSortToArray.js";
|
|
4
4
|
export { buildFieldsSelection } from "./buildFieldsSelection.js";
|
|
5
|
+
export { transformWhereToNested } from "./transformWhereToNested.js";
|
|
5
6
|
|
|
6
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getErrorMessage","getModel","transformSortToArray","buildFieldsSelection"],"sources":["index.ts"],"sourcesContent":["export { getErrorMessage } from \"./getErrorMessage.js\";\nexport { getModel } from \"./getModel.js\";\nexport { transformSortToArray } from \"./transformSortToArray.js\";\nexport { buildFieldsSelection } from \"./buildFieldsSelection.js\";\n"],"mappings":"AAAA,SAASA,eAAe;AACxB,SAASC,QAAQ;AACjB,SAASC,oBAAoB;AAC7B,SAASC,oBAAoB","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["getErrorMessage","getModel","transformSortToArray","buildFieldsSelection","transformWhereToNested"],"sources":["index.ts"],"sourcesContent":["export { getErrorMessage } from \"./getErrorMessage.js\";\nexport { getModel } from \"./getModel.js\";\nexport { transformSortToArray } from \"./transformSortToArray.js\";\nexport { buildFieldsSelection } from \"./buildFieldsSelection.js\";\nexport { transformWhereToNested } from \"./transformWhereToNested.js\";\n"],"mappings":"AAAA,SAASA,eAAe;AACxB,SAASC,QAAQ;AACjB,SAASC,oBAAoB;AAC7B,SAASC,oBAAoB;AAC7B,SAASC,sBAAsB","ignoreList":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transforms a flat where object with dot-notation keys into a nested object.
|
|
3
|
+
* Keys without dots are passed through unchanged.
|
|
4
|
+
* Handles logical operators (AND, OR) recursively.
|
|
5
|
+
*
|
|
6
|
+
* @param where - Where clause object potentially containing dot-notation keys
|
|
7
|
+
* @returns Nested where object compatible with the GraphQL ListWhereInput type
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* transformWhereToNested({ "values.name": "Keyboard", id: "abc" })
|
|
11
|
+
* // Returns: { values: { name: "Keyboard" }, id: "abc" }
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* transformWhereToNested({ "values.price_gt": 100, "values.name_contains": "board" })
|
|
15
|
+
* // Returns: { values: { price_gt: 100, name_contains: "board" } }
|
|
16
|
+
*/
|
|
17
|
+
export declare const transformWhereToNested: (where?: Record<string, unknown>) => Record<string, unknown> | undefined;
|