@webiny/api-headless-cms 6.4.12-beta.4 → 6.5.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/crud/contentEntry/entryDataValidation.d.ts +1 -1
- package/crud/contentEntry/entryDataValidation.js +33 -18
- package/crud/contentEntry/entryDataValidation.js.map +1 -1
- package/crud/contentEntry.crud.js +12 -39
- package/crud/contentEntry.crud.js.map +1 -1
- package/crud/contentModel/defaultFields.js +3 -2
- package/crud/contentModel/defaultFields.js.map +1 -1
- package/crud/contentModel/validate/endingAllowed.js +1 -1
- package/crud/contentModel/validate/endingAllowed.js.map +1 -1
- package/crud/contentModel/validate/pluralApiName.js +1 -1
- package/crud/contentModel/validate/pluralApiName.js.map +1 -1
- package/crud/contentModel/validate/singularApiName.js +1 -1
- package/crud/contentModel/validate/singularApiName.js.map +1 -1
- package/crud/contentModel/validation.js +2 -2
- package/crud/contentModel/validation.js.map +1 -1
- package/domain/contentModel/schemas.d.ts +4 -0
- package/domain/contentModel/schemas.js +5 -2
- package/domain/contentModel/schemas.js.map +1 -1
- package/domain/contentModel/validation/endingAllowed.js +1 -1
- package/domain/contentModel/validation/endingAllowed.js.map +1 -1
- package/domain/contentModel/validation/pluralApiName.js +1 -1
- package/domain/contentModel/validation/pluralApiName.js.map +1 -1
- package/domain/contentModel/validation/singularApiName.js +1 -1
- package/domain/contentModel/validation/singularApiName.js.map +1 -1
- package/export/crud/exporting.js +2 -2
- package/export/crud/exporting.js.map +1 -1
- package/export/crud/imports/importGroups.js +2 -1
- package/export/crud/imports/importGroups.js.map +1 -1
- package/export/crud/imports/validateModels.js +1 -1
- package/export/crud/imports/validateModels.js.map +1 -1
- package/exports/api/cms/model.d.ts +4 -1
- package/exports/api/cms/model.js +2 -0
- package/extension.d.ts +3 -0
- package/extension.js +19 -0
- package/extension.js.map +1 -0
- package/features/contentEntry/ContentEntriesFeature.js +2 -0
- package/features/contentEntry/ContentEntriesFeature.js.map +1 -1
- package/features/contentEntry/CreateEntry/CreateEntryUseCase.js +1 -2
- package/features/contentEntry/CreateEntry/CreateEntryUseCase.js.map +1 -1
- package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js.map +1 -1
- package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionRepository.js +1 -0
- package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionRepository.js.map +1 -1
- package/features/contentEntry/GetSingletonEntry/GetSingletonEntryUseCase.js +1 -3
- package/features/contentEntry/GetSingletonEntry/GetSingletonEntryUseCase.js.map +1 -1
- package/features/contentEntry/PublishEntry/PublishEntryUseCase.js.map +1 -1
- package/features/contentEntry/UpdateRevision/UpdateRevisionRepository.d.ts +14 -0
- package/features/contentEntry/UpdateRevision/UpdateRevisionRepository.js +34 -0
- package/features/contentEntry/UpdateRevision/UpdateRevisionRepository.js.map +1 -0
- package/features/contentEntry/UpdateRevision/abstractions.d.ts +10 -0
- package/features/contentEntry/UpdateRevision/abstractions.js +5 -0
- package/features/contentEntry/UpdateRevision/abstractions.js.map +1 -0
- package/features/contentEntry/UpdateRevision/feature.d.ts +4 -0
- package/features/contentEntry/UpdateRevision/feature.js +11 -0
- package/features/contentEntry/UpdateRevision/feature.js.map +1 -0
- package/features/contentEntry/UpdateRevision/index.d.ts +1 -0
- package/features/contentEntry/UpdateRevision/index.js +1 -0
- package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.d.ts +2 -2
- package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.js +2 -2
- package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.js.map +1 -1
- package/features/contentEntry/ensureItemIds.d.ts +13 -0
- package/features/contentEntry/ensureItemIds.js +22 -0
- package/features/contentEntry/ensureItemIds.js.map +1 -0
- package/features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.d.ts +3 -1
- package/features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.js +9 -3
- package/features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.js.map +1 -1
- package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/CreateEntryRevisionFromDataFactory.d.ts +3 -3
- package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/CreateEntryRevisionFromDataFactory.js +10 -6
- package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/CreateEntryRevisionFromDataFactory.js.map +1 -1
- package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/UpdateEntryDataFactory.d.ts +3 -1
- package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/UpdateEntryDataFactory.js +9 -3
- package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/UpdateEntryDataFactory.js.map +1 -1
- package/features/contentEntry/entryDataFactories/expiresAt.js +2 -2
- package/features/contentEntry/entryDataFactories/expiresAt.js.map +1 -1
- package/features/contentModel/ComponentMapGenerator/ComponentMapGenerator.d.ts +14 -0
- package/features/contentModel/ComponentMapGenerator/ComponentMapGenerator.js +32 -0
- package/features/contentModel/ComponentMapGenerator/ComponentMapGenerator.js.map +1 -0
- package/features/contentModel/ComponentMapGenerator/abstractions.d.ts +8 -0
- package/features/contentModel/ComponentMapGenerator/abstractions.js +5 -0
- package/features/contentModel/ComponentMapGenerator/abstractions.js.map +1 -0
- package/features/contentModel/ComponentMapGenerator/feature.d.ts +4 -0
- package/features/contentModel/ComponentMapGenerator/feature.js +11 -0
- package/features/contentModel/ComponentMapGenerator/feature.js.map +1 -0
- package/features/contentModel/ComponentMapGenerator/index.d.ts +2 -0
- package/features/contentModel/ComponentMapGenerator/index.js +2 -0
- package/features/contentModel/ContentModelFeature.js +6 -0
- package/features/contentModel/ContentModelFeature.js.map +1 -1
- package/features/contentModel/CreateModel/CreateModelRepository.js +2 -1
- package/features/contentModel/CreateModel/CreateModelRepository.js.map +1 -1
- package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js +2 -1
- package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js.map +1 -1
- package/features/contentModel/RefModelsGenerator/RefModelsGenerator.d.ts +19 -0
- package/features/contentModel/RefModelsGenerator/RefModelsGenerator.js +56 -0
- package/features/contentModel/RefModelsGenerator/RefModelsGenerator.js.map +1 -0
- package/features/contentModel/RefModelsGenerator/abstractions.d.ts +11 -0
- package/features/contentModel/RefModelsGenerator/abstractions.js +5 -0
- package/features/contentModel/RefModelsGenerator/abstractions.js.map +1 -0
- package/features/contentModel/RefModelsGenerator/feature.d.ts +4 -0
- package/features/contentModel/RefModelsGenerator/feature.js +11 -0
- package/features/contentModel/RefModelsGenerator/feature.js.map +1 -0
- package/features/contentModel/RefModelsGenerator/index.d.ts +2 -0
- package/features/contentModel/RefModelsGenerator/index.js +2 -0
- package/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.d.ts +16 -0
- package/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.js +54 -0
- package/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.js.map +1 -0
- package/features/contentModel/ValuesSelectionGenerator/abstractions.d.ts +8 -0
- package/features/contentModel/ValuesSelectionGenerator/abstractions.js +5 -0
- package/features/contentModel/ValuesSelectionGenerator/abstractions.js.map +1 -0
- package/features/contentModel/ValuesSelectionGenerator/feature.d.ts +4 -0
- package/features/contentModel/ValuesSelectionGenerator/feature.js +11 -0
- package/features/contentModel/ValuesSelectionGenerator/feature.js.map +1 -0
- package/features/contentModel/ValuesSelectionGenerator/index.d.ts +1 -0
- package/features/contentModel/ValuesSelectionGenerator/index.js +1 -0
- package/features/graphql/feature.js +2 -0
- package/features/graphql/feature.js.map +1 -1
- package/features/graphql/fields/base/AssetToGraphQL.d.ts +26 -0
- package/features/graphql/fields/base/AssetToGraphQL.js +148 -0
- package/features/graphql/fields/base/AssetToGraphQL.js.map +1 -0
- package/features/graphql/fields/base/DynamicZoneToGraphQL.js +12 -2
- package/features/graphql/fields/base/DynamicZoneToGraphQL.js.map +1 -1
- package/features/graphql/fields/base/ObjectToGraphQL.js +8 -5
- package/features/graphql/fields/base/ObjectToGraphQL.js.map +1 -1
- package/features/modelBuilder/abstractions.d.ts +9 -0
- package/features/modelBuilder/abstractions.js.map +1 -1
- package/features/modelBuilder/feature.js +2 -0
- package/features/modelBuilder/feature.js.map +1 -1
- package/features/modelBuilder/fields/AssetFieldType.d.ts +20 -0
- package/features/modelBuilder/fields/AssetFieldType.js +46 -0
- package/features/modelBuilder/fields/AssetFieldType.js.map +1 -0
- package/features/modelBuilder/fields/DataFieldBuilder.d.ts +62 -18
- package/features/modelBuilder/fields/DataFieldBuilder.js +8 -0
- package/features/modelBuilder/fields/DataFieldBuilder.js.map +1 -1
- package/features/modelBuilder/fields/DynamicZoneFieldType.d.ts +1 -0
- package/features/modelBuilder/fields/DynamicZoneFieldType.js +2 -6
- package/features/modelBuilder/fields/DynamicZoneFieldType.js.map +1 -1
- package/features/modelBuilder/fields/resolveAssetUrl.d.ts +35 -0
- package/features/modelBuilder/fields/resolveAssetUrl.js +26 -0
- package/features/modelBuilder/fields/resolveAssetUrl.js.map +1 -0
- package/features/modelBuilder/index.d.ts +1 -1
- package/features/modelBuilder/models/BaseModelBuilder.d.ts +3 -1
- package/features/modelBuilder/models/BaseModelBuilder.js +7 -0
- package/features/modelBuilder/models/BaseModelBuilder.js.map +1 -1
- package/features/modelBuilder/models/PrivateModelBuilder.js +2 -1
- package/features/modelBuilder/models/PrivateModelBuilder.js.map +1 -1
- package/features/modelBuilder/models/PublicModelBuilder.js +2 -1
- package/features/modelBuilder/models/PublicModelBuilder.js.map +1 -1
- package/features/sortMapper/SortMapper.js +2 -5
- package/features/sortMapper/SortMapper.js.map +1 -1
- package/features/storage/fields/CompressedTextStorageTransform.js +1 -1
- package/features/storage/fields/CompressedTextStorageTransform.js.map +1 -1
- package/features/storage/fields/DateStorageTransform.js +4 -3
- package/features/storage/fields/DateStorageTransform.js.map +1 -1
- package/features/storage/fields/DynamicZoneStorageTransform.js +2 -2
- package/features/storage/fields/DynamicZoneStorageTransform.js.map +1 -1
- package/features/storage/fields/JsonStorageTransform.js +1 -1
- package/features/storage/fields/JsonStorageTransform.js.map +1 -1
- package/features/storage/fields/LongTextStorageTransform.js +1 -1
- package/features/storage/fields/LongTextStorageTransform.js.map +1 -1
- package/features/storage/fields/ObjectStorageTransform.js +27 -7
- package/features/storage/fields/ObjectStorageTransform.js.map +1 -1
- package/features/storage/fields/RichTextStorageTransform.js +1 -1
- package/features/storage/fields/RichTextStorageTransform.js.map +1 -1
- package/features/validation/validators/DateGteValidator.js +1 -1
- package/features/validation/validators/DateGteValidator.js.map +1 -1
- package/features/validation/validators/DateLteValidator.js +1 -1
- package/features/validation/validators/DateLteValidator.js.map +1 -1
- package/features/validation/validators/PatternValidator.js +1 -1
- package/features/validation/validators/PatternValidator.js.map +1 -1
- package/features/whereMapper/WhereMapper.js +10 -7
- package/features/whereMapper/WhereMapper.js.map +1 -1
- package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js +8 -2
- package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js.map +1 -1
- package/fieldConverters/CmsModelObjectFieldConverterPlugin.js +8 -2
- package/fieldConverters/CmsModelObjectFieldConverterPlugin.js.map +1 -1
- package/fieldConverters/index.d.ts +1 -1
- package/graphql/getSchema/generateCacheKey.js +1 -1
- package/graphql/getSchema/generateCacheKey.js.map +1 -1
- package/graphql/scalars/RevisionId.js +1 -1
- package/graphql/scalars/RevisionId.js.map +1 -1
- package/graphql/schema/baseSchema.js +5 -25
- package/graphql/schema/baseSchema.js.map +1 -1
- package/graphql/schema/cms/getEntryResolver.js +3 -2
- package/graphql/schema/cms/getEntryResolver.js.map +1 -1
- package/graphql/schema/cms/getModelResolver.d.ts +35 -0
- package/graphql/schema/cms/getModelResolver.js +49 -0
- package/graphql/schema/cms/getModelResolver.js.map +1 -0
- package/graphql/schema/cms/helpers/buildFieldsSelection.js +9 -2
- package/graphql/schema/cms/helpers/buildFieldsSelection.js.map +1 -1
- package/graphql/schema/cms/helpers/expandFieldWildcards.d.ts +2 -0
- package/graphql/schema/cms/helpers/expandFieldWildcards.js +13 -0
- package/graphql/schema/cms/helpers/expandFieldWildcards.js.map +1 -0
- package/graphql/schema/cms/helpers/index.d.ts +1 -0
- package/graphql/schema/cms/helpers/index.js +1 -0
- package/graphql/schema/cms/helpers.d.ts +1 -0
- package/graphql/schema/cms/helpers.js +1 -0
- package/graphql/schema/cms/index.js +2 -1
- package/graphql/schema/cms/index.js.map +1 -1
- package/graphql/schema/cms/listEntriesResolver.js +3 -2
- package/graphql/schema/cms/listEntriesResolver.js.map +1 -1
- package/graphql/schema/cms/resolvers/getModel.d.ts +8 -0
- package/graphql/schema/cms/resolvers/getModel.js +18 -0
- package/graphql/schema/cms/resolvers/getModel.js.map +1 -0
- package/graphql/schema/cms/resolvers/index.d.ts +1 -0
- package/graphql/schema/cms/resolvers/index.js +1 -0
- package/graphql/schema/cms/typeDefs/query.js +1 -0
- package/graphql/schema/cms/typeDefs/query.js.map +1 -1
- package/graphql/schema/cms/typeDefs/responses.js +5 -0
- package/graphql/schema/cms/typeDefs/responses.js.map +1 -1
- package/graphql/schema/contentModels.js +40 -1
- package/graphql/schema/contentModels.js.map +1 -1
- package/graphql/schema/createFieldResolvers.js +1 -1
- package/graphql/schema/createFieldResolvers.js.map +1 -1
- package/index.d.ts +2 -5
- package/index.js +1 -21
- package/package.json +26 -29
- package/plugins/CmsModelPlugin.js +12 -10
- package/plugins/CmsModelPlugin.js.map +1 -1
- package/types/fields/dynamicZoneField.d.ts +1 -0
- package/types/model.d.ts +6 -0
- package/types/modelField.d.ts +13 -0
- package/types/types.d.ts +8 -4
- package/types/types.js.map +1 -1
- package/utils/caching/Cache.js +1 -1
- package/utils/caching/Cache.js.map +1 -1
- package/utils/contentModelToJsonSchema/CmsModelToJsonSchemaConverter.d.ts +28 -0
- package/utils/contentModelToJsonSchema/CmsModelToJsonSchemaConverter.js +324 -0
- package/utils/contentModelToJsonSchema/CmsModelToJsonSchemaConverter.js.map +1 -0
- package/utils/contentModelToJsonSchema/index.d.ts +2 -0
- package/utils/contentModelToJsonSchema/index.js +1 -0
- package/utils/contentModelToJsonSchema/types.d.ts +24 -0
- package/utils/contentModelToJsonSchema/types.js +0 -0
- package/utils/createModelField.js +2 -1
- package/utils/createModelField.js.map +1 -1
- package/utils/date.js +1 -1
- package/utils/date.js.map +1 -1
- package/utils/entryStorage.js +1 -1
- package/utils/entryStorage.js.map +1 -1
- package/utils/index.d.ts +1 -0
- package/utils/index.js +1 -0
- package/utils/renderFields.js +1 -1
- package/utils/renderFields.js.map +1 -1
- package/index.js.map +0 -1
|
@@ -74,9 +74,10 @@ class ReadApi {
|
|
|
74
74
|
fieldRegistry,
|
|
75
75
|
endpointType: "read"
|
|
76
76
|
});
|
|
77
|
+
const itemIdTypeDef = `\nextend type ${fieldType} {\n _id: ID\n}\n`;
|
|
77
78
|
return {
|
|
78
79
|
fields: `${field.fieldId}: ${field.list ? `[${fieldType}!]` : fieldType}`,
|
|
79
|
-
typeDefs: `${typeDefs}${childTypeDefs}`
|
|
80
|
+
typeDefs: `${typeDefs}${childTypeDefs}${itemIdTypeDef}`
|
|
80
81
|
};
|
|
81
82
|
}
|
|
82
83
|
createResolver({ field, createFieldResolvers, graphQLType }) {
|
|
@@ -85,10 +86,10 @@ class ReadApi {
|
|
|
85
86
|
const typeResolvers = createFieldResolvers({
|
|
86
87
|
graphQLType: fieldType,
|
|
87
88
|
fields: field.settings.fields
|
|
88
|
-
});
|
|
89
|
+
}) || {};
|
|
89
90
|
return {
|
|
90
91
|
resolver: null,
|
|
91
|
-
typeResolvers
|
|
92
|
+
typeResolvers
|
|
92
93
|
};
|
|
93
94
|
}
|
|
94
95
|
createListFilters({ field, model }) {
|
|
@@ -118,9 +119,10 @@ class ManageApi {
|
|
|
118
119
|
fieldRegistry,
|
|
119
120
|
endpointType: "manage"
|
|
120
121
|
});
|
|
122
|
+
const itemIdTypeDef = `\nextend type ${fieldType} {\n _id: ID\n}\n`;
|
|
121
123
|
return {
|
|
122
124
|
fields: `${field.fieldId}: ${field.list ? `[${fieldType}!]` : fieldType}`,
|
|
123
|
-
typeDefs: `${typeDefs}\n${childTypeDefs}`
|
|
125
|
+
typeDefs: `${typeDefs}\n${childTypeDefs}${itemIdTypeDef}`
|
|
124
126
|
};
|
|
125
127
|
}
|
|
126
128
|
createInputField({ models, model, field, fieldRegistry }) {
|
|
@@ -139,9 +141,10 @@ class ManageApi {
|
|
|
139
141
|
});
|
|
140
142
|
if (!result) return null;
|
|
141
143
|
const { fieldType, typeDefs } = result;
|
|
144
|
+
const itemIdTypeDef = `\nextend input ${fieldType} {\n _id: ID\n}\n`;
|
|
142
145
|
return {
|
|
143
146
|
fields: `${field.fieldId}: ${field.list ? `[${fieldType}!]` : fieldType}`,
|
|
144
|
-
typeDefs
|
|
147
|
+
typeDefs: `${typeDefs}${itemIdTypeDef}`
|
|
145
148
|
};
|
|
146
149
|
}
|
|
147
150
|
createResolver({ graphQLType, field, createFieldResolvers }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/graphql/fields/base/ObjectToGraphQL.js","sources":["../../../../../src/features/graphql/fields/base/ObjectToGraphQL.ts"],"sourcesContent":["import upperFirst from \"lodash/upperFirst.js\";\nimport { CmsModelFieldToGraphQL } from \"../abstractions/CmsModelFieldToGraphQL.js\";\nimport type { CmsModelFieldToGraphQLRegistry } from \"../abstractions/CmsModelFieldToGraphQLRegistry.js\";\nimport type {\n CmsModel,\n CmsModelField,\n CmsModelFieldType,\n CmsModelFieldDefinition,\n CmsModelObjectField\n} from \"~/types/index.js\";\nimport type { ValidateChildFieldsParams } from \"../abstractions/CmsModelFieldToGraphQL.js\";\nimport type { CmsModelFieldAstNode, ICmsModelFieldToAst } from \"~/types/modelAst.js\";\nimport { createTypeFromFields } from \"~/utils/createTypeFromFields.js\";\n\ninterface CreateTypeNameParams {\n model: Pick<CmsModel, \"singularApiName\">;\n parents?: string[];\n field: CmsModelField;\n}\n\nconst createTypeName = (params: CreateTypeNameParams): string => {\n const { model, parents = [], field } = params;\n return [model.singularApiName]\n .concat(parents)\n .concat([field.fieldId])\n .filter(Boolean)\n .map(id => {\n return upperFirst(id);\n })\n .join(\"_\");\n};\n\ninterface CreateChildTypeDefsParams {\n model: Pick<CmsModel, \"singularApiName\">;\n field: CmsModelField;\n fieldRegistry: CmsModelFieldToGraphQLRegistry.Interface;\n endpointType: \"manage\" | \"read\";\n}\n\nconst createChildTypeDefs = (params: CreateChildTypeDefsParams): string => {\n const { field, fieldRegistry, model, endpointType } = params;\n const fields = field.settings?.fields || [];\n\n const typeName = createTypeName({\n model,\n field,\n parents: field.settings?.parents\n });\n\n const filters = fields\n .map(child => {\n const fieldImpl = fieldRegistry.get(child.type);\n if (!fieldImpl) {\n return null;\n }\n const api = endpointType === \"manage\" ? fieldImpl.manage : fieldImpl.read;\n const createListFilters = api.createListFilters;\n if (!createListFilters) {\n return null;\n }\n\n const filters = createListFilters({\n model,\n field: {\n ...child,\n settings: {\n ...child.settings,\n parents: (child.settings?.parents || []).concat([field.fieldId])\n }\n },\n fieldRegistry\n });\n if (!filters) {\n return null;\n }\n return filters;\n })\n .filter(Boolean)\n .join(\"\\n\");\n return `input ${typeName}WhereInput {\n ${filters || \"_empty: String\"}\n }\\n`;\n};\n\nconst createObjectListFilters = (\n field: CmsModelField,\n model: Pick<CmsModel, \"singularApiName\">\n): string => {\n const typeName = createTypeName({\n model,\n field,\n parents: field.settings?.parents\n });\n return `${field.fieldId}: ${typeName}WhereInput`;\n};\n\nclass ReadApi implements CmsModelFieldToGraphQL.ReadApi {\n public createTypeField({\n field,\n models,\n model,\n fieldRegistry\n }: CmsModelFieldToGraphQL.TypeFieldParams): CmsModelFieldDefinition | null {\n const result = createTypeFromFields({\n models,\n typeOfType: \"type\",\n model,\n type: \"read\",\n typeNamePrefix: createTypeName({\n model,\n field,\n parents: field.settings?.parents\n }),\n fields: field.settings?.fields || [],\n fieldRegistry\n });\n\n if (!result) {\n return null;\n }\n const { fieldType, typeDefs } = result;\n\n const childTypeDefs = createChildTypeDefs({\n model,\n field,\n fieldRegistry,\n endpointType: \"read\"\n });\n\n return {\n fields: `${field.fieldId}: ${field.list ? `[${fieldType}!]` : fieldType}`,\n typeDefs: `${typeDefs}${childTypeDefs}`\n };\n }\n\n public createResolver({\n field,\n createFieldResolvers,\n graphQLType\n }: CmsModelFieldToGraphQL.ResolverParams): CmsModelFieldToGraphQL.Resolver {\n if (!field.settings?.fields || field.settings.fields.length === 0) {\n return false;\n }\n\n const fieldType = `${graphQLType}_${upperFirst(field.fieldId)}`;\n\n const typeResolvers = createFieldResolvers({\n graphQLType: fieldType,\n fields: field.settings.fields\n });\n return {\n resolver: null,\n typeResolvers: typeResolvers || {}\n };\n }\n\n public createListFilters({ field, model }: CmsModelFieldToGraphQL.ListFiltersParams): string {\n return createObjectListFilters(field, model);\n }\n}\n\nclass ManageApi implements CmsModelFieldToGraphQL.ManageApi {\n public createTypeField({\n models,\n model,\n field,\n fieldRegistry\n }: CmsModelFieldToGraphQL.TypeFieldParams): CmsModelFieldDefinition | null {\n const result = createTypeFromFields({\n typeOfType: \"type\",\n models,\n model,\n type: \"manage\",\n typeNamePrefix: createTypeName({\n model,\n field,\n parents: field.settings?.parents\n }),\n fields: field.settings?.fields || [],\n fieldRegistry\n });\n\n if (!result) {\n return null;\n }\n const { fieldType, typeDefs } = result;\n\n const childTypeDefs = createChildTypeDefs({\n model,\n field,\n fieldRegistry,\n endpointType: \"manage\"\n });\n\n return {\n fields: `${field.fieldId}: ${field.list ? `[${fieldType}!]` : fieldType}`,\n typeDefs: `${typeDefs}\\n${childTypeDefs}`\n };\n }\n\n public createInputField({\n models,\n model,\n field,\n fieldRegistry\n }: CmsModelFieldToGraphQL.TypeFieldParams): CmsModelFieldDefinition | null {\n const result = createTypeFromFields({\n typeOfType: \"input\",\n models,\n model,\n type: \"manage\",\n typeNamePrefix: createTypeName({\n model,\n field,\n parents: field.settings?.parents\n }),\n fields: field.settings?.fields || [],\n fieldRegistry\n });\n if (!result) {\n return null;\n }\n const { fieldType, typeDefs } = result;\n\n return {\n fields: `${field.fieldId}: ${field.list ? `[${fieldType}!]` : fieldType}`,\n typeDefs\n };\n }\n\n public createResolver({\n graphQLType,\n field,\n createFieldResolvers\n }: CmsModelFieldToGraphQL.ResolverParams): CmsModelFieldToGraphQL.Resolver {\n if (!field.settings?.fields || field.settings.fields.length === 0) {\n return false;\n }\n const fieldType = `${graphQLType}_${upperFirst(field.fieldId)}`;\n const typeResolvers = createFieldResolvers({\n graphQLType: fieldType,\n fields: field.settings.fields\n });\n return {\n resolver: null,\n typeResolvers: typeResolvers || {}\n };\n }\n\n public createListFilters({ field, model }: CmsModelFieldToGraphQL.ListFiltersParams): string {\n return createObjectListFilters(field, model);\n }\n}\n\nclass ObjectToGraphQL implements CmsModelFieldToGraphQL.Interface {\n public readonly read = new ReadApi();\n public readonly manage = new ManageApi();\n\n public readonly fieldType: CmsModelFieldType = \"object\";\n public readonly isSearchable: boolean = false;\n public readonly isSortable: boolean = false;\n public readonly isFullTextSearchable: boolean = false;\n\n public getReadApi(): CmsModelFieldToGraphQL.ReadApi {\n return this.read;\n }\n\n public getManageApi(): CmsModelFieldToGraphQL.ManageApi {\n return this.manage;\n }\n\n public validateChildFields(params: ValidateChildFieldsParams<CmsModelField>): void {\n const field = params.field as CmsModelObjectField;\n const originalField = params.originalField as CmsModelObjectField | undefined;\n params.validate({\n fields: field.settings?.fields ?? [],\n originalFields: originalField?.settings?.fields || []\n });\n }\n\n public getFieldAst(field: CmsModelField, converter: ICmsModelFieldToAst): CmsModelFieldAstNode {\n const objectField = field as CmsModelObjectField;\n const { fields = [], ...settings } = objectField.settings;\n return {\n type: \"field\",\n field: {\n ...objectField,\n settings: settings || {}\n },\n children: fields.map(f => converter.toAst(f))\n };\n }\n}\n\nexport const ObjectFieldToGraphQL = CmsModelFieldToGraphQL.createImplementation({\n implementation: ObjectToGraphQL,\n dependencies: []\n});\n"],"names":["createTypeName","params","model","parents","field","Boolean","id","upperFirst","createChildTypeDefs","fieldRegistry","endpointType","fields","typeName","filters","child","fieldImpl","api","createListFilters","createObjectListFilters","ReadApi","models","result","createTypeFromFields","fieldType","typeDefs","childTypeDefs","createFieldResolvers","graphQLType","typeResolvers","ManageApi","ObjectToGraphQL","originalField","converter","objectField","settings","f","ObjectFieldToGraphQL","CmsModelFieldToGraphQL"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"features/graphql/fields/base/ObjectToGraphQL.js","sources":["../../../../../src/features/graphql/fields/base/ObjectToGraphQL.ts"],"sourcesContent":["import upperFirst from \"lodash/upperFirst.js\";\nimport { CmsModelFieldToGraphQL } from \"../abstractions/CmsModelFieldToGraphQL.js\";\nimport type { CmsModelFieldToGraphQLRegistry } from \"../abstractions/CmsModelFieldToGraphQLRegistry.js\";\nimport type {\n CmsModel,\n CmsModelField,\n CmsModelFieldType,\n CmsModelFieldDefinition,\n CmsModelObjectField\n} from \"~/types/index.js\";\nimport type { ValidateChildFieldsParams } from \"../abstractions/CmsModelFieldToGraphQL.js\";\nimport type { CmsModelFieldAstNode, ICmsModelFieldToAst } from \"~/types/modelAst.js\";\nimport { createTypeFromFields } from \"~/utils/createTypeFromFields.js\";\n\ninterface CreateTypeNameParams {\n model: Pick<CmsModel, \"singularApiName\">;\n parents?: string[];\n field: CmsModelField;\n}\n\nconst createTypeName = (params: CreateTypeNameParams): string => {\n const { model, parents = [], field } = params;\n return [model.singularApiName]\n .concat(parents)\n .concat([field.fieldId])\n .filter(Boolean)\n .map(id => {\n return upperFirst(id);\n })\n .join(\"_\");\n};\n\ninterface CreateChildTypeDefsParams {\n model: Pick<CmsModel, \"singularApiName\">;\n field: CmsModelField;\n fieldRegistry: CmsModelFieldToGraphQLRegistry.Interface;\n endpointType: \"manage\" | \"read\";\n}\n\nconst createChildTypeDefs = (params: CreateChildTypeDefsParams): string => {\n const { field, fieldRegistry, model, endpointType } = params;\n const fields = field.settings?.fields || [];\n\n const typeName = createTypeName({\n model,\n field,\n parents: field.settings?.parents\n });\n\n const filters = fields\n .map(child => {\n const fieldImpl = fieldRegistry.get(child.type);\n if (!fieldImpl) {\n return null;\n }\n const api = endpointType === \"manage\" ? fieldImpl.manage : fieldImpl.read;\n const createListFilters = api.createListFilters;\n if (!createListFilters) {\n return null;\n }\n\n const filters = createListFilters({\n model,\n field: {\n ...child,\n settings: {\n ...child.settings,\n parents: (child.settings?.parents || []).concat([field.fieldId])\n }\n },\n fieldRegistry\n });\n if (!filters) {\n return null;\n }\n return filters;\n })\n .filter(Boolean)\n .join(\"\\n\");\n return `input ${typeName}WhereInput {\n ${filters || \"_empty: String\"}\n }\\n`;\n};\n\nconst createObjectListFilters = (\n field: CmsModelField,\n model: Pick<CmsModel, \"singularApiName\">\n): string => {\n const typeName = createTypeName({\n model,\n field,\n parents: field.settings?.parents\n });\n return `${field.fieldId}: ${typeName}WhereInput`;\n};\n\nclass ReadApi implements CmsModelFieldToGraphQL.ReadApi {\n public createTypeField({\n field,\n models,\n model,\n fieldRegistry\n }: CmsModelFieldToGraphQL.TypeFieldParams): CmsModelFieldDefinition | null {\n const result = createTypeFromFields({\n models,\n typeOfType: \"type\",\n model,\n type: \"read\",\n typeNamePrefix: createTypeName({\n model,\n field,\n parents: field.settings?.parents\n }),\n fields: field.settings?.fields || [],\n fieldRegistry\n });\n\n if (!result) {\n return null;\n }\n const { fieldType, typeDefs } = result;\n\n const childTypeDefs = createChildTypeDefs({\n model,\n field,\n fieldRegistry,\n endpointType: \"read\"\n });\n\n const itemIdTypeDef = `\\nextend type ${fieldType} {\\n _id: ID\\n}\\n`;\n\n return {\n fields: `${field.fieldId}: ${field.list ? `[${fieldType}!]` : fieldType}`,\n typeDefs: `${typeDefs}${childTypeDefs}${itemIdTypeDef}`\n };\n }\n\n public createResolver({\n field,\n createFieldResolvers,\n graphQLType\n }: CmsModelFieldToGraphQL.ResolverParams): CmsModelFieldToGraphQL.Resolver {\n if (!field.settings?.fields || field.settings.fields.length === 0) {\n return false;\n }\n\n const fieldType = `${graphQLType}_${upperFirst(field.fieldId)}`;\n\n const typeResolvers =\n createFieldResolvers({\n graphQLType: fieldType,\n fields: field.settings.fields\n }) || {};\n\n return {\n resolver: null,\n typeResolvers\n };\n }\n\n public createListFilters({ field, model }: CmsModelFieldToGraphQL.ListFiltersParams): string {\n return createObjectListFilters(field, model);\n }\n}\n\nclass ManageApi implements CmsModelFieldToGraphQL.ManageApi {\n public createTypeField({\n models,\n model,\n field,\n fieldRegistry\n }: CmsModelFieldToGraphQL.TypeFieldParams): CmsModelFieldDefinition | null {\n const result = createTypeFromFields({\n typeOfType: \"type\",\n models,\n model,\n type: \"manage\",\n typeNamePrefix: createTypeName({\n model,\n field,\n parents: field.settings?.parents\n }),\n fields: field.settings?.fields || [],\n fieldRegistry\n });\n\n if (!result) {\n return null;\n }\n const { fieldType, typeDefs } = result;\n\n const childTypeDefs = createChildTypeDefs({\n model,\n field,\n fieldRegistry,\n endpointType: \"manage\"\n });\n\n const itemIdTypeDef = `\\nextend type ${fieldType} {\\n _id: ID\\n}\\n`;\n\n return {\n fields: `${field.fieldId}: ${field.list ? `[${fieldType}!]` : fieldType}`,\n typeDefs: `${typeDefs}\\n${childTypeDefs}${itemIdTypeDef}`\n };\n }\n\n public createInputField({\n models,\n model,\n field,\n fieldRegistry\n }: CmsModelFieldToGraphQL.TypeFieldParams): CmsModelFieldDefinition | null {\n const result = createTypeFromFields({\n typeOfType: \"input\",\n models,\n model,\n type: \"manage\",\n typeNamePrefix: createTypeName({\n model,\n field,\n parents: field.settings?.parents\n }),\n fields: field.settings?.fields || [],\n fieldRegistry\n });\n if (!result) {\n return null;\n }\n const { fieldType, typeDefs } = result;\n\n const itemIdTypeDef = `\\nextend input ${fieldType} {\\n _id: ID\\n}\\n`;\n\n return {\n fields: `${field.fieldId}: ${field.list ? `[${fieldType}!]` : fieldType}`,\n typeDefs: `${typeDefs}${itemIdTypeDef}`\n };\n }\n\n public createResolver({\n graphQLType,\n field,\n createFieldResolvers\n }: CmsModelFieldToGraphQL.ResolverParams): CmsModelFieldToGraphQL.Resolver {\n if (!field.settings?.fields || field.settings.fields.length === 0) {\n return false;\n }\n const fieldType = `${graphQLType}_${upperFirst(field.fieldId)}`;\n const typeResolvers = createFieldResolvers({\n graphQLType: fieldType,\n fields: field.settings.fields\n });\n return {\n resolver: null,\n typeResolvers: typeResolvers || {}\n };\n }\n\n public createListFilters({ field, model }: CmsModelFieldToGraphQL.ListFiltersParams): string {\n return createObjectListFilters(field, model);\n }\n}\n\nclass ObjectToGraphQL implements CmsModelFieldToGraphQL.Interface {\n public readonly read = new ReadApi();\n public readonly manage = new ManageApi();\n\n public readonly fieldType: CmsModelFieldType = \"object\";\n public readonly isSearchable: boolean = false;\n public readonly isSortable: boolean = false;\n public readonly isFullTextSearchable: boolean = false;\n\n public getReadApi(): CmsModelFieldToGraphQL.ReadApi {\n return this.read;\n }\n\n public getManageApi(): CmsModelFieldToGraphQL.ManageApi {\n return this.manage;\n }\n\n public validateChildFields(params: ValidateChildFieldsParams<CmsModelField>): void {\n const field = params.field as CmsModelObjectField;\n const originalField = params.originalField as CmsModelObjectField | undefined;\n params.validate({\n fields: field.settings?.fields ?? [],\n originalFields: originalField?.settings?.fields || []\n });\n }\n\n public getFieldAst(field: CmsModelField, converter: ICmsModelFieldToAst): CmsModelFieldAstNode {\n const objectField = field as CmsModelObjectField;\n const { fields = [], ...settings } = objectField.settings;\n return {\n type: \"field\",\n field: {\n ...objectField,\n settings: settings || {}\n },\n children: fields.map(f => converter.toAst(f))\n };\n }\n}\n\nexport const ObjectFieldToGraphQL = CmsModelFieldToGraphQL.createImplementation({\n implementation: ObjectToGraphQL,\n dependencies: []\n});\n"],"names":["createTypeName","params","model","parents","field","Boolean","id","upperFirst","createChildTypeDefs","fieldRegistry","endpointType","fields","typeName","filters","child","fieldImpl","api","createListFilters","createObjectListFilters","ReadApi","models","result","createTypeFromFields","fieldType","typeDefs","childTypeDefs","itemIdTypeDef","createFieldResolvers","graphQLType","typeResolvers","ManageApi","ObjectToGraphQL","originalField","converter","objectField","settings","f","ObjectFieldToGraphQL","CmsModelFieldToGraphQL"],"mappings":"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"}
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import type { PrivateModelBuilder } from "./models/PrivateModelBuilder.js";
|
|
2
2
|
import type { PublicModelBuilder } from "./models/PublicModelBuilder.js";
|
|
3
3
|
import type { IModelBuilderPrivateInput, IModelBuilderPublicInput } from "./models/ModelBuilder.js";
|
|
4
|
+
/**
|
|
5
|
+
* Augmentable model settings interface.
|
|
6
|
+
* External packages can extend this via module augmentation.
|
|
7
|
+
*/
|
|
8
|
+
export interface IModelSettings {
|
|
9
|
+
aiEntryWizard?: boolean;
|
|
10
|
+
previewPath?: string;
|
|
11
|
+
[key: string]: any;
|
|
12
|
+
}
|
|
4
13
|
/**
|
|
5
14
|
* Augmentable field builder registry. Provides access to all registered field types.
|
|
6
15
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/modelBuilder/abstractions.js","sources":["../../../src/features/modelBuilder/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { PrivateModelBuilder } from \"./models/PrivateModelBuilder.js\";\nimport type { PublicModelBuilder } from \"./models/PublicModelBuilder.js\";\nimport type { IModelBuilderPrivateInput, IModelBuilderPublicInput } from \"./models/ModelBuilder.js\";\n\n/**\n * Augmentable field builder registry. Provides access to all registered field types.\n */\nexport interface IFieldBuilderRegistry {\n /**\n * Mark the next field creation as an extension.\n * When extending, the registry will create a temporary builder marked with _extendMode,\n * and BaseModelBuilder will merge its operations into the existing field.\n */\n extend(): this;\n\n // Field types will be added via module augmentation by field type implementations\n // Example: text(): ITextFieldBuilder;\n}\n\n/**\n * @internal Do not export this abstraction. We don't want external developers to use it.\n */\nexport const FieldBuilderRegistry =\n createAbstraction<FieldBuilderRegistry.Interface>(\"FieldBuilderRegistry\");\n\nexport namespace FieldBuilderRegistry {\n export interface Interface extends IFieldBuilderRegistry {}\n}\n\n/**\n * Unified Model abstraction\n * External developers implement this to provide both public and private models\n */\n\nexport interface IModelBuilder {\n private(input: IModelBuilderPrivateInput): PrivateModelBuilder;\n public(input: IModelBuilderPublicInput): PublicModelBuilder;\n}\n\nexport interface IModelFactory {\n execute(builder: IModelBuilder): Promise<PrivateModelBuilder[] | PublicModelBuilder[]>;\n}\n\n/** Provide code-defined content models. */\nexport const ModelFactory = createAbstraction<IModelFactory>(\"Cms/ModelFactory\");\nexport namespace ModelFactory {\n export type Interface = IModelFactory;\n export type Return = Promise<PrivateModelBuilder[] | PublicModelBuilder[]>;\n export type Builder = IModelBuilder;\n export type FieldBuilder = FieldBuilderRegistry.Interface;\n}\n"],"names":["FieldBuilderRegistry","createAbstraction","ModelFactory"],"mappings":";
|
|
1
|
+
{"version":3,"file":"features/modelBuilder/abstractions.js","sources":["../../../src/features/modelBuilder/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { PrivateModelBuilder } from \"./models/PrivateModelBuilder.js\";\nimport type { PublicModelBuilder } from \"./models/PublicModelBuilder.js\";\nimport type { IModelBuilderPrivateInput, IModelBuilderPublicInput } from \"./models/ModelBuilder.js\";\n\n/**\n * Augmentable model settings interface.\n * External packages can extend this via module augmentation.\n */\nexport interface IModelSettings {\n aiEntryWizard?: boolean;\n previewPath?: string;\n [key: string]: any;\n}\n\n/**\n * Augmentable field builder registry. Provides access to all registered field types.\n */\nexport interface IFieldBuilderRegistry {\n /**\n * Mark the next field creation as an extension.\n * When extending, the registry will create a temporary builder marked with _extendMode,\n * and BaseModelBuilder will merge its operations into the existing field.\n */\n extend(): this;\n\n // Field types will be added via module augmentation by field type implementations\n // Example: text(): ITextFieldBuilder;\n}\n\n/**\n * @internal Do not export this abstraction. We don't want external developers to use it.\n */\nexport const FieldBuilderRegistry =\n createAbstraction<FieldBuilderRegistry.Interface>(\"FieldBuilderRegistry\");\n\nexport namespace FieldBuilderRegistry {\n export interface Interface extends IFieldBuilderRegistry {}\n}\n\n/**\n * Unified Model abstraction\n * External developers implement this to provide both public and private models\n */\n\nexport interface IModelBuilder {\n private(input: IModelBuilderPrivateInput): PrivateModelBuilder;\n public(input: IModelBuilderPublicInput): PublicModelBuilder;\n}\n\nexport interface IModelFactory {\n execute(builder: IModelBuilder): Promise<PrivateModelBuilder[] | PublicModelBuilder[]>;\n}\n\n/** Provide code-defined content models. */\nexport const ModelFactory = createAbstraction<IModelFactory>(\"Cms/ModelFactory\");\nexport namespace ModelFactory {\n export type Interface = IModelFactory;\n export type Return = Promise<PrivateModelBuilder[] | PublicModelBuilder[]>;\n export type Builder = IModelBuilder;\n export type FieldBuilder = FieldBuilderRegistry.Interface;\n}\n"],"names":["FieldBuilderRegistry","createAbstraction","ModelFactory"],"mappings":";AAiCO,MAAMA,uBACTC,kBAAkD;AAqB/C,MAAMC,eAAeD,kBAAiC"}
|
|
@@ -9,6 +9,7 @@ import { DynamicZoneFieldType } from "./fields/DynamicZoneFieldType.js";
|
|
|
9
9
|
import { NumberFieldType } from "./fields/NumberFieldType.js";
|
|
10
10
|
import { BooleanFieldType } from "./fields/BooleanFieldType.js";
|
|
11
11
|
import { FileFieldType } from "./fields/FileFieldType.js";
|
|
12
|
+
import { AssetFieldType } from "./fields/AssetFieldType.js";
|
|
12
13
|
import { DateTimeFieldType } from "./fields/DateTimeFieldType.js";
|
|
13
14
|
import { JsonFieldType } from "./fields/JsonFieldType.js";
|
|
14
15
|
import { SearchableJsonFieldType } from "./fields/SearchableJsonFieldType.js";
|
|
@@ -31,6 +32,7 @@ const ModelBuilderFeature = createFeature({
|
|
|
31
32
|
container.register(NumberFieldType);
|
|
32
33
|
container.register(BooleanFieldType);
|
|
33
34
|
container.register(FileFieldType);
|
|
35
|
+
container.register(AssetFieldType);
|
|
34
36
|
container.register(DateTimeFieldType);
|
|
35
37
|
container.register(JsonFieldType);
|
|
36
38
|
container.register(SearchableJsonFieldType);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/modelBuilder/feature.js","sources":["../../../src/features/modelBuilder/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { FieldBuilderRegistry } from \"./fields/FieldBuilderRegistry.js\";\nimport { TextFieldType } from \"./fields/TextFieldType.js\";\nimport { LongTextFieldType } from \"./fields/LongTextFieldType.js\";\nimport { RichTextFieldType } from \"./fields/RichTextFieldType.js\";\nimport { ObjectFieldType } from \"./fields/ObjectFieldType.js\";\nimport { RefFieldType } from \"./fields/RefFieldType.js\";\nimport { DynamicZoneFieldType } from \"./fields/DynamicZoneFieldType.js\";\nimport { NumberFieldType } from \"./fields/NumberFieldType.js\";\nimport { BooleanFieldType } from \"./fields/BooleanFieldType.js\";\nimport { FileFieldType } from \"./fields/FileFieldType.js\";\nimport { DateTimeFieldType } from \"./fields/DateTimeFieldType.js\";\nimport { JsonFieldType } from \"./fields/JsonFieldType.js\";\nimport { SearchableJsonFieldType } from \"./fields/SearchableJsonFieldType.js\";\n// import { LocationFieldType } from \"./fields/LocationFieldType.js\";\nimport { FieldBuilderRegistry as FieldsRegistryAbstraction, ModelFactory } from \"./abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { ModelsProvider as ModelsProviderAbstraction } from \"./models/abstractions.js\";\nimport { ModelsProvider } from \"./models/ModelsProvider.js\";\nimport { UiSeparatorFieldType } from \"./fields/UiSeparatorFieldType.js\";\nimport { UiAlertFieldType } from \"./fields/UiAlertFieldType.js\";\nimport { UiTabsFieldType } from \"./fields/UiTabsFieldType.js\";\n\nexport const ModelBuilderFeature = createFeature({\n name: \"ModelBuilder\",\n register(container) {\n // Register core field types\n container.register(TextFieldType);\n container.register(LongTextFieldType);\n container.register(RichTextFieldType);\n container.register(ObjectFieldType);\n container.register(RefFieldType);\n container.register(DynamicZoneFieldType);\n container.register(NumberFieldType);\n container.register(BooleanFieldType);\n container.register(FileFieldType);\n container.register(DateTimeFieldType);\n container.register(JsonFieldType);\n container.register(SearchableJsonFieldType);\n container.register(UiSeparatorFieldType);\n container.register(UiAlertFieldType);\n container.register(UiTabsFieldType);\n // container.register(LocationFieldType);\n\n // Register field builder registry (will automatically get all FieldType implementations)\n container.register(FieldBuilderRegistry).inSingletonScope();\n\n // Register unified models provider\n container.registerFactory(ModelsProviderAbstraction, () => {\n let accessControl: AccessControl.Interface | undefined = undefined;\n try {\n // TODO: add `container.resolveOptional`\n accessControl = container.resolve(AccessControl);\n } catch {\n // It's an optional dependency!\n }\n\n return new ModelsProvider(\n // TODO: introduce a `lazy: true` dependency modifier, which will inject a getter.\n () => container.resolveAll(ModelFactory),\n container.resolve(FieldsRegistryAbstraction),\n accessControl\n );\n });\n }\n});\n"],"names":["ModelBuilderFeature","createFeature","container","TextFieldType","LongTextFieldType","RichTextFieldType","ObjectFieldType","RefFieldType","DynamicZoneFieldType","NumberFieldType","BooleanFieldType","FileFieldType","DateTimeFieldType","JsonFieldType","SearchableJsonFieldType","UiSeparatorFieldType","UiAlertFieldType","UiTabsFieldType","FieldBuilderRegistry","ModelsProviderAbstraction","accessControl","AccessControl","ModelsProvider","ModelFactory","FieldsRegistryAbstraction"],"mappings":"
|
|
1
|
+
{"version":3,"file":"features/modelBuilder/feature.js","sources":["../../../src/features/modelBuilder/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { FieldBuilderRegistry } from \"./fields/FieldBuilderRegistry.js\";\nimport { TextFieldType } from \"./fields/TextFieldType.js\";\nimport { LongTextFieldType } from \"./fields/LongTextFieldType.js\";\nimport { RichTextFieldType } from \"./fields/RichTextFieldType.js\";\nimport { ObjectFieldType } from \"./fields/ObjectFieldType.js\";\nimport { RefFieldType } from \"./fields/RefFieldType.js\";\nimport { DynamicZoneFieldType } from \"./fields/DynamicZoneFieldType.js\";\nimport { NumberFieldType } from \"./fields/NumberFieldType.js\";\nimport { BooleanFieldType } from \"./fields/BooleanFieldType.js\";\nimport { FileFieldType } from \"./fields/FileFieldType.js\";\nimport { AssetFieldType } from \"./fields/AssetFieldType.js\";\nimport { DateTimeFieldType } from \"./fields/DateTimeFieldType.js\";\nimport { JsonFieldType } from \"./fields/JsonFieldType.js\";\nimport { SearchableJsonFieldType } from \"./fields/SearchableJsonFieldType.js\";\n// import { LocationFieldType } from \"./fields/LocationFieldType.js\";\nimport { FieldBuilderRegistry as FieldsRegistryAbstraction, ModelFactory } from \"./abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { ModelsProvider as ModelsProviderAbstraction } from \"./models/abstractions.js\";\nimport { ModelsProvider } from \"./models/ModelsProvider.js\";\nimport { UiSeparatorFieldType } from \"./fields/UiSeparatorFieldType.js\";\nimport { UiAlertFieldType } from \"./fields/UiAlertFieldType.js\";\nimport { UiTabsFieldType } from \"./fields/UiTabsFieldType.js\";\n\nexport const ModelBuilderFeature = createFeature({\n name: \"ModelBuilder\",\n register(container) {\n // Register core field types\n container.register(TextFieldType);\n container.register(LongTextFieldType);\n container.register(RichTextFieldType);\n container.register(ObjectFieldType);\n container.register(RefFieldType);\n container.register(DynamicZoneFieldType);\n container.register(NumberFieldType);\n container.register(BooleanFieldType);\n container.register(FileFieldType);\n container.register(AssetFieldType);\n container.register(DateTimeFieldType);\n container.register(JsonFieldType);\n container.register(SearchableJsonFieldType);\n container.register(UiSeparatorFieldType);\n container.register(UiAlertFieldType);\n container.register(UiTabsFieldType);\n // container.register(LocationFieldType);\n\n // Register field builder registry (will automatically get all FieldType implementations)\n container.register(FieldBuilderRegistry).inSingletonScope();\n\n // Register unified models provider\n container.registerFactory(ModelsProviderAbstraction, () => {\n let accessControl: AccessControl.Interface | undefined = undefined;\n try {\n // TODO: add `container.resolveOptional`\n accessControl = container.resolve(AccessControl);\n } catch {\n // It's an optional dependency!\n }\n\n return new ModelsProvider(\n // TODO: introduce a `lazy: true` dependency modifier, which will inject a getter.\n () => container.resolveAll(ModelFactory),\n container.resolve(FieldsRegistryAbstraction),\n accessControl\n );\n });\n }\n});\n"],"names":["ModelBuilderFeature","createFeature","container","TextFieldType","LongTextFieldType","RichTextFieldType","ObjectFieldType","RefFieldType","DynamicZoneFieldType","NumberFieldType","BooleanFieldType","FileFieldType","AssetFieldType","DateTimeFieldType","JsonFieldType","SearchableJsonFieldType","UiSeparatorFieldType","UiAlertFieldType","UiTabsFieldType","FieldBuilderRegistry","ModelsProviderAbstraction","accessControl","AccessControl","ModelsProvider","ModelFactory","FieldsRegistryAbstraction"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAwBO,MAAMA,sBAAsBC,cAAc;IAC7C,MAAM;IACN,UAASC,SAAS;QAEdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QACnBF,UAAU,QAAQ,CAACG;QACnBH,UAAU,QAAQ,CAACI;QACnBJ,UAAU,QAAQ,CAACK;QACnBL,UAAU,QAAQ,CAACM;QACnBN,UAAU,QAAQ,CAACO;QACnBP,UAAU,QAAQ,CAACQ;QACnBR,UAAU,QAAQ,CAACS;QACnBT,UAAU,QAAQ,CAACU;QACnBV,UAAU,QAAQ,CAACW;QACnBX,UAAU,QAAQ,CAACY;QACnBZ,UAAU,QAAQ,CAACa;QACnBb,UAAU,QAAQ,CAACc;QACnBd,UAAU,QAAQ,CAACe;QACnBf,UAAU,QAAQ,CAACgB;QAInBhB,UAAU,QAAQ,CAACiB,sBAAsB,gBAAgB;QAGzDjB,UAAU,eAAe,CAACkB,gBAA2B;YACjD,IAAIC;YACJ,IAAI;gBAEAA,gBAAgBnB,UAAU,OAAO,CAACoB;YACtC,EAAE,OAAM,CAER;YAEA,OAAO,IAAIC,iCAEP,IAAMrB,UAAU,UAAU,CAACsB,eAC3BtB,UAAU,OAAO,CAACuB,gDAClBJ;QAER;IACJ;AACJ"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type IFieldTypeFactory } from "./abstractions.js";
|
|
2
|
+
import { DataFieldBuilder } from "./FieldBuilder.js";
|
|
3
|
+
import { RequiredValidator } from "./fieldTypeValidator.js";
|
|
4
|
+
export interface IAssetFieldBuilder extends DataFieldBuilder<"asset">, RequiredValidator {
|
|
5
|
+
accept(mimeTypes: string[]): this;
|
|
6
|
+
imagesOnly(): this;
|
|
7
|
+
}
|
|
8
|
+
declare class AssetFieldTypeFactory implements IFieldTypeFactory {
|
|
9
|
+
readonly type = "asset";
|
|
10
|
+
create(): IAssetFieldBuilder;
|
|
11
|
+
}
|
|
12
|
+
export declare const AssetFieldType: typeof AssetFieldTypeFactory & {
|
|
13
|
+
__abstraction: import("@webiny/di").Abstraction<IFieldTypeFactory>;
|
|
14
|
+
};
|
|
15
|
+
declare module "../abstractions.js" {
|
|
16
|
+
interface IFieldBuilderRegistry {
|
|
17
|
+
asset(): IAssetFieldBuilder;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { FieldType } from "./abstractions.js";
|
|
2
|
+
import { DataFieldBuilder } from "./FieldBuilder.js";
|
|
3
|
+
class AssetFieldBuilder extends DataFieldBuilder {
|
|
4
|
+
constructor(){
|
|
5
|
+
super("asset");
|
|
6
|
+
this.label("Asset");
|
|
7
|
+
this.renderer("assetField");
|
|
8
|
+
}
|
|
9
|
+
required(message) {
|
|
10
|
+
return this.validation({
|
|
11
|
+
name: "required",
|
|
12
|
+
message: message || "Value is required.",
|
|
13
|
+
settings: {}
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
list() {
|
|
17
|
+
super.list();
|
|
18
|
+
this.renderer("assetFields");
|
|
19
|
+
return this;
|
|
20
|
+
}
|
|
21
|
+
accept(mimeTypes) {
|
|
22
|
+
this.config.settings = this.config.settings || {};
|
|
23
|
+
this.config.settings.accept = mimeTypes;
|
|
24
|
+
return this;
|
|
25
|
+
}
|
|
26
|
+
imagesOnly() {
|
|
27
|
+
this.config.settings = this.config.settings || {};
|
|
28
|
+
this.config.settings.imagesOnly = true;
|
|
29
|
+
return this;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
class AssetFieldTypeFactory {
|
|
33
|
+
create() {
|
|
34
|
+
return new AssetFieldBuilder();
|
|
35
|
+
}
|
|
36
|
+
constructor(){
|
|
37
|
+
this.type = "asset";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const AssetFieldType = FieldType.createImplementation({
|
|
41
|
+
implementation: AssetFieldTypeFactory,
|
|
42
|
+
dependencies: []
|
|
43
|
+
});
|
|
44
|
+
export { AssetFieldType };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=AssetFieldType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/modelBuilder/fields/AssetFieldType.js","sources":["../../../../src/features/modelBuilder/fields/AssetFieldType.ts"],"sourcesContent":["import { FieldType, type IFieldTypeFactory } from \"./abstractions.js\";\nimport { DataFieldBuilder } from \"./FieldBuilder.js\";\nimport { RequiredValidator } from \"./fieldTypeValidator.js\";\n\nexport interface IAssetFieldBuilder extends DataFieldBuilder<\"asset\">, RequiredValidator {\n accept(mimeTypes: string[]): this;\n imagesOnly(): this;\n}\n\nclass AssetFieldBuilder extends DataFieldBuilder<\"asset\"> implements IAssetFieldBuilder {\n public constructor() {\n super(\"asset\");\n this.label(\"Asset\");\n this.renderer(\"assetField\");\n }\n\n required(message?: string): this {\n return this.validation({\n name: \"required\",\n message: message || \"Value is required.\",\n settings: {}\n });\n }\n\n override list(): this {\n super.list();\n this.renderer(\"assetFields\");\n return this;\n }\n\n accept(mimeTypes: string[]): this {\n this.config.settings = this.config.settings || {};\n this.config.settings.accept = mimeTypes;\n return this;\n }\n\n imagesOnly(): this {\n this.config.settings = this.config.settings || {};\n this.config.settings.imagesOnly = true;\n return this;\n }\n}\n\nclass AssetFieldTypeFactory implements IFieldTypeFactory {\n readonly type = \"asset\";\n\n create(): IAssetFieldBuilder {\n return new AssetFieldBuilder();\n }\n}\n\nexport const AssetFieldType = FieldType.createImplementation({\n implementation: AssetFieldTypeFactory,\n dependencies: []\n});\n\ndeclare module \"../abstractions.js\" {\n interface IFieldBuilderRegistry {\n asset(): IAssetFieldBuilder;\n }\n}\n"],"names":["AssetFieldBuilder","DataFieldBuilder","message","mimeTypes","AssetFieldTypeFactory","AssetFieldType","FieldType"],"mappings":";;AASA,MAAMA,0BAA0BC;IAC5B,aAAqB;QACjB,KAAK,CAAC;QACN,IAAI,CAAC,KAAK,CAAC;QACX,IAAI,CAAC,QAAQ,CAAC;IAClB;IAEA,SAASC,OAAgB,EAAQ;QAC7B,OAAO,IAAI,CAAC,UAAU,CAAC;YACnB,MAAM;YACN,SAASA,WAAW;YACpB,UAAU,CAAC;QACf;IACJ;IAES,OAAa;QAClB,KAAK,CAAC;QACN,IAAI,CAAC,QAAQ,CAAC;QACd,OAAO,IAAI;IACf;IAEA,OAAOC,SAAmB,EAAQ;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAGA;QAC9B,OAAO,IAAI;IACf;IAEA,aAAmB;QACf,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG;QAClC,OAAO,IAAI;IACf;AACJ;AAEA,MAAMC;IAGF,SAA6B;QACzB,OAAO,IAAIJ;IACf;;aAJS,IAAI,GAAG;;AAKpB;AAEO,MAAMK,iBAAiBC,UAAU,oBAAoB,CAAC;IACzD,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
|
|
@@ -25,15 +25,18 @@ export interface IFieldRendererRegistry {
|
|
|
25
25
|
dateTimeInputs: {
|
|
26
26
|
fieldType: "datetime";
|
|
27
27
|
settings?: {
|
|
28
|
-
|
|
29
|
-
addValueButtonLabel?: string;
|
|
30
|
-
};
|
|
28
|
+
addItemLabel?: string;
|
|
31
29
|
};
|
|
32
30
|
};
|
|
33
31
|
dynamicZone: {
|
|
34
32
|
fieldType: "dynamicZone";
|
|
35
33
|
settings?: {
|
|
34
|
+
/** Whether the accordion is expanded by default. */
|
|
36
35
|
open?: boolean;
|
|
36
|
+
/** Wrap the zone in a container panel. Set to `false` for a flat inline layout. */
|
|
37
|
+
container?: boolean;
|
|
38
|
+
/** Label for the "add item" button (defaults to "Add Item"). */
|
|
39
|
+
addItemLabel?: string;
|
|
37
40
|
};
|
|
38
41
|
};
|
|
39
42
|
hidden: {
|
|
@@ -47,9 +50,7 @@ export interface IFieldRendererRegistry {
|
|
|
47
50
|
lexicalEditors: {
|
|
48
51
|
fieldType: "rich-text";
|
|
49
52
|
settings?: {
|
|
50
|
-
|
|
51
|
-
addValueButtonLabel?: string;
|
|
52
|
-
};
|
|
53
|
+
addItemLabel?: string;
|
|
53
54
|
};
|
|
54
55
|
};
|
|
55
56
|
textarea: {
|
|
@@ -59,9 +60,7 @@ export interface IFieldRendererRegistry {
|
|
|
59
60
|
textareas: {
|
|
60
61
|
fieldType: "long-text";
|
|
61
62
|
settings: {
|
|
62
|
-
|
|
63
|
-
addValueButtonLabel?: string;
|
|
64
|
-
};
|
|
63
|
+
addItemLabel?: string;
|
|
65
64
|
};
|
|
66
65
|
};
|
|
67
66
|
numberInput: {
|
|
@@ -71,24 +70,35 @@ export interface IFieldRendererRegistry {
|
|
|
71
70
|
numberInputs: {
|
|
72
71
|
fieldType: "number";
|
|
73
72
|
settings?: {
|
|
74
|
-
|
|
75
|
-
addValueButtonLabel?: string;
|
|
76
|
-
};
|
|
73
|
+
addItemLabel?: string;
|
|
77
74
|
};
|
|
78
75
|
};
|
|
79
76
|
objectAccordionSingle: {
|
|
80
77
|
fieldType: "object";
|
|
81
78
|
settings?: {
|
|
79
|
+
/** Whether the accordion is expanded by default. */
|
|
82
80
|
open?: boolean;
|
|
81
|
+
/** Wrap the object in a container panel. Set to `false` for a flat inline layout. */
|
|
82
|
+
container?: boolean;
|
|
83
|
+
/** Field ID whose value is used as the accordion title, or a function receiving the object data. */
|
|
84
|
+
itemTitle?: string;
|
|
85
|
+
/** Field ID whose value is used as the accordion description, or a function receiving the object data. */
|
|
86
|
+
itemDescription?: string;
|
|
83
87
|
};
|
|
84
88
|
};
|
|
85
89
|
objectAccordionMultiple: {
|
|
86
90
|
fieldType: "object";
|
|
87
91
|
settings?: {
|
|
92
|
+
/** Whether each accordion item is expanded by default. */
|
|
88
93
|
open?: boolean;
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
94
|
+
/** Wrap the list in a container panel. Set to `false` for a flat inline layout. */
|
|
95
|
+
container?: boolean;
|
|
96
|
+
/** Field ID whose value is used as each item's accordion title. */
|
|
97
|
+
itemTitle?: string;
|
|
98
|
+
/** Field ID whose value is used as each item's accordion description. */
|
|
99
|
+
itemDescription?: string;
|
|
100
|
+
/** Label for the "add item" button (defaults to "Add {fieldLabel}"). */
|
|
101
|
+
addItemLabel?: string;
|
|
92
102
|
};
|
|
93
103
|
};
|
|
94
104
|
passthrough: {
|
|
@@ -106,6 +116,7 @@ export interface IFieldRendererRegistry {
|
|
|
106
116
|
refDialogMultiple: {
|
|
107
117
|
fieldType: "ref";
|
|
108
118
|
settings?: {
|
|
119
|
+
/** Where newly picked references are inserted: `"first"` (top) or `"last"` (bottom, default). */
|
|
109
120
|
newItemPosition?: "first" | "last";
|
|
110
121
|
};
|
|
111
122
|
};
|
|
@@ -125,6 +136,11 @@ export interface IFieldRendererRegistry {
|
|
|
125
136
|
fieldType: "ref";
|
|
126
137
|
settings: undefined;
|
|
127
138
|
};
|
|
139
|
+
select: {
|
|
140
|
+
fieldType: "text" | "number";
|
|
141
|
+
settings: undefined;
|
|
142
|
+
};
|
|
143
|
+
/** @deprecated Use "select" instead. */
|
|
128
144
|
dropdown: {
|
|
129
145
|
fieldType: "text" | "number";
|
|
130
146
|
settings: undefined;
|
|
@@ -140,21 +156,41 @@ export interface IFieldRendererRegistry {
|
|
|
140
156
|
textInputs: {
|
|
141
157
|
fieldType: "text";
|
|
142
158
|
settings?: {
|
|
143
|
-
|
|
144
|
-
addValueButtonLabel?: string;
|
|
145
|
-
};
|
|
159
|
+
addItemLabel?: string;
|
|
146
160
|
};
|
|
147
161
|
};
|
|
162
|
+
/** @deprecated Use `assetField` instead. */
|
|
148
163
|
file: {
|
|
149
164
|
fieldType: "file";
|
|
150
165
|
settings?: {
|
|
166
|
+
/** Only allow image files to be selected. */
|
|
151
167
|
imagesOnly?: boolean;
|
|
152
168
|
};
|
|
153
169
|
};
|
|
170
|
+
/** @deprecated Use `assetFields` instead. */
|
|
154
171
|
files: {
|
|
155
172
|
fieldType: "file";
|
|
156
173
|
settings?: {
|
|
174
|
+
/** Only allow image files to be selected. */
|
|
175
|
+
imagesOnly?: boolean;
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
assetField: {
|
|
179
|
+
fieldType: "asset";
|
|
180
|
+
settings?: {
|
|
181
|
+
/** Only allow image files to be selected. */
|
|
157
182
|
imagesOnly?: boolean;
|
|
183
|
+
/** MIME types or extensions to allow (e.g. `["image/png", "application/pdf"]`). Leave empty to allow all. */
|
|
184
|
+
accept?: string[];
|
|
185
|
+
};
|
|
186
|
+
};
|
|
187
|
+
assetFields: {
|
|
188
|
+
fieldType: "asset";
|
|
189
|
+
settings?: {
|
|
190
|
+
/** Only allow image files to be selected. */
|
|
191
|
+
imagesOnly?: boolean;
|
|
192
|
+
/** MIME types or extensions to allow (e.g. `["image/png", "application/pdf"]`). Leave empty to allow all. */
|
|
193
|
+
accept?: string[];
|
|
158
194
|
};
|
|
159
195
|
};
|
|
160
196
|
uiSeparator: {
|
|
@@ -191,6 +227,14 @@ export declare class DataFieldBuilder<TType extends string = string> extends Bas
|
|
|
191
227
|
storageId(id: string): this;
|
|
192
228
|
defaultValue(value: any): this;
|
|
193
229
|
list(): this;
|
|
230
|
+
/**
|
|
231
|
+
* Renders the field in the admin app, but doesn't let anyone edit its value.
|
|
232
|
+
* Handy for values your own code owns, like an external ID or a generated slug.
|
|
233
|
+
*
|
|
234
|
+
* Only the admin app honours this. The API doesn't check it, so the field can
|
|
235
|
+
* still be written to over GraphQL.
|
|
236
|
+
*/
|
|
237
|
+
disabled(value?: boolean): this;
|
|
194
238
|
tags(tags: string[]): this;
|
|
195
239
|
/**
|
|
196
240
|
* List validators - these methods are available after calling list()
|
|
@@ -24,12 +24,15 @@ const rendererNameMap = {
|
|
|
24
24
|
refAutocompleteMultiple: "ref-inputs",
|
|
25
25
|
refCheckboxes: "ref-simple-multiple",
|
|
26
26
|
refRadioButtons: "ref-simple-single",
|
|
27
|
+
select: "select-box",
|
|
27
28
|
dropdown: "select-box",
|
|
28
29
|
tags: "tags",
|
|
29
30
|
textInput: "text-input",
|
|
30
31
|
textInputs: "text-inputs",
|
|
31
32
|
file: "file-input",
|
|
32
33
|
files: "file-inputs",
|
|
34
|
+
assetField: "asset-input",
|
|
35
|
+
assetFields: "asset-inputs",
|
|
33
36
|
uiSeparator: "uiSeparator",
|
|
34
37
|
uiAlert: "uiAlert",
|
|
35
38
|
uiTabs: "uiTabs"
|
|
@@ -77,6 +80,10 @@ class DataFieldBuilder extends BaseFieldBuilder {
|
|
|
77
80
|
this.config.list = true;
|
|
78
81
|
return this;
|
|
79
82
|
}
|
|
83
|
+
disabled(value = true) {
|
|
84
|
+
this.config.disabled = value;
|
|
85
|
+
return this;
|
|
86
|
+
}
|
|
80
87
|
tags(tags) {
|
|
81
88
|
this.config.tags = tags;
|
|
82
89
|
return this;
|
|
@@ -147,6 +154,7 @@ class DataFieldBuilder extends BaseFieldBuilder {
|
|
|
147
154
|
validation: this.config.validation || [],
|
|
148
155
|
listValidation: this.config.listValidation || [],
|
|
149
156
|
list: this.config.list || false,
|
|
157
|
+
disabled: this.config.disabled || false,
|
|
150
158
|
predefinedValues: this.config.predefinedValues || {
|
|
151
159
|
enabled: false,
|
|
152
160
|
values: []
|
|
@@ -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 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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"}
|
|
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 addItemLabel?: string;\n };\n };\n dynamicZone: {\n fieldType: \"dynamicZone\";\n settings?: {\n /** Whether the accordion is expanded by default. */\n open?: boolean;\n /** Wrap the zone in a container panel. Set to `false` for a flat inline layout. */\n container?: boolean;\n /** Label for the \"add item\" button (defaults to \"Add Item\"). */\n addItemLabel?: string;\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 addItemLabel?: string;\n };\n };\n textarea: {\n fieldType: \"long-text\";\n settings: undefined;\n };\n textareas: {\n fieldType: \"long-text\";\n settings: {\n addItemLabel?: string;\n };\n };\n numberInput: {\n fieldType: \"number\";\n settings: undefined;\n };\n numberInputs: {\n fieldType: \"number\";\n settings?: {\n addItemLabel?: string;\n };\n };\n objectAccordionSingle: {\n fieldType: \"object\";\n settings?: {\n /** Whether the accordion is expanded by default. */\n open?: boolean;\n /** Wrap the object in a container panel. Set to `false` for a flat inline layout. */\n container?: boolean;\n /** Field ID whose value is used as the accordion title, or a function receiving the object data. */\n itemTitle?: string;\n /** Field ID whose value is used as the accordion description, or a function receiving the object data. */\n itemDescription?: string;\n };\n };\n objectAccordionMultiple: {\n fieldType: \"object\";\n settings?: {\n /** Whether each accordion item is expanded by default. */\n open?: boolean;\n /** Wrap the list in a container panel. Set to `false` for a flat inline layout. */\n container?: boolean;\n /** Field ID whose value is used as each item's accordion title. */\n itemTitle?: string;\n /** Field ID whose value is used as each item's accordion description. */\n itemDescription?: string;\n /** Label for the \"add item\" button (defaults to \"Add {fieldLabel}\"). */\n addItemLabel?: string;\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 /** Where newly picked references are inserted: `\"first\"` (top) or `\"last\"` (bottom, default). */\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 select: {\n fieldType: \"text\" | \"number\";\n settings: undefined;\n };\n /** @deprecated Use \"select\" instead. */\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 addItemLabel?: string;\n };\n };\n /** @deprecated Use `assetField` instead. */\n file: {\n fieldType: \"file\";\n settings?: {\n /** Only allow image files to be selected. */\n imagesOnly?: boolean;\n };\n };\n /** @deprecated Use `assetFields` instead. */\n files: {\n fieldType: \"file\";\n settings?: {\n /** Only allow image files to be selected. */\n imagesOnly?: boolean;\n };\n };\n assetField: {\n fieldType: \"asset\";\n settings?: {\n /** Only allow image files to be selected. */\n imagesOnly?: boolean;\n /** MIME types or extensions to allow (e.g. `[\"image/png\", \"application/pdf\"]`). Leave empty to allow all. */\n accept?: string[];\n };\n };\n assetFields: {\n fieldType: \"asset\";\n settings?: {\n /** Only allow image files to be selected. */\n imagesOnly?: boolean;\n /** MIME types or extensions to allow (e.g. `[\"image/png\", \"application/pdf\"]`). Leave empty to allow all. */\n accept?: string[];\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 select: \"select-box\",\n dropdown: \"select-box\",\n tags: \"tags\",\n textInput: \"text-input\",\n textInputs: \"text-inputs\",\n file: \"file-input\",\n files: \"file-inputs\",\n assetField: \"asset-input\",\n assetFields: \"asset-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 /**\n * Renders the field in the admin app, but doesn't let anyone edit its value.\n * Handy for values your own code owns, like an external ID or a generated slug.\n *\n * Only the admin app honours this. The API doesn't check it, so the field can\n * still be written to over GraphQL.\n */\n disabled(value = true): this {\n this.config.disabled = value;\n return 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 disabled: this.config.disabled || 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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"}
|
|
@@ -9,6 +9,7 @@ export interface IDynamicZoneFieldBuilder extends DataFieldBuilder<"dynamicZone"
|
|
|
9
9
|
gqlTypeName: string;
|
|
10
10
|
icon?: CmsIcon;
|
|
11
11
|
description?: string;
|
|
12
|
+
componentName?: string;
|
|
12
13
|
fields: (registry: IFieldBuilderRegistry) => Record<string, BaseFieldBuilder<any>>;
|
|
13
14
|
layout?: string[][];
|
|
14
15
|
}): this;
|
|
@@ -31,6 +31,7 @@ class DynamicZoneFieldBuilder extends DataFieldBuilder {
|
|
|
31
31
|
gqlTypeName: config.gqlTypeName,
|
|
32
32
|
icon: config.icon,
|
|
33
33
|
description: config.description || "",
|
|
34
|
+
componentName: config.componentName,
|
|
34
35
|
fields,
|
|
35
36
|
layout,
|
|
36
37
|
validation: []
|
|
@@ -40,12 +41,7 @@ class DynamicZoneFieldBuilder extends DataFieldBuilder {
|
|
|
40
41
|
build() {
|
|
41
42
|
this.config.settings = this.config.settings || {};
|
|
42
43
|
this.config.settings.templates = this.templates;
|
|
43
|
-
this.config.listValidation = [
|
|
44
|
-
{
|
|
45
|
-
name: "dynamicZone",
|
|
46
|
-
message: ""
|
|
47
|
-
}
|
|
48
|
-
];
|
|
44
|
+
this.config.listValidation = [];
|
|
49
45
|
return super.build();
|
|
50
46
|
}
|
|
51
47
|
}
|
|
@@ -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 {\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 = [
|
|
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 componentName?: string;\n fields: any[];\n layout: CmsModelLayoutCell[][];\n validation: CmsModelFieldValidation[];\n}\n\nexport interface IDynamicZoneFieldBuilder extends DataFieldBuilder<\"dynamicZone\"> {\n required(message?: string): this;\n\n template(\n id: string,\n config: {\n name: string;\n gqlTypeName: string;\n icon?: CmsIcon;\n description?: string;\n componentName?: 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 componentName?: 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 componentName: config.componentName,\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 = [];\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":";;AAkDA,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;YACnC,eAAeA,OAAO,aAAa;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,EAAE;QAC/B,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"}
|