@strapi/core 0.0.0-next.ce5699024a72ea224891438d5bbe39f904ec6774 → 0.0.0-next.ce8ed0c8aa03361c3009f41af96f742be028ffd9
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.
Potentially problematic release.
This version of @strapi/core might be problematic. Click here for more details.
- package/dist/Strapi.d.ts +1 -0
- package/dist/Strapi.d.ts.map +1 -1
- package/dist/Strapi.js +24 -5
- package/dist/Strapi.js.map +1 -1
- package/dist/Strapi.mjs +24 -5
- package/dist/Strapi.mjs.map +1 -1
- package/dist/configuration/config-loader.js.map +1 -1
- package/dist/configuration/config-loader.mjs.map +1 -1
- package/dist/configuration/index.d.ts +1 -0
- package/dist/configuration/index.d.ts.map +1 -1
- package/dist/configuration/index.js +1 -0
- package/dist/configuration/index.js.map +1 -1
- package/dist/configuration/index.mjs +1 -0
- package/dist/configuration/index.mjs.map +1 -1
- package/dist/configuration/urls.d.ts.map +1 -1
- package/dist/configuration/urls.js +13 -4
- package/dist/configuration/urls.js.map +1 -1
- package/dist/configuration/urls.mjs +13 -4
- package/dist/configuration/urls.mjs.map +1 -1
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -0
- package/dist/constants.mjs +4 -0
- package/dist/constants.mjs.map +1 -0
- package/dist/container.js.map +1 -1
- package/dist/container.mjs.map +1 -1
- package/dist/core-api/controller/index.d.ts.map +1 -1
- package/dist/core-api/controller/index.js +2 -1
- package/dist/core-api/controller/index.js.map +1 -1
- package/dist/core-api/controller/index.mjs +2 -1
- package/dist/core-api/controller/index.mjs.map +1 -1
- package/dist/core-api/controller/transform.d.ts +3 -2
- package/dist/core-api/controller/transform.d.ts.map +1 -1
- package/dist/core-api/controller/transform.js +13 -3
- package/dist/core-api/controller/transform.js.map +1 -1
- package/dist/core-api/controller/transform.mjs +13 -3
- package/dist/core-api/controller/transform.mjs.map +1 -1
- package/dist/core-api/routes/index.d.ts +4 -22
- package/dist/core-api/routes/index.d.ts.map +1 -1
- package/dist/core-api/routes/index.js +150 -8
- package/dist/core-api/routes/index.js.map +1 -1
- package/dist/core-api/routes/index.mjs +131 -8
- package/dist/core-api/routes/index.mjs.map +1 -1
- package/dist/core-api/routes/validation/attributes.d.ts +244 -0
- package/dist/core-api/routes/validation/attributes.d.ts.map +1 -0
- package/dist/core-api/routes/validation/attributes.js +560 -0
- package/dist/core-api/routes/validation/attributes.js.map +1 -0
- package/dist/core-api/routes/validation/attributes.mjs +521 -0
- package/dist/core-api/routes/validation/attributes.mjs.map +1 -0
- package/dist/core-api/routes/validation/common.d.ts +105 -0
- package/dist/core-api/routes/validation/common.d.ts.map +1 -0
- package/dist/core-api/routes/validation/common.js +116 -0
- package/dist/core-api/routes/validation/common.js.map +1 -0
- package/dist/core-api/routes/validation/common.mjs +95 -0
- package/dist/core-api/routes/validation/common.mjs.map +1 -0
- package/dist/core-api/routes/validation/component.d.ts +34 -0
- package/dist/core-api/routes/validation/component.d.ts.map +1 -0
- package/dist/core-api/routes/validation/component.js +45 -0
- package/dist/core-api/routes/validation/component.js.map +1 -0
- package/dist/core-api/routes/validation/component.mjs +43 -0
- package/dist/core-api/routes/validation/component.mjs.map +1 -0
- package/dist/core-api/routes/validation/constants.d.ts +8 -0
- package/dist/core-api/routes/validation/constants.d.ts.map +1 -0
- package/dist/core-api/routes/validation/constants.js +18 -0
- package/dist/core-api/routes/validation/constants.js.map +1 -0
- package/dist/core-api/routes/validation/constants.mjs +16 -0
- package/dist/core-api/routes/validation/constants.mjs.map +1 -0
- package/dist/core-api/routes/validation/content-type.d.ts +128 -0
- package/dist/core-api/routes/validation/content-type.d.ts.map +1 -0
- package/dist/core-api/routes/validation/content-type.js +201 -0
- package/dist/core-api/routes/validation/content-type.js.map +1 -0
- package/dist/core-api/routes/validation/content-type.mjs +180 -0
- package/dist/core-api/routes/validation/content-type.mjs.map +1 -0
- package/dist/core-api/routes/validation/index.d.ts +5 -0
- package/dist/core-api/routes/validation/index.d.ts.map +1 -0
- package/dist/core-api/routes/validation/mappers.d.ts +105 -0
- package/dist/core-api/routes/validation/mappers.d.ts.map +1 -0
- package/dist/core-api/routes/validation/mappers.js +273 -0
- package/dist/core-api/routes/validation/mappers.js.map +1 -0
- package/dist/core-api/routes/validation/mappers.mjs +249 -0
- package/dist/core-api/routes/validation/mappers.mjs.map +1 -0
- package/dist/core-api/routes/validation/utils.d.ts +47 -0
- package/dist/core-api/routes/validation/utils.d.ts.map +1 -0
- package/dist/core-api/routes/validation/utils.js +128 -0
- package/dist/core-api/routes/validation/utils.js.map +1 -0
- package/dist/core-api/routes/validation/utils.mjs +106 -0
- package/dist/core-api/routes/validation/utils.mjs.map +1 -0
- package/dist/core-api/service/collection-type.js.map +1 -1
- package/dist/core-api/service/collection-type.mjs.map +1 -1
- package/dist/core-api/service/single-type.js.map +1 -1
- package/dist/core-api/service/single-type.mjs.map +1 -1
- package/dist/domain/content-type/index.d.ts.map +1 -1
- package/dist/domain/content-type/index.js +17 -1
- package/dist/domain/content-type/index.js.map +1 -1
- package/dist/domain/content-type/index.mjs +17 -1
- package/dist/domain/content-type/index.mjs.map +1 -1
- package/dist/domain/module/index.d.ts.map +1 -1
- package/dist/domain/module/index.js +3 -0
- package/dist/domain/module/index.js.map +1 -1
- package/dist/domain/module/index.mjs +3 -0
- package/dist/domain/module/index.mjs.map +1 -1
- package/dist/ee/index.d.ts +6 -0
- package/dist/ee/index.d.ts.map +1 -1
- package/dist/ee/index.js +29 -3
- package/dist/ee/index.js.map +1 -1
- package/dist/ee/index.mjs +30 -4
- package/dist/ee/index.mjs.map +1 -1
- package/dist/ee/license.d.ts +3 -1
- package/dist/ee/license.d.ts.map +1 -1
- package/dist/ee/license.js +9 -4
- package/dist/ee/license.js.map +1 -1
- package/dist/ee/license.mjs +10 -6
- package/dist/ee/license.mjs.map +1 -1
- package/dist/factories.d.ts +3 -1
- package/dist/factories.d.ts.map +1 -1
- package/dist/factories.js +10 -2
- package/dist/factories.js.map +1 -1
- package/dist/factories.mjs +10 -3
- package/dist/factories.mjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/dist/loaders/apis.js.map +1 -1
- package/dist/loaders/apis.mjs.map +1 -1
- package/dist/loaders/components.js.map +1 -1
- package/dist/loaders/components.mjs.map +1 -1
- package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
- package/dist/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
- package/dist/loaders/plugins/index.js +1 -1
- package/dist/loaders/plugins/index.js.map +1 -1
- package/dist/loaders/plugins/index.mjs +1 -1
- package/dist/loaders/plugins/index.mjs.map +1 -1
- package/dist/loaders/src-index.js.map +1 -1
- package/dist/loaders/src-index.mjs.map +1 -1
- package/dist/middlewares/cors.d.ts +9 -1
- package/dist/middlewares/cors.d.ts.map +1 -1
- package/dist/middlewares/cors.js +39 -17
- package/dist/middlewares/cors.js.map +1 -1
- package/dist/middlewares/cors.mjs +39 -18
- package/dist/middlewares/cors.mjs.map +1 -1
- package/dist/middlewares/logger.js.map +1 -1
- package/dist/middlewares/logger.mjs.map +1 -1
- package/dist/middlewares/response-time.js.map +1 -1
- package/dist/middlewares/response-time.mjs.map +1 -1
- package/dist/middlewares/security.d.ts.map +1 -1
- package/dist/middlewares/security.js +2 -15
- package/dist/middlewares/security.js.map +1 -1
- package/dist/middlewares/security.mjs +2 -15
- package/dist/middlewares/security.mjs.map +1 -1
- package/dist/migrations/first-published-at.d.ts +4 -0
- package/dist/migrations/first-published-at.d.ts.map +1 -0
- package/dist/migrations/first-published-at.js +51 -0
- package/dist/migrations/first-published-at.js.map +1 -0
- package/dist/migrations/first-published-at.mjs +49 -0
- package/dist/migrations/first-published-at.mjs.map +1 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +5 -0
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/index.mjs +5 -0
- package/dist/migrations/index.mjs.map +1 -1
- package/dist/package.json.js +20 -15
- package/dist/package.json.js.map +1 -1
- package/dist/package.json.mjs +20 -15
- package/dist/package.json.mjs.map +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +2 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/index.mjs +2 -0
- package/dist/providers/index.mjs.map +1 -1
- package/dist/providers/session-manager.d.ts +3 -0
- package/dist/providers/session-manager.d.ts.map +1 -0
- package/dist/providers/session-manager.js +23 -0
- package/dist/providers/session-manager.js.map +1 -0
- package/dist/providers/session-manager.mjs +21 -0
- package/dist/providers/session-manager.mjs.map +1 -0
- package/dist/registries/apis.js.map +1 -1
- package/dist/registries/apis.mjs.map +1 -1
- package/dist/registries/custom-fields.js.map +1 -1
- package/dist/registries/custom-fields.mjs.map +1 -1
- package/dist/registries/namespace.js.map +1 -1
- package/dist/registries/namespace.mjs.map +1 -1
- package/dist/registries/plugins.js.map +1 -1
- package/dist/registries/plugins.mjs.map +1 -1
- package/dist/registries/policies.js.map +1 -1
- package/dist/registries/policies.mjs.map +1 -1
- package/dist/services/config.js.map +1 -1
- package/dist/services/config.mjs.map +1 -1
- package/dist/services/content-api/index.d.ts +1 -1
- package/dist/services/content-api/index.d.ts.map +1 -1
- package/dist/services/content-api/index.js +1 -1
- package/dist/services/content-api/index.js.map +1 -1
- package/dist/services/content-api/index.mjs +2 -2
- package/dist/services/content-api/index.mjs.map +1 -1
- package/dist/services/content-api/permissions/index.js.map +1 -1
- package/dist/services/content-api/permissions/index.mjs.map +1 -1
- package/dist/services/content-source-maps.d.ts +13 -0
- package/dist/services/content-source-maps.d.ts.map +1 -0
- package/dist/services/content-source-maps.js +108 -0
- package/dist/services/content-source-maps.js.map +1 -0
- package/dist/services/content-source-maps.mjs +106 -0
- package/dist/services/content-source-maps.mjs.map +1 -0
- package/dist/services/core-store.d.ts +2 -2
- package/dist/services/core-store.d.ts.map +1 -1
- package/dist/services/core-store.js.map +1 -1
- package/dist/services/core-store.mjs.map +1 -1
- package/dist/services/document-service/components.d.ts +31 -1
- package/dist/services/document-service/components.d.ts.map +1 -1
- package/dist/services/document-service/components.js +109 -0
- package/dist/services/document-service/components.js.map +1 -1
- package/dist/services/document-service/components.mjs +107 -1
- package/dist/services/document-service/components.mjs.map +1 -1
- package/dist/services/document-service/entries.d.ts.map +1 -1
- package/dist/services/document-service/entries.js +42 -0
- package/dist/services/document-service/entries.js.map +1 -1
- package/dist/services/document-service/entries.mjs +43 -1
- package/dist/services/document-service/entries.mjs.map +1 -1
- package/dist/services/document-service/first-published-at.d.ts +7 -0
- package/dist/services/document-service/first-published-at.d.ts.map +1 -0
- package/dist/services/document-service/first-published-at.js +31 -0
- package/dist/services/document-service/first-published-at.js.map +1 -0
- package/dist/services/document-service/first-published-at.mjs +28 -0
- package/dist/services/document-service/first-published-at.mjs.map +1 -0
- package/dist/services/document-service/internationalization.d.ts +6 -1
- package/dist/services/document-service/internationalization.d.ts.map +1 -1
- package/dist/services/document-service/internationalization.js +32 -0
- package/dist/services/document-service/internationalization.js.map +1 -1
- package/dist/services/document-service/internationalization.mjs +32 -1
- package/dist/services/document-service/internationalization.mjs.map +1 -1
- package/dist/services/document-service/repository.d.ts.map +1 -1
- package/dist/services/document-service/repository.js +17 -9
- package/dist/services/document-service/repository.js.map +1 -1
- package/dist/services/document-service/repository.mjs +19 -11
- package/dist/services/document-service/repository.mjs.map +1 -1
- package/dist/services/document-service/transform/fields.js.map +1 -1
- package/dist/services/document-service/transform/fields.mjs.map +1 -1
- package/dist/services/document-service/transform/id-map.js.map +1 -1
- package/dist/services/document-service/transform/id-map.mjs.map +1 -1
- package/dist/services/document-service/utils/clean-component-join-table.d.ts +7 -0
- package/dist/services/document-service/utils/clean-component-join-table.d.ts.map +1 -0
- package/dist/services/document-service/utils/clean-component-join-table.js +145 -0
- package/dist/services/document-service/utils/clean-component-join-table.js.map +1 -0
- package/dist/services/document-service/utils/clean-component-join-table.mjs +143 -0
- package/dist/services/document-service/utils/clean-component-join-table.mjs.map +1 -0
- package/dist/services/document-service/utils/unidirectional-relations.d.ts +19 -2
- package/dist/services/document-service/utils/unidirectional-relations.d.ts.map +1 -1
- package/dist/services/document-service/utils/unidirectional-relations.js +21 -6
- package/dist/services/document-service/utils/unidirectional-relations.js.map +1 -1
- package/dist/services/document-service/utils/unidirectional-relations.mjs +21 -6
- package/dist/services/document-service/utils/unidirectional-relations.mjs.map +1 -1
- package/dist/services/entity-service/index.js.map +1 -1
- package/dist/services/entity-service/index.mjs.map +1 -1
- package/dist/services/entity-validator/blocks-validator.js.map +1 -1
- package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
- package/dist/services/entity-validator/index.d.ts.map +1 -1
- package/dist/services/entity-validator/index.js +9 -0
- package/dist/services/entity-validator/index.js.map +1 -1
- package/dist/services/entity-validator/index.mjs +9 -0
- package/dist/services/entity-validator/index.mjs.map +1 -1
- package/dist/services/entity-validator/validators.d.ts +1 -0
- package/dist/services/entity-validator/validators.d.ts.map +1 -1
- package/dist/services/entity-validator/validators.js +3 -0
- package/dist/services/entity-validator/validators.js.map +1 -1
- package/dist/services/entity-validator/validators.mjs +3 -0
- package/dist/services/entity-validator/validators.mjs.map +1 -1
- package/dist/services/metrics/admin-user-hash.d.ts.map +1 -1
- package/dist/services/metrics/admin-user-hash.js.map +1 -1
- package/dist/services/metrics/admin-user-hash.mjs.map +1 -1
- package/dist/services/metrics/index.d.ts +1 -1
- package/dist/services/metrics/index.d.ts.map +1 -1
- package/dist/services/metrics/index.js +11 -9
- package/dist/services/metrics/index.js.map +1 -1
- package/dist/services/metrics/index.mjs +11 -9
- package/dist/services/metrics/index.mjs.map +1 -1
- package/dist/services/metrics/middleware.d.ts +2 -1
- package/dist/services/metrics/middleware.d.ts.map +1 -1
- package/dist/services/metrics/middleware.js +2 -2
- package/dist/services/metrics/middleware.js.map +1 -1
- package/dist/services/metrics/middleware.mjs +2 -2
- package/dist/services/metrics/middleware.mjs.map +1 -1
- package/dist/services/metrics/sender.d.ts.map +1 -1
- package/dist/services/metrics/sender.js +7 -6
- package/dist/services/metrics/sender.js.map +1 -1
- package/dist/services/metrics/sender.mjs +8 -7
- package/dist/services/metrics/sender.mjs.map +1 -1
- package/dist/services/server/compose-endpoint.js.map +1 -1
- package/dist/services/server/compose-endpoint.mjs.map +1 -1
- package/dist/services/server/index.js.map +1 -1
- package/dist/services/server/index.mjs.map +1 -1
- package/dist/services/server/middleware.js.map +1 -1
- package/dist/services/server/middleware.mjs.map +1 -1
- package/dist/services/server/register-routes.js +22 -2
- package/dist/services/server/register-routes.js.map +1 -1
- package/dist/services/server/register-routes.mjs +22 -2
- package/dist/services/server/register-routes.mjs.map +1 -1
- package/dist/services/server/routing.d.ts +10 -0
- package/dist/services/server/routing.d.ts.map +1 -1
- package/dist/services/server/routing.js +7 -1
- package/dist/services/server/routing.js.map +1 -1
- package/dist/services/server/routing.mjs +7 -1
- package/dist/services/server/routing.mjs.map +1 -1
- package/dist/services/session-manager.d.ts +167 -0
- package/dist/services/session-manager.d.ts.map +1 -0
- package/dist/services/session-manager.js +529 -0
- package/dist/services/session-manager.js.map +1 -0
- package/dist/services/session-manager.mjs +526 -0
- package/dist/services/session-manager.mjs.map +1 -0
- package/dist/services/utils/conditional-fields.d.ts +3 -0
- package/dist/services/utils/conditional-fields.d.ts.map +1 -0
- package/dist/services/utils/conditional-fields.js +22 -0
- package/dist/services/utils/conditional-fields.js.map +1 -0
- package/dist/services/utils/conditional-fields.mjs +20 -0
- package/dist/services/utils/conditional-fields.mjs.map +1 -0
- package/dist/services/webhook-runner.js.map +1 -1
- package/dist/services/webhook-runner.mjs.map +1 -1
- package/dist/services/worker-queue.js.map +1 -1
- package/dist/services/worker-queue.mjs.map +1 -1
- package/dist/utils/fetch.d.ts +5 -1
- package/dist/utils/fetch.d.ts.map +1 -1
- package/dist/utils/fetch.js +8 -4
- package/dist/utils/fetch.js.map +1 -1
- package/dist/utils/fetch.mjs +8 -4
- package/dist/utils/fetch.mjs.map +1 -1
- package/dist/utils/filepath-to-prop-path.js.map +1 -1
- package/dist/utils/filepath-to-prop-path.mjs.map +1 -1
- package/dist/utils/load-config-file.js.map +1 -1
- package/dist/utils/load-config-file.mjs.map +1 -1
- package/dist/utils/startup-logger.js.map +1 -1
- package/dist/utils/startup-logger.mjs.map +1 -1
- package/dist/utils/transform-content-types-to-models.d.ts +197 -0
- package/dist/utils/transform-content-types-to-models.d.ts.map +1 -1
- package/package.json +20 -15
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clean-component-join-table.mjs","sources":["../../../../src/services/document-service/utils/clean-component-join-table.ts"],"sourcesContent":["import type { Database } from '@strapi/database';\nimport type { Schema } from '@strapi/types';\nimport { findComponentParent, getParentSchemasForComponent } from '../components';\n\n/**\n * Cleans ghost relations with publication state mismatches from a join table\n * Uses schema-based draft/publish checking like prevention fix\n */\nexport const cleanComponentJoinTable = async (\n db: Database,\n joinTableName: string,\n relation: any,\n sourceModel: any\n): Promise<number> => {\n try {\n // Get the target model metadata\n const targetModel = db.metadata.get(relation.target);\n if (!targetModel) {\n db.logger.debug(`Target model ${relation.target} not found, skipping ${joinTableName}`);\n return 0;\n }\n\n // Check if source supports draft/publish, if it doesnt it should contain duplicate states\n const sourceContentType = strapi.contentTypes[sourceModel.uid];\n // It could be a model, which does not have the draftAndPublish option\n const sourceSupportsDraftPublish = sourceContentType?.options?.draftAndPublish;\n\n if (sourceContentType && !sourceSupportsDraftPublish) {\n return 0;\n }\n\n // Check if target supports draft/publish using schema-based approach (like prevention fix)\n const targetContentType =\n strapi.contentTypes[relation.target as keyof typeof strapi.contentTypes];\n const targetSupportsDraftPublish = targetContentType?.options?.draftAndPublish || false;\n\n if (!targetSupportsDraftPublish) {\n return 0;\n }\n\n // Find entries with publication state mismatches\n const ghostEntries = await findPublicationStateMismatches(\n db,\n joinTableName,\n relation,\n targetModel,\n sourceModel\n );\n\n if (ghostEntries.length === 0) {\n return 0;\n }\n\n // Remove ghost entries\n await db.connection(joinTableName).whereIn('id', ghostEntries).del();\n db.logger.debug(\n `Removed ${ghostEntries.length} ghost relations with publication state mismatches from ${joinTableName}`\n );\n\n return ghostEntries.length;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n db.logger.error(`Failed to clean join table \"${joinTableName}\": ${errorMessage}`);\n return 0;\n }\n};\n\nconst findContentTypeParentForComponentInstance = async (\n componentSchema: Schema.Component,\n componentId: number | string\n): Promise<{ uid: string; table: string; parentId: number | string } | null> => {\n // Get the parent schemas that could contain this component\n const parentSchemas = getParentSchemasForComponent(componentSchema);\n if (parentSchemas.length === 0) {\n // No potential parents\n return null;\n }\n\n // Find the actual parent for THIS specific component instance\n const parent = await findComponentParent(componentSchema, componentId, parentSchemas);\n if (!parent) {\n // No parent found for this component instance\n return null;\n }\n\n if (strapi.components[parent.uid as keyof typeof strapi.components]) {\n // If the parent is a component, we need to check its parents recursively\n const parentComponentSchema = strapi.components[parent.uid as keyof typeof strapi.components];\n return findContentTypeParentForComponentInstance(parentComponentSchema, parent.parentId);\n }\n\n if (strapi.contentTypes[parent.uid as keyof typeof strapi.contentTypes]) {\n // Found a content type parent\n return parent;\n }\n\n return null;\n};\n\n/**\n * Finds join table entries with publication state mismatches\n * Uses existing component parent detection from document service\n */\nconst findPublicationStateMismatches = async (\n db: Database,\n joinTableName: string,\n relation: any,\n targetModel: any,\n sourceModel: any\n): Promise<number[]> => {\n try {\n // Get join column names using proper functions (addressing PR feedback)\n const sourceColumn = relation.joinTable.joinColumn.name;\n const targetColumn = relation.joinTable.inverseJoinColumn.name;\n\n // Get all join entries with their target entities\n const query = db\n .connection(joinTableName)\n .select(\n `${joinTableName}.id as join_id`,\n `${joinTableName}.${sourceColumn} as source_id`,\n `${joinTableName}.${targetColumn} as target_id`,\n `${targetModel.tableName}.published_at as target_published_at`\n )\n .leftJoin(\n targetModel.tableName,\n `${joinTableName}.${targetColumn}`,\n `${targetModel.tableName}.id`\n );\n\n const joinEntries = await query;\n\n // Group by source_id to find duplicates pointing to draft/published versions of same entity\n const entriesBySource: { [key: string]: any[] } = {};\n for (const entry of joinEntries) {\n const sourceId = entry.source_id;\n if (!entriesBySource[sourceId]) {\n entriesBySource[sourceId] = [];\n }\n entriesBySource[sourceId].push(entry);\n }\n\n const ghostEntries: number[] = [];\n\n // Check if this is a join table (ends with _lnk)\n const isRelationJoinTable = joinTableName.endsWith('_lnk');\n const isComponentModel =\n !sourceModel.uid?.startsWith('api::') &&\n !sourceModel.uid?.startsWith('plugin::') &&\n sourceModel.uid?.includes('.');\n\n // Check for draft/publish inconsistencies\n for (const [sourceId, entries] of Object.entries(entriesBySource)) {\n // Skip entries with single relations\n if (entries.length <= 1) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // For component join tables, check if THIS specific component instance's parent supports D&P\n if (isRelationJoinTable && isComponentModel) {\n try {\n const componentSchema = strapi.components[sourceModel.uid] as Schema.Component;\n if (!componentSchema) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const parent = await findContentTypeParentForComponentInstance(componentSchema, sourceId);\n if (!parent) {\n continue;\n }\n\n // Check if THIS component instance's parent supports draft/publish\n const parentContentType =\n strapi.contentTypes[parent.uid as keyof typeof strapi.contentTypes];\n if (!parentContentType?.options?.draftAndPublish) {\n // This component instance's parent does NOT support D&P - skip cleanup\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // If we reach here, this component instance's parent DOES support D&P\n // Continue to process this component instance for ghost relations\n } catch (error) {\n // Skip this component instance on error\n // eslint-disable-next-line no-continue\n continue;\n }\n }\n\n // Find ghost relations (same logic as original but with improved parent checking)\n for (const entry of entries) {\n if (entry.target_published_at === null) {\n // This is a draft target - find its published version\n const draftTarget = await db\n .connection(targetModel.tableName)\n .select('document_id')\n .where('id', entry.target_id)\n .first();\n\n if (draftTarget) {\n const publishedVersion = await db\n .connection(targetModel.tableName)\n .select('id', 'document_id')\n .where('document_id', draftTarget.document_id)\n .whereNotNull('published_at')\n .first();\n\n if (publishedVersion) {\n // Check if we also have a relation to the published version\n const publishedRelation = entries.find((e) => e.target_id === publishedVersion.id);\n if (publishedRelation) {\n ghostEntries.push(publishedRelation.join_id);\n }\n }\n }\n }\n }\n }\n\n return ghostEntries;\n } catch (error) {\n return [];\n }\n};\n"],"names":["cleanComponentJoinTable","db","joinTableName","relation","sourceModel","targetModel","metadata","get","target","logger","debug","sourceContentType","strapi","contentTypes","uid","sourceSupportsDraftPublish","options","draftAndPublish","targetContentType","targetSupportsDraftPublish","ghostEntries","findPublicationStateMismatches","length","connection","whereIn","del","error","errorMessage","Error","message","String","findContentTypeParentForComponentInstance","componentSchema","componentId","parentSchemas","getParentSchemasForComponent","parent","findComponentParent","components","parentComponentSchema","parentId","sourceColumn","joinTable","joinColumn","name","targetColumn","inverseJoinColumn","query","select","tableName","leftJoin","joinEntries","entriesBySource","entry","sourceId","source_id","push","isRelationJoinTable","endsWith","isComponentModel","startsWith","includes","entries","Object","parentContentType","target_published_at","draftTarget","where","target_id","first","publishedVersion","document_id","whereNotNull","publishedRelation","find","e","id","join_id"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { UID } from '@strapi/types';
|
|
1
|
+
import type { UID, Schema } from '@strapi/types';
|
|
2
|
+
import type { JoinTable } from '@strapi/database';
|
|
2
3
|
interface LoadContext {
|
|
3
4
|
oldVersions: {
|
|
4
5
|
id: string;
|
|
@@ -9,15 +10,30 @@ interface LoadContext {
|
|
|
9
10
|
locale: string;
|
|
10
11
|
}[];
|
|
11
12
|
}
|
|
13
|
+
interface RelationUpdate {
|
|
14
|
+
joinTable: JoinTable;
|
|
15
|
+
relations: Record<string, any>[];
|
|
16
|
+
}
|
|
17
|
+
interface RelationFilterOptions {
|
|
18
|
+
/**
|
|
19
|
+
* Function to determine if a relation should be propagated to new document versions
|
|
20
|
+
* This replaces the hardcoded component-specific logic
|
|
21
|
+
*/
|
|
22
|
+
shouldPropagateRelation?: (relation: Record<string, any>, model: Schema.Component | Schema.ContentType, trx: any) => Promise<boolean>;
|
|
23
|
+
}
|
|
12
24
|
/**
|
|
13
25
|
* Loads lingering relations that need to be updated when overriding a published or draft entry.
|
|
14
26
|
* This is necessary because the relations are uni-directional and the target entry is not aware of the source entry.
|
|
15
27
|
* This is not the case for bi-directional relations, where the target entry is also linked to the source entry.
|
|
16
28
|
*/
|
|
17
|
-
declare const load: (uid: UID.ContentType, { oldVersions, newVersions }: LoadContext) => Promise<
|
|
29
|
+
declare const load: (uid: UID.ContentType, { oldVersions, newVersions }: LoadContext, options?: RelationFilterOptions) => Promise<RelationUpdate[]>;
|
|
18
30
|
/**
|
|
19
31
|
* Updates uni directional relations to target the right entries when overriding published or draft entries.
|
|
20
32
|
*
|
|
33
|
+
* This function:
|
|
34
|
+
* 1. Creates new relations pointing to the new entry versions
|
|
35
|
+
* 2. Precisely deletes only the old relations being replaced to prevent orphaned links
|
|
36
|
+
*
|
|
21
37
|
* @param oldEntries The old entries that are being overridden
|
|
22
38
|
* @param newEntries The new entries that are overriding the old ones
|
|
23
39
|
* @param oldRelations The relations that were previously loaded with `load` @see load
|
|
@@ -33,4 +49,5 @@ declare const sync: (oldEntries: {
|
|
|
33
49
|
relations: any[];
|
|
34
50
|
}[]) => Promise<void>;
|
|
35
51
|
export { load, sync };
|
|
52
|
+
export type { RelationFilterOptions };
|
|
36
53
|
//# sourceMappingURL=unidirectional-relations.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unidirectional-relations.d.ts","sourceRoot":"","sources":["../../../../src/services/document-service/utils/unidirectional-relations.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"unidirectional-relations.d.ts","sourceRoot":"","sources":["../../../../src/services/document-service/utils/unidirectional-relations.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,UAAU,WAAW;IACnB,WAAW,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9C,WAAW,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC/C;AAED,UAAU,cAAc;IACtB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;CAClC;AAED,UAAU,qBAAqB;IAC7B;;;OAGG;IACH,uBAAuB,CAAC,EAAE,CACxB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,KAAK,EAAE,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,WAAW,EAC5C,GAAG,EAAE,GAAG,KACL,OAAO,CAAC,OAAO,CAAC,CAAC;CACvB;AAED;;;;GAIG;AACH,QAAA,MAAM,IAAI,QACH,IAAI,WAAW,gCACU,WAAW,YAChC,qBAAqB,KAC7B,QAAQ,cAAc,EAAE,CAyG1B,CAAC;AAEF;;;;;;;;;;GAUG;AACH,QAAA,MAAM,IAAI,eACI;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,cAChC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,gBAC9B;IAAE,SAAS,EAAE,GAAG,CAAC;IAAC,SAAS,EAAE,GAAG,EAAE,CAAA;CAAE,EAAE,kBAiCrD,CAAC;AAEF,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACtB,YAAY,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -6,7 +6,7 @@ var fp = require('lodash/fp');
|
|
|
6
6
|
* Loads lingering relations that need to be updated when overriding a published or draft entry.
|
|
7
7
|
* This is necessary because the relations are uni-directional and the target entry is not aware of the source entry.
|
|
8
8
|
* This is not the case for bi-directional relations, where the target entry is also linked to the source entry.
|
|
9
|
-
*/ const load = async (uid, { oldVersions, newVersions })=>{
|
|
9
|
+
*/ const load = async (uid, { oldVersions, newVersions }, options = {})=>{
|
|
10
10
|
const updates = [];
|
|
11
11
|
// Iterate all components and content types to find relations that need to be updated
|
|
12
12
|
await strapi.db.transaction(async ({ trx })=>{
|
|
@@ -53,17 +53,28 @@ var fp = require('lodash/fp');
|
|
|
53
53
|
* create link to new draft version
|
|
54
54
|
*/ if (!model.options?.draftAndPublish) {
|
|
55
55
|
const ids = newVersions.map((entry)=>entry.id);
|
|
56
|
+
// This is the step were we query the join table based on the id of the document
|
|
56
57
|
const newVersionsRelations = await strapi.db.getConnection().select('*').from(joinTable.name).whereIn(targetColumnName, ids).transacting(trx);
|
|
57
|
-
|
|
58
|
+
let versionRelations = newVersionsRelations;
|
|
59
|
+
if (options.shouldPropagateRelation) {
|
|
60
|
+
const relationsToPropagate = [];
|
|
61
|
+
for (const relation of newVersionsRelations){
|
|
62
|
+
if (await options.shouldPropagateRelation(relation, model, trx)) {
|
|
63
|
+
relationsToPropagate.push(relation);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
versionRelations = relationsToPropagate;
|
|
67
|
+
}
|
|
68
|
+
if (versionRelations.length > 0) {
|
|
58
69
|
// when publishing a draft that doesn't have a published version yet,
|
|
59
70
|
// copy the links to the draft over to the published version
|
|
60
71
|
// when discarding a published version, if no drafts exists
|
|
61
|
-
const discardToAdd =
|
|
62
|
-
const
|
|
72
|
+
const discardToAdd = versionRelations.filter((relation)=>{
|
|
73
|
+
const matchingOldVersion = oldVersionsRelations.find((oldRelation)=>{
|
|
63
74
|
return oldRelation[sourceColumnName] === relation[sourceColumnName];
|
|
64
75
|
});
|
|
65
|
-
return !
|
|
66
|
-
}).map(fp.omit(
|
|
76
|
+
return !matchingOldVersion;
|
|
77
|
+
}).map(fp.omit(strapi.db.metadata.identifiers.ID_COLUMN));
|
|
67
78
|
updates.push({
|
|
68
79
|
joinTable,
|
|
69
80
|
relations: discardToAdd
|
|
@@ -78,6 +89,10 @@ var fp = require('lodash/fp');
|
|
|
78
89
|
/**
|
|
79
90
|
* Updates uni directional relations to target the right entries when overriding published or draft entries.
|
|
80
91
|
*
|
|
92
|
+
* This function:
|
|
93
|
+
* 1. Creates new relations pointing to the new entry versions
|
|
94
|
+
* 2. Precisely deletes only the old relations being replaced to prevent orphaned links
|
|
95
|
+
*
|
|
81
96
|
* @param oldEntries The old entries that are being overridden
|
|
82
97
|
* @param newEntries The new entries that are overriding the old ones
|
|
83
98
|
* @param oldRelations The relations that were previously loaded with `load` @see load
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unidirectional-relations.js","sources":["../../../../src/services/document-service/utils/unidirectional-relations.ts"],"sourcesContent":["/* eslint-disable no-continue */\nimport { keyBy, omit } from 'lodash/fp';\n\nimport type { UID, Schema } from '@strapi/types';\n\ninterface LoadContext {\n oldVersions: { id: string; locale: string }[];\n newVersions: { id: string; locale: string }[];\n}\n\n/**\n * Loads lingering relations that need to be updated when overriding a published or draft entry.\n * This is necessary because the relations are uni-directional and the target entry is not aware of the source entry.\n * This is not the case for bi-directional relations, where the target entry is also linked to the source entry.\n */\nconst load = async (uid: UID.ContentType, { oldVersions, newVersions }: LoadContext) => {\n const updates = [] as any;\n\n // Iterate all components and content types to find relations that need to be updated\n await strapi.db.transaction(async ({ trx }) => {\n const contentTypes = Object.values(strapi.contentTypes) as Schema.ContentType[];\n const components = Object.values(strapi.components) as Schema.Component[];\n\n for (const model of [...contentTypes, ...components]) {\n const dbModel = strapi.db.metadata.get(model.uid);\n\n for (const attribute of Object.values(dbModel.attributes) as any) {\n /**\n * Only consider unidirectional relations\n */\n if (\n attribute.type !== 'relation' ||\n attribute.target !== uid ||\n attribute.inversedBy ||\n attribute.mappedBy\n ) {\n continue;\n }\n\n // TODO: joinColumn relations\n const joinTable = attribute.joinTable;\n if (!joinTable) {\n continue;\n }\n\n const { name: sourceColumnName } = joinTable.joinColumn;\n const { name: targetColumnName } = joinTable.inverseJoinColumn;\n\n /**\n * Load all relations that need to be updated\n */\n // NOTE: when the model has draft and publish, we can assume relation are only draft to draft & published to published\n const ids = oldVersions.map((entry) => entry.id);\n\n const oldVersionsRelations = await strapi.db\n .getConnection()\n .select('*')\n .from(joinTable.name)\n .whereIn(targetColumnName, ids)\n .transacting(trx);\n\n if (oldVersionsRelations.length > 0) {\n updates.push({ joinTable, relations: oldVersionsRelations });\n }\n\n /**\n * if publishing\n * if published version exists\n * updated published versions links\n * else\n * create link to newly published version\n *\n * if discarding\n * if published version link exists & not draft version link\n * create link to new draft version\n */\n\n if (!model.options?.draftAndPublish) {\n const ids = newVersions.map((entry) => entry.id);\n\n const newVersionsRelations = await strapi.db\n .getConnection()\n .select('*')\n .from(joinTable.name)\n .whereIn(targetColumnName, ids)\n .transacting(trx);\n\n if (newVersionsRelations.length > 0) {\n // when publishing a draft that doesn't have a published version yet,\n // copy the links to the draft over to the published version\n // when discarding a published version, if no drafts exists\n const discardToAdd = newVersionsRelations\n .filter((relation) => {\n const matchingOldVerion = oldVersionsRelations.find((oldRelation) => {\n return oldRelation[sourceColumnName] === relation[sourceColumnName];\n });\n\n return !matchingOldVerion;\n })\n .map(omit('id'));\n\n updates.push({ joinTable, relations: discardToAdd });\n }\n }\n }\n }\n });\n\n return updates;\n};\n\n/**\n * Updates uni directional relations to target the right entries when overriding published or draft entries.\n *\n * @param oldEntries The old entries that are being overridden\n * @param newEntries The new entries that are overriding the old ones\n * @param oldRelations The relations that were previously loaded with `load` @see load\n */\nconst sync = async (\n oldEntries: { id: string; locale: string }[],\n newEntries: { id: string; locale: string }[],\n oldRelations: { joinTable: any; relations: any[] }[]\n) => {\n /**\n * Create a map of old entry ids to new entry ids\n *\n * Will be used to update the relation target ids\n */\n const newEntryByLocale = keyBy('locale', newEntries);\n const oldEntriesMap = oldEntries.reduce(\n (acc, entry) => {\n const newEntry = newEntryByLocale[entry.locale];\n if (!newEntry) return acc;\n acc[entry.id] = newEntry.id;\n return acc;\n },\n {} as Record<string, string>\n );\n\n await strapi.db.transaction(async ({ trx }) => {\n // Iterate old relations that are deleted and insert the new ones\n for (const { joinTable, relations } of oldRelations) {\n // Update old ids with the new ones\n const column = joinTable.inverseJoinColumn.name;\n\n const newRelations = relations.map((relation) => {\n const newId = oldEntriesMap[relation[column]];\n return { ...relation, [column]: newId };\n });\n\n // Insert those relations into the join table\n await trx.batchInsert(joinTable.name, newRelations, 1000);\n }\n });\n};\n\nexport { load, sync };\n"],"names":["load","uid","oldVersions","newVersions","updates","strapi","db","transaction","trx","contentTypes","Object","values","components","model","dbModel","metadata","get","attribute","attributes","type","target","inversedBy","mappedBy","joinTable","name","sourceColumnName","joinColumn","targetColumnName","inverseJoinColumn","ids","map","entry","id","oldVersionsRelations","getConnection","select","from","whereIn","transacting","length","push","relations","options","draftAndPublish","newVersionsRelations","discardToAdd","filter","relation","matchingOldVerion","find","oldRelation","omit","sync","oldEntries","newEntries","oldRelations","newEntryByLocale","keyBy","oldEntriesMap","reduce","acc","newEntry","locale","column","newRelations","newId","batchInsert"],"mappings":";;;;AAUA;;;;IAKA,MAAMA,OAAO,OAAOC,GAAAA,EAAsB,EAAEC,WAAW,EAAEC,WAAW,EAAe,GAAA;AACjF,IAAA,MAAMC,UAAU,EAAE;;IAGlB,MAAMC,MAAAA,CAAOC,EAAE,CAACC,WAAW,CAAC,OAAO,EAAEC,GAAG,EAAE,GAAA;AACxC,QAAA,MAAMC,YAAeC,GAAAA,MAAAA,CAAOC,MAAM,CAACN,OAAOI,YAAY,CAAA;AACtD,QAAA,MAAMG,UAAaF,GAAAA,MAAAA,CAAOC,MAAM,CAACN,OAAOO,UAAU,CAAA;AAElD,QAAA,KAAK,MAAMC,KAAS,IAAA;AAAIJ,YAAAA,GAAAA,YAAAA;AAAiBG,YAAAA,GAAAA;SAAW,CAAE;YACpD,MAAME,OAAAA,GAAUT,OAAOC,EAAE,CAACS,QAAQ,CAACC,GAAG,CAACH,KAAAA,CAAMZ,GAAG,CAAA;AAEhD,YAAA,KAAK,MAAMgB,SAAaP,IAAAA,MAAAA,CAAOC,MAAM,CAACG,OAAAA,CAAQI,UAAU,CAAU,CAAA;AAChE;;AAEC,YACD,IACED,SAAAA,CAAUE,IAAI,KAAK,cACnBF,SAAUG,CAAAA,MAAM,KAAKnB,GAAAA,IACrBgB,SAAUI,CAAAA,UAAU,IACpBJ,SAAAA,CAAUK,QAAQ,EAClB;AACA,oBAAA;AACF;;gBAGA,MAAMC,SAAAA,GAAYN,UAAUM,SAAS;AACrC,gBAAA,IAAI,CAACA,SAAW,EAAA;AACd,oBAAA;AACF;AAEA,gBAAA,MAAM,EAAEC,IAAMC,EAAAA,gBAAgB,EAAE,GAAGF,UAAUG,UAAU;AACvD,gBAAA,MAAM,EAAEF,IAAMG,EAAAA,gBAAgB,EAAE,GAAGJ,UAAUK,iBAAiB;AAE9D;;AAEC;AAED,gBAAA,MAAMC,MAAM3B,WAAY4B,CAAAA,GAAG,CAAC,CAACC,KAAAA,GAAUA,MAAMC,EAAE,CAAA;gBAE/C,MAAMC,oBAAAA,GAAuB,MAAM5B,MAAOC,CAAAA,EAAE,CACzC4B,aAAa,EAAA,CACbC,MAAM,CAAC,GAAA,CAAA,CACPC,IAAI,CAACb,SAAAA,CAAUC,IAAI,CACnBa,CAAAA,OAAO,CAACV,gBAAkBE,EAAAA,GAAAA,CAAAA,CAC1BS,WAAW,CAAC9B,GAAAA,CAAAA;gBAEf,IAAIyB,oBAAAA,CAAqBM,MAAM,GAAG,CAAG,EAAA;AACnCnC,oBAAAA,OAAAA,CAAQoC,IAAI,CAAC;AAAEjB,wBAAAA,SAAAA;wBAAWkB,SAAWR,EAAAA;AAAqB,qBAAA,CAAA;AAC5D;AAEA;;;;;;;;;;AAUC,YAED,IAAI,CAACpB,KAAM6B,CAAAA,OAAO,EAAEC,eAAiB,EAAA;AACnC,oBAAA,MAAMd,MAAM1B,WAAY2B,CAAAA,GAAG,CAAC,CAACC,KAAAA,GAAUA,MAAMC,EAAE,CAAA;oBAE/C,MAAMY,oBAAAA,GAAuB,MAAMvC,MAAOC,CAAAA,EAAE,CACzC4B,aAAa,EAAA,CACbC,MAAM,CAAC,GAAA,CAAA,CACPC,IAAI,CAACb,SAAAA,CAAUC,IAAI,CACnBa,CAAAA,OAAO,CAACV,gBAAkBE,EAAAA,GAAAA,CAAAA,CAC1BS,WAAW,CAAC9B,GAAAA,CAAAA;oBAEf,IAAIoC,oBAAAA,CAAqBL,MAAM,GAAG,CAAG,EAAA;;;;AAInC,wBAAA,MAAMM,YAAeD,GAAAA,oBAAAA,CAClBE,MAAM,CAAC,CAACC,QAAAA,GAAAA;AACP,4BAAA,MAAMC,iBAAoBf,GAAAA,oBAAAA,CAAqBgB,IAAI,CAAC,CAACC,WAAAA,GAAAA;AACnD,gCAAA,OAAOA,WAAW,CAACzB,gBAAAA,CAAiB,KAAKsB,QAAQ,CAACtB,gBAAiB,CAAA;AACrE,6BAAA,CAAA;AAEA,4BAAA,OAAO,CAACuB,iBAAAA;yBAETlB,CAAAA,CAAAA,GAAG,CAACqB,OAAK,CAAA,IAAA,CAAA,CAAA;AAEZ/C,wBAAAA,OAAAA,CAAQoC,IAAI,CAAC;AAAEjB,4BAAAA,SAAAA;4BAAWkB,SAAWI,EAAAA;AAAa,yBAAA,CAAA;AACpD;AACF;AACF;AACF;AACF,KAAA,CAAA;IAEA,OAAOzC,OAAAA;AACT;AAEA;;;;;;AAMC,IACKgD,MAAAA,IAAAA,GAAO,OACXC,UAAAA,EACAC,UACAC,EAAAA,YAAAA,GAAAA;AAEA;;;;MAKA,MAAMC,gBAAmBC,GAAAA,QAAAA,CAAM,QAAUH,EAAAA,UAAAA,CAAAA;AACzC,IAAA,MAAMI,aAAgBL,GAAAA,UAAAA,CAAWM,MAAM,CACrC,CAACC,GAAK7B,EAAAA,KAAAA,GAAAA;AACJ,QAAA,MAAM8B,QAAWL,GAAAA,gBAAgB,CAACzB,KAAAA,CAAM+B,MAAM,CAAC;QAC/C,IAAI,CAACD,UAAU,OAAOD,GAAAA;AACtBA,QAAAA,GAAG,CAAC7B,KAAMC,CAAAA,EAAE,CAAC,GAAG6B,SAAS7B,EAAE;QAC3B,OAAO4B,GAAAA;AACT,KAAA,EACA,EAAC,CAAA;IAGH,MAAMvD,MAAAA,CAAOC,EAAE,CAACC,WAAW,CAAC,OAAO,EAAEC,GAAG,EAAE,GAAA;;AAExC,QAAA,KAAK,MAAM,EAAEe,SAAS,EAAEkB,SAAS,EAAE,IAAIc,YAAc,CAAA;;AAEnD,YAAA,MAAMQ,MAASxC,GAAAA,SAAAA,CAAUK,iBAAiB,CAACJ,IAAI;AAE/C,YAAA,MAAMwC,YAAevB,GAAAA,SAAAA,CAAUX,GAAG,CAAC,CAACiB,QAAAA,GAAAA;AAClC,gBAAA,MAAMkB,QAAQP,aAAa,CAACX,QAAQ,CAACgB,OAAO,CAAC;gBAC7C,OAAO;AAAE,oBAAA,GAAGhB,QAAQ;AAAE,oBAAA,CAACgB,SAASE;AAAM,iBAAA;AACxC,aAAA,CAAA;;AAGA,YAAA,MAAMzD,IAAI0D,WAAW,CAAC3C,SAAUC,CAAAA,IAAI,EAAEwC,YAAc,EAAA,IAAA,CAAA;AACtD;AACF,KAAA,CAAA;AACF;;;;;"}
|
|
1
|
+
{"version":3,"file":"unidirectional-relations.js","sources":["../../../../src/services/document-service/utils/unidirectional-relations.ts"],"sourcesContent":["/* eslint-disable no-continue */\nimport { keyBy, omit } from 'lodash/fp';\n\nimport type { UID, Schema } from '@strapi/types';\n\nimport type { JoinTable } from '@strapi/database';\n\ninterface LoadContext {\n oldVersions: { id: string; locale: string }[];\n newVersions: { id: string; locale: string }[];\n}\n\ninterface RelationUpdate {\n joinTable: JoinTable;\n relations: Record<string, any>[];\n}\n\ninterface RelationFilterOptions {\n /**\n * Function to determine if a relation should be propagated to new document versions\n * This replaces the hardcoded component-specific logic\n */\n shouldPropagateRelation?: (\n relation: Record<string, any>,\n model: Schema.Component | Schema.ContentType,\n trx: any\n ) => Promise<boolean>;\n}\n\n/**\n * Loads lingering relations that need to be updated when overriding a published or draft entry.\n * This is necessary because the relations are uni-directional and the target entry is not aware of the source entry.\n * This is not the case for bi-directional relations, where the target entry is also linked to the source entry.\n */\nconst load = async (\n uid: UID.ContentType,\n { oldVersions, newVersions }: LoadContext,\n options: RelationFilterOptions = {}\n): Promise<RelationUpdate[]> => {\n const updates: RelationUpdate[] = [];\n\n // Iterate all components and content types to find relations that need to be updated\n await strapi.db.transaction(async ({ trx }) => {\n const contentTypes = Object.values(strapi.contentTypes) as Schema.ContentType[];\n const components = Object.values(strapi.components) as Schema.Component[];\n\n for (const model of [...contentTypes, ...components]) {\n const dbModel = strapi.db.metadata.get(model.uid);\n\n for (const attribute of Object.values(dbModel.attributes) as any) {\n /**\n * Only consider unidirectional relations\n */\n if (\n attribute.type !== 'relation' ||\n attribute.target !== uid ||\n attribute.inversedBy ||\n attribute.mappedBy\n ) {\n continue;\n }\n\n // TODO: joinColumn relations\n const joinTable = attribute.joinTable;\n if (!joinTable) {\n continue;\n }\n\n const { name: sourceColumnName } = joinTable.joinColumn;\n const { name: targetColumnName } = joinTable.inverseJoinColumn;\n\n /**\n * Load all relations that need to be updated\n */\n // NOTE: when the model has draft and publish, we can assume relation are only draft to draft & published to published\n const ids = oldVersions.map((entry) => entry.id);\n\n const oldVersionsRelations = await strapi.db\n .getConnection()\n .select('*')\n .from(joinTable.name)\n .whereIn(targetColumnName, ids)\n .transacting(trx);\n\n if (oldVersionsRelations.length > 0) {\n updates.push({ joinTable, relations: oldVersionsRelations });\n }\n\n /**\n * if publishing\n * if published version exists\n * updated published versions links\n * else\n * create link to newly published version\n *\n * if discarding\n * if published version link exists & not draft version link\n * create link to new draft version\n */\n if (!model.options?.draftAndPublish) {\n const ids = newVersions.map((entry) => entry.id);\n\n // This is the step were we query the join table based on the id of the document\n const newVersionsRelations = await strapi.db\n .getConnection()\n .select('*')\n .from(joinTable.name)\n .whereIn(targetColumnName, ids)\n .transacting(trx);\n\n let versionRelations = newVersionsRelations;\n if (options.shouldPropagateRelation) {\n const relationsToPropagate = [];\n for (const relation of newVersionsRelations) {\n if (await options.shouldPropagateRelation(relation, model, trx)) {\n relationsToPropagate.push(relation);\n }\n }\n versionRelations = relationsToPropagate;\n }\n\n if (versionRelations.length > 0) {\n // when publishing a draft that doesn't have a published version yet,\n // copy the links to the draft over to the published version\n // when discarding a published version, if no drafts exists\n const discardToAdd = versionRelations\n .filter((relation) => {\n const matchingOldVersion = oldVersionsRelations.find((oldRelation) => {\n return oldRelation[sourceColumnName] === relation[sourceColumnName];\n });\n\n return !matchingOldVersion;\n })\n .map(omit(strapi.db.metadata.identifiers.ID_COLUMN));\n\n updates.push({ joinTable, relations: discardToAdd });\n }\n }\n }\n }\n });\n\n return updates;\n};\n\n/**\n * Updates uni directional relations to target the right entries when overriding published or draft entries.\n *\n * This function:\n * 1. Creates new relations pointing to the new entry versions\n * 2. Precisely deletes only the old relations being replaced to prevent orphaned links\n *\n * @param oldEntries The old entries that are being overridden\n * @param newEntries The new entries that are overriding the old ones\n * @param oldRelations The relations that were previously loaded with `load` @see load\n */\nconst sync = async (\n oldEntries: { id: string; locale: string }[],\n newEntries: { id: string; locale: string }[],\n oldRelations: { joinTable: any; relations: any[] }[]\n) => {\n /**\n * Create a map of old entry ids to new entry ids\n *\n * Will be used to update the relation target ids\n */\n const newEntryByLocale = keyBy('locale', newEntries);\n const oldEntriesMap = oldEntries.reduce(\n (acc, entry) => {\n const newEntry = newEntryByLocale[entry.locale];\n if (!newEntry) return acc;\n acc[entry.id] = newEntry.id;\n return acc;\n },\n {} as Record<string, string>\n );\n\n await strapi.db.transaction(async ({ trx }) => {\n // Iterate old relations that are deleted and insert the new ones\n for (const { joinTable, relations } of oldRelations) {\n // Update old ids with the new ones\n const column = joinTable.inverseJoinColumn.name;\n\n const newRelations = relations.map((relation) => {\n const newId = oldEntriesMap[relation[column]];\n return { ...relation, [column]: newId };\n });\n\n // Insert those relations into the join table\n await trx.batchInsert(joinTable.name, newRelations, 1000);\n }\n });\n};\n\nexport { load, sync };\nexport type { RelationFilterOptions };\n"],"names":["load","uid","oldVersions","newVersions","options","updates","strapi","db","transaction","trx","contentTypes","Object","values","components","model","dbModel","metadata","get","attribute","attributes","type","target","inversedBy","mappedBy","joinTable","name","sourceColumnName","joinColumn","targetColumnName","inverseJoinColumn","ids","map","entry","id","oldVersionsRelations","getConnection","select","from","whereIn","transacting","length","push","relations","draftAndPublish","newVersionsRelations","versionRelations","shouldPropagateRelation","relationsToPropagate","relation","discardToAdd","filter","matchingOldVersion","find","oldRelation","omit","identifiers","ID_COLUMN","sync","oldEntries","newEntries","oldRelations","newEntryByLocale","keyBy","oldEntriesMap","reduce","acc","newEntry","locale","column","newRelations","newId","batchInsert"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { omit, keyBy } from 'lodash/fp';
|
|
|
4
4
|
* Loads lingering relations that need to be updated when overriding a published or draft entry.
|
|
5
5
|
* This is necessary because the relations are uni-directional and the target entry is not aware of the source entry.
|
|
6
6
|
* This is not the case for bi-directional relations, where the target entry is also linked to the source entry.
|
|
7
|
-
*/ const load = async (uid, { oldVersions, newVersions })=>{
|
|
7
|
+
*/ const load = async (uid, { oldVersions, newVersions }, options = {})=>{
|
|
8
8
|
const updates = [];
|
|
9
9
|
// Iterate all components and content types to find relations that need to be updated
|
|
10
10
|
await strapi.db.transaction(async ({ trx })=>{
|
|
@@ -51,17 +51,28 @@ import { omit, keyBy } from 'lodash/fp';
|
|
|
51
51
|
* create link to new draft version
|
|
52
52
|
*/ if (!model.options?.draftAndPublish) {
|
|
53
53
|
const ids = newVersions.map((entry)=>entry.id);
|
|
54
|
+
// This is the step were we query the join table based on the id of the document
|
|
54
55
|
const newVersionsRelations = await strapi.db.getConnection().select('*').from(joinTable.name).whereIn(targetColumnName, ids).transacting(trx);
|
|
55
|
-
|
|
56
|
+
let versionRelations = newVersionsRelations;
|
|
57
|
+
if (options.shouldPropagateRelation) {
|
|
58
|
+
const relationsToPropagate = [];
|
|
59
|
+
for (const relation of newVersionsRelations){
|
|
60
|
+
if (await options.shouldPropagateRelation(relation, model, trx)) {
|
|
61
|
+
relationsToPropagate.push(relation);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
versionRelations = relationsToPropagate;
|
|
65
|
+
}
|
|
66
|
+
if (versionRelations.length > 0) {
|
|
56
67
|
// when publishing a draft that doesn't have a published version yet,
|
|
57
68
|
// copy the links to the draft over to the published version
|
|
58
69
|
// when discarding a published version, if no drafts exists
|
|
59
|
-
const discardToAdd =
|
|
60
|
-
const
|
|
70
|
+
const discardToAdd = versionRelations.filter((relation)=>{
|
|
71
|
+
const matchingOldVersion = oldVersionsRelations.find((oldRelation)=>{
|
|
61
72
|
return oldRelation[sourceColumnName] === relation[sourceColumnName];
|
|
62
73
|
});
|
|
63
|
-
return !
|
|
64
|
-
}).map(omit(
|
|
74
|
+
return !matchingOldVersion;
|
|
75
|
+
}).map(omit(strapi.db.metadata.identifiers.ID_COLUMN));
|
|
65
76
|
updates.push({
|
|
66
77
|
joinTable,
|
|
67
78
|
relations: discardToAdd
|
|
@@ -76,6 +87,10 @@ import { omit, keyBy } from 'lodash/fp';
|
|
|
76
87
|
/**
|
|
77
88
|
* Updates uni directional relations to target the right entries when overriding published or draft entries.
|
|
78
89
|
*
|
|
90
|
+
* This function:
|
|
91
|
+
* 1. Creates new relations pointing to the new entry versions
|
|
92
|
+
* 2. Precisely deletes only the old relations being replaced to prevent orphaned links
|
|
93
|
+
*
|
|
79
94
|
* @param oldEntries The old entries that are being overridden
|
|
80
95
|
* @param newEntries The new entries that are overriding the old ones
|
|
81
96
|
* @param oldRelations The relations that were previously loaded with `load` @see load
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unidirectional-relations.mjs","sources":["../../../../src/services/document-service/utils/unidirectional-relations.ts"],"sourcesContent":["/* eslint-disable no-continue */\nimport { keyBy, omit } from 'lodash/fp';\n\nimport type { UID, Schema } from '@strapi/types';\n\ninterface LoadContext {\n oldVersions: { id: string; locale: string }[];\n newVersions: { id: string; locale: string }[];\n}\n\n/**\n * Loads lingering relations that need to be updated when overriding a published or draft entry.\n * This is necessary because the relations are uni-directional and the target entry is not aware of the source entry.\n * This is not the case for bi-directional relations, where the target entry is also linked to the source entry.\n */\nconst load = async (uid: UID.ContentType, { oldVersions, newVersions }: LoadContext) => {\n const updates = [] as any;\n\n // Iterate all components and content types to find relations that need to be updated\n await strapi.db.transaction(async ({ trx }) => {\n const contentTypes = Object.values(strapi.contentTypes) as Schema.ContentType[];\n const components = Object.values(strapi.components) as Schema.Component[];\n\n for (const model of [...contentTypes, ...components]) {\n const dbModel = strapi.db.metadata.get(model.uid);\n\n for (const attribute of Object.values(dbModel.attributes) as any) {\n /**\n * Only consider unidirectional relations\n */\n if (\n attribute.type !== 'relation' ||\n attribute.target !== uid ||\n attribute.inversedBy ||\n attribute.mappedBy\n ) {\n continue;\n }\n\n // TODO: joinColumn relations\n const joinTable = attribute.joinTable;\n if (!joinTable) {\n continue;\n }\n\n const { name: sourceColumnName } = joinTable.joinColumn;\n const { name: targetColumnName } = joinTable.inverseJoinColumn;\n\n /**\n * Load all relations that need to be updated\n */\n // NOTE: when the model has draft and publish, we can assume relation are only draft to draft & published to published\n const ids = oldVersions.map((entry) => entry.id);\n\n const oldVersionsRelations = await strapi.db\n .getConnection()\n .select('*')\n .from(joinTable.name)\n .whereIn(targetColumnName, ids)\n .transacting(trx);\n\n if (oldVersionsRelations.length > 0) {\n updates.push({ joinTable, relations: oldVersionsRelations });\n }\n\n /**\n * if publishing\n * if published version exists\n * updated published versions links\n * else\n * create link to newly published version\n *\n * if discarding\n * if published version link exists & not draft version link\n * create link to new draft version\n */\n\n if (!model.options?.draftAndPublish) {\n const ids = newVersions.map((entry) => entry.id);\n\n const newVersionsRelations = await strapi.db\n .getConnection()\n .select('*')\n .from(joinTable.name)\n .whereIn(targetColumnName, ids)\n .transacting(trx);\n\n if (newVersionsRelations.length > 0) {\n // when publishing a draft that doesn't have a published version yet,\n // copy the links to the draft over to the published version\n // when discarding a published version, if no drafts exists\n const discardToAdd = newVersionsRelations\n .filter((relation) => {\n const matchingOldVerion = oldVersionsRelations.find((oldRelation) => {\n return oldRelation[sourceColumnName] === relation[sourceColumnName];\n });\n\n return !matchingOldVerion;\n })\n .map(omit('id'));\n\n updates.push({ joinTable, relations: discardToAdd });\n }\n }\n }\n }\n });\n\n return updates;\n};\n\n/**\n * Updates uni directional relations to target the right entries when overriding published or draft entries.\n *\n * @param oldEntries The old entries that are being overridden\n * @param newEntries The new entries that are overriding the old ones\n * @param oldRelations The relations that were previously loaded with `load` @see load\n */\nconst sync = async (\n oldEntries: { id: string; locale: string }[],\n newEntries: { id: string; locale: string }[],\n oldRelations: { joinTable: any; relations: any[] }[]\n) => {\n /**\n * Create a map of old entry ids to new entry ids\n *\n * Will be used to update the relation target ids\n */\n const newEntryByLocale = keyBy('locale', newEntries);\n const oldEntriesMap = oldEntries.reduce(\n (acc, entry) => {\n const newEntry = newEntryByLocale[entry.locale];\n if (!newEntry) return acc;\n acc[entry.id] = newEntry.id;\n return acc;\n },\n {} as Record<string, string>\n );\n\n await strapi.db.transaction(async ({ trx }) => {\n // Iterate old relations that are deleted and insert the new ones\n for (const { joinTable, relations } of oldRelations) {\n // Update old ids with the new ones\n const column = joinTable.inverseJoinColumn.name;\n\n const newRelations = relations.map((relation) => {\n const newId = oldEntriesMap[relation[column]];\n return { ...relation, [column]: newId };\n });\n\n // Insert those relations into the join table\n await trx.batchInsert(joinTable.name, newRelations, 1000);\n }\n });\n};\n\nexport { load, sync };\n"],"names":["load","uid","oldVersions","newVersions","updates","strapi","db","transaction","trx","contentTypes","Object","values","components","model","dbModel","metadata","get","attribute","attributes","type","target","inversedBy","mappedBy","joinTable","name","sourceColumnName","joinColumn","targetColumnName","inverseJoinColumn","ids","map","entry","id","oldVersionsRelations","getConnection","select","from","whereIn","transacting","length","push","relations","options","draftAndPublish","newVersionsRelations","discardToAdd","filter","relation","matchingOldVerion","find","oldRelation","omit","sync","oldEntries","newEntries","oldRelations","newEntryByLocale","keyBy","oldEntriesMap","reduce","acc","newEntry","locale","column","newRelations","newId","batchInsert"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"unidirectional-relations.mjs","sources":["../../../../src/services/document-service/utils/unidirectional-relations.ts"],"sourcesContent":["/* eslint-disable no-continue */\nimport { keyBy, omit } from 'lodash/fp';\n\nimport type { UID, Schema } from '@strapi/types';\n\nimport type { JoinTable } from '@strapi/database';\n\ninterface LoadContext {\n oldVersions: { id: string; locale: string }[];\n newVersions: { id: string; locale: string }[];\n}\n\ninterface RelationUpdate {\n joinTable: JoinTable;\n relations: Record<string, any>[];\n}\n\ninterface RelationFilterOptions {\n /**\n * Function to determine if a relation should be propagated to new document versions\n * This replaces the hardcoded component-specific logic\n */\n shouldPropagateRelation?: (\n relation: Record<string, any>,\n model: Schema.Component | Schema.ContentType,\n trx: any\n ) => Promise<boolean>;\n}\n\n/**\n * Loads lingering relations that need to be updated when overriding a published or draft entry.\n * This is necessary because the relations are uni-directional and the target entry is not aware of the source entry.\n * This is not the case for bi-directional relations, where the target entry is also linked to the source entry.\n */\nconst load = async (\n uid: UID.ContentType,\n { oldVersions, newVersions }: LoadContext,\n options: RelationFilterOptions = {}\n): Promise<RelationUpdate[]> => {\n const updates: RelationUpdate[] = [];\n\n // Iterate all components and content types to find relations that need to be updated\n await strapi.db.transaction(async ({ trx }) => {\n const contentTypes = Object.values(strapi.contentTypes) as Schema.ContentType[];\n const components = Object.values(strapi.components) as Schema.Component[];\n\n for (const model of [...contentTypes, ...components]) {\n const dbModel = strapi.db.metadata.get(model.uid);\n\n for (const attribute of Object.values(dbModel.attributes) as any) {\n /**\n * Only consider unidirectional relations\n */\n if (\n attribute.type !== 'relation' ||\n attribute.target !== uid ||\n attribute.inversedBy ||\n attribute.mappedBy\n ) {\n continue;\n }\n\n // TODO: joinColumn relations\n const joinTable = attribute.joinTable;\n if (!joinTable) {\n continue;\n }\n\n const { name: sourceColumnName } = joinTable.joinColumn;\n const { name: targetColumnName } = joinTable.inverseJoinColumn;\n\n /**\n * Load all relations that need to be updated\n */\n // NOTE: when the model has draft and publish, we can assume relation are only draft to draft & published to published\n const ids = oldVersions.map((entry) => entry.id);\n\n const oldVersionsRelations = await strapi.db\n .getConnection()\n .select('*')\n .from(joinTable.name)\n .whereIn(targetColumnName, ids)\n .transacting(trx);\n\n if (oldVersionsRelations.length > 0) {\n updates.push({ joinTable, relations: oldVersionsRelations });\n }\n\n /**\n * if publishing\n * if published version exists\n * updated published versions links\n * else\n * create link to newly published version\n *\n * if discarding\n * if published version link exists & not draft version link\n * create link to new draft version\n */\n if (!model.options?.draftAndPublish) {\n const ids = newVersions.map((entry) => entry.id);\n\n // This is the step were we query the join table based on the id of the document\n const newVersionsRelations = await strapi.db\n .getConnection()\n .select('*')\n .from(joinTable.name)\n .whereIn(targetColumnName, ids)\n .transacting(trx);\n\n let versionRelations = newVersionsRelations;\n if (options.shouldPropagateRelation) {\n const relationsToPropagate = [];\n for (const relation of newVersionsRelations) {\n if (await options.shouldPropagateRelation(relation, model, trx)) {\n relationsToPropagate.push(relation);\n }\n }\n versionRelations = relationsToPropagate;\n }\n\n if (versionRelations.length > 0) {\n // when publishing a draft that doesn't have a published version yet,\n // copy the links to the draft over to the published version\n // when discarding a published version, if no drafts exists\n const discardToAdd = versionRelations\n .filter((relation) => {\n const matchingOldVersion = oldVersionsRelations.find((oldRelation) => {\n return oldRelation[sourceColumnName] === relation[sourceColumnName];\n });\n\n return !matchingOldVersion;\n })\n .map(omit(strapi.db.metadata.identifiers.ID_COLUMN));\n\n updates.push({ joinTable, relations: discardToAdd });\n }\n }\n }\n }\n });\n\n return updates;\n};\n\n/**\n * Updates uni directional relations to target the right entries when overriding published or draft entries.\n *\n * This function:\n * 1. Creates new relations pointing to the new entry versions\n * 2. Precisely deletes only the old relations being replaced to prevent orphaned links\n *\n * @param oldEntries The old entries that are being overridden\n * @param newEntries The new entries that are overriding the old ones\n * @param oldRelations The relations that were previously loaded with `load` @see load\n */\nconst sync = async (\n oldEntries: { id: string; locale: string }[],\n newEntries: { id: string; locale: string }[],\n oldRelations: { joinTable: any; relations: any[] }[]\n) => {\n /**\n * Create a map of old entry ids to new entry ids\n *\n * Will be used to update the relation target ids\n */\n const newEntryByLocale = keyBy('locale', newEntries);\n const oldEntriesMap = oldEntries.reduce(\n (acc, entry) => {\n const newEntry = newEntryByLocale[entry.locale];\n if (!newEntry) return acc;\n acc[entry.id] = newEntry.id;\n return acc;\n },\n {} as Record<string, string>\n );\n\n await strapi.db.transaction(async ({ trx }) => {\n // Iterate old relations that are deleted and insert the new ones\n for (const { joinTable, relations } of oldRelations) {\n // Update old ids with the new ones\n const column = joinTable.inverseJoinColumn.name;\n\n const newRelations = relations.map((relation) => {\n const newId = oldEntriesMap[relation[column]];\n return { ...relation, [column]: newId };\n });\n\n // Insert those relations into the join table\n await trx.batchInsert(joinTable.name, newRelations, 1000);\n }\n });\n};\n\nexport { load, sync };\nexport type { RelationFilterOptions };\n"],"names":["load","uid","oldVersions","newVersions","options","updates","strapi","db","transaction","trx","contentTypes","Object","values","components","model","dbModel","metadata","get","attribute","attributes","type","target","inversedBy","mappedBy","joinTable","name","sourceColumnName","joinColumn","targetColumnName","inverseJoinColumn","ids","map","entry","id","oldVersionsRelations","getConnection","select","from","whereIn","transacting","length","push","relations","draftAndPublish","newVersionsRelations","versionRelations","shouldPropagateRelation","relationsToPropagate","relation","discardToAdd","filter","matchingOldVersion","find","oldRelation","omit","identifiers","ID_COLUMN","sync","oldEntries","newEntries","oldRelations","newEntryByLocale","keyBy","oldEntriesMap","reduce","acc","newEntry","locale","column","newRelations","newId","batchInsert"],"mappings":";;AA6BA;;;;AAIC,IACKA,MAAAA,IAAAA,GAAO,OACXC,GAAAA,EACA,EAAEC,WAAW,EAAEC,WAAW,EAAe,EACzCC,OAAiC,GAAA,EAAE,GAAA;AAEnC,IAAA,MAAMC,UAA4B,EAAE;;IAGpC,MAAMC,MAAAA,CAAOC,EAAE,CAACC,WAAW,CAAC,OAAO,EAAEC,GAAG,EAAE,GAAA;AACxC,QAAA,MAAMC,YAAeC,GAAAA,MAAAA,CAAOC,MAAM,CAACN,OAAOI,YAAY,CAAA;AACtD,QAAA,MAAMG,UAAaF,GAAAA,MAAAA,CAAOC,MAAM,CAACN,OAAOO,UAAU,CAAA;AAElD,QAAA,KAAK,MAAMC,KAAS,IAAA;AAAIJ,YAAAA,GAAAA,YAAAA;AAAiBG,YAAAA,GAAAA;SAAW,CAAE;YACpD,MAAME,OAAAA,GAAUT,OAAOC,EAAE,CAACS,QAAQ,CAACC,GAAG,CAACH,KAAAA,CAAMb,GAAG,CAAA;AAEhD,YAAA,KAAK,MAAMiB,SAAaP,IAAAA,MAAAA,CAAOC,MAAM,CAACG,OAAAA,CAAQI,UAAU,CAAU,CAAA;AAChE;;AAEC,YACD,IACED,SAAAA,CAAUE,IAAI,KAAK,cACnBF,SAAUG,CAAAA,MAAM,KAAKpB,GAAAA,IACrBiB,SAAUI,CAAAA,UAAU,IACpBJ,SAAAA,CAAUK,QAAQ,EAClB;AACA,oBAAA;AACF;;gBAGA,MAAMC,SAAAA,GAAYN,UAAUM,SAAS;AACrC,gBAAA,IAAI,CAACA,SAAW,EAAA;AACd,oBAAA;AACF;AAEA,gBAAA,MAAM,EAAEC,IAAMC,EAAAA,gBAAgB,EAAE,GAAGF,UAAUG,UAAU;AACvD,gBAAA,MAAM,EAAEF,IAAMG,EAAAA,gBAAgB,EAAE,GAAGJ,UAAUK,iBAAiB;AAE9D;;AAEC;AAED,gBAAA,MAAMC,MAAM5B,WAAY6B,CAAAA,GAAG,CAAC,CAACC,KAAAA,GAAUA,MAAMC,EAAE,CAAA;gBAE/C,MAAMC,oBAAAA,GAAuB,MAAM5B,MAAOC,CAAAA,EAAE,CACzC4B,aAAa,EAAA,CACbC,MAAM,CAAC,GAAA,CAAA,CACPC,IAAI,CAACb,SAAAA,CAAUC,IAAI,CACnBa,CAAAA,OAAO,CAACV,gBAAkBE,EAAAA,GAAAA,CAAAA,CAC1BS,WAAW,CAAC9B,GAAAA,CAAAA;gBAEf,IAAIyB,oBAAAA,CAAqBM,MAAM,GAAG,CAAG,EAAA;AACnCnC,oBAAAA,OAAAA,CAAQoC,IAAI,CAAC;AAAEjB,wBAAAA,SAAAA;wBAAWkB,SAAWR,EAAAA;AAAqB,qBAAA,CAAA;AAC5D;AAEA;;;;;;;;;;AAUC,YACD,IAAI,CAACpB,KAAMV,CAAAA,OAAO,EAAEuC,eAAiB,EAAA;AACnC,oBAAA,MAAMb,MAAM3B,WAAY4B,CAAAA,GAAG,CAAC,CAACC,KAAAA,GAAUA,MAAMC,EAAE,CAAA;;oBAG/C,MAAMW,oBAAAA,GAAuB,MAAMtC,MAAOC,CAAAA,EAAE,CACzC4B,aAAa,EAAA,CACbC,MAAM,CAAC,GAAA,CAAA,CACPC,IAAI,CAACb,SAAAA,CAAUC,IAAI,CACnBa,CAAAA,OAAO,CAACV,gBAAkBE,EAAAA,GAAAA,CAAAA,CAC1BS,WAAW,CAAC9B,GAAAA,CAAAA;AAEf,oBAAA,IAAIoC,gBAAmBD,GAAAA,oBAAAA;oBACvB,IAAIxC,OAAAA,CAAQ0C,uBAAuB,EAAE;AACnC,wBAAA,MAAMC,uBAAuB,EAAE;wBAC/B,KAAK,MAAMC,YAAYJ,oBAAsB,CAAA;AAC3C,4BAAA,IAAI,MAAMxC,OAAQ0C,CAAAA,uBAAuB,CAACE,QAAAA,EAAUlC,OAAOL,GAAM,CAAA,EAAA;AAC/DsC,gCAAAA,oBAAAA,CAAqBN,IAAI,CAACO,QAAAA,CAAAA;AAC5B;AACF;wBACAH,gBAAmBE,GAAAA,oBAAAA;AACrB;oBAEA,IAAIF,gBAAAA,CAAiBL,MAAM,GAAG,CAAG,EAAA;;;;AAI/B,wBAAA,MAAMS,YAAeJ,GAAAA,gBAAAA,CAClBK,MAAM,CAAC,CAACF,QAAAA,GAAAA;AACP,4BAAA,MAAMG,kBAAqBjB,GAAAA,oBAAAA,CAAqBkB,IAAI,CAAC,CAACC,WAAAA,GAAAA;AACpD,gCAAA,OAAOA,WAAW,CAAC3B,gBAAAA,CAAiB,KAAKsB,QAAQ,CAACtB,gBAAiB,CAAA;AACrE,6BAAA,CAAA;AAEA,4BAAA,OAAO,CAACyB,kBAAAA;yBAETpB,CAAAA,CAAAA,GAAG,CAACuB,IAAAA,CAAKhD,MAAOC,CAAAA,EAAE,CAACS,QAAQ,CAACuC,WAAW,CAACC,SAAS,CAAA,CAAA;AAEpDnD,wBAAAA,OAAAA,CAAQoC,IAAI,CAAC;AAAEjB,4BAAAA,SAAAA;4BAAWkB,SAAWO,EAAAA;AAAa,yBAAA,CAAA;AACpD;AACF;AACF;AACF;AACF,KAAA,CAAA;IAEA,OAAO5C,OAAAA;AACT;AAEA;;;;;;;;;;AAUC,IACKoD,MAAAA,IAAAA,GAAO,OACXC,UAAAA,EACAC,UACAC,EAAAA,YAAAA,GAAAA;AAEA;;;;MAKA,MAAMC,gBAAmBC,GAAAA,KAAAA,CAAM,QAAUH,EAAAA,UAAAA,CAAAA;AACzC,IAAA,MAAMI,aAAgBL,GAAAA,UAAAA,CAAWM,MAAM,CACrC,CAACC,GAAKjC,EAAAA,KAAAA,GAAAA;AACJ,QAAA,MAAMkC,QAAWL,GAAAA,gBAAgB,CAAC7B,KAAAA,CAAMmC,MAAM,CAAC;QAC/C,IAAI,CAACD,UAAU,OAAOD,GAAAA;AACtBA,QAAAA,GAAG,CAACjC,KAAMC,CAAAA,EAAE,CAAC,GAAGiC,SAASjC,EAAE;QAC3B,OAAOgC,GAAAA;AACT,KAAA,EACA,EAAC,CAAA;IAGH,MAAM3D,MAAAA,CAAOC,EAAE,CAACC,WAAW,CAAC,OAAO,EAAEC,GAAG,EAAE,GAAA;;AAExC,QAAA,KAAK,MAAM,EAAEe,SAAS,EAAEkB,SAAS,EAAE,IAAIkB,YAAc,CAAA;;AAEnD,YAAA,MAAMQ,MAAS5C,GAAAA,SAAAA,CAAUK,iBAAiB,CAACJ,IAAI;AAE/C,YAAA,MAAM4C,YAAe3B,GAAAA,SAAAA,CAAUX,GAAG,CAAC,CAACiB,QAAAA,GAAAA;AAClC,gBAAA,MAAMsB,QAAQP,aAAa,CAACf,QAAQ,CAACoB,OAAO,CAAC;gBAC7C,OAAO;AAAE,oBAAA,GAAGpB,QAAQ;AAAE,oBAAA,CAACoB,SAASE;AAAM,iBAAA;AACxC,aAAA,CAAA;;AAGA,YAAA,MAAM7D,IAAI8D,WAAW,CAAC/C,SAAUC,CAAAA,IAAI,EAAE4C,YAAc,EAAA,IAAA,CAAA;AACtD;AACF,KAAA,CAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/services/entity-service/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport delegate from 'delegates';\nimport { errors as databaseErrors } from '@strapi/database';\nimport {\n contentTypes as contentTypesUtils,\n errors,\n relations as relationUtils,\n} from '@strapi/utils';\nimport type { Database } from '@strapi/database';\nimport type { Core, Modules, Utils } from '@strapi/types';\n\ntype Decoratable<T> = T & {\n decorate(\n decorator: (old: Modules.EntityService.EntityService) => Modules.EntityService.EntityService & {\n [key: string]: unknown;\n }\n ): void;\n};\n\nconst transformLoadParamsToQuery = (\n uid: string,\n field: string,\n params: Record<string, unknown>,\n pagination = {}\n) => {\n const query = strapi\n .get('query-params')\n .transform(uid, { populate: { [field]: params } as any }) as any;\n\n const res = {\n ...query.populate[field],\n ...pagination,\n };\n\n return res;\n};\n\nconst databaseErrorsToTransform = [\n databaseErrors.InvalidTimeError,\n databaseErrors.InvalidDateTimeError,\n databaseErrors.InvalidDateError,\n databaseErrors.InvalidRelationError,\n];\n\nconst createDefaultImplementation = ({\n strapi,\n db,\n}: {\n strapi: Core.Strapi;\n db: Database;\n}): Modules.EntityService.EntityService => ({\n async wrapParams(options: any = {}) {\n return options;\n },\n\n async wrapResult(result: any = {}) {\n return result;\n },\n\n async findMany(uid, opts) {\n const { kind } = strapi.getModel(uid);\n\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findMany' });\n\n if (kind === 'singleType') {\n const entity = strapi.documents!(uid).findFirst(wrappedParams);\n return this.wrapResult(entity, { uid, action: 'findOne' });\n }\n\n const entities = await strapi.documents!(uid).findMany(wrappedParams);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findPage(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findPage' });\n\n const query = strapi.get('query-params').transform(uid, wrappedParams);\n\n const entities = await db.query(uid).findPage(query);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findOne(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findOne' });\n\n const res = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!res) {\n return this.wrapResult(null, { uid, action: 'findOne' });\n }\n\n const entity = await strapi.documents!(uid).findOne({\n ...wrappedParams,\n documentId: res.documentId,\n });\n return this.wrapResult(entity, { uid, action: 'findOne' });\n },\n\n async count(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'count' });\n\n return strapi.documents!(uid).count(wrappedParams);\n },\n\n async create(uid, params) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data' | 'fields' | 'populate'>\n >(params, { uid, action: 'create' });\n const { data } = wrappedParams;\n\n if (!data) {\n throw new Error('cannot create');\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(data, strapi.getModel(uid));\n\n const entity = await strapi.documents!(uid).create({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n });\n\n return this.wrapResult(entity, { uid, action: 'create' });\n },\n\n async update(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data:partial' | 'fields' | 'populate'>\n >(opts, {\n uid,\n action: 'update',\n });\n const entityToUpdate = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToUpdate) {\n return this.wrapResult(null, { uid, action: 'update' });\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(entityToUpdate, strapi.getModel(uid));\n\n const entity = strapi.documents!(uid).update({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n documentId: entityToUpdate.documentId,\n });\n\n return this.wrapResult(entity, { uid, action: 'update' });\n },\n\n async delete(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'delete' });\n\n const entityToDelete = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToDelete) {\n return this.wrapResult(null, { uid, action: 'delete' });\n }\n\n await strapi.documents!(uid).delete({\n ...wrappedParams,\n documentId: entityToDelete.documentId,\n });\n\n return this.wrapResult(entityToDelete, { uid, action: 'delete' });\n },\n\n async load(uid, entity, field, params) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const loadedEntity = await db\n .query(uid)\n .load(entity, field, transformLoadParamsToQuery(uid, field, params ?? {}));\n\n return this.wrapResult(loadedEntity, { uid, field, action: 'load' });\n },\n\n async loadPages(uid, entity, field, params, pagination = {}) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const { attributes } = strapi.getModel(uid);\n const attribute = attributes[field];\n\n if (!relationUtils.isAnyToMany(attribute)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be an anyToMany relational attribute`);\n }\n\n const query = transformLoadParamsToQuery(uid, field, params ?? {}, pagination);\n\n const loadedPage = await db.query(uid).loadPages(entity, field, query);\n\n return {\n ...loadedPage,\n results: await this.wrapResult(loadedPage.results, { uid, field, action: 'load' }),\n };\n },\n});\n\nexport default (ctx: {\n strapi: Core.Strapi;\n db: Database;\n}): Decoratable<Modules.EntityService.EntityService> => {\n const implementation = createDefaultImplementation(ctx);\n\n const service = {\n implementation,\n decorate<T extends object>(decorator: (current: typeof implementation) => T) {\n if (typeof decorator !== 'function') {\n throw new Error(`Decorator must be a function, received ${typeof decorator}`);\n }\n\n this.implementation = { ...this.implementation, ...decorator(this.implementation) };\n return this;\n },\n };\n\n const delegator = delegate(service, 'implementation');\n\n // delegate every method in implementation\n Object.keys(service.implementation).forEach((key) => delegator.method(key));\n\n // wrap methods to handle Database Errors\n service.decorate((oldService: Modules.EntityService.EntityService) => {\n const newService = _.mapValues(\n oldService,\n (method, methodName: keyof Modules.EntityService.EntityService) =>\n async function (this: Modules.EntityService.EntityService, ...args: []) {\n try {\n return await (oldService[methodName] as Utils.Function.AnyPromise).call(this, ...args);\n } catch (error) {\n if (\n databaseErrorsToTransform.some(\n (errorToTransform) => error instanceof errorToTransform\n )\n ) {\n if (error instanceof Error) {\n throw new errors.ValidationError(error.message);\n }\n\n throw error;\n }\n throw error;\n }\n }\n );\n\n return newService;\n });\n\n return service as unknown as Decoratable<Modules.EntityService.EntityService>;\n};\n"],"names":["transformLoadParamsToQuery","uid","field","params","pagination","query","strapi","get","transform","populate","res","databaseErrorsToTransform","databaseErrors","InvalidTimeError","InvalidDateTimeError","InvalidDateError","InvalidRelationError","createDefaultImplementation","db","wrapParams","options","wrapResult","result","findMany","opts","kind","getModel","wrappedParams","action","entity","documents","findFirst","entities","findPage","findOne","entityId","where","id","documentId","count","create","data","Error","shouldPublish","contentTypesUtils","isDraft","status","update","entityToUpdate","delete","entityToDelete","load","_","isString","loadedEntity","loadPages","attributes","attribute","relationUtils","isAnyToMany","loadedPage","results","ctx","implementation","service","decorate","decorator","delegator","delegate","Object","keys","forEach","key","method","oldService","newService","mapValues","methodName","args","call","error","some","errorToTransform","errors","ValidationError","message"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/services/entity-service/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport delegate from 'delegates';\nimport { errors as databaseErrors } from '@strapi/database';\nimport {\n contentTypes as contentTypesUtils,\n errors,\n relations as relationUtils,\n} from '@strapi/utils';\nimport type { Database } from '@strapi/database';\nimport type { Core, Modules, Utils } from '@strapi/types';\n\ntype Decoratable<T> = T & {\n decorate(\n decorator: (old: Modules.EntityService.EntityService) => Modules.EntityService.EntityService & {\n [key: string]: unknown;\n }\n ): void;\n};\n\nconst transformLoadParamsToQuery = (\n uid: string,\n field: string,\n params: Record<string, unknown>,\n pagination = {}\n) => {\n const query = strapi\n .get('query-params')\n .transform(uid, { populate: { [field]: params } as any }) as any;\n\n const res = {\n ...query.populate[field],\n ...pagination,\n };\n\n return res;\n};\n\nconst databaseErrorsToTransform = [\n databaseErrors.InvalidTimeError,\n databaseErrors.InvalidDateTimeError,\n databaseErrors.InvalidDateError,\n databaseErrors.InvalidRelationError,\n];\n\nconst createDefaultImplementation = ({\n strapi,\n db,\n}: {\n strapi: Core.Strapi;\n db: Database;\n}): Modules.EntityService.EntityService => ({\n async wrapParams(options: any = {}) {\n return options;\n },\n\n async wrapResult(result: any = {}) {\n return result;\n },\n\n async findMany(uid, opts) {\n const { kind } = strapi.getModel(uid);\n\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findMany' });\n\n if (kind === 'singleType') {\n const entity = strapi.documents!(uid).findFirst(wrappedParams);\n return this.wrapResult(entity, { uid, action: 'findOne' });\n }\n\n const entities = await strapi.documents!(uid).findMany(wrappedParams);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findPage(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findPage' });\n\n const query = strapi.get('query-params').transform(uid, wrappedParams);\n\n const entities = await db.query(uid).findPage(query);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findOne(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findOne' });\n\n const res = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!res) {\n return this.wrapResult(null, { uid, action: 'findOne' });\n }\n\n const entity = await strapi.documents!(uid).findOne({\n ...wrappedParams,\n documentId: res.documentId,\n });\n return this.wrapResult(entity, { uid, action: 'findOne' });\n },\n\n async count(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'count' });\n\n return strapi.documents!(uid).count(wrappedParams);\n },\n\n async create(uid, params) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data' | 'fields' | 'populate'>\n >(params, { uid, action: 'create' });\n const { data } = wrappedParams;\n\n if (!data) {\n throw new Error('cannot create');\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(data, strapi.getModel(uid));\n\n const entity = await strapi.documents!(uid).create({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n });\n\n return this.wrapResult(entity, { uid, action: 'create' });\n },\n\n async update(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data:partial' | 'fields' | 'populate'>\n >(opts, {\n uid,\n action: 'update',\n });\n const entityToUpdate = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToUpdate) {\n return this.wrapResult(null, { uid, action: 'update' });\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(entityToUpdate, strapi.getModel(uid));\n\n const entity = strapi.documents!(uid).update({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n documentId: entityToUpdate.documentId,\n });\n\n return this.wrapResult(entity, { uid, action: 'update' });\n },\n\n async delete(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'delete' });\n\n const entityToDelete = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToDelete) {\n return this.wrapResult(null, { uid, action: 'delete' });\n }\n\n await strapi.documents!(uid).delete({\n ...wrappedParams,\n documentId: entityToDelete.documentId,\n });\n\n return this.wrapResult(entityToDelete, { uid, action: 'delete' });\n },\n\n async load(uid, entity, field, params) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const loadedEntity = await db\n .query(uid)\n .load(entity, field, transformLoadParamsToQuery(uid, field, params ?? {}));\n\n return this.wrapResult(loadedEntity, { uid, field, action: 'load' });\n },\n\n async loadPages(uid, entity, field, params, pagination = {}) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const { attributes } = strapi.getModel(uid);\n const attribute = attributes[field];\n\n if (!relationUtils.isAnyToMany(attribute)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be an anyToMany relational attribute`);\n }\n\n const query = transformLoadParamsToQuery(uid, field, params ?? {}, pagination);\n\n const loadedPage = await db.query(uid).loadPages(entity, field, query);\n\n return {\n ...loadedPage,\n results: await this.wrapResult(loadedPage.results, { uid, field, action: 'load' }),\n };\n },\n});\n\nexport default (ctx: {\n strapi: Core.Strapi;\n db: Database;\n}): Decoratable<Modules.EntityService.EntityService> => {\n const implementation = createDefaultImplementation(ctx);\n\n const service = {\n implementation,\n decorate<T extends object>(decorator: (current: typeof implementation) => T) {\n if (typeof decorator !== 'function') {\n throw new Error(`Decorator must be a function, received ${typeof decorator}`);\n }\n\n this.implementation = { ...this.implementation, ...decorator(this.implementation) };\n return this;\n },\n };\n\n const delegator = delegate(service, 'implementation');\n\n // delegate every method in implementation\n Object.keys(service.implementation).forEach((key) => delegator.method(key));\n\n // wrap methods to handle Database Errors\n service.decorate((oldService: Modules.EntityService.EntityService) => {\n const newService = _.mapValues(\n oldService,\n (method, methodName: keyof Modules.EntityService.EntityService) =>\n async function (this: Modules.EntityService.EntityService, ...args: []) {\n try {\n return await (oldService[methodName] as Utils.Function.AnyPromise).call(this, ...args);\n } catch (error) {\n if (\n databaseErrorsToTransform.some(\n (errorToTransform) => error instanceof errorToTransform\n )\n ) {\n if (error instanceof Error) {\n throw new errors.ValidationError(error.message);\n }\n\n throw error;\n }\n throw error;\n }\n }\n );\n\n return newService;\n });\n\n return service as unknown as Decoratable<Modules.EntityService.EntityService>;\n};\n"],"names":["transformLoadParamsToQuery","uid","field","params","pagination","query","strapi","get","transform","populate","res","databaseErrorsToTransform","databaseErrors","InvalidTimeError","InvalidDateTimeError","InvalidDateError","InvalidRelationError","createDefaultImplementation","db","wrapParams","options","wrapResult","result","findMany","opts","kind","getModel","wrappedParams","action","entity","documents","findFirst","entities","findPage","findOne","entityId","where","id","documentId","count","create","data","Error","shouldPublish","contentTypesUtils","isDraft","status","update","entityToUpdate","delete","entityToDelete","load","_","isString","loadedEntity","loadPages","attributes","attribute","relationUtils","isAnyToMany","loadedPage","results","ctx","implementation","service","decorate","decorator","delegator","delegate","Object","keys","forEach","key","method","oldService","newService","mapValues","methodName","args","call","error","some","errorToTransform","errors","ValidationError","message"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../src/services/entity-service/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport delegate from 'delegates';\nimport { errors as databaseErrors } from '@strapi/database';\nimport {\n contentTypes as contentTypesUtils,\n errors,\n relations as relationUtils,\n} from '@strapi/utils';\nimport type { Database } from '@strapi/database';\nimport type { Core, Modules, Utils } from '@strapi/types';\n\ntype Decoratable<T> = T & {\n decorate(\n decorator: (old: Modules.EntityService.EntityService) => Modules.EntityService.EntityService & {\n [key: string]: unknown;\n }\n ): void;\n};\n\nconst transformLoadParamsToQuery = (\n uid: string,\n field: string,\n params: Record<string, unknown>,\n pagination = {}\n) => {\n const query = strapi\n .get('query-params')\n .transform(uid, { populate: { [field]: params } as any }) as any;\n\n const res = {\n ...query.populate[field],\n ...pagination,\n };\n\n return res;\n};\n\nconst databaseErrorsToTransform = [\n databaseErrors.InvalidTimeError,\n databaseErrors.InvalidDateTimeError,\n databaseErrors.InvalidDateError,\n databaseErrors.InvalidRelationError,\n];\n\nconst createDefaultImplementation = ({\n strapi,\n db,\n}: {\n strapi: Core.Strapi;\n db: Database;\n}): Modules.EntityService.EntityService => ({\n async wrapParams(options: any = {}) {\n return options;\n },\n\n async wrapResult(result: any = {}) {\n return result;\n },\n\n async findMany(uid, opts) {\n const { kind } = strapi.getModel(uid);\n\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findMany' });\n\n if (kind === 'singleType') {\n const entity = strapi.documents!(uid).findFirst(wrappedParams);\n return this.wrapResult(entity, { uid, action: 'findOne' });\n }\n\n const entities = await strapi.documents!(uid).findMany(wrappedParams);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findPage(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findPage' });\n\n const query = strapi.get('query-params').transform(uid, wrappedParams);\n\n const entities = await db.query(uid).findPage(query);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findOne(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findOne' });\n\n const res = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!res) {\n return this.wrapResult(null, { uid, action: 'findOne' });\n }\n\n const entity = await strapi.documents!(uid).findOne({\n ...wrappedParams,\n documentId: res.documentId,\n });\n return this.wrapResult(entity, { uid, action: 'findOne' });\n },\n\n async count(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'count' });\n\n return strapi.documents!(uid).count(wrappedParams);\n },\n\n async create(uid, params) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data' | 'fields' | 'populate'>\n >(params, { uid, action: 'create' });\n const { data } = wrappedParams;\n\n if (!data) {\n throw new Error('cannot create');\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(data, strapi.getModel(uid));\n\n const entity = await strapi.documents!(uid).create({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n });\n\n return this.wrapResult(entity, { uid, action: 'create' });\n },\n\n async update(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data:partial' | 'fields' | 'populate'>\n >(opts, {\n uid,\n action: 'update',\n });\n const entityToUpdate = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToUpdate) {\n return this.wrapResult(null, { uid, action: 'update' });\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(entityToUpdate, strapi.getModel(uid));\n\n const entity = strapi.documents!(uid).update({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n documentId: entityToUpdate.documentId,\n });\n\n return this.wrapResult(entity, { uid, action: 'update' });\n },\n\n async delete(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'delete' });\n\n const entityToDelete = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToDelete) {\n return this.wrapResult(null, { uid, action: 'delete' });\n }\n\n await strapi.documents!(uid).delete({\n ...wrappedParams,\n documentId: entityToDelete.documentId,\n });\n\n return this.wrapResult(entityToDelete, { uid, action: 'delete' });\n },\n\n async load(uid, entity, field, params) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const loadedEntity = await db\n .query(uid)\n .load(entity, field, transformLoadParamsToQuery(uid, field, params ?? {}));\n\n return this.wrapResult(loadedEntity, { uid, field, action: 'load' });\n },\n\n async loadPages(uid, entity, field, params, pagination = {}) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const { attributes } = strapi.getModel(uid);\n const attribute = attributes[field];\n\n if (!relationUtils.isAnyToMany(attribute)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be an anyToMany relational attribute`);\n }\n\n const query = transformLoadParamsToQuery(uid, field, params ?? {}, pagination);\n\n const loadedPage = await db.query(uid).loadPages(entity, field, query);\n\n return {\n ...loadedPage,\n results: await this.wrapResult(loadedPage.results, { uid, field, action: 'load' }),\n };\n },\n});\n\nexport default (ctx: {\n strapi: Core.Strapi;\n db: Database;\n}): Decoratable<Modules.EntityService.EntityService> => {\n const implementation = createDefaultImplementation(ctx);\n\n const service = {\n implementation,\n decorate<T extends object>(decorator: (current: typeof implementation) => T) {\n if (typeof decorator !== 'function') {\n throw new Error(`Decorator must be a function, received ${typeof decorator}`);\n }\n\n this.implementation = { ...this.implementation, ...decorator(this.implementation) };\n return this;\n },\n };\n\n const delegator = delegate(service, 'implementation');\n\n // delegate every method in implementation\n Object.keys(service.implementation).forEach((key) => delegator.method(key));\n\n // wrap methods to handle Database Errors\n service.decorate((oldService: Modules.EntityService.EntityService) => {\n const newService = _.mapValues(\n oldService,\n (method, methodName: keyof Modules.EntityService.EntityService) =>\n async function (this: Modules.EntityService.EntityService, ...args: []) {\n try {\n return await (oldService[methodName] as Utils.Function.AnyPromise).call(this, ...args);\n } catch (error) {\n if (\n databaseErrorsToTransform.some(\n (errorToTransform) => error instanceof errorToTransform\n )\n ) {\n if (error instanceof Error) {\n throw new errors.ValidationError(error.message);\n }\n\n throw error;\n }\n throw error;\n }\n }\n );\n\n return newService;\n });\n\n return service as unknown as Decoratable<Modules.EntityService.EntityService>;\n};\n"],"names":["transformLoadParamsToQuery","uid","field","params","pagination","query","strapi","get","transform","populate","res","databaseErrorsToTransform","databaseErrors","InvalidTimeError","InvalidDateTimeError","InvalidDateError","InvalidRelationError","createDefaultImplementation","db","wrapParams","options","wrapResult","result","findMany","opts","kind","getModel","wrappedParams","action","entity","documents","findFirst","entities","findPage","findOne","entityId","where","id","documentId","count","create","data","Error","shouldPublish","contentTypesUtils","isDraft","status","update","entityToUpdate","delete","entityToDelete","load","_","isString","loadedEntity","loadPages","attributes","attribute","relationUtils","isAnyToMany","loadedPage","results","ctx","implementation","service","decorate","decorator","delegator","delegate","Object","keys","forEach","key","method","oldService","newService","mapValues","methodName","args","call","error","some","errorToTransform","errors","ValidationError","message"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/services/entity-service/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport delegate from 'delegates';\nimport { errors as databaseErrors } from '@strapi/database';\nimport {\n contentTypes as contentTypesUtils,\n errors,\n relations as relationUtils,\n} from '@strapi/utils';\nimport type { Database } from '@strapi/database';\nimport type { Core, Modules, Utils } from '@strapi/types';\n\ntype Decoratable<T> = T & {\n decorate(\n decorator: (old: Modules.EntityService.EntityService) => Modules.EntityService.EntityService & {\n [key: string]: unknown;\n }\n ): void;\n};\n\nconst transformLoadParamsToQuery = (\n uid: string,\n field: string,\n params: Record<string, unknown>,\n pagination = {}\n) => {\n const query = strapi\n .get('query-params')\n .transform(uid, { populate: { [field]: params } as any }) as any;\n\n const res = {\n ...query.populate[field],\n ...pagination,\n };\n\n return res;\n};\n\nconst databaseErrorsToTransform = [\n databaseErrors.InvalidTimeError,\n databaseErrors.InvalidDateTimeError,\n databaseErrors.InvalidDateError,\n databaseErrors.InvalidRelationError,\n];\n\nconst createDefaultImplementation = ({\n strapi,\n db,\n}: {\n strapi: Core.Strapi;\n db: Database;\n}): Modules.EntityService.EntityService => ({\n async wrapParams(options: any = {}) {\n return options;\n },\n\n async wrapResult(result: any = {}) {\n return result;\n },\n\n async findMany(uid, opts) {\n const { kind } = strapi.getModel(uid);\n\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findMany' });\n\n if (kind === 'singleType') {\n const entity = strapi.documents!(uid).findFirst(wrappedParams);\n return this.wrapResult(entity, { uid, action: 'findOne' });\n }\n\n const entities = await strapi.documents!(uid).findMany(wrappedParams);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findPage(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findPage' });\n\n const query = strapi.get('query-params').transform(uid, wrappedParams);\n\n const entities = await db.query(uid).findPage(query);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findOne(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findOne' });\n\n const res = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!res) {\n return this.wrapResult(null, { uid, action: 'findOne' });\n }\n\n const entity = await strapi.documents!(uid).findOne({\n ...wrappedParams,\n documentId: res.documentId,\n });\n return this.wrapResult(entity, { uid, action: 'findOne' });\n },\n\n async count(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'count' });\n\n return strapi.documents!(uid).count(wrappedParams);\n },\n\n async create(uid, params) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data' | 'fields' | 'populate'>\n >(params, { uid, action: 'create' });\n const { data } = wrappedParams;\n\n if (!data) {\n throw new Error('cannot create');\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(data, strapi.getModel(uid));\n\n const entity = await strapi.documents!(uid).create({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n });\n\n return this.wrapResult(entity, { uid, action: 'create' });\n },\n\n async update(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data:partial' | 'fields' | 'populate'>\n >(opts, {\n uid,\n action: 'update',\n });\n const entityToUpdate = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToUpdate) {\n return this.wrapResult(null, { uid, action: 'update' });\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(entityToUpdate, strapi.getModel(uid));\n\n const entity = strapi.documents!(uid).update({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n documentId: entityToUpdate.documentId,\n });\n\n return this.wrapResult(entity, { uid, action: 'update' });\n },\n\n async delete(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'delete' });\n\n const entityToDelete = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToDelete) {\n return this.wrapResult(null, { uid, action: 'delete' });\n }\n\n await strapi.documents!(uid).delete({\n ...wrappedParams,\n documentId: entityToDelete.documentId,\n });\n\n return this.wrapResult(entityToDelete, { uid, action: 'delete' });\n },\n\n async load(uid, entity, field, params) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const loadedEntity = await db\n .query(uid)\n .load(entity, field, transformLoadParamsToQuery(uid, field, params ?? {}));\n\n return this.wrapResult(loadedEntity, { uid, field, action: 'load' });\n },\n\n async loadPages(uid, entity, field, params, pagination = {}) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const { attributes } = strapi.getModel(uid);\n const attribute = attributes[field];\n\n if (!relationUtils.isAnyToMany(attribute)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be an anyToMany relational attribute`);\n }\n\n const query = transformLoadParamsToQuery(uid, field, params ?? {}, pagination);\n\n const loadedPage = await db.query(uid).loadPages(entity, field, query);\n\n return {\n ...loadedPage,\n results: await this.wrapResult(loadedPage.results, { uid, field, action: 'load' }),\n };\n },\n});\n\nexport default (ctx: {\n strapi: Core.Strapi;\n db: Database;\n}): Decoratable<Modules.EntityService.EntityService> => {\n const implementation = createDefaultImplementation(ctx);\n\n const service = {\n implementation,\n decorate<T extends object>(decorator: (current: typeof implementation) => T) {\n if (typeof decorator !== 'function') {\n throw new Error(`Decorator must be a function, received ${typeof decorator}`);\n }\n\n this.implementation = { ...this.implementation, ...decorator(this.implementation) };\n return this;\n },\n };\n\n const delegator = delegate(service, 'implementation');\n\n // delegate every method in implementation\n Object.keys(service.implementation).forEach((key) => delegator.method(key));\n\n // wrap methods to handle Database Errors\n service.decorate((oldService: Modules.EntityService.EntityService) => {\n const newService = _.mapValues(\n oldService,\n (method, methodName: keyof Modules.EntityService.EntityService) =>\n async function (this: Modules.EntityService.EntityService, ...args: []) {\n try {\n return await (oldService[methodName] as Utils.Function.AnyPromise).call(this, ...args);\n } catch (error) {\n if (\n databaseErrorsToTransform.some(\n (errorToTransform) => error instanceof errorToTransform\n )\n ) {\n if (error instanceof Error) {\n throw new errors.ValidationError(error.message);\n }\n\n throw error;\n }\n throw error;\n }\n }\n );\n\n return newService;\n });\n\n return service as unknown as Decoratable<Modules.EntityService.EntityService>;\n};\n"],"names":["transformLoadParamsToQuery","uid","field","params","pagination","query","strapi","get","transform","populate","res","databaseErrorsToTransform","databaseErrors","InvalidTimeError","InvalidDateTimeError","InvalidDateError","InvalidRelationError","createDefaultImplementation","db","wrapParams","options","wrapResult","result","findMany","opts","kind","getModel","wrappedParams","action","entity","documents","findFirst","entities","findPage","findOne","entityId","where","id","documentId","count","create","data","Error","shouldPublish","contentTypesUtils","isDraft","status","update","entityToUpdate","delete","entityToDelete","load","_","isString","loadedEntity","loadPages","attributes","attribute","relationUtils","isAnyToMany","loadedPage","results","ctx","implementation","service","decorate","decorator","delegator","delegate","Object","keys","forEach","key","method","oldService","newService","mapValues","methodName","args","call","error","some","errorToTransform","errors","ValidationError","message"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocks-validator.js","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\n\nconst textNodeValidator = yup.object().shape({\n type: yup.string().equals(['text']).required(),\n text: yup\n .string()\n .test(\n 'is-valid-text',\n 'Text must be defined with at least an empty string',\n (text: unknown) => {\n return typeof text === 'string' || text === '';\n }\n ),\n bold: yup.boolean(),\n italic: yup.boolean(),\n underline: yup.boolean(),\n strikethrough: yup.boolean(),\n code: yup.boolean(),\n});\n\nconst checkValidLink = (link: string) => {\n try {\n // eslint-disable-next-line no-new\n new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);\n } catch (error) {\n return false;\n }\n return true;\n};\n\nconst linkNodeValidator = yup.object().shape({\n type: yup.string().equals(['link']).required(),\n url: yup\n .string()\n .test('invalid-url', 'Please specify a valid link.', (value) => checkValidLink(value ?? '')),\n children: yup.array().of(textNodeValidator).required(),\n});\n\n// TODO: remove any with a correct Type\nconst inlineNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'text':\n return textNodeValidator;\n case 'link':\n return linkNodeValidator;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be Text or Link', () => {\n return false;\n });\n }\n});\n\nconst paragraphNodeValidator = yup.object().shape({\n type: yup.string().equals(['paragraph']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Paragraph node children must have at least one Text or Link node')\n .required(),\n});\n\nconst headingNodeValidator = yup.object().shape({\n type: yup.string().equals(['heading']).required(),\n level: yup.number().oneOf([1, 2, 3, 4, 5, 6]).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Heading node children must have at least one Text or Link node')\n .required(),\n});\n\nconst quoteNodeValidator = yup.object().shape({\n type: yup.string().equals(['quote']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst codeBlockValidator = yup.object().shape({\n type: yup.string().equals(['code']).required(),\n syntax: yup.string().nullable(),\n children: yup\n .array()\n .of(textNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst listItemNode = yup.object().shape({\n type: yup.string().equals(['list-item']).required(),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// Allow children to be either a listItemNode or a listNode itself\n// @ts-expect-error - listChildrenValidator needs a type\nconst listChildrenValidator = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'list':\n return listNodeValidator;\n case 'list-item':\n return listItemNode;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be list-item or list', () => {\n return false;\n });\n }\n});\n\n// @ts-expect-error - listNodeValidator needs a type\nconst listNodeValidator = yup.object().shape({\n type: yup.string().equals(['list']).required(),\n format: yup.string().equals(['ordered', 'unordered']).required(),\n children: yup\n .array()\n .of(listChildrenValidator)\n .min(1, 'List node children must have at least one ListItem or ListNode')\n .required(),\n});\n\nconst imageNodeValidator = yup.object().shape({\n type: yup.string().equals(['image']).required(),\n image: yup.object().shape({\n name: yup.string().required(),\n alternativeText: yup.string().nullable(),\n url: yup.string().required(),\n caption: yup.string().nullable(),\n width: yup.number().required(),\n height: yup.number().required(),\n formats: yup.object().required(),\n hash: yup.string().required(),\n ext: yup.string().required(),\n mime: yup.string().required(),\n size: yup.number().required(),\n previewUrl: yup.string().nullable(),\n provider: yup.string().required(),\n provider_metadata: yup.mixed().nullable(),\n createdAt: yup.string().required(),\n updatedAt: yup.string().required(),\n }),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// TODO: remove the any and replace with a correct Type\nconst blockNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'paragraph':\n return paragraphNodeValidator;\n case 'heading':\n return headingNodeValidator;\n case 'quote':\n return quoteNodeValidator;\n case 'list':\n return listNodeValidator;\n case 'image':\n return imageNodeValidator;\n case 'code':\n return codeBlockValidator;\n default:\n return yup.mixed().test('invalid-type', 'Block node is of invalid type', () => {\n return false;\n });\n }\n});\n\nconst blocksValidatorSchema = yup.array().of(blockNodeValidator);\n\nexport const blocksValidator = () => blocksValidatorSchema;\n"],"names":["textNodeValidator","yup","object","shape","type","string","equals","required","text","test","bold","boolean","italic","underline","strikethrough","code","checkValidLink","link","URL","startsWith","error","linkNodeValidator","url","value","children","array","of","inlineNodeValidator","lazy","mixed","paragraphNodeValidator","min","headingNodeValidator","level","number","oneOf","quoteNodeValidator","codeBlockValidator","syntax","nullable","listItemNode","listChildrenValidator","listNodeValidator","format","imageNodeValidator","image","name","alternativeText","caption","width","height","formats","hash","ext","mime","size","previewUrl","provider","provider_metadata","createdAt","updatedAt","blockNodeValidator","blocksValidatorSchema","blocksValidator"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"blocks-validator.js","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\n\nconst textNodeValidator = yup.object().shape({\n type: yup.string().equals(['text']).required(),\n text: yup\n .string()\n .test(\n 'is-valid-text',\n 'Text must be defined with at least an empty string',\n (text: unknown) => {\n return typeof text === 'string' || text === '';\n }\n ),\n bold: yup.boolean(),\n italic: yup.boolean(),\n underline: yup.boolean(),\n strikethrough: yup.boolean(),\n code: yup.boolean(),\n});\n\nconst checkValidLink = (link: string) => {\n try {\n // eslint-disable-next-line no-new\n new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);\n } catch (error) {\n return false;\n }\n return true;\n};\n\nconst linkNodeValidator = yup.object().shape({\n type: yup.string().equals(['link']).required(),\n url: yup\n .string()\n .test('invalid-url', 'Please specify a valid link.', (value) => checkValidLink(value ?? '')),\n children: yup.array().of(textNodeValidator).required(),\n});\n\n// TODO: remove any with a correct Type\nconst inlineNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'text':\n return textNodeValidator;\n case 'link':\n return linkNodeValidator;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be Text or Link', () => {\n return false;\n });\n }\n});\n\nconst paragraphNodeValidator = yup.object().shape({\n type: yup.string().equals(['paragraph']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Paragraph node children must have at least one Text or Link node')\n .required(),\n});\n\nconst headingNodeValidator = yup.object().shape({\n type: yup.string().equals(['heading']).required(),\n level: yup.number().oneOf([1, 2, 3, 4, 5, 6]).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Heading node children must have at least one Text or Link node')\n .required(),\n});\n\nconst quoteNodeValidator = yup.object().shape({\n type: yup.string().equals(['quote']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst codeBlockValidator = yup.object().shape({\n type: yup.string().equals(['code']).required(),\n syntax: yup.string().nullable(),\n children: yup\n .array()\n .of(textNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst listItemNode = yup.object().shape({\n type: yup.string().equals(['list-item']).required(),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// Allow children to be either a listItemNode or a listNode itself\n// @ts-expect-error - listChildrenValidator needs a type\nconst listChildrenValidator = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'list':\n return listNodeValidator;\n case 'list-item':\n return listItemNode;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be list-item or list', () => {\n return false;\n });\n }\n});\n\n// @ts-expect-error - listNodeValidator needs a type\nconst listNodeValidator = yup.object().shape({\n type: yup.string().equals(['list']).required(),\n format: yup.string().equals(['ordered', 'unordered']).required(),\n children: yup\n .array()\n .of(listChildrenValidator)\n .min(1, 'List node children must have at least one ListItem or ListNode')\n .required(),\n});\n\nconst imageNodeValidator = yup.object().shape({\n type: yup.string().equals(['image']).required(),\n image: yup.object().shape({\n name: yup.string().required(),\n alternativeText: yup.string().nullable(),\n url: yup.string().required(),\n caption: yup.string().nullable(),\n width: yup.number().required(),\n height: yup.number().required(),\n formats: yup.object().required(),\n hash: yup.string().required(),\n ext: yup.string().required(),\n mime: yup.string().required(),\n size: yup.number().required(),\n previewUrl: yup.string().nullable(),\n provider: yup.string().required(),\n provider_metadata: yup.mixed().nullable(),\n createdAt: yup.string().required(),\n updatedAt: yup.string().required(),\n }),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// TODO: remove the any and replace with a correct Type\nconst blockNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'paragraph':\n return paragraphNodeValidator;\n case 'heading':\n return headingNodeValidator;\n case 'quote':\n return quoteNodeValidator;\n case 'list':\n return listNodeValidator;\n case 'image':\n return imageNodeValidator;\n case 'code':\n return codeBlockValidator;\n default:\n return yup.mixed().test('invalid-type', 'Block node is of invalid type', () => {\n return false;\n });\n }\n});\n\nconst blocksValidatorSchema = yup.array().of(blockNodeValidator);\n\nexport const blocksValidator = () => blocksValidatorSchema;\n"],"names":["textNodeValidator","yup","object","shape","type","string","equals","required","text","test","bold","boolean","italic","underline","strikethrough","code","checkValidLink","link","URL","startsWith","error","linkNodeValidator","url","value","children","array","of","inlineNodeValidator","lazy","mixed","paragraphNodeValidator","min","headingNodeValidator","level","number","oneOf","quoteNodeValidator","codeBlockValidator","syntax","nullable","listItemNode","listChildrenValidator","listNodeValidator","format","imageNodeValidator","image","name","alternativeText","caption","width","height","formats","hash","ext","mime","size","previewUrl","provider","provider_metadata","createdAt","updatedAt","blockNodeValidator","blocksValidatorSchema","blocksValidator"],"mappings":"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"}
|