@webiny/api-headless-cms 6.4.11-beta.1 → 6.4.12-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/crud/contentEntry/entryDataValidation.js +3 -4
- package/crud/contentEntry/entryDataValidation.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/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 +1 -2
- 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/features/contentEntry/entryDataFactories/expiresAt.js +2 -2
- package/features/contentEntry/entryDataFactories/expiresAt.js.map +1 -1
- package/features/contentModel/CreateModel/CreateModelRepository.js +1 -2
- package/features/contentModel/CreateModel/CreateModelRepository.js.map +1 -1
- package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js +1 -2
- package/features/contentModel/CreateModelFrom/CreateModelFromRepository.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 +3 -4
- 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/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/whereMapper/WhereMapper.js +2 -3
- package/features/whereMapper/WhereMapper.js.map +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/createFieldResolvers.js +1 -1
- package/graphql/schema/createFieldResolvers.js.map +1 -1
- package/package.json +27 -27
- package/plugins/CmsModelPlugin.js +9 -10
- package/plugins/CmsModelPlugin.js.map +1 -1
- package/utils/caching/Cache.js +1 -1
- package/utils/caching/Cache.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/renderFields.js +1 -1
- package/utils/renderFields.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentModel/CreateModel/CreateModelRepository.js","sources":["../../../../src/features/contentModel/CreateModel/CreateModelRepository.ts"],"sourcesContent":["import camelCase from \"lodash/camelCase.js\";\nimport { Result } from \"@webiny/feature/api\";\nimport { CreateModelRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { ModelCache, PluginModelsProvider } from \"~/features/contentModel/shared/abstractions.js\";\nimport { ListModelsUseCase } from \"~/features/contentModel/ListModels/index.js\";\nimport {\n ModelAlreadyExistsError,\n ModelPersistenceError,\n ModelValidationError\n} from \"~/domain/contentModel/errors.js\";\nimport { CmsContext, StorageOperations } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport {\n validateExistingModelId,\n validateModelIdAllowed\n} from \"~/crud/contentModel/validate/modelId.js\";\nimport { validateEndingAllowed } from \"~/crud/contentModel/validate/endingAllowed.js\";\nimport type { CmsModel } from \"~/types/index.js\";\nimport { ensureTypeTag } from \"~/domain/contentModel/ensureTypeTag.js\";\nimport { validateSingularApiName } from \"~/domain/contentModel/validation/singularApiName.js\";\nimport { validatePluralApiName } from \"~/domain/contentModel/validation/pluralApiName.js\";\nimport { validateModelFields } from \"~/domain/contentModel/validation/modelFields.js\";\nimport { ModelFieldCompression } from \"~/features/contentModel/ModelFieldCompression/index.js\";\nimport { RuntimeTenant } from \"~/features/runtimeTenant/abstractions.js\";\n\n/**\n * Generate modelId from model following the exact logic from beforeCreate.ts\n */\nconst getModelId = (model: { modelId?: string; name?: string }): string => {\n const { modelId, name } = model;\n const value = modelId ? modelId.trim() : null;\n if (value) {\n const isModelIdValid = camelCase(value).toLowerCase() === value.toLowerCase();\n if (isModelIdValid) {\n return value;\n }\n return camelCase(value);\n } else if (name) {\n return camelCase(name.trim());\n }\n throw new ModelValidationError(\n `There is no \"modelId\" or \"name\" passed into the create model method.`\n );\n};\n\n/**\n * CreateModelRepository - Validates domain rules and persists a new model.\n *\n * Responsibilities:\n * - Generate modelId from input\n * - Validate modelId is allowed (not in disallowed list)\n * - Validate API name endings\n * - Validate modelId uniqueness (database + plugins)\n * - Validate API name uniqueness (database + plugins)\n * - Validate plugin conflicts\n * - Validate model fields\n * - Persist to storage\n * - Clear ModelCache after successful create\n */\nclass CreateModelRepositoryImpl implements RepositoryAbstraction.Interface {\n public constructor(\n private readonly modelCache: ModelCache.Interface,\n private readonly pluginModelsProvider: PluginModelsProvider.Interface,\n private readonly listModelsUseCase: ListModelsUseCase.Interface,\n private readonly storageOperations: StorageOperations.Interface,\n private readonly tenantContext: TenantContext.Interface,\n private readonly cmsContext: CmsContext.Interface,\n private readonly modelFieldCompression: ModelFieldCompression.Interface,\n private readonly runtimeTenant: RuntimeTenant.Interface\n ) {}\n\n async execute(initialModel: CmsModel): Promise<Result<CmsModel, RepositoryAbstraction.Error>> {\n const model = this.runtimeTenant.assign(initialModel);\n try {\n const tenant = this.tenantContext.getTenant();\n\n // TODO: this will eventually become part of the Model domain object.\n const modelId = getModelId(model);\n model.modelId = modelId;\n\n // Validate modelId is allowed (not in disallowed list)\n try {\n validateModelIdAllowed({ model });\n } catch (error) {\n return Result.fail(\n new ModelValidationError({\n message: error.message,\n data: error.data\n })\n );\n }\n\n // Validate API name endings\n try {\n validateEndingAllowed({ model });\n } catch (error) {\n return Result.fail(\n new ModelValidationError({\n message: error.message,\n data: error.data\n })\n );\n }\n\n // Check for plugin model conflicts\n const pluginModels = await this.pluginModelsProvider.list(tenant.id);\n const pluginModelConflict = pluginModels.find(pm => {\n return pm.modelId === model.modelId;\n });\n\n if (pluginModelConflict) {\n return Result.fail(\n new ModelAlreadyExistsError({\n modelId,\n message: `Model \"${modelId}\" is already registered via a plugin.`\n })\n );\n }\n\n // Get all models for further validation\n const modelsResult = await this.listModelsUseCase.execute();\n\n if (modelsResult.isFail()) {\n return Result.fail(new ModelPersistenceError(modelsResult.error));\n }\n\n const models = modelsResult.value;\n\n try {\n /**\n * We need to check for the existence of:\n * - modelId\n * - singularApiName\n * - pluralApiName\n */\n for (const existingModel of models) {\n validateExistingModelId({\n existingModel,\n model\n });\n validateSingularApiName({\n existingModel,\n model\n });\n validatePluralApiName({\n existingModel,\n model\n });\n }\n\n await validateModelFields({\n models,\n model,\n context: this.cmsContext\n });\n } catch (error) {\n return Result.fail(\n new ModelValidationError({ message: error.message, data: error.data })\n );\n }\n\n // TODO: ideally, this will eventually be handled by the Model domain object\n model.tags = ensureTypeTag(model);\n\n const fields = await this.modelFieldCompression.compress(model.fields);\n\n // Persist to storage\n await this.storageOperations.models.create({\n model: {\n ...model,\n fields\n }\n });\n\n // Clear cache\n this.modelCache.clear();\n\n return Result.ok(model);\n } catch (error) {\n console.error(error, error.stack);\n return Result.fail(new ModelPersistenceError(error as Error));\n }\n }\n}\n\nexport const CreateModelRepository = RepositoryAbstraction.createImplementation({\n implementation: CreateModelRepositoryImpl,\n dependencies: [\n ModelCache,\n PluginModelsProvider,\n ListModelsUseCase,\n StorageOperations,\n TenantContext,\n CmsContext,\n ModelFieldCompression,\n RuntimeTenant\n ]\n});\n"],"names":["getModelId","model","modelId","name","value","isModelIdValid","camelCase","ModelValidationError","CreateModelRepositoryImpl","modelCache","pluginModelsProvider","listModelsUseCase","storageOperations","tenantContext","cmsContext","modelFieldCompression","runtimeTenant","initialModel","tenant","validateModelIdAllowed","error","Result","validateEndingAllowed","pluginModels","pluginModelConflict","pm","ModelAlreadyExistsError","modelsResult","ModelPersistenceError","models","existingModel","validateExistingModelId","validateSingularApiName","validatePluralApiName","validateModelFields","ensureTypeTag","fields","console","CreateModelRepository","RepositoryAbstraction","ModelCache","PluginModelsProvider","ListModelsUseCase","StorageOperations","TenantContext","CmsContext","ModelFieldCompression","RuntimeTenant"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"features/contentModel/CreateModel/CreateModelRepository.js","sources":["../../../../src/features/contentModel/CreateModel/CreateModelRepository.ts"],"sourcesContent":["import camelCase from \"lodash/camelCase.js\";\nimport { Result } from \"@webiny/feature/api\";\nimport { CreateModelRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { ModelCache, PluginModelsProvider } from \"~/features/contentModel/shared/abstractions.js\";\nimport { ListModelsUseCase } from \"~/features/contentModel/ListModels/index.js\";\nimport {\n ModelAlreadyExistsError,\n ModelPersistenceError,\n ModelValidationError\n} from \"~/domain/contentModel/errors.js\";\nimport { CmsContext, StorageOperations } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport {\n validateExistingModelId,\n validateModelIdAllowed\n} from \"~/crud/contentModel/validate/modelId.js\";\nimport { validateEndingAllowed } from \"~/crud/contentModel/validate/endingAllowed.js\";\nimport type { CmsModel } from \"~/types/index.js\";\nimport { ensureTypeTag } from \"~/domain/contentModel/ensureTypeTag.js\";\nimport { validateSingularApiName } from \"~/domain/contentModel/validation/singularApiName.js\";\nimport { validatePluralApiName } from \"~/domain/contentModel/validation/pluralApiName.js\";\nimport { validateModelFields } from \"~/domain/contentModel/validation/modelFields.js\";\nimport { ModelFieldCompression } from \"~/features/contentModel/ModelFieldCompression/index.js\";\nimport { RuntimeTenant } from \"~/features/runtimeTenant/abstractions.js\";\n\n/**\n * Generate modelId from model following the exact logic from beforeCreate.ts\n */\nconst getModelId = (model: { modelId?: string; name?: string }): string => {\n const { modelId, name } = model;\n const value = modelId ? modelId.trim() : null;\n if (value) {\n const isModelIdValid = camelCase(value).toLowerCase() === value.toLowerCase();\n if (isModelIdValid) {\n return value;\n }\n return camelCase(value);\n } else if (name) {\n return camelCase(name.trim());\n }\n throw new ModelValidationError(\n `There is no \"modelId\" or \"name\" passed into the create model method.`\n );\n};\n\n/**\n * CreateModelRepository - Validates domain rules and persists a new model.\n *\n * Responsibilities:\n * - Generate modelId from input\n * - Validate modelId is allowed (not in disallowed list)\n * - Validate API name endings\n * - Validate modelId uniqueness (database + plugins)\n * - Validate API name uniqueness (database + plugins)\n * - Validate plugin conflicts\n * - Validate model fields\n * - Persist to storage\n * - Clear ModelCache after successful create\n */\nclass CreateModelRepositoryImpl implements RepositoryAbstraction.Interface {\n public constructor(\n private readonly modelCache: ModelCache.Interface,\n private readonly pluginModelsProvider: PluginModelsProvider.Interface,\n private readonly listModelsUseCase: ListModelsUseCase.Interface,\n private readonly storageOperations: StorageOperations.Interface,\n private readonly tenantContext: TenantContext.Interface,\n private readonly cmsContext: CmsContext.Interface,\n private readonly modelFieldCompression: ModelFieldCompression.Interface,\n private readonly runtimeTenant: RuntimeTenant.Interface\n ) {}\n\n async execute(initialModel: CmsModel): Promise<Result<CmsModel, RepositoryAbstraction.Error>> {\n const model = this.runtimeTenant.assign(initialModel);\n try {\n const tenant = this.tenantContext.getTenant();\n\n // TODO: this will eventually become part of the Model domain object.\n const modelId = getModelId(model);\n model.modelId = modelId;\n\n // Validate modelId is allowed (not in disallowed list)\n try {\n validateModelIdAllowed({ model });\n } catch (error) {\n return Result.fail(\n new ModelValidationError({\n message: error.message,\n data: error.data\n })\n );\n }\n\n // Validate API name endings\n try {\n validateEndingAllowed({ model });\n } catch (error) {\n return Result.fail(\n new ModelValidationError({\n message: error.message,\n data: error.data\n })\n );\n }\n\n // Check for plugin model conflicts\n const pluginModels = await this.pluginModelsProvider.list(tenant.id);\n const pluginModelConflict = pluginModels.find(pm => {\n return pm.modelId === model.modelId;\n });\n\n if (pluginModelConflict) {\n return Result.fail(\n new ModelAlreadyExistsError({\n modelId,\n message: `Model \"${modelId}\" is already registered via a plugin.`\n })\n );\n }\n\n // Get all models for further validation\n const modelsResult = await this.listModelsUseCase.execute();\n\n if (modelsResult.isFail()) {\n return Result.fail(new ModelPersistenceError(modelsResult.error));\n }\n\n const models = modelsResult.value;\n\n try {\n /**\n * We need to check for the existence of:\n * - modelId\n * - singularApiName\n * - pluralApiName\n */\n for (const existingModel of models) {\n validateExistingModelId({\n existingModel,\n model\n });\n validateSingularApiName({\n existingModel,\n model\n });\n validatePluralApiName({\n existingModel,\n model\n });\n }\n\n await validateModelFields({\n models,\n model,\n context: this.cmsContext\n });\n } catch (error) {\n return Result.fail(\n new ModelValidationError({ message: error.message, data: error.data })\n );\n }\n\n // TODO: ideally, this will eventually be handled by the Model domain object\n model.tags = ensureTypeTag(model);\n\n const fields = await this.modelFieldCompression.compress(model.fields);\n\n // Persist to storage\n await this.storageOperations.models.create({\n model: {\n ...model,\n fields\n }\n });\n\n // Clear cache\n this.modelCache.clear();\n\n return Result.ok(model);\n } catch (error) {\n console.error(error, error.stack);\n return Result.fail(new ModelPersistenceError(error as Error));\n }\n }\n}\n\nexport const CreateModelRepository = RepositoryAbstraction.createImplementation({\n implementation: CreateModelRepositoryImpl,\n dependencies: [\n ModelCache,\n PluginModelsProvider,\n ListModelsUseCase,\n StorageOperations,\n TenantContext,\n CmsContext,\n ModelFieldCompression,\n RuntimeTenant\n ]\n});\n"],"names":["getModelId","model","modelId","name","value","isModelIdValid","camelCase","ModelValidationError","CreateModelRepositoryImpl","modelCache","pluginModelsProvider","listModelsUseCase","storageOperations","tenantContext","cmsContext","modelFieldCompression","runtimeTenant","initialModel","tenant","validateModelIdAllowed","error","Result","validateEndingAllowed","pluginModels","pluginModelConflict","pm","ModelAlreadyExistsError","modelsResult","ModelPersistenceError","models","existingModel","validateExistingModelId","validateSingularApiName","validatePluralApiName","validateModelFields","ensureTypeTag","fields","console","CreateModelRepository","RepositoryAbstraction","ModelCache","PluginModelsProvider","ListModelsUseCase","StorageOperations","TenantContext","CmsContext","ModelFieldCompression","RuntimeTenant"],"mappings":"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"}
|
|
@@ -20,8 +20,7 @@ const getModelId = (model)=>{
|
|
|
20
20
|
const isModelIdValid = camelCase(value).toLowerCase() === value.toLowerCase();
|
|
21
21
|
if (isModelIdValid) return value;
|
|
22
22
|
return camelCase(value);
|
|
23
|
-
}
|
|
24
|
-
if (name) return camelCase(name.trim());
|
|
23
|
+
} else if (name) return camelCase(name.trim());
|
|
25
24
|
throw new ModelValidationError('There is no "modelId" or "name" passed into the create model from method.');
|
|
26
25
|
};
|
|
27
26
|
class CreateModelFromRepositoryImpl {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentModel/CreateModelFrom/CreateModelFromRepository.js","sources":["../../../../src/features/contentModel/CreateModelFrom/CreateModelFromRepository.ts"],"sourcesContent":["import camelCase from \"lodash/camelCase.js\";\nimport { Result } from \"@webiny/feature/api\";\nimport { CreateModelFromRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport {\n ModelCache,\n ModelsFetcher,\n PluginModelsProvider\n} from \"~/features/contentModel/shared/abstractions.js\";\nimport {\n ModelAlreadyExistsError,\n ModelPersistenceError,\n ModelValidationError\n} from \"~/domain/contentModel/errors.js\";\nimport { CmsContext, StorageOperations } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport {\n validateExistingModelId,\n validateModelIdAllowed\n} from \"~/crud/contentModel/validate/modelId.js\";\nimport { validateEndingAllowed } from \"~/crud/contentModel/validate/endingAllowed.js\";\nimport { validateSingularApiName } from \"~/domain/contentModel/validation/singularApiName.js\";\nimport { validatePluralApiName } from \"~/domain/contentModel/validation/pluralApiName.js\";\nimport { validateModelFields } from \"~/domain/contentModel/validation/modelFields.js\";\nimport type { CmsModel } from \"~/types/index.js\";\nimport { ensureTypeTag } from \"~/domain/contentModel/ensureTypeTag.js\";\nimport { ModelFieldCompression } from \"~/features/contentModel/ModelFieldCompression/index.js\";\nimport { RuntimeTenant } from \"~/features/runtimeTenant/abstractions.js\";\n\n/**\n * Generate modelId from model following the exact logic from beforeCreate.ts\n */\nconst getModelId = (model: { modelId?: string; name?: string }): string => {\n const { modelId, name } = model;\n const value = modelId ? modelId.trim() : null;\n if (value) {\n const isModelIdValid = camelCase(value).toLowerCase() === value.toLowerCase();\n if (isModelIdValid) {\n return value;\n }\n return camelCase(value);\n } else if (name) {\n return camelCase(name.trim());\n }\n throw new ModelValidationError(\n `There is no \"modelId\" or \"name\" passed into the create model from method.`\n );\n};\n\n/**\n * CreateModelFromRepository - Validates domain rules and persists cloned model.\n *\n * Responsibilities:\n * - Generate modelId from input\n * - Validate modelId is allowed (not in disallowed list)\n * - Validate API name endings\n * - Validate modelId uniqueness (database + plugins)\n * - Validate API name uniqueness (database + plugins)\n * - Validate plugin conflicts\n * - Validate model fields\n * - Persist to storage\n * - Clear ModelCache after successful create\n */\nclass CreateModelFromRepositoryImpl implements RepositoryAbstraction.Interface {\n public constructor(\n private readonly modelCache: ModelCache.Interface,\n private readonly pluginModelsProvider: PluginModelsProvider.Interface,\n private readonly modelsFetcher: ModelsFetcher.Interface,\n private readonly storageOperations: StorageOperations.Interface,\n private readonly tenantContext: TenantContext.Interface,\n private readonly cmsContext: CmsContext.Interface,\n private readonly modelFieldCompression: ModelFieldCompression.Interface,\n private readonly runtimeTenant: RuntimeTenant.Interface\n ) {}\n\n async execute(initialModel: CmsModel): Promise<Result<CmsModel, RepositoryAbstraction.Error>> {\n const model = this.runtimeTenant.assign(initialModel);\n try {\n const tenant = this.tenantContext.getTenant();\n\n // Generate modelId using the exact logic from beforeCreate.ts\n const modelId = getModelId(model);\n model.modelId = modelId;\n\n // Validate modelId is allowed (not in disallowed list)\n try {\n validateModelIdAllowed({ model });\n } catch (error) {\n return Result.fail(\n new ModelValidationError({ message: error.message, data: error.data })\n );\n }\n\n // Validate API name endings\n try {\n validateEndingAllowed({ model });\n } catch (error) {\n return Result.fail(\n new ModelValidationError({ message: error.message, data: error.data })\n );\n }\n\n // Validate modelId uniqueness (database)\n const modelsResult = await this.modelsFetcher.fetchAll();\n if (modelsResult.isFail()) {\n return Result.fail(new ModelPersistenceError(modelsResult.error));\n }\n\n const existingModel = modelsResult.value.find(m => m.modelId === modelId);\n if (existingModel) {\n return Result.fail(new ModelAlreadyExistsError({ modelId }));\n }\n\n // Check for plugin model conflicts\n const pluginModels = await this.pluginModelsProvider.list(tenant.id);\n const pluginModelConflict = pluginModels.find(pm => {\n return (\n pm.modelId === model.modelId ||\n pm.singularApiName === model.singularApiName ||\n pm.pluralApiName === model.pluralApiName\n );\n });\n\n if (pluginModelConflict) {\n return Result.fail(\n new ModelAlreadyExistsError({\n modelId,\n message: `Model \"${modelId}\" is already registered via a plugin.`\n })\n );\n }\n\n const models = modelsResult.value;\n\n try {\n // Validate uniqueness\n for (const existingModel of models) {\n validateExistingModelId({\n existingModel,\n model\n });\n validateSingularApiName({\n existingModel,\n model\n });\n validatePluralApiName({\n existingModel,\n model\n });\n }\n\n // Validate model fields\n await validateModelFields({\n models,\n model,\n context: this.cmsContext\n });\n } catch (error) {\n return Result.fail(\n new ModelValidationError({ message: error.message, data: error.data })\n );\n }\n\n // Ensure type tags\n model.tags = ensureTypeTag(model);\n\n const fields = await this.modelFieldCompression.compress(model.fields);\n\n // Persist to storage\n await this.storageOperations.models.create({\n model: {\n ...model,\n fields\n }\n });\n\n // Clear cache\n this.modelCache.clear();\n\n return Result.ok(model);\n } catch (error) {\n return Result.fail(new ModelPersistenceError(error as Error));\n }\n }\n}\n\nexport const CreateModelFromRepository = RepositoryAbstraction.createImplementation({\n implementation: CreateModelFromRepositoryImpl,\n dependencies: [\n ModelCache,\n PluginModelsProvider,\n ModelsFetcher,\n StorageOperations,\n TenantContext,\n CmsContext,\n ModelFieldCompression,\n RuntimeTenant\n ]\n});\n"],"names":["getModelId","model","modelId","name","value","isModelIdValid","camelCase","ModelValidationError","CreateModelFromRepositoryImpl","modelCache","pluginModelsProvider","modelsFetcher","storageOperations","tenantContext","cmsContext","modelFieldCompression","runtimeTenant","initialModel","tenant","validateModelIdAllowed","error","Result","validateEndingAllowed","modelsResult","ModelPersistenceError","existingModel","m","ModelAlreadyExistsError","pluginModels","pluginModelConflict","pm","models","validateExistingModelId","validateSingularApiName","validatePluralApiName","validateModelFields","ensureTypeTag","fields","CreateModelFromRepository","RepositoryAbstraction","ModelCache","PluginModelsProvider","ModelsFetcher","StorageOperations","TenantContext","CmsContext","ModelFieldCompression","RuntimeTenant"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"features/contentModel/CreateModelFrom/CreateModelFromRepository.js","sources":["../../../../src/features/contentModel/CreateModelFrom/CreateModelFromRepository.ts"],"sourcesContent":["import camelCase from \"lodash/camelCase.js\";\nimport { Result } from \"@webiny/feature/api\";\nimport { CreateModelFromRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport {\n ModelCache,\n ModelsFetcher,\n PluginModelsProvider\n} from \"~/features/contentModel/shared/abstractions.js\";\nimport {\n ModelAlreadyExistsError,\n ModelPersistenceError,\n ModelValidationError\n} from \"~/domain/contentModel/errors.js\";\nimport { CmsContext, StorageOperations } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport {\n validateExistingModelId,\n validateModelIdAllowed\n} from \"~/crud/contentModel/validate/modelId.js\";\nimport { validateEndingAllowed } from \"~/crud/contentModel/validate/endingAllowed.js\";\nimport { validateSingularApiName } from \"~/domain/contentModel/validation/singularApiName.js\";\nimport { validatePluralApiName } from \"~/domain/contentModel/validation/pluralApiName.js\";\nimport { validateModelFields } from \"~/domain/contentModel/validation/modelFields.js\";\nimport type { CmsModel } from \"~/types/index.js\";\nimport { ensureTypeTag } from \"~/domain/contentModel/ensureTypeTag.js\";\nimport { ModelFieldCompression } from \"~/features/contentModel/ModelFieldCompression/index.js\";\nimport { RuntimeTenant } from \"~/features/runtimeTenant/abstractions.js\";\n\n/**\n * Generate modelId from model following the exact logic from beforeCreate.ts\n */\nconst getModelId = (model: { modelId?: string; name?: string }): string => {\n const { modelId, name } = model;\n const value = modelId ? modelId.trim() : null;\n if (value) {\n const isModelIdValid = camelCase(value).toLowerCase() === value.toLowerCase();\n if (isModelIdValid) {\n return value;\n }\n return camelCase(value);\n } else if (name) {\n return camelCase(name.trim());\n }\n throw new ModelValidationError(\n `There is no \"modelId\" or \"name\" passed into the create model from method.`\n );\n};\n\n/**\n * CreateModelFromRepository - Validates domain rules and persists cloned model.\n *\n * Responsibilities:\n * - Generate modelId from input\n * - Validate modelId is allowed (not in disallowed list)\n * - Validate API name endings\n * - Validate modelId uniqueness (database + plugins)\n * - Validate API name uniqueness (database + plugins)\n * - Validate plugin conflicts\n * - Validate model fields\n * - Persist to storage\n * - Clear ModelCache after successful create\n */\nclass CreateModelFromRepositoryImpl implements RepositoryAbstraction.Interface {\n public constructor(\n private readonly modelCache: ModelCache.Interface,\n private readonly pluginModelsProvider: PluginModelsProvider.Interface,\n private readonly modelsFetcher: ModelsFetcher.Interface,\n private readonly storageOperations: StorageOperations.Interface,\n private readonly tenantContext: TenantContext.Interface,\n private readonly cmsContext: CmsContext.Interface,\n private readonly modelFieldCompression: ModelFieldCompression.Interface,\n private readonly runtimeTenant: RuntimeTenant.Interface\n ) {}\n\n async execute(initialModel: CmsModel): Promise<Result<CmsModel, RepositoryAbstraction.Error>> {\n const model = this.runtimeTenant.assign(initialModel);\n try {\n const tenant = this.tenantContext.getTenant();\n\n // Generate modelId using the exact logic from beforeCreate.ts\n const modelId = getModelId(model);\n model.modelId = modelId;\n\n // Validate modelId is allowed (not in disallowed list)\n try {\n validateModelIdAllowed({ model });\n } catch (error) {\n return Result.fail(\n new ModelValidationError({ message: error.message, data: error.data })\n );\n }\n\n // Validate API name endings\n try {\n validateEndingAllowed({ model });\n } catch (error) {\n return Result.fail(\n new ModelValidationError({ message: error.message, data: error.data })\n );\n }\n\n // Validate modelId uniqueness (database)\n const modelsResult = await this.modelsFetcher.fetchAll();\n if (modelsResult.isFail()) {\n return Result.fail(new ModelPersistenceError(modelsResult.error));\n }\n\n const existingModel = modelsResult.value.find(m => m.modelId === modelId);\n if (existingModel) {\n return Result.fail(new ModelAlreadyExistsError({ modelId }));\n }\n\n // Check for plugin model conflicts\n const pluginModels = await this.pluginModelsProvider.list(tenant.id);\n const pluginModelConflict = pluginModels.find(pm => {\n return (\n pm.modelId === model.modelId ||\n pm.singularApiName === model.singularApiName ||\n pm.pluralApiName === model.pluralApiName\n );\n });\n\n if (pluginModelConflict) {\n return Result.fail(\n new ModelAlreadyExistsError({\n modelId,\n message: `Model \"${modelId}\" is already registered via a plugin.`\n })\n );\n }\n\n const models = modelsResult.value;\n\n try {\n // Validate uniqueness\n for (const existingModel of models) {\n validateExistingModelId({\n existingModel,\n model\n });\n validateSingularApiName({\n existingModel,\n model\n });\n validatePluralApiName({\n existingModel,\n model\n });\n }\n\n // Validate model fields\n await validateModelFields({\n models,\n model,\n context: this.cmsContext\n });\n } catch (error) {\n return Result.fail(\n new ModelValidationError({ message: error.message, data: error.data })\n );\n }\n\n // Ensure type tags\n model.tags = ensureTypeTag(model);\n\n const fields = await this.modelFieldCompression.compress(model.fields);\n\n // Persist to storage\n await this.storageOperations.models.create({\n model: {\n ...model,\n fields\n }\n });\n\n // Clear cache\n this.modelCache.clear();\n\n return Result.ok(model);\n } catch (error) {\n return Result.fail(new ModelPersistenceError(error as Error));\n }\n }\n}\n\nexport const CreateModelFromRepository = RepositoryAbstraction.createImplementation({\n implementation: CreateModelFromRepositoryImpl,\n dependencies: [\n ModelCache,\n PluginModelsProvider,\n ModelsFetcher,\n StorageOperations,\n TenantContext,\n CmsContext,\n ModelFieldCompression,\n RuntimeTenant\n ]\n});\n"],"names":["getModelId","model","modelId","name","value","isModelIdValid","camelCase","ModelValidationError","CreateModelFromRepositoryImpl","modelCache","pluginModelsProvider","modelsFetcher","storageOperations","tenantContext","cmsContext","modelFieldCompression","runtimeTenant","initialModel","tenant","validateModelIdAllowed","error","Result","validateEndingAllowed","modelsResult","ModelPersistenceError","existingModel","m","ModelAlreadyExistsError","pluginModels","pluginModelConflict","pm","models","validateExistingModelId","validateSingularApiName","validatePluralApiName","validateModelFields","ensureTypeTag","fields","CreateModelFromRepository","RepositoryAbstraction","ModelCache","PluginModelsProvider","ModelsFetcher","StorageOperations","TenantContext","CmsContext","ModelFieldCompression","RuntimeTenant"],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ class CompressedTextStorageTransformImpl {
|
|
|
9
9
|
async fromStorage(params) {
|
|
10
10
|
const { value } = params;
|
|
11
11
|
if ("string" != typeof value) return value;
|
|
12
|
-
if (!value.includes("compression")) return value;
|
|
12
|
+
else if (!value.includes("compression")) return value;
|
|
13
13
|
try {
|
|
14
14
|
const parsed = JSON.parse(value);
|
|
15
15
|
return await this.compressionHandler.decompress(parsed);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/storage/fields/CompressedTextStorageTransform.js","sources":["../../../../src/features/storage/fields/CompressedTextStorageTransform.ts"],"sourcesContent":["import { StorageTransform } from \"../abstractions/StorageTransform.js\";\nimport { CompressionHandler } from \"@webiny/utils/exports/api.js\";\nimport { TextFieldTypes } from \"~/features/modelBuilder/index.js\";\n\nclass CompressedTextStorageTransformImpl implements StorageTransform.Interface<string, string> {\n public readonly fieldType = TextFieldTypes.COMPRESSED;\n\n public constructor(private readonly compressionHandler: CompressionHandler.Interface) {}\n\n public async fromStorage(\n params: StorageTransform.FromStorageParams<unknown, string>\n ): StorageTransform.FromStorageResponse<string> {\n const { value } = params;\n if (typeof value !== \"string\") {\n return value as string;\n } else if (!value.includes(\"compression\")) {\n return value;\n }\n try {\n const parsed = JSON.parse(value);\n return await this.compressionHandler.decompress<string>(parsed);\n } catch {\n return value;\n }\n }\n\n public async toStorage(\n params: StorageTransform.ToStorageParams<unknown, string>\n ): StorageTransform.ToStorageResponse<string> {\n const { value } = params;\n if (typeof value !== \"string\") {\n return value as string;\n }\n\n try {\n return JSON.stringify(await this.compressionHandler.compress(value));\n } catch {\n return value;\n }\n }\n}\n\nexport const CompressedTextStorageTransform = StorageTransform.createImplementation({\n implementation: CompressedTextStorageTransformImpl,\n dependencies: [CompressionHandler]\n});\n"],"names":["CompressedTextStorageTransformImpl","compressionHandler","TextFieldTypes","params","value","parsed","JSON","CompressedTextStorageTransform","StorageTransform","CompressionHandler"],"mappings":";;;AAIA,MAAMA;IAGF,YAAoCC,kBAAgD,CAAE;aAAlDA,kBAAkB,GAAlBA;aAFpB,SAAS,GAAGC,eAAe,UAAU;IAEkC;IAEvF,MAAa,YACTC,MAA2D,EACf;QAC5C,MAAM,EAAEC,KAAK,EAAE,GAAGD;QAClB,IAAI,AAAiB,YAAjB,OAAOC,OACP,OAAOA;
|
|
1
|
+
{"version":3,"file":"features/storage/fields/CompressedTextStorageTransform.js","sources":["../../../../src/features/storage/fields/CompressedTextStorageTransform.ts"],"sourcesContent":["import { StorageTransform } from \"../abstractions/StorageTransform.js\";\nimport { CompressionHandler } from \"@webiny/utils/exports/api.js\";\nimport { TextFieldTypes } from \"~/features/modelBuilder/index.js\";\n\nclass CompressedTextStorageTransformImpl implements StorageTransform.Interface<string, string> {\n public readonly fieldType = TextFieldTypes.COMPRESSED;\n\n public constructor(private readonly compressionHandler: CompressionHandler.Interface) {}\n\n public async fromStorage(\n params: StorageTransform.FromStorageParams<unknown, string>\n ): StorageTransform.FromStorageResponse<string> {\n const { value } = params;\n if (typeof value !== \"string\") {\n return value as string;\n } else if (!value.includes(\"compression\")) {\n return value;\n }\n try {\n const parsed = JSON.parse(value);\n return await this.compressionHandler.decompress<string>(parsed);\n } catch {\n return value;\n }\n }\n\n public async toStorage(\n params: StorageTransform.ToStorageParams<unknown, string>\n ): StorageTransform.ToStorageResponse<string> {\n const { value } = params;\n if (typeof value !== \"string\") {\n return value as string;\n }\n\n try {\n return JSON.stringify(await this.compressionHandler.compress(value));\n } catch {\n return value;\n }\n }\n}\n\nexport const CompressedTextStorageTransform = StorageTransform.createImplementation({\n implementation: CompressedTextStorageTransformImpl,\n dependencies: [CompressionHandler]\n});\n"],"names":["CompressedTextStorageTransformImpl","compressionHandler","TextFieldTypes","params","value","parsed","JSON","CompressedTextStorageTransform","StorageTransform","CompressionHandler"],"mappings":";;;AAIA,MAAMA;IAGF,YAAoCC,kBAAgD,CAAE;aAAlDA,kBAAkB,GAAlBA;aAFpB,SAAS,GAAGC,eAAe,UAAU;IAEkC;IAEvF,MAAa,YACTC,MAA2D,EACf;QAC5C,MAAM,EAAEC,KAAK,EAAE,GAAGD;QAClB,IAAI,AAAiB,YAAjB,OAAOC,OACP,OAAOA;aACJ,IAAI,CAACA,MAAM,QAAQ,CAAC,gBACvB,OAAOA;QAEX,IAAI;YACA,MAAMC,SAASC,KAAK,KAAK,CAACF;YAC1B,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAASC;QAC5D,EAAE,OAAM;YACJ,OAAOD;QACX;IACJ;IAEA,MAAa,UACTD,MAAyD,EACf;QAC1C,MAAM,EAAEC,KAAK,EAAE,GAAGD;QAClB,IAAI,AAAiB,YAAjB,OAAOC,OACP,OAAOA;QAGX,IAAI;YACA,OAAOE,KAAK,SAAS,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAACF;QACjE,EAAE,OAAM;YACJ,OAAOA;QACX;IACJ;AACJ;AAEO,MAAMG,iCAAiCC,iBAAiB,oBAAoB,CAAC;IAChF,gBAAgBR;IAChB,cAAc;QAACS;KAAmB;AACtC"}
|
|
@@ -22,7 +22,7 @@ const convertFromStorage = (value)=>{
|
|
|
22
22
|
};
|
|
23
23
|
const convertValueToStorage = (field, value)=>{
|
|
24
24
|
if (value instanceof Date || value?.toISOString) return value.toISOString();
|
|
25
|
-
if ("string" == typeof value) return value;
|
|
25
|
+
else if ("string" == typeof value) return value;
|
|
26
26
|
throw new error("Error converting value to a storage type.", "TO_STORAGE_ERROR", {
|
|
27
27
|
value: value,
|
|
28
28
|
fieldId: field.fieldId,
|
|
@@ -50,7 +50,7 @@ class DateStorageTransformImpl {
|
|
|
50
50
|
const { value, field } = params;
|
|
51
51
|
const { type } = field.settings || {};
|
|
52
52
|
if (!value || !type || excludeTypes.includes(type)) return value;
|
|
53
|
-
if (field.list) {
|
|
53
|
+
else if (field.list) {
|
|
54
54
|
if (!Array.isArray(value)) return [];
|
|
55
55
|
const list = value;
|
|
56
56
|
const results = [];
|
|
@@ -59,8 +59,7 @@ class DateStorageTransformImpl {
|
|
|
59
59
|
if (isNaN(input.getTime())) continue;
|
|
60
60
|
results.push(input);
|
|
61
61
|
continue;
|
|
62
|
-
}
|
|
63
|
-
if (!input || "object" == typeof input && 0 === Object.keys(input).length) continue;
|
|
62
|
+
} else if (!input || "object" == typeof input && 0 === Object.keys(input).length) continue;
|
|
64
63
|
const output = convertFromStorage(input);
|
|
65
64
|
if (output) results.push(output);
|
|
66
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/storage/fields/DateStorageTransform.js","sources":["../../../../src/features/storage/fields/DateStorageTransform.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type { CmsModelField } from \"~/types/index.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { StorageTransform } from \"../abstractions/StorageTransform.js\";\n\nconst excludeTypes = [\"time\", \"dateTimeWithTimezone\"];\n\nconst convertFromStorage = (value: unknown): Date | unknown => {\n if (!value) {\n return value === null ? null : undefined;\n }\n try {\n const output = new Date(value as string);\n if (isNaN(output.getTime())) {\n if (process.env.DEBUG !== \"true\") {\n return null;\n }\n console.warn(`Could not transform \"${value}\" to date.`);\n return null;\n }\n return output;\n } catch {\n if (process.env.DEBUG !== \"true\") {\n return null;\n }\n console.warn(`Could not transform \"${value}\" from storage for date field type.`);\n return null;\n }\n};\n\nconst convertValueToStorage = (field: CmsModelField, value: Date | string | unknown): string => {\n if (value instanceof Date || (value as GenericRecord)?.toISOString) {\n return (value as Date).toISOString();\n } else if (typeof value === \"string\") {\n return value as string;\n }\n throw new WebinyError(\"Error converting value to a storage type.\", \"TO_STORAGE_ERROR\", {\n value: value,\n fieldId: field.fieldId,\n storageId: field.storageId\n });\n};\n\nclass DateStorageTransformImpl implements StorageTransform.Interface {\n public readonly fieldType = \"datetime\";\n\n public async toStorage(\n params: StorageTransform.ToStorageParams\n ): StorageTransform.ToStorageResponse {\n const { value, field } = params;\n const { type } = field.settings || {};\n if (!value || !type || excludeTypes.includes(type)) {\n return value;\n }\n if (field.list) {\n const list = value as (string | Date | null | undefined)[];\n const results: string[] = [];\n for (const input of list) {\n if (!input) {\n continue;\n }\n const output = convertValueToStorage(field, input);\n if (!output) {\n continue;\n }\n results.push(output);\n }\n return results;\n }\n return convertValueToStorage(field, value);\n }\n\n public async fromStorage(\n params: StorageTransform.FromStorageParams\n ): StorageTransform.FromStorageResponse {\n const { value, field } = params;\n const { type } = field.settings || {};\n if (!value || !type || excludeTypes.includes(type)) {\n return value;\n } else if (field.list) {\n if (!Array.isArray(value)) {\n return [];\n }\n const list = value as unknown[];\n const results: (Date | unknown)[] = [];\n for (const input of list) {\n if (input instanceof Date) {\n if (isNaN(input.getTime())) {\n continue;\n }\n results.push(input);\n continue;\n } else if (\n !input ||\n (typeof input === \"object\" && Object.keys(input).length === 0)\n ) {\n continue;\n }\n const output = convertFromStorage(input);\n if (!output) {\n continue;\n }\n results.push(output);\n }\n return results;\n }\n return convertFromStorage(value);\n }\n}\n\nexport const DateStorageTransform = StorageTransform.createImplementation({\n implementation: DateStorageTransformImpl,\n dependencies: []\n});\n"],"names":["excludeTypes","convertFromStorage","value","undefined","output","Date","isNaN","process","console","convertValueToStorage","field","WebinyError","DateStorageTransformImpl","params","type","list","results","input","Array","Object","DateStorageTransform","StorageTransform"],"mappings":";;AAKA,MAAMA,eAAe;IAAC;IAAQ;CAAuB;AAErD,MAAMC,qBAAqB,CAACC;IACxB,IAAI,CAACA,OACD,OAAOA,AAAU,SAAVA,QAAiB,OAAOC;IAEnC,IAAI;QACA,MAAMC,SAAS,IAAIC,KAAKH;QACxB,IAAII,MAAMF,OAAO,OAAO,KAAK;YACzB,IAAIG,AAAsB,WAAtBA,QAAQ,GAAG,CAAC,KAAK,EACjB,OAAO;YAEXC,QAAQ,IAAI,CAAC,CAAC,qBAAqB,EAAEN,MAAM,UAAU,CAAC;YACtD,OAAO;QACX;QACA,OAAOE;IACX,EAAE,OAAM;QACJ,IAAIG,AAAsB,WAAtBA,QAAQ,GAAG,CAAC,KAAK,EACjB,OAAO;QAEXC,QAAQ,IAAI,CAAC,CAAC,qBAAqB,EAAEN,MAAM,mCAAmC,CAAC;QAC/E,OAAO;IACX;AACJ;AAEA,MAAMO,wBAAwB,CAACC,OAAsBR;IACjD,IAAIA,iBAAiBG,QAASH,OAAyB,aACnD,OAAQA,MAAe,WAAW;
|
|
1
|
+
{"version":3,"file":"features/storage/fields/DateStorageTransform.js","sources":["../../../../src/features/storage/fields/DateStorageTransform.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type { CmsModelField } from \"~/types/index.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { StorageTransform } from \"../abstractions/StorageTransform.js\";\n\nconst excludeTypes = [\"time\", \"dateTimeWithTimezone\"];\n\nconst convertFromStorage = (value: unknown): Date | unknown => {\n if (!value) {\n return value === null ? null : undefined;\n }\n try {\n const output = new Date(value as string);\n if (isNaN(output.getTime())) {\n if (process.env.DEBUG !== \"true\") {\n return null;\n }\n console.warn(`Could not transform \"${value}\" to date.`);\n return null;\n }\n return output;\n } catch {\n if (process.env.DEBUG !== \"true\") {\n return null;\n }\n console.warn(`Could not transform \"${value}\" from storage for date field type.`);\n return null;\n }\n};\n\nconst convertValueToStorage = (field: CmsModelField, value: Date | string | unknown): string => {\n if (value instanceof Date || (value as GenericRecord)?.toISOString) {\n return (value as Date).toISOString();\n } else if (typeof value === \"string\") {\n return value as string;\n }\n throw new WebinyError(\"Error converting value to a storage type.\", \"TO_STORAGE_ERROR\", {\n value: value,\n fieldId: field.fieldId,\n storageId: field.storageId\n });\n};\n\nclass DateStorageTransformImpl implements StorageTransform.Interface {\n public readonly fieldType = \"datetime\";\n\n public async toStorage(\n params: StorageTransform.ToStorageParams\n ): StorageTransform.ToStorageResponse {\n const { value, field } = params;\n const { type } = field.settings || {};\n if (!value || !type || excludeTypes.includes(type)) {\n return value;\n }\n if (field.list) {\n const list = value as (string | Date | null | undefined)[];\n const results: string[] = [];\n for (const input of list) {\n if (!input) {\n continue;\n }\n const output = convertValueToStorage(field, input);\n if (!output) {\n continue;\n }\n results.push(output);\n }\n return results;\n }\n return convertValueToStorage(field, value);\n }\n\n public async fromStorage(\n params: StorageTransform.FromStorageParams\n ): StorageTransform.FromStorageResponse {\n const { value, field } = params;\n const { type } = field.settings || {};\n if (!value || !type || excludeTypes.includes(type)) {\n return value;\n } else if (field.list) {\n if (!Array.isArray(value)) {\n return [];\n }\n const list = value as unknown[];\n const results: (Date | unknown)[] = [];\n for (const input of list) {\n if (input instanceof Date) {\n if (isNaN(input.getTime())) {\n continue;\n }\n results.push(input);\n continue;\n } else if (\n !input ||\n (typeof input === \"object\" && Object.keys(input).length === 0)\n ) {\n continue;\n }\n const output = convertFromStorage(input);\n if (!output) {\n continue;\n }\n results.push(output);\n }\n return results;\n }\n return convertFromStorage(value);\n }\n}\n\nexport const DateStorageTransform = StorageTransform.createImplementation({\n implementation: DateStorageTransformImpl,\n dependencies: []\n});\n"],"names":["excludeTypes","convertFromStorage","value","undefined","output","Date","isNaN","process","console","convertValueToStorage","field","WebinyError","DateStorageTransformImpl","params","type","list","results","input","Array","Object","DateStorageTransform","StorageTransform"],"mappings":";;AAKA,MAAMA,eAAe;IAAC;IAAQ;CAAuB;AAErD,MAAMC,qBAAqB,CAACC;IACxB,IAAI,CAACA,OACD,OAAOA,AAAU,SAAVA,QAAiB,OAAOC;IAEnC,IAAI;QACA,MAAMC,SAAS,IAAIC,KAAKH;QACxB,IAAII,MAAMF,OAAO,OAAO,KAAK;YACzB,IAAIG,AAAsB,WAAtBA,QAAQ,GAAG,CAAC,KAAK,EACjB,OAAO;YAEXC,QAAQ,IAAI,CAAC,CAAC,qBAAqB,EAAEN,MAAM,UAAU,CAAC;YACtD,OAAO;QACX;QACA,OAAOE;IACX,EAAE,OAAM;QACJ,IAAIG,AAAsB,WAAtBA,QAAQ,GAAG,CAAC,KAAK,EACjB,OAAO;QAEXC,QAAQ,IAAI,CAAC,CAAC,qBAAqB,EAAEN,MAAM,mCAAmC,CAAC;QAC/E,OAAO;IACX;AACJ;AAEA,MAAMO,wBAAwB,CAACC,OAAsBR;IACjD,IAAIA,iBAAiBG,QAASH,OAAyB,aACnD,OAAQA,MAAe,WAAW;SAC/B,IAAI,AAAiB,YAAjB,OAAOA,OACd,OAAOA;IAEX,MAAM,IAAIS,MAAY,6CAA6C,oBAAoB;QACnF,OAAOT;QACP,SAASQ,MAAM,OAAO;QACtB,WAAWA,MAAM,SAAS;IAC9B;AACJ;AAEA,MAAME;IAGF,MAAa,UACTC,MAAwC,EACN;QAClC,MAAM,EAAEX,KAAK,EAAEQ,KAAK,EAAE,GAAGG;QACzB,MAAM,EAAEC,IAAI,EAAE,GAAGJ,MAAM,QAAQ,IAAI,CAAC;QACpC,IAAI,CAACR,SAAS,CAACY,QAAQd,aAAa,QAAQ,CAACc,OACzC,OAAOZ;QAEX,IAAIQ,MAAM,IAAI,EAAE;YACZ,MAAMK,OAAOb;YACb,MAAMc,UAAoB,EAAE;YAC5B,KAAK,MAAMC,SAASF,KAAM;gBACtB,IAAI,CAACE,OACD;gBAEJ,MAAMb,SAASK,sBAAsBC,OAAOO;gBAC5C,IAAKb,QAGLY,QAAQ,IAAI,CAACZ;YACjB;YACA,OAAOY;QACX;QACA,OAAOP,sBAAsBC,OAAOR;IACxC;IAEA,MAAa,YACTW,MAA0C,EACN;QACpC,MAAM,EAAEX,KAAK,EAAEQ,KAAK,EAAE,GAAGG;QACzB,MAAM,EAAEC,IAAI,EAAE,GAAGJ,MAAM,QAAQ,IAAI,CAAC;QACpC,IAAI,CAACR,SAAS,CAACY,QAAQd,aAAa,QAAQ,CAACc,OACzC,OAAOZ;aACJ,IAAIQ,MAAM,IAAI,EAAE;YACnB,IAAI,CAACQ,MAAM,OAAO,CAAChB,QACf,OAAO,EAAE;YAEb,MAAMa,OAAOb;YACb,MAAMc,UAA8B,EAAE;YACtC,KAAK,MAAMC,SAASF,KAAM;gBACtB,IAAIE,iBAAiBZ,MAAM;oBACvB,IAAIC,MAAMW,MAAM,OAAO,KACnB;oBAEJD,QAAQ,IAAI,CAACC;oBACb;gBACJ,OAAO,IACH,CAACA,SACA,AAAiB,YAAjB,OAAOA,SAAsBE,AAA8B,MAA9BA,OAAO,IAAI,CAACF,OAAO,MAAM,EAEvD;gBAEJ,MAAMb,SAASH,mBAAmBgB;gBAClC,IAAKb,QAGLY,QAAQ,IAAI,CAACZ;YACjB;YACA,OAAOY;QACX;QACA,OAAOf,mBAAmBC;IAC9B;;aA/DgB,SAAS,GAAG;;AAgEhC;AAEO,MAAMkB,uBAAuBC,iBAAiB,oBAAoB,CAAC;IACtE,gBAAgBT;IAChB,cAAc,EAAE;AACpB"}
|
|
@@ -55,7 +55,7 @@ class DynamicZoneStorageTransformImpl {
|
|
|
55
55
|
async toStorage(params) {
|
|
56
56
|
const { value: input, field, model, getStorageTransform } = params;
|
|
57
57
|
if (!input) return input;
|
|
58
|
-
if (field.list) {
|
|
58
|
+
else if (field.list) {
|
|
59
59
|
if (!Array.isArray(input)) return input;
|
|
60
60
|
const values = input;
|
|
61
61
|
return Promise.all(values.map(async (value)=>await processToStorage({
|
|
@@ -75,7 +75,7 @@ class DynamicZoneStorageTransformImpl {
|
|
|
75
75
|
async fromStorage(params) {
|
|
76
76
|
const { value: input, field, model, getStorageTransform } = params;
|
|
77
77
|
if (!input) return input;
|
|
78
|
-
if (field.list) {
|
|
78
|
+
else if (field.list) {
|
|
79
79
|
if (!Array.isArray(input)) return input;
|
|
80
80
|
const values = input;
|
|
81
81
|
return await Promise.all(values.map(async (value)=>await processFromStorage({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/storage/fields/DynamicZoneStorageTransform.js","sources":["../../../../src/features/storage/fields/DynamicZoneStorageTransform.ts"],"sourcesContent":["import { StorageTransform } from \"../abstractions/StorageTransform.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport type { CmsModel, CmsModelDynamicZoneField } from \"~/types/index.js\";\nimport pReduce from \"p-reduce\";\n\ninterface IProcessParams {\n model: CmsModel;\n field: CmsModelDynamicZoneField;\n value: GenericRecord;\n getStorageTransform: (fieldType: string) => StorageTransform.Interface;\n}\n\nconst processToStorage = async (params: IProcessParams): Promise<GenericRecord> => {\n const { model, field: parentField, value: input, getStorageTransform } = params;\n\n const output: GenericRecord = structuredClone(input);\n\n if (!output._templateId) {\n return output;\n }\n const template = parentField.settings.templates.find(t => t.id === output._templateId);\n if (!template || !template.fields.length) {\n return output;\n }\n\n return await pReduce(\n template.fields,\n async (values, field) => {\n const value = values[field.fieldId];\n\n if (!value) {\n values[field.fieldId] = value;\n return values;\n }\n const storageTransform = getStorageTransform(field.type);\n if (!storageTransform) {\n console.error(`Missing storage transform for field type \"${field.type}\".`);\n delete values[field.fieldId];\n return values;\n }\n values[field.fieldId] = await storageTransform.toStorage({\n getStorageTransform,\n model,\n field,\n value\n });\n\n return values;\n },\n output\n );\n};\n\nconst processFromStorage = async (params: IProcessParams): Promise<GenericRecord> => {\n const { model, field: parentField, value: input, getStorageTransform } = params;\n\n const output: GenericRecord = structuredClone(input);\n\n if (!output._templateId) {\n return output;\n }\n const template = parentField.settings.templates.find(t => t.id === output._templateId);\n if (!template || !template.fields.length) {\n return output;\n }\n\n return await pReduce(\n template.fields,\n async (values, field) => {\n const value = values[field.fieldId];\n\n if (!value) {\n return values;\n }\n const storageTransform = getStorageTransform(field.type);\n if (!storageTransform) {\n console.error(`Missing storage transform for field type \"${field.type}\".`);\n delete values[field.fieldId];\n return values;\n }\n values[field.fieldId] = await storageTransform.fromStorage({\n getStorageTransform,\n model,\n field,\n value\n });\n\n return values;\n },\n output\n );\n};\n\nclass DynamicZoneStorageTransformImpl implements StorageTransform.Interface {\n public readonly fieldType = \"dynamicZone\";\n\n public async toStorage(\n params: StorageTransform.ToStorageParams\n ): StorageTransform.ToStorageResponse {\n const { value: input, field, model, getStorageTransform } = params;\n if (!input) {\n return input;\n } else if (field.list) {\n if (!Array.isArray(input)) {\n return input;\n }\n const values = input as GenericRecord[];\n return Promise.all(\n values.map(async value => {\n return await processToStorage({\n model,\n field: field as CmsModelDynamicZoneField,\n value,\n getStorageTransform\n });\n })\n );\n }\n return await processToStorage({\n model,\n field: field as CmsModelDynamicZoneField,\n value: input,\n getStorageTransform\n });\n }\n\n public async fromStorage(\n params: StorageTransform.FromStorageParams\n ): StorageTransform.FromStorageResponse {\n const { value: input, field, model, getStorageTransform } = params;\n if (!input) {\n return input;\n } else if (field.list) {\n if (!Array.isArray(input)) {\n return input;\n }\n const values = input as GenericRecord[];\n\n return await Promise.all(\n values.map(async value => {\n return await processFromStorage({\n model,\n field: field as CmsModelDynamicZoneField,\n value,\n getStorageTransform\n });\n })\n );\n }\n return await processFromStorage({\n model,\n field: field as CmsModelDynamicZoneField,\n value: input,\n getStorageTransform\n });\n }\n}\n\nexport const DynamicZoneStorageTransform = StorageTransform.createImplementation({\n implementation: DynamicZoneStorageTransformImpl,\n dependencies: []\n});\n"],"names":["processToStorage","params","model","parentField","input","getStorageTransform","output","structuredClone","template","t","pReduce","values","field","value","storageTransform","console","processFromStorage","DynamicZoneStorageTransformImpl","Array","Promise","DynamicZoneStorageTransform","StorageTransform"],"mappings":";;AAYA,MAAMA,mBAAmB,OAAOC;IAC5B,MAAM,EAAEC,KAAK,EAAE,OAAOC,WAAW,EAAE,OAAOC,KAAK,EAAEC,mBAAmB,EAAE,GAAGJ;IAEzE,MAAMK,SAAwBC,gBAAgBH;IAE9C,IAAI,CAACE,OAAO,WAAW,EACnB,OAAOA;IAEX,MAAME,WAAWL,YAAY,QAAQ,CAAC,SAAS,CAAC,IAAI,CAACM,CAAAA,IAAKA,EAAE,EAAE,KAAKH,OAAO,WAAW;IACrF,IAAI,CAACE,YAAY,CAACA,SAAS,MAAM,CAAC,MAAM,EACpC,OAAOF;IAGX,OAAO,MAAMI,SACTF,SAAS,MAAM,EACf,OAAOG,QAAQC;QACX,MAAMC,QAAQF,MAAM,CAACC,MAAM,OAAO,CAAC;QAEnC,IAAI,CAACC,OAAO;YACRF,MAAM,CAACC,MAAM,OAAO,CAAC,GAAGC;YACxB,OAAOF;QACX;QACA,MAAMG,mBAAmBT,oBAAoBO,MAAM,IAAI;QACvD,IAAI,CAACE,kBAAkB;YACnBC,QAAQ,KAAK,CAAC,CAAC,0CAA0C,EAAEH,MAAM,IAAI,CAAC,EAAE,CAAC;YACzE,OAAOD,MAAM,CAACC,MAAM,OAAO,CAAC;YAC5B,OAAOD;QACX;QACAA,MAAM,CAACC,MAAM,OAAO,CAAC,GAAG,MAAME,iBAAiB,SAAS,CAAC;YACrDT;YACAH;YACAU;YACAC;QACJ;QAEA,OAAOF;IACX,GACAL;AAER;AAEA,MAAMU,qBAAqB,OAAOf;IAC9B,MAAM,EAAEC,KAAK,EAAE,OAAOC,WAAW,EAAE,OAAOC,KAAK,EAAEC,mBAAmB,EAAE,GAAGJ;IAEzE,MAAMK,SAAwBC,gBAAgBH;IAE9C,IAAI,CAACE,OAAO,WAAW,EACnB,OAAOA;IAEX,MAAME,WAAWL,YAAY,QAAQ,CAAC,SAAS,CAAC,IAAI,CAACM,CAAAA,IAAKA,EAAE,EAAE,KAAKH,OAAO,WAAW;IACrF,IAAI,CAACE,YAAY,CAACA,SAAS,MAAM,CAAC,MAAM,EACpC,OAAOF;IAGX,OAAO,MAAMI,SACTF,SAAS,MAAM,EACf,OAAOG,QAAQC;QACX,MAAMC,QAAQF,MAAM,CAACC,MAAM,OAAO,CAAC;QAEnC,IAAI,CAACC,OACD,OAAOF;QAEX,MAAMG,mBAAmBT,oBAAoBO,MAAM,IAAI;QACvD,IAAI,CAACE,kBAAkB;YACnBC,QAAQ,KAAK,CAAC,CAAC,0CAA0C,EAAEH,MAAM,IAAI,CAAC,EAAE,CAAC;YACzE,OAAOD,MAAM,CAACC,MAAM,OAAO,CAAC;YAC5B,OAAOD;QACX;QACAA,MAAM,CAACC,MAAM,OAAO,CAAC,GAAG,MAAME,iBAAiB,WAAW,CAAC;YACvDT;YACAH;YACAU;YACAC;QACJ;QAEA,OAAOF;IACX,GACAL;AAER;AAEA,MAAMW;IAGF,MAAa,UACThB,MAAwC,EACN;QAClC,MAAM,EAAE,OAAOG,KAAK,EAAEQ,KAAK,EAAEV,KAAK,EAAEG,mBAAmB,EAAE,GAAGJ;QAC5D,IAAI,CAACG,OACD,OAAOA;
|
|
1
|
+
{"version":3,"file":"features/storage/fields/DynamicZoneStorageTransform.js","sources":["../../../../src/features/storage/fields/DynamicZoneStorageTransform.ts"],"sourcesContent":["import { StorageTransform } from \"../abstractions/StorageTransform.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport type { CmsModel, CmsModelDynamicZoneField } from \"~/types/index.js\";\nimport pReduce from \"p-reduce\";\n\ninterface IProcessParams {\n model: CmsModel;\n field: CmsModelDynamicZoneField;\n value: GenericRecord;\n getStorageTransform: (fieldType: string) => StorageTransform.Interface;\n}\n\nconst processToStorage = async (params: IProcessParams): Promise<GenericRecord> => {\n const { model, field: parentField, value: input, getStorageTransform } = params;\n\n const output: GenericRecord = structuredClone(input);\n\n if (!output._templateId) {\n return output;\n }\n const template = parentField.settings.templates.find(t => t.id === output._templateId);\n if (!template || !template.fields.length) {\n return output;\n }\n\n return await pReduce(\n template.fields,\n async (values, field) => {\n const value = values[field.fieldId];\n\n if (!value) {\n values[field.fieldId] = value;\n return values;\n }\n const storageTransform = getStorageTransform(field.type);\n if (!storageTransform) {\n console.error(`Missing storage transform for field type \"${field.type}\".`);\n delete values[field.fieldId];\n return values;\n }\n values[field.fieldId] = await storageTransform.toStorage({\n getStorageTransform,\n model,\n field,\n value\n });\n\n return values;\n },\n output\n );\n};\n\nconst processFromStorage = async (params: IProcessParams): Promise<GenericRecord> => {\n const { model, field: parentField, value: input, getStorageTransform } = params;\n\n const output: GenericRecord = structuredClone(input);\n\n if (!output._templateId) {\n return output;\n }\n const template = parentField.settings.templates.find(t => t.id === output._templateId);\n if (!template || !template.fields.length) {\n return output;\n }\n\n return await pReduce(\n template.fields,\n async (values, field) => {\n const value = values[field.fieldId];\n\n if (!value) {\n return values;\n }\n const storageTransform = getStorageTransform(field.type);\n if (!storageTransform) {\n console.error(`Missing storage transform for field type \"${field.type}\".`);\n delete values[field.fieldId];\n return values;\n }\n values[field.fieldId] = await storageTransform.fromStorage({\n getStorageTransform,\n model,\n field,\n value\n });\n\n return values;\n },\n output\n );\n};\n\nclass DynamicZoneStorageTransformImpl implements StorageTransform.Interface {\n public readonly fieldType = \"dynamicZone\";\n\n public async toStorage(\n params: StorageTransform.ToStorageParams\n ): StorageTransform.ToStorageResponse {\n const { value: input, field, model, getStorageTransform } = params;\n if (!input) {\n return input;\n } else if (field.list) {\n if (!Array.isArray(input)) {\n return input;\n }\n const values = input as GenericRecord[];\n return Promise.all(\n values.map(async value => {\n return await processToStorage({\n model,\n field: field as CmsModelDynamicZoneField,\n value,\n getStorageTransform\n });\n })\n );\n }\n return await processToStorage({\n model,\n field: field as CmsModelDynamicZoneField,\n value: input,\n getStorageTransform\n });\n }\n\n public async fromStorage(\n params: StorageTransform.FromStorageParams\n ): StorageTransform.FromStorageResponse {\n const { value: input, field, model, getStorageTransform } = params;\n if (!input) {\n return input;\n } else if (field.list) {\n if (!Array.isArray(input)) {\n return input;\n }\n const values = input as GenericRecord[];\n\n return await Promise.all(\n values.map(async value => {\n return await processFromStorage({\n model,\n field: field as CmsModelDynamicZoneField,\n value,\n getStorageTransform\n });\n })\n );\n }\n return await processFromStorage({\n model,\n field: field as CmsModelDynamicZoneField,\n value: input,\n getStorageTransform\n });\n }\n}\n\nexport const DynamicZoneStorageTransform = StorageTransform.createImplementation({\n implementation: DynamicZoneStorageTransformImpl,\n dependencies: []\n});\n"],"names":["processToStorage","params","model","parentField","input","getStorageTransform","output","structuredClone","template","t","pReduce","values","field","value","storageTransform","console","processFromStorage","DynamicZoneStorageTransformImpl","Array","Promise","DynamicZoneStorageTransform","StorageTransform"],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ class JsonStorageTransformImpl {
|
|
|
8
8
|
}
|
|
9
9
|
async fromStorage({ field, value }) {
|
|
10
10
|
if (!value) return value;
|
|
11
|
-
if ("object" != typeof value) throw new WebinyError(`JSON value received in "fromStorage" function is not an object in field "${field.storageId}" - ${field.fieldId}.`);
|
|
11
|
+
else if ("object" != typeof value) throw new WebinyError(`JSON value received in "fromStorage" function is not an object in field "${field.storageId}" - ${field.fieldId}.`);
|
|
12
12
|
return await this.compressorHandler.decompress(value);
|
|
13
13
|
}
|
|
14
14
|
async toStorage({ value }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/storage/fields/JsonStorageTransform.js","sources":["../../../../src/features/storage/fields/JsonStorageTransform.ts"],"sourcesContent":["import { StorageTransform } from \"../abstractions/StorageTransform.js\";\nimport { WebinyError } from \"@webiny/error\";\nimport { CompressionHandler } from \"@webiny/utils/exports/api.js\";\n\nclass JsonStorageTransformImpl implements StorageTransform.Interface {\n public fieldType = \"json\";\n\n public constructor(private readonly compressorHandler: CompressionHandler.Interface) {}\n\n public async fromStorage({\n field,\n value\n }: StorageTransform.FromStorageParams): StorageTransform.FromStorageResponse {\n if (!value) {\n return value;\n } else if (typeof value !== \"object\") {\n throw new WebinyError(\n `JSON value received in \"fromStorage\" function is not an object in field \"${field.storageId}\" - ${field.fieldId}.`\n );\n }\n\n return await this.compressorHandler.decompress(value);\n }\n\n public async toStorage({\n value\n }: StorageTransform.ToStorageParams): StorageTransform.ToStorageResponse {\n return await this.compressorHandler.compress(value);\n }\n}\n\nexport const JsonStorageTransform = StorageTransform.createImplementation({\n implementation: JsonStorageTransformImpl,\n dependencies: [CompressionHandler]\n});\n"],"names":["JsonStorageTransformImpl","compressorHandler","field","value","WebinyError","JsonStorageTransform","StorageTransform","CompressionHandler"],"mappings":";;;AAIA,MAAMA;IAGF,YAAoCC,iBAA+C,CAAE;aAAjDA,iBAAiB,GAAjBA;aAF7B,SAAS,GAAG;IAEmE;IAEtF,MAAa,YAAY,EACrBC,KAAK,EACLC,KAAK,EAC4B,EAAwC;QACzE,IAAI,CAACA,OACD,OAAOA;
|
|
1
|
+
{"version":3,"file":"features/storage/fields/JsonStorageTransform.js","sources":["../../../../src/features/storage/fields/JsonStorageTransform.ts"],"sourcesContent":["import { StorageTransform } from \"../abstractions/StorageTransform.js\";\nimport { WebinyError } from \"@webiny/error\";\nimport { CompressionHandler } from \"@webiny/utils/exports/api.js\";\n\nclass JsonStorageTransformImpl implements StorageTransform.Interface {\n public fieldType = \"json\";\n\n public constructor(private readonly compressorHandler: CompressionHandler.Interface) {}\n\n public async fromStorage({\n field,\n value\n }: StorageTransform.FromStorageParams): StorageTransform.FromStorageResponse {\n if (!value) {\n return value;\n } else if (typeof value !== \"object\") {\n throw new WebinyError(\n `JSON value received in \"fromStorage\" function is not an object in field \"${field.storageId}\" - ${field.fieldId}.`\n );\n }\n\n return await this.compressorHandler.decompress(value);\n }\n\n public async toStorage({\n value\n }: StorageTransform.ToStorageParams): StorageTransform.ToStorageResponse {\n return await this.compressorHandler.compress(value);\n }\n}\n\nexport const JsonStorageTransform = StorageTransform.createImplementation({\n implementation: JsonStorageTransformImpl,\n dependencies: [CompressionHandler]\n});\n"],"names":["JsonStorageTransformImpl","compressorHandler","field","value","WebinyError","JsonStorageTransform","StorageTransform","CompressionHandler"],"mappings":";;;AAIA,MAAMA;IAGF,YAAoCC,iBAA+C,CAAE;aAAjDA,iBAAiB,GAAjBA;aAF7B,SAAS,GAAG;IAEmE;IAEtF,MAAa,YAAY,EACrBC,KAAK,EACLC,KAAK,EAC4B,EAAwC;QACzE,IAAI,CAACA,OACD,OAAOA;aACJ,IAAI,AAAiB,YAAjB,OAAOA,OACd,MAAM,IAAIC,YACN,CAAC,yEAAyE,EAAEF,MAAM,SAAS,CAAC,IAAI,EAAEA,MAAM,OAAO,CAAC,CAAC,CAAC;QAI1H,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAACC;IACnD;IAEA,MAAa,UAAU,EACnBA,KAAK,EAC0B,EAAsC;QACrE,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAACA;IACjD;AACJ;AAEO,MAAME,uBAAuBC,iBAAiB,oBAAoB,CAAC;IACtE,gBAAgBN;IAChB,cAAc;QAACO;KAAmB;AACtC"}
|
|
@@ -9,7 +9,7 @@ class LongTextStorageTransformImpl {
|
|
|
9
9
|
async fromStorage({ field, value: storageValue }) {
|
|
10
10
|
const typeOf = typeof storageValue;
|
|
11
11
|
if (!storageValue || "string" === typeOf || "number" === typeOf || true === Array.isArray(storageValue)) return storageValue;
|
|
12
|
-
if ("object" !== typeOf) throw new WebinyError(`LongText value received in "fromStorage" function is not an object in field "${field.storageId}" - ${field.fieldId}.`);
|
|
12
|
+
else if ("object" !== typeOf) throw new WebinyError(`LongText value received in "fromStorage" function is not an object in field "${field.storageId}" - ${field.fieldId}.`);
|
|
13
13
|
try {
|
|
14
14
|
const sv = storageValue;
|
|
15
15
|
const result = await this.compressionHandler.decompress(storageValue);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/storage/fields/LongTextStorageTransform.js","sources":["../../../../src/features/storage/fields/LongTextStorageTransform.ts"],"sourcesContent":["import { StorageTransform } from \"../abstractions/StorageTransform.js\";\nimport { WebinyError } from \"@webiny/error\";\nimport { CompressionHandler } from \"@webiny/utils/exports/api.js\";\n\ninterface StorageValue {\n compression: string;\n value: string;\n isArray?: boolean;\n}\n\nclass LongTextStorageTransformImpl implements StorageTransform.Interface<\n string | string[],\n StorageValue\n> {\n public readonly fieldType = \"long-text\";\n\n public constructor(private readonly compressionHandler: CompressionHandler.Interface) {}\n\n public async fromStorage({\n field,\n value: storageValue\n }: StorageTransform.FromStorageParams<\n string | string[],\n StorageValue\n >): StorageTransform.FromStorageResponse<string | string[]> {\n const typeOf = typeof storageValue;\n if (\n !storageValue ||\n typeOf === \"string\" ||\n typeOf === \"number\" ||\n Array.isArray(storageValue) === true\n ) {\n return storageValue as unknown as string | string[];\n } else if (typeOf !== \"object\") {\n throw new WebinyError(\n `LongText value received in \"fromStorage\" function is not an object in field \"${field.storageId}\" - ${field.fieldId}.`\n );\n }\n\n try {\n const sv = storageValue as unknown as StorageValue;\n const result = await this.compressionHandler.decompress<string>(storageValue);\n if (!sv.isArray) {\n return result;\n }\n return JSON.parse(result);\n } catch (ex) {\n console.log(\"Error while transforming long-text.\");\n console.log(ex.message);\n return \"\";\n }\n }\n\n public async toStorage({\n value: initialValue\n }: StorageTransform.ToStorageParams<\n string | string[],\n StorageValue\n >): StorageTransform.ToStorageResponse<StorageValue> {\n if (initialValue && (initialValue as unknown as StorageValue).compression) {\n return initialValue as unknown as StorageValue;\n }\n const isArray = Array.isArray(initialValue);\n const value = isArray ? JSON.stringify(initialValue) : initialValue;\n const compressed = await this.compressionHandler.compress(value);\n\n if (!isArray) {\n return compressed as unknown as StorageValue;\n }\n return { ...compressed, isArray } as unknown as StorageValue;\n }\n}\n\nexport const LongTextStorageTransform = StorageTransform.createImplementation({\n implementation: LongTextStorageTransformImpl,\n dependencies: [CompressionHandler]\n});\n"],"names":["LongTextStorageTransformImpl","compressionHandler","field","storageValue","typeOf","Array","WebinyError","sv","result","JSON","ex","console","initialValue","isArray","value","compressed","LongTextStorageTransform","StorageTransform","CompressionHandler"],"mappings":";;;AAUA,MAAMA;IAMF,YAAoCC,kBAAgD,CAAE;aAAlDA,kBAAkB,GAAlBA;aAFpB,SAAS,GAAG;IAE2D;IAEvF,MAAa,YAAY,EACrBC,KAAK,EACL,OAAOC,YAAY,EAItB,EAA2D;QACxD,MAAMC,SAAS,OAAOD;QACtB,IACI,CAACA,gBACDC,AAAW,aAAXA,UACAA,AAAW,aAAXA,UACAC,AAAgC,SAAhCA,MAAM,OAAO,CAACF,eAEd,OAAOA;
|
|
1
|
+
{"version":3,"file":"features/storage/fields/LongTextStorageTransform.js","sources":["../../../../src/features/storage/fields/LongTextStorageTransform.ts"],"sourcesContent":["import { StorageTransform } from \"../abstractions/StorageTransform.js\";\nimport { WebinyError } from \"@webiny/error\";\nimport { CompressionHandler } from \"@webiny/utils/exports/api.js\";\n\ninterface StorageValue {\n compression: string;\n value: string;\n isArray?: boolean;\n}\n\nclass LongTextStorageTransformImpl implements StorageTransform.Interface<\n string | string[],\n StorageValue\n> {\n public readonly fieldType = \"long-text\";\n\n public constructor(private readonly compressionHandler: CompressionHandler.Interface) {}\n\n public async fromStorage({\n field,\n value: storageValue\n }: StorageTransform.FromStorageParams<\n string | string[],\n StorageValue\n >): StorageTransform.FromStorageResponse<string | string[]> {\n const typeOf = typeof storageValue;\n if (\n !storageValue ||\n typeOf === \"string\" ||\n typeOf === \"number\" ||\n Array.isArray(storageValue) === true\n ) {\n return storageValue as unknown as string | string[];\n } else if (typeOf !== \"object\") {\n throw new WebinyError(\n `LongText value received in \"fromStorage\" function is not an object in field \"${field.storageId}\" - ${field.fieldId}.`\n );\n }\n\n try {\n const sv = storageValue as unknown as StorageValue;\n const result = await this.compressionHandler.decompress<string>(storageValue);\n if (!sv.isArray) {\n return result;\n }\n return JSON.parse(result);\n } catch (ex) {\n console.log(\"Error while transforming long-text.\");\n console.log(ex.message);\n return \"\";\n }\n }\n\n public async toStorage({\n value: initialValue\n }: StorageTransform.ToStorageParams<\n string | string[],\n StorageValue\n >): StorageTransform.ToStorageResponse<StorageValue> {\n if (initialValue && (initialValue as unknown as StorageValue).compression) {\n return initialValue as unknown as StorageValue;\n }\n const isArray = Array.isArray(initialValue);\n const value = isArray ? JSON.stringify(initialValue) : initialValue;\n const compressed = await this.compressionHandler.compress(value);\n\n if (!isArray) {\n return compressed as unknown as StorageValue;\n }\n return { ...compressed, isArray } as unknown as StorageValue;\n }\n}\n\nexport const LongTextStorageTransform = StorageTransform.createImplementation({\n implementation: LongTextStorageTransformImpl,\n dependencies: [CompressionHandler]\n});\n"],"names":["LongTextStorageTransformImpl","compressionHandler","field","storageValue","typeOf","Array","WebinyError","sv","result","JSON","ex","console","initialValue","isArray","value","compressed","LongTextStorageTransform","StorageTransform","CompressionHandler"],"mappings":";;;AAUA,MAAMA;IAMF,YAAoCC,kBAAgD,CAAE;aAAlDA,kBAAkB,GAAlBA;aAFpB,SAAS,GAAG;IAE2D;IAEvF,MAAa,YAAY,EACrBC,KAAK,EACL,OAAOC,YAAY,EAItB,EAA2D;QACxD,MAAMC,SAAS,OAAOD;QACtB,IACI,CAACA,gBACDC,AAAW,aAAXA,UACAA,AAAW,aAAXA,UACAC,AAAgC,SAAhCA,MAAM,OAAO,CAACF,eAEd,OAAOA;aACJ,IAAIC,AAAW,aAAXA,QACP,MAAM,IAAIE,YACN,CAAC,6EAA6E,EAAEJ,MAAM,SAAS,CAAC,IAAI,EAAEA,MAAM,OAAO,CAAC,CAAC,CAAC;QAI9H,IAAI;YACA,MAAMK,KAAKJ;YACX,MAAMK,SAAS,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAASL;YAChE,IAAI,CAACI,GAAG,OAAO,EACX,OAAOC;YAEX,OAAOC,KAAK,KAAK,CAACD;QACtB,EAAE,OAAOE,IAAI;YACTC,QAAQ,GAAG,CAAC;YACZA,QAAQ,GAAG,CAACD,GAAG,OAAO;YACtB,OAAO;QACX;IACJ;IAEA,MAAa,UAAU,EACnB,OAAOE,YAAY,EAItB,EAAoD;QACjD,IAAIA,gBAAiBA,aAAyC,WAAW,EACrE,OAAOA;QAEX,MAAMC,UAAUR,MAAM,OAAO,CAACO;QAC9B,MAAME,QAAQD,UAAUJ,KAAK,SAAS,CAACG,gBAAgBA;QACvD,MAAMG,aAAa,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAACD;QAE1D,IAAI,CAACD,SACD,OAAOE;QAEX,OAAO;YAAE,GAAGA,UAAU;YAAEF;QAAQ;IACpC;AACJ;AAEO,MAAMG,2BAA2BC,iBAAiB,oBAAoB,CAAC;IAC1E,gBAAgBjB;IAChB,cAAc;QAACkB;KAAmB;AACtC"}
|
|
@@ -8,7 +8,7 @@ class RichTextStorageTransformImpl {
|
|
|
8
8
|
}
|
|
9
9
|
async fromStorage({ field, value: storageValue }) {
|
|
10
10
|
if (!storageValue) return storageValue;
|
|
11
|
-
if ("object" != typeof storageValue) throw new WebinyError(`RichText value received in "fromStorage" function is not an object in field "${field.storageId}" - ${field.fieldId}.`);
|
|
11
|
+
else if ("object" != typeof storageValue) throw new WebinyError(`RichText value received in "fromStorage" function is not an object in field "${field.storageId}" - ${field.fieldId}.`);
|
|
12
12
|
try {
|
|
13
13
|
return await this.compressionHandler.decompress(storageValue);
|
|
14
14
|
} catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/storage/fields/RichTextStorageTransform.js","sources":["../../../../src/features/storage/fields/RichTextStorageTransform.ts"],"sourcesContent":["import { StorageTransform } from \"../abstractions/StorageTransform.js\";\nimport { WebinyError } from \"@webiny/error\";\nimport { CompressionHandler } from \"@webiny/utils/exports/api.js\";\n\nclass RichTextStorageTransformImpl implements StorageTransform.Interface {\n public readonly fieldType = \"rich-text\";\n\n public constructor(private readonly compressionHandler: CompressionHandler.Interface) {}\n\n public async fromStorage({\n field,\n value: storageValue\n }: StorageTransform.FromStorageParams): StorageTransform.FromStorageResponse {\n if (!storageValue) {\n return storageValue;\n } else if (typeof storageValue !== \"object\") {\n throw new WebinyError(\n `RichText value received in \"fromStorage\" function is not an object in field \"${field.storageId}\" - ${field.fieldId}.`\n );\n }\n\n try {\n return await this.compressionHandler.decompress(storageValue);\n } catch {\n return storageValue;\n }\n }\n\n public async toStorage({\n value\n }: StorageTransform.ToStorageParams): StorageTransform.ToStorageResponse {\n try {\n return await this.compressionHandler.compress(value);\n } catch {\n return value;\n }\n }\n}\n\nexport const RichTextStorageTransform = StorageTransform.createImplementation({\n implementation: RichTextStorageTransformImpl,\n dependencies: [CompressionHandler]\n});\n"],"names":["RichTextStorageTransformImpl","compressionHandler","field","storageValue","WebinyError","value","RichTextStorageTransform","StorageTransform","CompressionHandler"],"mappings":";;;AAIA,MAAMA;IAGF,YAAoCC,kBAAgD,CAAE;aAAlDA,kBAAkB,GAAlBA;aAFpB,SAAS,GAAG;IAE2D;IAEvF,MAAa,YAAY,EACrBC,KAAK,EACL,OAAOC,YAAY,EACc,EAAwC;QACzE,IAAI,CAACA,cACD,OAAOA;
|
|
1
|
+
{"version":3,"file":"features/storage/fields/RichTextStorageTransform.js","sources":["../../../../src/features/storage/fields/RichTextStorageTransform.ts"],"sourcesContent":["import { StorageTransform } from \"../abstractions/StorageTransform.js\";\nimport { WebinyError } from \"@webiny/error\";\nimport { CompressionHandler } from \"@webiny/utils/exports/api.js\";\n\nclass RichTextStorageTransformImpl implements StorageTransform.Interface {\n public readonly fieldType = \"rich-text\";\n\n public constructor(private readonly compressionHandler: CompressionHandler.Interface) {}\n\n public async fromStorage({\n field,\n value: storageValue\n }: StorageTransform.FromStorageParams): StorageTransform.FromStorageResponse {\n if (!storageValue) {\n return storageValue;\n } else if (typeof storageValue !== \"object\") {\n throw new WebinyError(\n `RichText value received in \"fromStorage\" function is not an object in field \"${field.storageId}\" - ${field.fieldId}.`\n );\n }\n\n try {\n return await this.compressionHandler.decompress(storageValue);\n } catch {\n return storageValue;\n }\n }\n\n public async toStorage({\n value\n }: StorageTransform.ToStorageParams): StorageTransform.ToStorageResponse {\n try {\n return await this.compressionHandler.compress(value);\n } catch {\n return value;\n }\n }\n}\n\nexport const RichTextStorageTransform = StorageTransform.createImplementation({\n implementation: RichTextStorageTransformImpl,\n dependencies: [CompressionHandler]\n});\n"],"names":["RichTextStorageTransformImpl","compressionHandler","field","storageValue","WebinyError","value","RichTextStorageTransform","StorageTransform","CompressionHandler"],"mappings":";;;AAIA,MAAMA;IAGF,YAAoCC,kBAAgD,CAAE;aAAlDA,kBAAkB,GAAlBA;aAFpB,SAAS,GAAG;IAE2D;IAEvF,MAAa,YAAY,EACrBC,KAAK,EACL,OAAOC,YAAY,EACc,EAAwC;QACzE,IAAI,CAACA,cACD,OAAOA;aACJ,IAAI,AAAwB,YAAxB,OAAOA,cACd,MAAM,IAAIC,YACN,CAAC,6EAA6E,EAAEF,MAAM,SAAS,CAAC,IAAI,EAAEA,MAAM,OAAO,CAAC,CAAC,CAAC;QAI9H,IAAI;YACA,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAACC;QACpD,EAAE,OAAM;YACJ,OAAOA;QACX;IACJ;IAEA,MAAa,UAAU,EACnBE,KAAK,EAC0B,EAAsC;QACrE,IAAI;YACA,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAACA;QAClD,EAAE,OAAM;YACJ,OAAOA;QACX;IACJ;AACJ;AAEO,MAAMC,2BAA2BC,iBAAiB,oBAAoB,CAAC;IAC1E,gBAAgBP;IAChB,cAAc;QAACQ;KAAmB;AACtC"}
|
|
@@ -4,7 +4,7 @@ class DateGteValidatorImpl {
|
|
|
4
4
|
async validate({ value, validator }) {
|
|
5
5
|
const { value: gteValue, type } = validator.settings || {};
|
|
6
6
|
if (void 0 === gteValue) return true;
|
|
7
|
-
if ("time" === type) return validation.validate(value, `timeGte:${gteValue}`).then((v)=>true === v).catch(()=>false);
|
|
7
|
+
else if ("time" === type) return validation.validate(value, `timeGte:${gteValue}`).then((v)=>true === v).catch(()=>false);
|
|
8
8
|
return validation.validate(value, `dateGte:${gteValue}`).then((v)=>true === v).catch(()=>false);
|
|
9
9
|
}
|
|
10
10
|
constructor(){
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/validation/validators/DateGteValidator.js","sources":["../../../../src/features/validation/validators/DateGteValidator.ts"],"sourcesContent":["import { validation } from \"@webiny/validation\";\nimport { CmsModelFieldValidator } from \"../abstractions/CmsModelFieldValidator.js\";\nimport type { CmsModelFieldValidatorValidateParams } from \"~/types/types.js\";\n\nclass DateGteValidatorImpl implements CmsModelFieldValidator.Interface {\n public readonly name = \"dateGte\";\n\n public async validate({\n value,\n validator\n }: CmsModelFieldValidatorValidateParams): Promise<boolean> {\n const { value: gteValue, type } = validator.settings || {};\n if (typeof gteValue === \"undefined\") {\n return true;\n } else if (type === \"time\") {\n return validation\n .validate(value, `timeGte:${gteValue}`)\n .then(v => v === true)\n .catch(() => false);\n }\n return validation\n .validate(value, `dateGte:${gteValue}`)\n .then(v => v === true)\n .catch(() => false);\n }\n}\n\nexport const DateGteValidator = CmsModelFieldValidator.createImplementation({\n implementation: DateGteValidatorImpl,\n dependencies: []\n});\n"],"names":["DateGteValidatorImpl","value","validator","gteValue","type","validation","v","DateGteValidator","CmsModelFieldValidator"],"mappings":";;AAIA,MAAMA;IAGF,MAAa,SAAS,EAClBC,KAAK,EACLC,SAAS,EAC0B,EAAoB;QACvD,MAAM,EAAE,OAAOC,QAAQ,EAAEC,IAAI,EAAE,GAAGF,UAAU,QAAQ,IAAI,CAAC;QACzD,IAAI,AAAoB,WAAbC,UACP,OAAO;
|
|
1
|
+
{"version":3,"file":"features/validation/validators/DateGteValidator.js","sources":["../../../../src/features/validation/validators/DateGteValidator.ts"],"sourcesContent":["import { validation } from \"@webiny/validation\";\nimport { CmsModelFieldValidator } from \"../abstractions/CmsModelFieldValidator.js\";\nimport type { CmsModelFieldValidatorValidateParams } from \"~/types/types.js\";\n\nclass DateGteValidatorImpl implements CmsModelFieldValidator.Interface {\n public readonly name = \"dateGte\";\n\n public async validate({\n value,\n validator\n }: CmsModelFieldValidatorValidateParams): Promise<boolean> {\n const { value: gteValue, type } = validator.settings || {};\n if (typeof gteValue === \"undefined\") {\n return true;\n } else if (type === \"time\") {\n return validation\n .validate(value, `timeGte:${gteValue}`)\n .then(v => v === true)\n .catch(() => false);\n }\n return validation\n .validate(value, `dateGte:${gteValue}`)\n .then(v => v === true)\n .catch(() => false);\n }\n}\n\nexport const DateGteValidator = CmsModelFieldValidator.createImplementation({\n implementation: DateGteValidatorImpl,\n dependencies: []\n});\n"],"names":["DateGteValidatorImpl","value","validator","gteValue","type","validation","v","DateGteValidator","CmsModelFieldValidator"],"mappings":";;AAIA,MAAMA;IAGF,MAAa,SAAS,EAClBC,KAAK,EACLC,SAAS,EAC0B,EAAoB;QACvD,MAAM,EAAE,OAAOC,QAAQ,EAAEC,IAAI,EAAE,GAAGF,UAAU,QAAQ,IAAI,CAAC;QACzD,IAAI,AAAoB,WAAbC,UACP,OAAO;aACJ,IAAIC,AAAS,WAATA,MACP,OAAOC,WAAAA,QACM,CAACJ,OAAO,CAAC,QAAQ,EAAEE,UAAU,EACrC,IAAI,CAACG,CAAAA,IAAKA,AAAM,SAANA,GACV,KAAK,CAAC,IAAM;QAErB,OAAOD,WAAAA,QACM,CAACJ,OAAO,CAAC,QAAQ,EAAEE,UAAU,EACrC,IAAI,CAACG,CAAAA,IAAKA,AAAM,SAANA,GACV,KAAK,CAAC,IAAM;IACrB;;aAnBgB,IAAI,GAAG;;AAoB3B;AAEO,MAAMC,mBAAmBC,uBAAuB,oBAAoB,CAAC;IACxE,gBAAgBR;IAChB,cAAc,EAAE;AACpB"}
|
|
@@ -4,7 +4,7 @@ class DateLteValidatorImpl {
|
|
|
4
4
|
async validate({ value, validator }) {
|
|
5
5
|
const { value: lteValue, type } = validator.settings || {};
|
|
6
6
|
if (void 0 === lteValue) return true;
|
|
7
|
-
if ("time" === type) return validation.validate(value, `timeLte:${lteValue}`).then((v)=>true === v).catch(()=>false);
|
|
7
|
+
else if ("time" === type) return validation.validate(value, `timeLte:${lteValue}`).then((v)=>true === v).catch(()=>false);
|
|
8
8
|
return validation.validate(value, `dateLte:${lteValue}`).then((v)=>true === v).catch(()=>false);
|
|
9
9
|
}
|
|
10
10
|
constructor(){
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/validation/validators/DateLteValidator.js","sources":["../../../../src/features/validation/validators/DateLteValidator.ts"],"sourcesContent":["import { validation } from \"@webiny/validation\";\nimport { CmsModelFieldValidator } from \"../abstractions/CmsModelFieldValidator.js\";\nimport type { CmsModelFieldValidatorValidateParams } from \"~/types/types.js\";\n\nclass DateLteValidatorImpl implements CmsModelFieldValidator.Interface {\n public readonly name = \"dateLte\";\n\n public async validate({\n value,\n validator\n }: CmsModelFieldValidatorValidateParams): Promise<boolean> {\n const { value: lteValue, type } = validator.settings || {};\n if (typeof lteValue === \"undefined\") {\n return true;\n } else if (type === \"time\") {\n return validation\n .validate(value, `timeLte:${lteValue}`)\n .then(v => v === true)\n .catch(() => false);\n }\n return validation\n .validate(value, `dateLte:${lteValue}`)\n .then(v => v === true)\n .catch(() => false);\n }\n}\n\nexport const DateLteValidator = CmsModelFieldValidator.createImplementation({\n implementation: DateLteValidatorImpl,\n dependencies: []\n});\n"],"names":["DateLteValidatorImpl","value","validator","lteValue","type","validation","v","DateLteValidator","CmsModelFieldValidator"],"mappings":";;AAIA,MAAMA;IAGF,MAAa,SAAS,EAClBC,KAAK,EACLC,SAAS,EAC0B,EAAoB;QACvD,MAAM,EAAE,OAAOC,QAAQ,EAAEC,IAAI,EAAE,GAAGF,UAAU,QAAQ,IAAI,CAAC;QACzD,IAAI,AAAoB,WAAbC,UACP,OAAO;
|
|
1
|
+
{"version":3,"file":"features/validation/validators/DateLteValidator.js","sources":["../../../../src/features/validation/validators/DateLteValidator.ts"],"sourcesContent":["import { validation } from \"@webiny/validation\";\nimport { CmsModelFieldValidator } from \"../abstractions/CmsModelFieldValidator.js\";\nimport type { CmsModelFieldValidatorValidateParams } from \"~/types/types.js\";\n\nclass DateLteValidatorImpl implements CmsModelFieldValidator.Interface {\n public readonly name = \"dateLte\";\n\n public async validate({\n value,\n validator\n }: CmsModelFieldValidatorValidateParams): Promise<boolean> {\n const { value: lteValue, type } = validator.settings || {};\n if (typeof lteValue === \"undefined\") {\n return true;\n } else if (type === \"time\") {\n return validation\n .validate(value, `timeLte:${lteValue}`)\n .then(v => v === true)\n .catch(() => false);\n }\n return validation\n .validate(value, `dateLte:${lteValue}`)\n .then(v => v === true)\n .catch(() => false);\n }\n}\n\nexport const DateLteValidator = CmsModelFieldValidator.createImplementation({\n implementation: DateLteValidatorImpl,\n dependencies: []\n});\n"],"names":["DateLteValidatorImpl","value","validator","lteValue","type","validation","v","DateLteValidator","CmsModelFieldValidator"],"mappings":";;AAIA,MAAMA;IAGF,MAAa,SAAS,EAClBC,KAAK,EACLC,SAAS,EAC0B,EAAoB;QACvD,MAAM,EAAE,OAAOC,QAAQ,EAAEC,IAAI,EAAE,GAAGF,UAAU,QAAQ,IAAI,CAAC;QACzD,IAAI,AAAoB,WAAbC,UACP,OAAO;aACJ,IAAIC,AAAS,WAATA,MACP,OAAOC,WAAAA,QACM,CAACJ,OAAO,CAAC,QAAQ,EAAEE,UAAU,EACrC,IAAI,CAACG,CAAAA,IAAKA,AAAM,SAANA,GACV,KAAK,CAAC,IAAM;QAErB,OAAOD,WAAAA,QACM,CAACJ,OAAO,CAAC,QAAQ,EAAEE,UAAU,EACrC,IAAI,CAACG,CAAAA,IAAKA,AAAM,SAANA,GACV,KAAK,CAAC,IAAM;IACrB;;aAnBgB,IAAI,GAAG;;AAoB3B;AAEO,MAAMC,mBAAmBC,uBAAuB,oBAAoB,CAAC;IACxE,gBAAgBR;IAChB,cAAc,EAAE;AACpB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CmsWhereMapper } from "./abstractions.js";
|
|
2
2
|
const isPlainObject = (value)=>{
|
|
3
3
|
if (!value || "object" != typeof value) return false;
|
|
4
|
-
if (Array.isArray(value)) return false;
|
|
4
|
+
else if (Array.isArray(value)) return false;
|
|
5
5
|
return true;
|
|
6
6
|
};
|
|
7
7
|
const isLogicalKey = (key)=>"AND" === key || "OR" === key;
|
|
@@ -32,8 +32,7 @@ class WhereMapperImpl {
|
|
|
32
32
|
isField
|
|
33
33
|
}));
|
|
34
34
|
continue;
|
|
35
|
-
}
|
|
36
|
-
if (isField(key)) {
|
|
35
|
+
} else if (isField(key)) {
|
|
37
36
|
if (!out.values) out.values = {};
|
|
38
37
|
out.values[key] = value;
|
|
39
38
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/whereMapper/WhereMapper.js","sources":["../../../src/features/whereMapper/WhereMapper.ts"],"sourcesContent":["/**\n * Used to map a model with custom schema with fields in a root to values object.\n * eg. File Manager File model has \"title\" and \"tags\" fields in the root, but they should be\n * mapped to \"values.title\" and \"values.tags\" when creating the entry.\n */\nimport { GenericRecord } from \"@webiny/api/types.js\";\nimport { CmsEntryListWhere } from \"~/types/types.js\";\nimport { CmsWhereMapper, ICmsWhereMapperParams } from \"./abstractions.js\";\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (!value || typeof value !== \"object\") {\n return false;\n } else if (Array.isArray(value)) {\n return false;\n }\n return true;\n};\n\nconst isLogicalKey = (key: string): key is \"AND\" | \"OR\" => {\n return key === \"AND\" || key === \"OR\";\n};\n\ninterface IMapNodeWhereParams {\n input: GenericRecord;\n isField: (key: string) => boolean;\n}\n\nclass WhereMapperImpl implements CmsWhereMapper.Interface {\n map<T extends GenericRecord>(params: ICmsWhereMapperParams<T>): CmsEntryListWhere | undefined {\n const { fields: modelFields, input } = params;\n if (!input) {\n return undefined;\n }\n\n const fields = modelFields.map(field => {\n return field.fieldId;\n });\n\n const isField = (key: string): boolean => {\n const field = key.split(\"_\")[0];\n return fields.includes(field);\n };\n\n return this.mapWhere({\n input,\n isField\n });\n }\n\n private mapWhere(params: IMapNodeWhereParams) {\n const { input, isField } = params;\n const out: CmsEntryListWhere = {};\n\n const keys = Object.keys(input) as (keyof typeof out)[];\n if (keys.length === 0) {\n return out;\n }\n\n for (const key of keys) {\n const value = input[key];\n\n if (isLogicalKey(key)) {\n if (Array.isArray(value)) {\n out[key] = value.filter(isPlainObject).map(child => {\n return this.mapWhere({\n input: child,\n isField\n });\n });\n }\n continue;\n } else if (isField(key)) {\n if (!out.values) {\n out.values = {};\n }\n out.values[key] = value;\n continue;\n }\n\n out[key] = value;\n }\n\n return out;\n }\n}\n\nexport const WhereMapper = CmsWhereMapper.createImplementation({\n implementation: WhereMapperImpl,\n dependencies: []\n});\n"],"names":["isPlainObject","value","Array","isLogicalKey","key","WhereMapperImpl","params","modelFields","input","fields","field","isField","out","keys","Object","child","WhereMapper","CmsWhereMapper"],"mappings":";AASA,MAAMA,gBAAgB,CAACC;IACnB,IAAI,CAACA,SAAS,AAAiB,YAAjB,OAAOA,OACjB,OAAO;
|
|
1
|
+
{"version":3,"file":"features/whereMapper/WhereMapper.js","sources":["../../../src/features/whereMapper/WhereMapper.ts"],"sourcesContent":["/**\n * Used to map a model with custom schema with fields in a root to values object.\n * eg. File Manager File model has \"title\" and \"tags\" fields in the root, but they should be\n * mapped to \"values.title\" and \"values.tags\" when creating the entry.\n */\nimport { GenericRecord } from \"@webiny/api/types.js\";\nimport { CmsEntryListWhere } from \"~/types/types.js\";\nimport { CmsWhereMapper, ICmsWhereMapperParams } from \"./abstractions.js\";\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (!value || typeof value !== \"object\") {\n return false;\n } else if (Array.isArray(value)) {\n return false;\n }\n return true;\n};\n\nconst isLogicalKey = (key: string): key is \"AND\" | \"OR\" => {\n return key === \"AND\" || key === \"OR\";\n};\n\ninterface IMapNodeWhereParams {\n input: GenericRecord;\n isField: (key: string) => boolean;\n}\n\nclass WhereMapperImpl implements CmsWhereMapper.Interface {\n map<T extends GenericRecord>(params: ICmsWhereMapperParams<T>): CmsEntryListWhere | undefined {\n const { fields: modelFields, input } = params;\n if (!input) {\n return undefined;\n }\n\n const fields = modelFields.map(field => {\n return field.fieldId;\n });\n\n const isField = (key: string): boolean => {\n const field = key.split(\"_\")[0];\n return fields.includes(field);\n };\n\n return this.mapWhere({\n input,\n isField\n });\n }\n\n private mapWhere(params: IMapNodeWhereParams) {\n const { input, isField } = params;\n const out: CmsEntryListWhere = {};\n\n const keys = Object.keys(input) as (keyof typeof out)[];\n if (keys.length === 0) {\n return out;\n }\n\n for (const key of keys) {\n const value = input[key];\n\n if (isLogicalKey(key)) {\n if (Array.isArray(value)) {\n out[key] = value.filter(isPlainObject).map(child => {\n return this.mapWhere({\n input: child,\n isField\n });\n });\n }\n continue;\n } else if (isField(key)) {\n if (!out.values) {\n out.values = {};\n }\n out.values[key] = value;\n continue;\n }\n\n out[key] = value;\n }\n\n return out;\n }\n}\n\nexport const WhereMapper = CmsWhereMapper.createImplementation({\n implementation: WhereMapperImpl,\n dependencies: []\n});\n"],"names":["isPlainObject","value","Array","isLogicalKey","key","WhereMapperImpl","params","modelFields","input","fields","field","isField","out","keys","Object","child","WhereMapper","CmsWhereMapper"],"mappings":";AASA,MAAMA,gBAAgB,CAACC;IACnB,IAAI,CAACA,SAAS,AAAiB,YAAjB,OAAOA,OACjB,OAAO;SACJ,IAAIC,MAAM,OAAO,CAACD,QACrB,OAAO;IAEX,OAAO;AACX;AAEA,MAAME,eAAe,CAACC,MACXA,AAAQ,UAARA,OAAiBA,AAAQ,SAARA;AAQ5B,MAAMC;IACF,IAA6BC,MAAgC,EAAiC;QAC1F,MAAM,EAAE,QAAQC,WAAW,EAAEC,KAAK,EAAE,GAAGF;QACvC,IAAI,CAACE,OACD;QAGJ,MAAMC,SAASF,YAAY,GAAG,CAACG,CAAAA,QACpBA,MAAM,OAAO;QAGxB,MAAMC,UAAU,CAACP;YACb,MAAMM,QAAQN,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE;YAC/B,OAAOK,OAAO,QAAQ,CAACC;QAC3B;QAEA,OAAO,IAAI,CAAC,QAAQ,CAAC;YACjBF;YACAG;QACJ;IACJ;IAEQ,SAASL,MAA2B,EAAE;QAC1C,MAAM,EAAEE,KAAK,EAAEG,OAAO,EAAE,GAAGL;QAC3B,MAAMM,MAAyB,CAAC;QAEhC,MAAMC,OAAOC,OAAO,IAAI,CAACN;QACzB,IAAIK,AAAgB,MAAhBA,KAAK,MAAM,EACX,OAAOD;QAGX,KAAK,MAAMR,OAAOS,KAAM;YACpB,MAAMZ,QAAQO,KAAK,CAACJ,IAAI;YAExB,IAAID,aAAaC,MAAM;gBACnB,IAAIF,MAAM,OAAO,CAACD,QACdW,GAAG,CAACR,IAAI,GAAGH,MAAM,MAAM,CAACD,eAAe,GAAG,CAACe,CAAAA,QAChC,IAAI,CAAC,QAAQ,CAAC;wBACjB,OAAOA;wBACPJ;oBACJ;gBAGR;YACJ,OAAO,IAAIA,QAAQP,MAAM;gBACrB,IAAI,CAACQ,IAAI,MAAM,EACXA,IAAI,MAAM,GAAG,CAAC;gBAElBA,IAAI,MAAM,CAACR,IAAI,GAAGH;gBAClB;YACJ;YAEAW,GAAG,CAACR,IAAI,GAAGH;QACf;QAEA,OAAOW;IACX;AACJ;AAEO,MAAMI,cAAcC,eAAe,oBAAoB,CAAC;IAC3D,gBAAgBZ;IAChB,cAAc,EAAE;AACpB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import crypto_0 from "crypto";
|
|
2
2
|
const getSavedOn = (input)=>{
|
|
3
3
|
if (!input) return "unknown";
|
|
4
|
-
if (input instanceof Date) return input.toISOString();
|
|
4
|
+
else if (input instanceof Date) return input.toISOString();
|
|
5
5
|
try {
|
|
6
6
|
const savedOn = new Date(input);
|
|
7
7
|
return savedOn.toISOString();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql/getSchema/generateCacheKey.js","sources":["../../../src/graphql/getSchema/generateCacheKey.ts"],"sourcesContent":["import type { CmsModel } from \"~/types/index.js\";\nimport crypto from \"crypto\";\n\ninterface GenerateCacheKeyParams {\n models: Pick<CmsModel, \"modelId\" | \"singularApiName\" | \"pluralApiName\" | \"savedOn\">[];\n}\n\nconst getSavedOn = (input: Date | string | undefined | null): string => {\n if (!input) {\n return \"unknown\";\n } else if (input instanceof Date) {\n return input.toISOString();\n }\n try {\n const savedOn = new Date(input);\n return savedOn.toISOString();\n } catch {\n return \"unknown\";\n }\n};\n/**\n * Method generates cache key based on last model change time.\n * Or sets \"unknown\" - possible when no models in database.\n */\nexport const generateCacheKey = async (params: GenerateCacheKeyParams): Promise<string> => {\n const { models } = params;\n\n const keys: string[] = [];\n for (const model of models) {\n const value = getSavedOn(model.savedOn);\n\n keys.push(model.modelId, model.singularApiName, model.pluralApiName, value);\n }\n const key = keys.join(\"#\");\n\n const hash = crypto.createHash(\"sha512\");\n hash.update(key);\n return hash.digest(\"hex\");\n};\n"],"names":["getSavedOn","input","Date","savedOn","generateCacheKey","params","models","keys","model","value","key","hash","crypto"],"mappings":";AAOA,MAAMA,aAAa,CAACC;IAChB,IAAI,CAACA,OACD,OAAO;
|
|
1
|
+
{"version":3,"file":"graphql/getSchema/generateCacheKey.js","sources":["../../../src/graphql/getSchema/generateCacheKey.ts"],"sourcesContent":["import type { CmsModel } from \"~/types/index.js\";\nimport crypto from \"crypto\";\n\ninterface GenerateCacheKeyParams {\n models: Pick<CmsModel, \"modelId\" | \"singularApiName\" | \"pluralApiName\" | \"savedOn\">[];\n}\n\nconst getSavedOn = (input: Date | string | undefined | null): string => {\n if (!input) {\n return \"unknown\";\n } else if (input instanceof Date) {\n return input.toISOString();\n }\n try {\n const savedOn = new Date(input);\n return savedOn.toISOString();\n } catch {\n return \"unknown\";\n }\n};\n/**\n * Method generates cache key based on last model change time.\n * Or sets \"unknown\" - possible when no models in database.\n */\nexport const generateCacheKey = async (params: GenerateCacheKeyParams): Promise<string> => {\n const { models } = params;\n\n const keys: string[] = [];\n for (const model of models) {\n const value = getSavedOn(model.savedOn);\n\n keys.push(model.modelId, model.singularApiName, model.pluralApiName, value);\n }\n const key = keys.join(\"#\");\n\n const hash = crypto.createHash(\"sha512\");\n hash.update(key);\n return hash.digest(\"hex\");\n};\n"],"names":["getSavedOn","input","Date","savedOn","generateCacheKey","params","models","keys","model","value","key","hash","crypto"],"mappings":";AAOA,MAAMA,aAAa,CAACC;IAChB,IAAI,CAACA,OACD,OAAO;SACJ,IAAIA,iBAAiBC,MACxB,OAAOD,MAAM,WAAW;IAE5B,IAAI;QACA,MAAME,UAAU,IAAID,KAAKD;QACzB,OAAOE,QAAQ,WAAW;IAC9B,EAAE,OAAM;QACJ,OAAO;IACX;AACJ;AAKO,MAAMC,mBAAmB,OAAOC;IACnC,MAAM,EAAEC,MAAM,EAAE,GAAGD;IAEnB,MAAME,OAAiB,EAAE;IACzB,KAAK,MAAMC,SAASF,OAAQ;QACxB,MAAMG,QAAQT,WAAWQ,MAAM,OAAO;QAEtCD,KAAK,IAAI,CAACC,MAAM,OAAO,EAAEA,MAAM,eAAe,EAAEA,MAAM,aAAa,EAAEC;IACzE;IACA,MAAMC,MAAMH,KAAK,IAAI,CAAC;IAEtB,MAAMI,OAAOC,SAAAA,UAAiB,CAAC;IAC/BD,KAAK,MAAM,CAACD;IACZ,OAAOC,KAAK,MAAM,CAAC;AACvB"}
|
|
@@ -5,7 +5,7 @@ const RevisionIdScalar = new GraphQLScalarType({
|
|
|
5
5
|
description: "A Headless CMS Reference field input type.",
|
|
6
6
|
parseValue: (value)=>{
|
|
7
7
|
if (!value) return null;
|
|
8
|
-
if ("string" != typeof value) throw new Error("RevisionId value must be a string!");
|
|
8
|
+
else if ("string" != typeof value) throw new Error("RevisionId value must be a string!");
|
|
9
9
|
const result = parseIdentifier(value);
|
|
10
10
|
if (!result.version) throw new Error('RevisionId value must be a valid Revision ID property! Example: "abcdef#0001"');
|
|
11
11
|
return value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql/scalars/RevisionId.js","sources":["../../../src/graphql/scalars/RevisionId.ts"],"sourcesContent":["import { GraphQLScalarType } from \"graphql\";\nimport { parseIdentifier } from \"@webiny/utils\";\n\nexport const RevisionIdScalar = new GraphQLScalarType({\n name: \"RevisionId\",\n description: \"A Headless CMS Reference field input type.\",\n parseValue: value => {\n if (!value) {\n return null;\n } else if (typeof value !== \"string\") {\n throw new Error(\"RevisionId value must be a string!\");\n }\n\n const result = parseIdentifier(value);\n if (!result.version) {\n throw new Error(\n `RevisionId value must be a valid Revision ID property! Example: \"abcdef#0001\"`\n );\n }\n return value;\n }\n});\n"],"names":["RevisionIdScalar","GraphQLScalarType","value","Error","result","parseIdentifier"],"mappings":";;AAGO,MAAMA,mBAAmB,IAAIC,kBAAkB;IAClD,MAAM;IACN,aAAa;IACb,YAAYC,CAAAA;QACR,IAAI,CAACA,OACD,OAAO;
|
|
1
|
+
{"version":3,"file":"graphql/scalars/RevisionId.js","sources":["../../../src/graphql/scalars/RevisionId.ts"],"sourcesContent":["import { GraphQLScalarType } from \"graphql\";\nimport { parseIdentifier } from \"@webiny/utils\";\n\nexport const RevisionIdScalar = new GraphQLScalarType({\n name: \"RevisionId\",\n description: \"A Headless CMS Reference field input type.\",\n parseValue: value => {\n if (!value) {\n return null;\n } else if (typeof value !== \"string\") {\n throw new Error(\"RevisionId value must be a string!\");\n }\n\n const result = parseIdentifier(value);\n if (!result.version) {\n throw new Error(\n `RevisionId value must be a valid Revision ID property! Example: \"abcdef#0001\"`\n );\n }\n return value;\n }\n});\n"],"names":["RevisionIdScalar","GraphQLScalarType","value","Error","result","parseIdentifier"],"mappings":";;AAGO,MAAMA,mBAAmB,IAAIC,kBAAkB;IAClD,MAAM;IACN,aAAa;IACb,YAAYC,CAAAA;QACR,IAAI,CAACA,OACD,OAAO;aACJ,IAAI,AAAiB,YAAjB,OAAOA,OACd,MAAM,IAAIC,MAAM;QAGpB,MAAMC,SAASC,gBAAgBH;QAC/B,IAAI,CAACE,OAAO,OAAO,EACf,MAAM,IAAID,MACN;QAGR,OAAOD;IACX;AACJ"}
|
|
@@ -26,7 +26,7 @@ const createFieldResolversFactory = (factoryParams)=>{
|
|
|
26
26
|
fieldRegistry
|
|
27
27
|
}) : null;
|
|
28
28
|
if (false === fieldResolver) continue;
|
|
29
|
-
if ("function" == typeof fieldResolver) resolver = fieldResolver;
|
|
29
|
+
else if ("function" == typeof fieldResolver) resolver = fieldResolver;
|
|
30
30
|
else if (fieldResolver) {
|
|
31
31
|
resolver = fieldResolver.resolver;
|
|
32
32
|
Object.assign(typeResolvers, fieldResolver.typeResolvers);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql/schema/createFieldResolvers.js","sources":["../../../src/graphql/schema/createFieldResolvers.ts"],"sourcesContent":["import set from \"lodash/set.js\";\nimport type { Resolvers } from \"@webiny/handler-graphql/types.js\";\nimport WebinyError from \"@webiny/error\";\nimport type { ApiEndpoint, CmsContext, CmsModel, CmsModelField } from \"~/types/index.js\";\nimport { entryFieldFromStorageTransform } from \"~/utils/entryStorage.js\";\nimport { getBaseFieldType } from \"~/utils/getBaseFieldType.js\";\nimport type {\n CmsModelFieldToGraphQL,\n CmsModelFieldToGraphQLRegistry\n} from \"~/features/graphql/index.js\";\n\ninterface CreateFieldResolvers {\n graphQLType: string;\n fields: CmsModelField[];\n isRoot: boolean;\n extraResolvers?: Resolvers<any>;\n}\n\ninterface CreateFieldResolversFactoryParams {\n endpointType: ApiEndpoint;\n models: CmsModel[];\n model: CmsModel;\n fieldRegistry: CmsModelFieldToGraphQLRegistry.Interface;\n}\n\n/**\n * We use a factory to avoid passing the parameters for recursive invocations.\n * This way they will always be in the function scope, and we can only pass \"fields\".\n */\nexport const createFieldResolversFactory = (factoryParams: CreateFieldResolversFactoryParams) => {\n const { endpointType, models, model, fieldRegistry } = factoryParams;\n return function createFieldResolvers(params: CreateFieldResolvers) {\n const { graphQLType, fields, isRoot = false, extraResolvers = {} } = params;\n\n const fieldResolvers: Resolvers<any> = {};\n const typeResolvers = {};\n\n for (const field of fields) {\n const plugin = fieldRegistry.get(getBaseFieldType(field));\n if (!plugin) {\n continue;\n }\n /**\n * Field that is passed into this factory MUST have fieldId, so filter it before the method call.\n */\n if (!field.fieldId) {\n throw new WebinyError(\n \"Field is missing an `fieldId`. Cannot process field without the `fieldId` in the resolvers.\",\n \"FIELD_ID_ERROR\",\n {\n field\n }\n );\n }\n\n const api: CmsModelFieldToGraphQL.ReadApi | CmsModelFieldToGraphQL.ManageApi =\n endpointType === \"manage\" ? plugin.manage : plugin.read;\n const createResolver = api?.createResolver || null;\n\n let resolver: any;\n const fieldResolver = createResolver\n ? createResolver({\n graphQLType,\n models,\n model,\n field,\n createFieldResolvers,\n fieldRegistry\n })\n : null;\n\n /**\n * When fieldResolver is false it will completely skip adding field fieldId into the resolvers.\n * This is to fix the breaking of GraphQL schema.\n */\n if (fieldResolver === false) {\n continue;\n } else if (typeof fieldResolver === \"function\") {\n resolver = fieldResolver;\n } else if (fieldResolver) {\n resolver = fieldResolver.resolver;\n Object.assign(typeResolvers, fieldResolver.typeResolvers);\n }\n\n const { fieldId } = field;\n /**\n * Figure out a better way to extract value from parent.\n * // TODO fix\n */\n const getValue = (parent: any) => {\n if (!parent?.values || !parent?.values[fieldId]) {\n return {\n isRoot: false,\n value: parent?.[fieldId]\n };\n }\n return {\n isRoot: true,\n value: parent.values[fieldId]\n };\n };\n\n fieldResolvers[fieldId] = async (parent, args, context: CmsContext, info) => {\n /**\n * This is required because due to ref field can be requested without the populated data.\n * At that point there is no .values no fieldId property on the parent\n */\n const { isRoot: valueIsRoot, value } = getValue(parent);\n if (value === undefined) {\n return undefined;\n }\n // Get transformed value (eg. data decompression)\n const transformedValue = await entryFieldFromStorageTransform({\n context,\n model,\n field,\n value\n });\n\n set(\n valueIsRoot && parent.values ? parent.values : parent,\n fieldId,\n transformedValue\n );\n\n if (!resolver) {\n return valueIsRoot && parent.values[fieldId]\n ? parent.values[fieldId]\n : parent[fieldId];\n }\n\n return await resolver(valueIsRoot ? parent.values : parent, args, context, info);\n };\n }\n\n /**\n * Difference between root and non-root (object and dz, etc... fields) is that root has a values wrapper.\n * Subtypes must not have it.\n */\n if (!isRoot) {\n return {\n [graphQLType]: {\n ...fieldResolvers,\n ...extraResolvers\n },\n ...typeResolvers\n };\n }\n\n return {\n [graphQLType]: {\n ...extraResolvers\n },\n [`${graphQLType}Values`]: fieldResolvers,\n ...typeResolvers\n };\n };\n};\n"],"names":["createFieldResolversFactory","factoryParams","endpointType","models","model","fieldRegistry","createFieldResolvers","params","graphQLType","fields","isRoot","extraResolvers","fieldResolvers","typeResolvers","field","plugin","getBaseFieldType","WebinyError","api","createResolver","resolver","fieldResolver","Object","fieldId","getValue","parent","args","context","info","valueIsRoot","value","undefined","transformedValue","entryFieldFromStorageTransform","set"],"mappings":";;;;AA6BO,MAAMA,8BAA8B,CAACC;IACxC,MAAM,EAAEC,YAAY,EAAEC,MAAM,EAAEC,KAAK,EAAEC,aAAa,EAAE,GAAGJ;IACvD,OAAO,SAASK,qBAAqBC,MAA4B;QAC7D,MAAM,EAAEC,WAAW,EAAEC,MAAM,EAAEC,SAAS,KAAK,EAAEC,iBAAiB,CAAC,CAAC,EAAE,GAAGJ;QAErE,MAAMK,iBAAiC,CAAC;QACxC,MAAMC,gBAAgB,CAAC;QAEvB,KAAK,MAAMC,SAASL,OAAQ;YACxB,MAAMM,SAASV,cAAc,GAAG,CAACW,iBAAiBF;YAClD,IAAI,CAACC,QACD;YAKJ,IAAI,CAACD,MAAM,OAAO,EACd,MAAM,IAAIG,MACN,+FACA,kBACA;gBACIH;YACJ;YAIR,MAAMI,MACFhB,AAAiB,aAAjBA,eAA4Ba,OAAO,MAAM,GAAGA,OAAO,IAAI;YAC3D,MAAMI,iBAAiBD,KAAK,kBAAkB;YAE9C,IAAIE;YACJ,MAAMC,gBAAgBF,iBAChBA,eAAe;gBACXX;gBACAL;gBACAC;gBACAU;gBACAR;gBACAD;YACJ,KACA;YAMN,IAAIgB,AAAkB,UAAlBA,eACA;
|
|
1
|
+
{"version":3,"file":"graphql/schema/createFieldResolvers.js","sources":["../../../src/graphql/schema/createFieldResolvers.ts"],"sourcesContent":["import set from \"lodash/set.js\";\nimport type { Resolvers } from \"@webiny/handler-graphql/types.js\";\nimport WebinyError from \"@webiny/error\";\nimport type { ApiEndpoint, CmsContext, CmsModel, CmsModelField } from \"~/types/index.js\";\nimport { entryFieldFromStorageTransform } from \"~/utils/entryStorage.js\";\nimport { getBaseFieldType } from \"~/utils/getBaseFieldType.js\";\nimport type {\n CmsModelFieldToGraphQL,\n CmsModelFieldToGraphQLRegistry\n} from \"~/features/graphql/index.js\";\n\ninterface CreateFieldResolvers {\n graphQLType: string;\n fields: CmsModelField[];\n isRoot: boolean;\n extraResolvers?: Resolvers<any>;\n}\n\ninterface CreateFieldResolversFactoryParams {\n endpointType: ApiEndpoint;\n models: CmsModel[];\n model: CmsModel;\n fieldRegistry: CmsModelFieldToGraphQLRegistry.Interface;\n}\n\n/**\n * We use a factory to avoid passing the parameters for recursive invocations.\n * This way they will always be in the function scope, and we can only pass \"fields\".\n */\nexport const createFieldResolversFactory = (factoryParams: CreateFieldResolversFactoryParams) => {\n const { endpointType, models, model, fieldRegistry } = factoryParams;\n return function createFieldResolvers(params: CreateFieldResolvers) {\n const { graphQLType, fields, isRoot = false, extraResolvers = {} } = params;\n\n const fieldResolvers: Resolvers<any> = {};\n const typeResolvers = {};\n\n for (const field of fields) {\n const plugin = fieldRegistry.get(getBaseFieldType(field));\n if (!plugin) {\n continue;\n }\n /**\n * Field that is passed into this factory MUST have fieldId, so filter it before the method call.\n */\n if (!field.fieldId) {\n throw new WebinyError(\n \"Field is missing an `fieldId`. Cannot process field without the `fieldId` in the resolvers.\",\n \"FIELD_ID_ERROR\",\n {\n field\n }\n );\n }\n\n const api: CmsModelFieldToGraphQL.ReadApi | CmsModelFieldToGraphQL.ManageApi =\n endpointType === \"manage\" ? plugin.manage : plugin.read;\n const createResolver = api?.createResolver || null;\n\n let resolver: any;\n const fieldResolver = createResolver\n ? createResolver({\n graphQLType,\n models,\n model,\n field,\n createFieldResolvers,\n fieldRegistry\n })\n : null;\n\n /**\n * When fieldResolver is false it will completely skip adding field fieldId into the resolvers.\n * This is to fix the breaking of GraphQL schema.\n */\n if (fieldResolver === false) {\n continue;\n } else if (typeof fieldResolver === \"function\") {\n resolver = fieldResolver;\n } else if (fieldResolver) {\n resolver = fieldResolver.resolver;\n Object.assign(typeResolvers, fieldResolver.typeResolvers);\n }\n\n const { fieldId } = field;\n /**\n * Figure out a better way to extract value from parent.\n * // TODO fix\n */\n const getValue = (parent: any) => {\n if (!parent?.values || !parent?.values[fieldId]) {\n return {\n isRoot: false,\n value: parent?.[fieldId]\n };\n }\n return {\n isRoot: true,\n value: parent.values[fieldId]\n };\n };\n\n fieldResolvers[fieldId] = async (parent, args, context: CmsContext, info) => {\n /**\n * This is required because due to ref field can be requested without the populated data.\n * At that point there is no .values no fieldId property on the parent\n */\n const { isRoot: valueIsRoot, value } = getValue(parent);\n if (value === undefined) {\n return undefined;\n }\n // Get transformed value (eg. data decompression)\n const transformedValue = await entryFieldFromStorageTransform({\n context,\n model,\n field,\n value\n });\n\n set(\n valueIsRoot && parent.values ? parent.values : parent,\n fieldId,\n transformedValue\n );\n\n if (!resolver) {\n return valueIsRoot && parent.values[fieldId]\n ? parent.values[fieldId]\n : parent[fieldId];\n }\n\n return await resolver(valueIsRoot ? parent.values : parent, args, context, info);\n };\n }\n\n /**\n * Difference between root and non-root (object and dz, etc... fields) is that root has a values wrapper.\n * Subtypes must not have it.\n */\n if (!isRoot) {\n return {\n [graphQLType]: {\n ...fieldResolvers,\n ...extraResolvers\n },\n ...typeResolvers\n };\n }\n\n return {\n [graphQLType]: {\n ...extraResolvers\n },\n [`${graphQLType}Values`]: fieldResolvers,\n ...typeResolvers\n };\n };\n};\n"],"names":["createFieldResolversFactory","factoryParams","endpointType","models","model","fieldRegistry","createFieldResolvers","params","graphQLType","fields","isRoot","extraResolvers","fieldResolvers","typeResolvers","field","plugin","getBaseFieldType","WebinyError","api","createResolver","resolver","fieldResolver","Object","fieldId","getValue","parent","args","context","info","valueIsRoot","value","undefined","transformedValue","entryFieldFromStorageTransform","set"],"mappings":";;;;AA6BO,MAAMA,8BAA8B,CAACC;IACxC,MAAM,EAAEC,YAAY,EAAEC,MAAM,EAAEC,KAAK,EAAEC,aAAa,EAAE,GAAGJ;IACvD,OAAO,SAASK,qBAAqBC,MAA4B;QAC7D,MAAM,EAAEC,WAAW,EAAEC,MAAM,EAAEC,SAAS,KAAK,EAAEC,iBAAiB,CAAC,CAAC,EAAE,GAAGJ;QAErE,MAAMK,iBAAiC,CAAC;QACxC,MAAMC,gBAAgB,CAAC;QAEvB,KAAK,MAAMC,SAASL,OAAQ;YACxB,MAAMM,SAASV,cAAc,GAAG,CAACW,iBAAiBF;YAClD,IAAI,CAACC,QACD;YAKJ,IAAI,CAACD,MAAM,OAAO,EACd,MAAM,IAAIG,MACN,+FACA,kBACA;gBACIH;YACJ;YAIR,MAAMI,MACFhB,AAAiB,aAAjBA,eAA4Ba,OAAO,MAAM,GAAGA,OAAO,IAAI;YAC3D,MAAMI,iBAAiBD,KAAK,kBAAkB;YAE9C,IAAIE;YACJ,MAAMC,gBAAgBF,iBAChBA,eAAe;gBACXX;gBACAL;gBACAC;gBACAU;gBACAR;gBACAD;YACJ,KACA;YAMN,IAAIgB,AAAkB,UAAlBA,eACA;iBACG,IAAI,AAAyB,cAAzB,OAAOA,eACdD,WAAWC;iBACR,IAAIA,eAAe;gBACtBD,WAAWC,cAAc,QAAQ;gBACjCC,OAAO,MAAM,CAACT,eAAeQ,cAAc,aAAa;YAC5D;YAEA,MAAM,EAAEE,OAAO,EAAE,GAAGT;YAKpB,MAAMU,WAAW,CAACC;gBACd,IAAI,CAACA,QAAQ,UAAU,CAACA,QAAQ,MAAM,CAACF,QAAQ,EAC3C,OAAO;oBACH,QAAQ;oBACR,OAAOE,QAAQ,CAACF,QAAQ;gBAC5B;gBAEJ,OAAO;oBACH,QAAQ;oBACR,OAAOE,OAAO,MAAM,CAACF,QAAQ;gBACjC;YACJ;YAEAX,cAAc,CAACW,QAAQ,GAAG,OAAOE,QAAQC,MAAMC,SAAqBC;gBAKhE,MAAM,EAAE,QAAQC,WAAW,EAAEC,KAAK,EAAE,GAAGN,SAASC;gBAChD,IAAIK,AAAUC,WAAVD,OACA;gBAGJ,MAAME,mBAAmB,MAAMC,+BAA+B;oBAC1DN;oBACAvB;oBACAU;oBACAgB;gBACJ;gBAEAI,IACIL,eAAeJ,OAAO,MAAM,GAAGA,OAAO,MAAM,GAAGA,QAC/CF,SACAS;gBAGJ,IAAI,CAACZ,UACD,OAAOS,eAAeJ,OAAO,MAAM,CAACF,QAAQ,GACtCE,OAAO,MAAM,CAACF,QAAQ,GACtBE,MAAM,CAACF,QAAQ;gBAGzB,OAAO,MAAMH,SAASS,cAAcJ,OAAO,MAAM,GAAGA,QAAQC,MAAMC,SAASC;YAC/E;QACJ;QAMA,IAAI,CAAClB,QACD,OAAO;YACH,CAACF,YAAY,EAAE;gBACX,GAAGI,cAAc;gBACjB,GAAGD,cAAc;YACrB;YACA,GAAGE,aAAa;QACpB;QAGJ,OAAO;YACH,CAACL,YAAY,EAAE;gBACX,GAAGG,cAAc;YACrB;YACA,CAAC,GAAGH,YAAY,MAAM,CAAC,CAAC,EAAEI;YAC1B,GAAGC,aAAa;QACpB;IACJ;AACJ"}
|