@strapi/core 0.0.0-experimental.eba25ec571b091c6bde1104eb6c753debdf15462 → 0.0.0-experimental.ed76b5e1c1d6fb3b4435c438af7398a06b511d6f
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.map +1 -1
- package/dist/Strapi.js +429 -407
- package/dist/Strapi.js.map +1 -1
- package/dist/Strapi.mjs +428 -405
- package/dist/Strapi.mjs.map +1 -1
- package/dist/compile.js +23 -14
- package/dist/compile.js.map +1 -1
- package/dist/compile.mjs +22 -14
- package/dist/compile.mjs.map +1 -1
- package/dist/configuration/config-loader.js +110 -97
- package/dist/configuration/config-loader.js.map +1 -1
- package/dist/configuration/config-loader.mjs +109 -96
- package/dist/configuration/config-loader.mjs.map +1 -1
- package/dist/configuration/get-dirs.js +31 -29
- package/dist/configuration/get-dirs.js.map +1 -1
- package/dist/configuration/get-dirs.mjs +30 -30
- package/dist/configuration/get-dirs.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 +85 -73
- package/dist/configuration/index.js.map +1 -1
- package/dist/configuration/index.mjs +84 -69
- package/dist/configuration/index.mjs.map +1 -1
- package/dist/configuration/urls.d.ts.map +1 -1
- package/dist/configuration/urls.js +74 -61
- package/dist/configuration/urls.js.map +1 -1
- package/dist/configuration/urls.mjs +73 -62
- package/dist/configuration/urls.mjs.map +1 -1
- package/dist/container.js +27 -23
- package/dist/container.js.map +1 -1
- package/dist/container.mjs +26 -24
- package/dist/container.mjs.map +1 -1
- package/dist/core-api/controller/collection-type.js +77 -76
- package/dist/core-api/controller/collection-type.js.map +1 -1
- package/dist/core-api/controller/collection-type.mjs +76 -77
- package/dist/core-api/controller/collection-type.mjs.map +1 -1
- package/dist/core-api/controller/index.js +63 -48
- package/dist/core-api/controller/index.js.map +1 -1
- package/dist/core-api/controller/index.mjs +62 -49
- package/dist/core-api/controller/index.mjs.map +1 -1
- package/dist/core-api/controller/single-type.js +41 -40
- package/dist/core-api/controller/single-type.js.map +1 -1
- package/dist/core-api/controller/single-type.mjs +40 -41
- package/dist/core-api/controller/single-type.mjs.map +1 -1
- package/dist/core-api/controller/transform.js +72 -63
- package/dist/core-api/controller/transform.js.map +1 -1
- package/dist/core-api/controller/transform.mjs +71 -64
- 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 +205 -61
- package/dist/core-api/routes/index.js.map +1 -1
- package/dist/core-api/routes/index.mjs +185 -62
- 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 +238 -0
- package/dist/core-api/routes/validation/mappers.js.map +1 -0
- package/dist/core-api/routes/validation/mappers.mjs +214 -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 +73 -60
- package/dist/core-api/service/collection-type.js.map +1 -1
- package/dist/core-api/service/collection-type.mjs +72 -62
- package/dist/core-api/service/collection-type.mjs.map +1 -1
- package/dist/core-api/service/core-service.js +9 -8
- package/dist/core-api/service/core-service.js.map +1 -1
- package/dist/core-api/service/core-service.mjs +8 -9
- package/dist/core-api/service/core-service.mjs.map +1 -1
- package/dist/core-api/service/index.js +13 -13
- package/dist/core-api/service/index.js.map +1 -1
- package/dist/core-api/service/index.mjs +12 -14
- package/dist/core-api/service/index.mjs.map +1 -1
- package/dist/core-api/service/pagination.js +69 -43
- package/dist/core-api/service/pagination.js.map +1 -1
- package/dist/core-api/service/pagination.mjs +68 -47
- package/dist/core-api/service/pagination.mjs.map +1 -1
- package/dist/core-api/service/single-type.js +43 -39
- package/dist/core-api/service/single-type.js.map +1 -1
- package/dist/core-api/service/single-type.mjs +42 -41
- 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 +110 -99
- package/dist/domain/content-type/index.js.map +1 -1
- package/dist/domain/content-type/index.mjs +109 -99
- package/dist/domain/content-type/index.mjs.map +1 -1
- package/dist/domain/content-type/validator.js +84 -69
- package/dist/domain/content-type/validator.js.map +1 -1
- package/dist/domain/content-type/validator.mjs +83 -68
- package/dist/domain/content-type/validator.mjs.map +1 -1
- package/dist/domain/module/index.d.ts.map +1 -1
- package/dist/domain/module/index.js +112 -100
- package/dist/domain/module/index.js.map +1 -1
- package/dist/domain/module/index.mjs +111 -99
- package/dist/domain/module/index.mjs.map +1 -1
- package/dist/domain/module/validation.js +25 -20
- package/dist/domain/module/validation.js.map +1 -1
- package/dist/domain/module/validation.mjs +24 -21
- package/dist/domain/module/validation.mjs.map +1 -1
- package/dist/ee/index.d.ts +7 -0
- package/dist/ee/index.d.ts.map +1 -1
- package/dist/ee/index.js +197 -137
- package/dist/ee/index.js.map +1 -1
- package/dist/ee/index.mjs +196 -139
- 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 +105 -75
- package/dist/ee/license.js.map +1 -1
- package/dist/ee/license.mjs +103 -76
- 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 +80 -67
- package/dist/factories.js.map +1 -1
- package/dist/factories.mjs +77 -70
- package/dist/factories.mjs.map +1 -1
- package/dist/index.js +29 -26
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +29 -29
- package/dist/index.mjs.map +1 -1
- package/dist/loaders/admin.d.ts.map +1 -1
- package/dist/loaders/admin.js +21 -20
- package/dist/loaders/admin.js.map +1 -1
- package/dist/loaders/admin.mjs +20 -20
- package/dist/loaders/admin.mjs.map +1 -1
- package/dist/loaders/apis.js +143 -120
- package/dist/loaders/apis.js.map +1 -1
- package/dist/loaders/apis.mjs +142 -119
- package/dist/loaders/apis.mjs.map +1 -1
- package/dist/loaders/components.js +33 -34
- package/dist/loaders/components.js.map +1 -1
- package/dist/loaders/components.mjs +32 -34
- package/dist/loaders/components.mjs.map +1 -1
- package/dist/loaders/index.js +22 -20
- package/dist/loaders/index.js.map +1 -1
- package/dist/loaders/index.mjs +21 -21
- package/dist/loaders/index.mjs.map +1 -1
- package/dist/loaders/middlewares.js +29 -25
- package/dist/loaders/middlewares.js.map +1 -1
- package/dist/loaders/middlewares.mjs +28 -25
- package/dist/loaders/middlewares.mjs.map +1 -1
- package/dist/loaders/plugins/get-enabled-plugins.js +126 -131
- package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
- package/dist/loaders/plugins/get-enabled-plugins.mjs +125 -108
- package/dist/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
- package/dist/loaders/plugins/get-user-plugins-config.js +25 -24
- package/dist/loaders/plugins/get-user-plugins-config.js.map +1 -1
- package/dist/loaders/plugins/get-user-plugins-config.mjs +24 -23
- package/dist/loaders/plugins/get-user-plugins-config.mjs.map +1 -1
- package/dist/loaders/plugins/index.js +132 -122
- package/dist/loaders/plugins/index.js.map +1 -1
- package/dist/loaders/plugins/index.mjs +121 -112
- package/dist/loaders/plugins/index.mjs.map +1 -1
- package/dist/loaders/policies.js +24 -20
- package/dist/loaders/policies.js.map +1 -1
- package/dist/loaders/policies.mjs +23 -20
- package/dist/loaders/policies.mjs.map +1 -1
- package/dist/loaders/sanitizers.js +10 -4
- package/dist/loaders/sanitizers.js.map +1 -1
- package/dist/loaders/sanitizers.mjs +9 -6
- package/dist/loaders/sanitizers.mjs.map +1 -1
- package/dist/loaders/src-index.js +35 -27
- package/dist/loaders/src-index.js.map +1 -1
- package/dist/loaders/src-index.mjs +34 -29
- package/dist/loaders/src-index.mjs.map +1 -1
- package/dist/loaders/validators.js +9 -4
- package/dist/loaders/validators.js.map +1 -1
- package/dist/loaders/validators.mjs +8 -6
- package/dist/loaders/validators.mjs.map +1 -1
- package/dist/middlewares/body.d.ts.map +1 -1
- package/dist/middlewares/body.js +58 -54
- package/dist/middlewares/body.js.map +1 -1
- package/dist/middlewares/body.mjs +57 -51
- package/dist/middlewares/body.mjs.map +1 -1
- package/dist/middlewares/compression.js +6 -6
- package/dist/middlewares/compression.js.map +1 -1
- package/dist/middlewares/compression.mjs +5 -5
- package/dist/middlewares/compression.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 +81 -48
- package/dist/middlewares/cors.js.map +1 -1
- package/dist/middlewares/cors.mjs +78 -46
- package/dist/middlewares/cors.mjs.map +1 -1
- package/dist/middlewares/errors.js +32 -30
- package/dist/middlewares/errors.js.map +1 -1
- package/dist/middlewares/errors.mjs +31 -31
- package/dist/middlewares/errors.mjs.map +1 -1
- package/dist/middlewares/favicon.js +27 -17
- package/dist/middlewares/favicon.js.map +1 -1
- package/dist/middlewares/favicon.mjs +26 -16
- package/dist/middlewares/favicon.mjs.map +1 -1
- package/dist/middlewares/index.js +32 -30
- package/dist/middlewares/index.js.map +1 -1
- package/dist/middlewares/index.mjs +31 -31
- package/dist/middlewares/index.mjs.map +1 -1
- package/dist/middlewares/ip.js +6 -6
- package/dist/middlewares/ip.js.map +1 -1
- package/dist/middlewares/ip.mjs +5 -5
- package/dist/middlewares/ip.mjs.map +1 -1
- package/dist/middlewares/logger.js +10 -9
- package/dist/middlewares/logger.js.map +1 -1
- package/dist/middlewares/logger.mjs +9 -10
- package/dist/middlewares/logger.mjs.map +1 -1
- package/dist/middlewares/powered-by.js +13 -9
- package/dist/middlewares/powered-by.js.map +1 -1
- package/dist/middlewares/powered-by.mjs +12 -10
- package/dist/middlewares/powered-by.mjs.map +1 -1
- package/dist/middlewares/public.js +33 -29
- package/dist/middlewares/public.js.map +1 -1
- package/dist/middlewares/public.mjs +32 -28
- package/dist/middlewares/public.mjs.map +1 -1
- package/dist/middlewares/query.js +35 -32
- package/dist/middlewares/query.js.map +1 -1
- package/dist/middlewares/query.mjs +34 -31
- package/dist/middlewares/query.mjs.map +1 -1
- package/dist/middlewares/response-time.js +10 -9
- package/dist/middlewares/response-time.js.map +1 -1
- package/dist/middlewares/response-time.mjs +9 -10
- package/dist/middlewares/response-time.mjs.map +1 -1
- package/dist/middlewares/responses.js +14 -12
- package/dist/middlewares/responses.js.map +1 -1
- package/dist/middlewares/responses.mjs +13 -13
- package/dist/middlewares/responses.mjs.map +1 -1
- package/dist/middlewares/security.js +109 -71
- package/dist/middlewares/security.js.map +1 -1
- package/dist/middlewares/security.mjs +108 -70
- package/dist/middlewares/security.mjs.map +1 -1
- package/dist/middlewares/session.js +26 -25
- package/dist/middlewares/session.js.map +1 -1
- package/dist/middlewares/session.mjs +25 -24
- package/dist/middlewares/session.mjs.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.d.ts +2 -2
- package/dist/migrations/database/5.0.0-discard-drafts.d.ts.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.js +152 -90
- package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.mjs +151 -92
- package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
- package/dist/migrations/draft-publish.d.ts +1 -1
- package/dist/migrations/draft-publish.d.ts.map +1 -1
- package/dist/migrations/draft-publish.js +61 -34
- package/dist/migrations/draft-publish.js.map +1 -1
- package/dist/migrations/draft-publish.mjs +60 -36
- package/dist/migrations/draft-publish.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/i18n.js +62 -45
- package/dist/migrations/i18n.js.map +1 -1
- package/dist/migrations/i18n.mjs +61 -47
- package/dist/migrations/i18n.mjs.map +1 -1
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +29 -10
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/index.mjs +28 -12
- package/dist/migrations/index.mjs.map +1 -1
- package/dist/package.json.js +185 -0
- package/dist/package.json.js.map +1 -0
- package/dist/package.json.mjs +162 -0
- package/dist/package.json.mjs.map +1 -0
- package/dist/providers/admin.js +27 -17
- package/dist/providers/admin.js.map +1 -1
- package/dist/providers/admin.mjs +26 -19
- package/dist/providers/admin.mjs.map +1 -1
- package/dist/providers/coreStore.js +13 -8
- package/dist/providers/coreStore.js.map +1 -1
- package/dist/providers/coreStore.mjs +12 -10
- package/dist/providers/coreStore.mjs.map +1 -1
- package/dist/providers/cron.js +19 -16
- package/dist/providers/cron.js.map +1 -1
- package/dist/providers/cron.mjs +18 -18
- package/dist/providers/cron.mjs.map +1 -1
- package/dist/providers/index.js +18 -9
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/index.mjs +17 -10
- package/dist/providers/index.mjs.map +1 -1
- package/dist/providers/provider.js +4 -3
- package/dist/providers/provider.js.map +1 -1
- package/dist/providers/provider.mjs +3 -4
- package/dist/providers/provider.mjs.map +1 -1
- package/dist/providers/registries.js +37 -32
- package/dist/providers/registries.js.map +1 -1
- package/dist/providers/registries.mjs +36 -34
- package/dist/providers/registries.mjs.map +1 -1
- package/dist/providers/telemetry.js +19 -16
- package/dist/providers/telemetry.js.map +1 -1
- package/dist/providers/telemetry.mjs +18 -18
- package/dist/providers/telemetry.mjs.map +1 -1
- package/dist/providers/webhooks.js +28 -26
- package/dist/providers/webhooks.js.map +1 -1
- package/dist/providers/webhooks.mjs +27 -28
- package/dist/providers/webhooks.mjs.map +1 -1
- package/dist/registries/apis.js +23 -20
- package/dist/registries/apis.js.map +1 -1
- package/dist/registries/apis.mjs +22 -22
- package/dist/registries/apis.mjs.map +1 -1
- package/dist/registries/components.js +35 -37
- package/dist/registries/components.js.map +1 -1
- package/dist/registries/components.mjs +34 -39
- package/dist/registries/components.mjs.map +1 -1
- package/dist/registries/content-types.js +54 -59
- package/dist/registries/content-types.js.map +1 -1
- package/dist/registries/content-types.mjs +53 -61
- package/dist/registries/content-types.mjs.map +1 -1
- package/dist/registries/controllers.js +70 -71
- package/dist/registries/controllers.js.map +1 -1
- package/dist/registries/controllers.mjs +69 -73
- package/dist/registries/controllers.mjs.map +1 -1
- package/dist/registries/custom-fields.js +75 -65
- package/dist/registries/custom-fields.js.map +1 -1
- package/dist/registries/custom-fields.mjs +74 -67
- package/dist/registries/custom-fields.mjs.map +1 -1
- package/dist/registries/hooks.js +46 -49
- package/dist/registries/hooks.js.map +1 -1
- package/dist/registries/hooks.mjs +45 -51
- package/dist/registries/hooks.mjs.map +1 -1
- package/dist/registries/middlewares.js +49 -51
- package/dist/registries/middlewares.js.map +1 -1
- package/dist/registries/middlewares.mjs +48 -53
- package/dist/registries/middlewares.mjs.map +1 -1
- package/dist/registries/models.js +14 -13
- package/dist/registries/models.js.map +1 -1
- package/dist/registries/models.mjs +13 -14
- package/dist/registries/models.mjs.map +1 -1
- package/dist/registries/modules.js +39 -36
- package/dist/registries/modules.js.map +1 -1
- package/dist/registries/modules.mjs +38 -38
- package/dist/registries/modules.mjs.map +1 -1
- package/dist/registries/namespace.js +21 -20
- package/dist/registries/namespace.js.map +1 -1
- package/dist/registries/namespace.mjs +20 -23
- package/dist/registries/namespace.mjs.map +1 -1
- package/dist/registries/plugins.js +23 -20
- package/dist/registries/plugins.js.map +1 -1
- package/dist/registries/plugins.mjs +22 -22
- package/dist/registries/plugins.mjs.map +1 -1
- package/dist/registries/policies.js +103 -96
- package/dist/registries/policies.js.map +1 -1
- package/dist/registries/policies.mjs +102 -98
- package/dist/registries/policies.mjs.map +1 -1
- package/dist/registries/sanitizers.js +23 -22
- package/dist/registries/sanitizers.js.map +1 -1
- package/dist/registries/sanitizers.mjs +22 -22
- package/dist/registries/sanitizers.mjs.map +1 -1
- package/dist/registries/services.js +71 -71
- package/dist/registries/services.js.map +1 -1
- package/dist/registries/services.mjs +70 -73
- package/dist/registries/services.mjs.map +1 -1
- package/dist/registries/validators.js +23 -22
- package/dist/registries/validators.js.map +1 -1
- package/dist/registries/validators.mjs +22 -22
- package/dist/registries/validators.mjs.map +1 -1
- package/dist/services/auth/index.js +74 -74
- package/dist/services/auth/index.js.map +1 -1
- package/dist/services/auth/index.mjs +73 -74
- package/dist/services/auth/index.mjs.map +1 -1
- package/dist/services/config.js +47 -43
- package/dist/services/config.js.map +1 -1
- package/dist/services/config.mjs +46 -44
- package/dist/services/config.mjs.map +1 -1
- package/dist/services/content-api/index.js +80 -79
- package/dist/services/content-api/index.js.map +1 -1
- package/dist/services/content-api/index.mjs +79 -79
- package/dist/services/content-api/index.mjs.map +1 -1
- package/dist/services/content-api/permissions/engine.js +8 -5
- package/dist/services/content-api/permissions/engine.js.map +1 -1
- package/dist/services/content-api/permissions/engine.mjs +7 -5
- package/dist/services/content-api/permissions/engine.mjs.map +1 -1
- package/dist/services/content-api/permissions/index.js +101 -81
- package/dist/services/content-api/permissions/index.js.map +1 -1
- package/dist/services/content-api/permissions/index.mjs +100 -81
- package/dist/services/content-api/permissions/index.mjs.map +1 -1
- package/dist/services/content-api/permissions/providers/action.js +17 -14
- package/dist/services/content-api/permissions/providers/action.js.map +1 -1
- package/dist/services/content-api/permissions/providers/action.mjs +16 -16
- package/dist/services/content-api/permissions/providers/action.mjs.map +1 -1
- package/dist/services/content-api/permissions/providers/condition.js +17 -14
- package/dist/services/content-api/permissions/providers/condition.js.map +1 -1
- package/dist/services/content-api/permissions/providers/condition.mjs +16 -16
- package/dist/services/content-api/permissions/providers/condition.mjs.map +1 -1
- 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 +115 -95
- package/dist/services/core-store.js.map +1 -1
- package/dist/services/core-store.mjs +114 -97
- package/dist/services/core-store.mjs.map +1 -1
- package/dist/services/cron.js +74 -65
- package/dist/services/cron.js.map +1 -1
- package/dist/services/cron.mjs +73 -67
- package/dist/services/cron.mjs.map +1 -1
- package/dist/services/custom-fields.js +9 -7
- package/dist/services/custom-fields.js.map +1 -1
- package/dist/services/custom-fields.mjs +8 -9
- package/dist/services/custom-fields.mjs.map +1 -1
- package/dist/services/document-service/attributes/index.js +23 -18
- package/dist/services/document-service/attributes/index.js.map +1 -1
- package/dist/services/document-service/attributes/index.mjs +22 -19
- package/dist/services/document-service/attributes/index.mjs.map +1 -1
- package/dist/services/document-service/attributes/transforms.js +16 -15
- package/dist/services/document-service/attributes/transforms.js.map +1 -1
- package/dist/services/document-service/attributes/transforms.mjs +15 -15
- package/dist/services/document-service/attributes/transforms.mjs.map +1 -1
- package/dist/services/document-service/common.js +5 -4
- package/dist/services/document-service/common.js.map +1 -1
- package/dist/services/document-service/common.mjs +4 -5
- package/dist/services/document-service/common.mjs.map +1 -1
- package/dist/services/document-service/components.d.ts.map +1 -1
- package/dist/services/document-service/components.js +255 -257
- package/dist/services/document-service/components.js.map +1 -1
- package/dist/services/document-service/components.mjs +254 -262
- package/dist/services/document-service/components.mjs.map +1 -1
- package/dist/services/document-service/draft-and-publish.d.ts +1 -1
- package/dist/services/document-service/draft-and-publish.d.ts.map +1 -1
- package/dist/services/document-service/draft-and-publish.js +88 -48
- package/dist/services/document-service/draft-and-publish.js.map +1 -1
- package/dist/services/document-service/draft-and-publish.mjs +87 -54
- package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
- package/dist/services/document-service/entries.d.ts.map +1 -1
- package/dist/services/document-service/entries.js +151 -91
- package/dist/services/document-service/entries.js.map +1 -1
- package/dist/services/document-service/entries.mjs +150 -92
- package/dist/services/document-service/entries.mjs.map +1 -1
- package/dist/services/document-service/events.d.ts +1 -1
- package/dist/services/document-service/events.d.ts.map +1 -1
- package/dist/services/document-service/events.js +52 -40
- package/dist/services/document-service/events.js.map +1 -1
- package/dist/services/document-service/events.mjs +51 -41
- package/dist/services/document-service/events.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/index.js +53 -33
- package/dist/services/document-service/index.js.map +1 -1
- package/dist/services/document-service/index.mjs +52 -34
- package/dist/services/document-service/index.mjs.map +1 -1
- 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 +94 -46
- package/dist/services/document-service/internationalization.js.map +1 -1
- package/dist/services/document-service/internationalization.mjs +92 -50
- package/dist/services/document-service/internationalization.mjs.map +1 -1
- package/dist/services/document-service/middlewares/errors.js +23 -19
- package/dist/services/document-service/middlewares/errors.js.map +1 -1
- package/dist/services/document-service/middlewares/errors.mjs +22 -20
- package/dist/services/document-service/middlewares/errors.mjs.map +1 -1
- package/dist/services/document-service/middlewares/middleware-manager.js +46 -44
- package/dist/services/document-service/middlewares/middleware-manager.js.map +1 -1
- package/dist/services/document-service/middlewares/middleware-manager.mjs +45 -45
- package/dist/services/document-service/middlewares/middleware-manager.mjs.map +1 -1
- package/dist/services/document-service/params.js +11 -5
- package/dist/services/document-service/params.js.map +1 -1
- package/dist/services/document-service/params.mjs +10 -6
- package/dist/services/document-service/params.mjs.map +1 -1
- package/dist/services/document-service/repository.d.ts.map +1 -1
- package/dist/services/document-service/repository.js +358 -319
- package/dist/services/document-service/repository.js.map +1 -1
- package/dist/services/document-service/repository.mjs +357 -320
- package/dist/services/document-service/repository.mjs.map +1 -1
- package/dist/services/document-service/transform/data.js +22 -12
- package/dist/services/document-service/transform/data.js.map +1 -1
- package/dist/services/document-service/transform/data.mjs +21 -13
- package/dist/services/document-service/transform/data.mjs.map +1 -1
- package/dist/services/document-service/transform/fields.js +26 -17
- package/dist/services/document-service/transform/fields.js.map +1 -1
- package/dist/services/document-service/transform/fields.mjs +25 -18
- package/dist/services/document-service/transform/fields.mjs.map +1 -1
- package/dist/services/document-service/transform/id-map.d.ts +1 -1
- package/dist/services/document-service/transform/id-map.d.ts.map +1 -1
- package/dist/services/document-service/transform/id-map.js +115 -77
- package/dist/services/document-service/transform/id-map.js.map +1 -1
- package/dist/services/document-service/transform/id-map.mjs +114 -78
- package/dist/services/document-service/transform/id-map.mjs.map +1 -1
- package/dist/services/document-service/transform/id-transform.d.ts +1 -1
- package/dist/services/document-service/transform/id-transform.d.ts.map +1 -1
- package/dist/services/document-service/transform/id-transform.js +37 -29
- package/dist/services/document-service/transform/id-transform.js.map +1 -1
- package/dist/services/document-service/transform/id-transform.mjs +36 -30
- package/dist/services/document-service/transform/id-transform.mjs.map +1 -1
- package/dist/services/document-service/transform/populate.js +23 -18
- package/dist/services/document-service/transform/populate.js.map +1 -1
- package/dist/services/document-service/transform/populate.mjs +22 -19
- package/dist/services/document-service/transform/populate.mjs.map +1 -1
- package/dist/services/document-service/transform/query.js +11 -6
- package/dist/services/document-service/transform/query.js.map +1 -1
- package/dist/services/document-service/transform/query.mjs +10 -7
- package/dist/services/document-service/transform/query.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/extract/data-ids.d.ts +1 -1
- package/dist/services/document-service/transform/relations/extract/data-ids.d.ts.map +1 -1
- package/dist/services/document-service/transform/relations/extract/data-ids.js +70 -54
- package/dist/services/document-service/transform/relations/extract/data-ids.js.map +1 -1
- package/dist/services/document-service/transform/relations/extract/data-ids.mjs +69 -55
- package/dist/services/document-service/transform/relations/extract/data-ids.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/transform/data-ids.js +96 -72
- package/dist/services/document-service/transform/relations/transform/data-ids.js.map +1 -1
- package/dist/services/document-service/transform/relations/transform/data-ids.mjs +95 -73
- package/dist/services/document-service/transform/relations/transform/data-ids.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/transform/default-locale.js +47 -29
- package/dist/services/document-service/transform/relations/transform/default-locale.js.map +1 -1
- package/dist/services/document-service/transform/relations/transform/default-locale.mjs +46 -30
- package/dist/services/document-service/transform/relations/transform/default-locale.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/utils/dp.d.ts +1 -1
- package/dist/services/document-service/transform/relations/utils/dp.d.ts.map +1 -1
- package/dist/services/document-service/transform/relations/utils/dp.js +52 -26
- package/dist/services/document-service/transform/relations/utils/dp.js.map +1 -1
- package/dist/services/document-service/transform/relations/utils/dp.mjs +51 -27
- package/dist/services/document-service/transform/relations/utils/dp.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/utils/i18n.d.ts +1 -1
- package/dist/services/document-service/transform/relations/utils/i18n.d.ts.map +1 -1
- package/dist/services/document-service/transform/relations/utils/i18n.js +20 -18
- package/dist/services/document-service/transform/relations/utils/i18n.js.map +1 -1
- package/dist/services/document-service/transform/relations/utils/i18n.mjs +19 -21
- package/dist/services/document-service/transform/relations/utils/i18n.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/utils/map-relation.js +116 -73
- package/dist/services/document-service/transform/relations/utils/map-relation.js.map +1 -1
- package/dist/services/document-service/transform/relations/utils/map-relation.mjs +115 -75
- package/dist/services/document-service/transform/relations/utils/map-relation.mjs.map +1 -1
- package/dist/services/document-service/utils/bidirectional-relations.d.ts +95 -0
- package/dist/services/document-service/utils/bidirectional-relations.d.ts.map +1 -0
- package/dist/services/document-service/utils/bidirectional-relations.js +148 -0
- package/dist/services/document-service/utils/bidirectional-relations.js.map +1 -0
- package/dist/services/document-service/utils/bidirectional-relations.mjs +145 -0
- package/dist/services/document-service/utils/bidirectional-relations.mjs.map +1 -0
- package/dist/services/document-service/utils/populate.d.ts +1 -1
- package/dist/services/document-service/utils/populate.d.ts.map +1 -1
- package/dist/services/document-service/utils/populate.js +66 -42
- package/dist/services/document-service/utils/populate.js.map +1 -1
- package/dist/services/document-service/utils/populate.mjs +65 -43
- package/dist/services/document-service/utils/populate.mjs.map +1 -1
- package/dist/services/document-service/utils/unidirectional-relations.d.ts +15 -2
- package/dist/services/document-service/utils/unidirectional-relations.d.ts.map +1 -1
- package/dist/services/document-service/utils/unidirectional-relations.js +163 -61
- package/dist/services/document-service/utils/unidirectional-relations.js.map +1 -1
- package/dist/services/document-service/utils/unidirectional-relations.mjs +162 -63
- package/dist/services/document-service/utils/unidirectional-relations.mjs.map +1 -1
- package/dist/services/entity-service/index.js +230 -161
- package/dist/services/entity-service/index.js.map +1 -1
- package/dist/services/entity-service/index.mjs +229 -160
- package/dist/services/entity-service/index.mjs.map +1 -1
- package/dist/services/entity-validator/blocks-validator.js +135 -103
- package/dist/services/entity-validator/blocks-validator.js.map +1 -1
- package/dist/services/entity-validator/blocks-validator.mjs +134 -104
- package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
- package/dist/services/entity-validator/index.d.ts +1 -1
- package/dist/services/entity-validator/index.d.ts.map +1 -1
- package/dist/services/entity-validator/index.js +370 -366
- package/dist/services/entity-validator/index.js.map +1 -1
- package/dist/services/entity-validator/index.mjs +366 -363
- 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 +270 -209
- package/dist/services/entity-validator/validators.js.map +1 -1
- package/dist/services/entity-validator/validators.mjs +269 -215
- package/dist/services/entity-validator/validators.mjs.map +1 -1
- package/dist/services/errors.js +65 -65
- package/dist/services/errors.js.map +1 -1
- package/dist/services/errors.mjs +64 -66
- package/dist/services/errors.mjs.map +1 -1
- package/dist/services/event-hub.js +82 -69
- package/dist/services/event-hub.js.map +1 -1
- package/dist/services/event-hub.mjs +81 -71
- package/dist/services/event-hub.mjs.map +1 -1
- package/dist/services/features.js +19 -14
- package/dist/services/features.js.map +1 -1
- package/dist/services/features.mjs +18 -15
- package/dist/services/features.mjs.map +1 -1
- package/dist/services/fs.js +41 -40
- package/dist/services/fs.js.map +1 -1
- package/dist/services/fs.mjs +40 -39
- package/dist/services/fs.mjs.map +1 -1
- package/dist/services/metrics/admin-user-hash.d.ts.map +1 -1
- package/dist/services/metrics/admin-user-hash.js +13 -11
- package/dist/services/metrics/admin-user-hash.js.map +1 -1
- package/dist/services/metrics/admin-user-hash.mjs +12 -10
- 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 +47 -40
- package/dist/services/metrics/index.js.map +1 -1
- package/dist/services/metrics/index.mjs +46 -42
- package/dist/services/metrics/index.mjs.map +1 -1
- package/dist/services/metrics/is-truthy.js +13 -6
- package/dist/services/metrics/is-truthy.js.map +1 -1
- package/dist/services/metrics/is-truthy.mjs +12 -6
- package/dist/services/metrics/is-truthy.mjs.map +1 -1
- package/dist/services/metrics/middleware.d.ts.map +1 -1
- package/dist/services/metrics/middleware.js +37 -22
- package/dist/services/metrics/middleware.js.map +1 -1
- package/dist/services/metrics/middleware.mjs +36 -24
- package/dist/services/metrics/middleware.mjs.map +1 -1
- package/dist/services/metrics/rate-limiter.d.ts.map +1 -1
- package/dist/services/metrics/rate-limiter.js +24 -19
- package/dist/services/metrics/rate-limiter.js.map +1 -1
- package/dist/services/metrics/rate-limiter.mjs +23 -21
- package/dist/services/metrics/rate-limiter.mjs.map +1 -1
- package/dist/services/metrics/sender.d.ts.map +1 -1
- package/dist/services/metrics/sender.js +78 -69
- package/dist/services/metrics/sender.js.map +1 -1
- package/dist/services/metrics/sender.mjs +77 -64
- package/dist/services/metrics/sender.mjs.map +1 -1
- package/dist/services/query-params.js +13 -10
- package/dist/services/query-params.js.map +1 -1
- package/dist/services/query-params.mjs +12 -12
- package/dist/services/query-params.mjs.map +1 -1
- package/dist/services/reloader.js +35 -32
- package/dist/services/reloader.js.map +1 -1
- package/dist/services/reloader.mjs +34 -33
- package/dist/services/reloader.mjs.map +1 -1
- package/dist/services/request-context.js +11 -8
- package/dist/services/request-context.js.map +1 -1
- package/dist/services/request-context.mjs +10 -10
- package/dist/services/request-context.mjs.map +1 -1
- package/dist/services/server/admin-api.js +11 -10
- package/dist/services/server/admin-api.js.map +1 -1
- package/dist/services/server/admin-api.mjs +10 -11
- package/dist/services/server/admin-api.mjs.map +1 -1
- package/dist/services/server/api.js +33 -27
- package/dist/services/server/api.js.map +1 -1
- package/dist/services/server/api.mjs +32 -26
- package/dist/services/server/api.mjs.map +1 -1
- package/dist/services/server/compose-endpoint.js +116 -105
- package/dist/services/server/compose-endpoint.js.map +1 -1
- package/dist/services/server/compose-endpoint.mjs +115 -105
- package/dist/services/server/compose-endpoint.mjs.map +1 -1
- package/dist/services/server/content-api.js +11 -9
- package/dist/services/server/content-api.js.map +1 -1
- package/dist/services/server/content-api.mjs +10 -10
- package/dist/services/server/content-api.mjs.map +1 -1
- package/dist/services/server/http-server.js +48 -44
- package/dist/services/server/http-server.js.map +1 -1
- package/dist/services/server/http-server.mjs +47 -43
- package/dist/services/server/http-server.mjs.map +1 -1
- package/dist/services/server/index.js +85 -82
- package/dist/services/server/index.js.map +1 -1
- package/dist/services/server/index.mjs +84 -81
- package/dist/services/server/index.mjs.map +1 -1
- package/dist/services/server/koa.js +49 -47
- package/dist/services/server/koa.js.map +1 -1
- package/dist/services/server/koa.mjs +48 -44
- package/dist/services/server/koa.mjs.map +1 -1
- package/dist/services/server/middleware.js +86 -82
- package/dist/services/server/middleware.js.map +1 -1
- package/dist/services/server/middleware.mjs +85 -82
- package/dist/services/server/middleware.mjs.map +1 -1
- package/dist/services/server/policy.js +24 -17
- package/dist/services/server/policy.js.map +1 -1
- package/dist/services/server/policy.mjs +23 -18
- package/dist/services/server/policy.mjs.map +1 -1
- package/dist/services/server/register-middlewares.js +68 -61
- package/dist/services/server/register-middlewares.js.map +1 -1
- package/dist/services/server/register-middlewares.mjs +67 -63
- package/dist/services/server/register-middlewares.mjs.map +1 -1
- package/dist/services/server/register-routes.js +109 -66
- package/dist/services/server/register-routes.js.map +1 -1
- package/dist/services/server/register-routes.mjs +108 -66
- 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 +100 -81
- package/dist/services/server/routing.js.map +1 -1
- package/dist/services/server/routing.mjs +99 -81
- package/dist/services/server/routing.mjs.map +1 -1
- 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/utils/dynamic-zones.js +13 -14
- package/dist/services/utils/dynamic-zones.js.map +1 -1
- package/dist/services/utils/dynamic-zones.mjs +12 -16
- package/dist/services/utils/dynamic-zones.mjs.map +1 -1
- package/dist/services/webhook-runner.js +124 -122
- package/dist/services/webhook-runner.js.map +1 -1
- package/dist/services/webhook-runner.mjs +123 -121
- package/dist/services/webhook-runner.mjs.map +1 -1
- package/dist/services/webhook-store.js +132 -99
- package/dist/services/webhook-store.js.map +1 -1
- package/dist/services/webhook-store.mjs +131 -101
- package/dist/services/webhook-store.mjs.map +1 -1
- package/dist/services/worker-queue.js +44 -49
- package/dist/services/worker-queue.js.map +1 -1
- package/dist/services/worker-queue.mjs +43 -49
- package/dist/services/worker-queue.mjs.map +1 -1
- package/dist/utils/convert-custom-field-type.js +17 -20
- package/dist/utils/convert-custom-field-type.js.map +1 -1
- package/dist/utils/convert-custom-field-type.mjs +16 -21
- package/dist/utils/convert-custom-field-type.mjs.map +1 -1
- package/dist/utils/cron.js +64 -30
- package/dist/utils/cron.js.map +1 -1
- package/dist/utils/cron.mjs +63 -31
- package/dist/utils/cron.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 +28 -18
- package/dist/utils/fetch.js.map +1 -1
- package/dist/utils/fetch.mjs +27 -19
- package/dist/utils/fetch.mjs.map +1 -1
- package/dist/utils/filepath-to-prop-path.js +20 -28
- package/dist/utils/filepath-to-prop-path.js.map +1 -1
- package/dist/utils/filepath-to-prop-path.mjs +19 -26
- package/dist/utils/filepath-to-prop-path.mjs.map +1 -1
- package/dist/utils/is-initialized.js +21 -12
- package/dist/utils/is-initialized.js.map +1 -1
- package/dist/utils/is-initialized.mjs +20 -13
- package/dist/utils/is-initialized.mjs.map +1 -1
- package/dist/utils/lifecycles.js +6 -5
- package/dist/utils/lifecycles.js.map +1 -1
- package/dist/utils/lifecycles.mjs +5 -6
- package/dist/utils/lifecycles.mjs.map +1 -1
- package/dist/utils/load-config-file.js +40 -38
- package/dist/utils/load-config-file.js.map +1 -1
- package/dist/utils/load-config-file.mjs +39 -36
- package/dist/utils/load-config-file.mjs.map +1 -1
- package/dist/utils/load-files.js +40 -35
- package/dist/utils/load-files.js.map +1 -1
- package/dist/utils/load-files.mjs +39 -32
- package/dist/utils/load-files.mjs.map +1 -1
- package/dist/utils/open-browser.js +8 -8
- package/dist/utils/open-browser.js.map +1 -1
- package/dist/utils/open-browser.mjs +7 -7
- package/dist/utils/open-browser.mjs.map +1 -1
- package/dist/utils/resolve-working-dirs.js +23 -10
- package/dist/utils/resolve-working-dirs.js.map +1 -1
- package/dist/utils/resolve-working-dirs.mjs +22 -9
- package/dist/utils/resolve-working-dirs.mjs.map +1 -1
- package/dist/utils/signals.js +20 -14
- package/dist/utils/signals.js.map +1 -1
- package/dist/utils/signals.mjs +19 -15
- package/dist/utils/signals.mjs.map +1 -1
- package/dist/utils/startup-logger.js +107 -83
- package/dist/utils/startup-logger.js.map +1 -1
- package/dist/utils/startup-logger.mjs +106 -80
- 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/dist/utils/transform-content-types-to-models.js +350 -261
- package/dist/utils/transform-content-types-to-models.js.map +1 -1
- package/dist/utils/transform-content-types-to-models.mjs +349 -269
- package/dist/utils/transform-content-types-to-models.mjs.map +1 -1
- package/dist/utils/update-notifier/index.d.ts.map +1 -1
- package/dist/utils/update-notifier/index.js +68 -73
- package/dist/utils/update-notifier/index.js.map +1 -1
- package/dist/utils/update-notifier/index.mjs +67 -67
- package/dist/utils/update-notifier/index.mjs.map +1 -1
- package/package.json +29 -27
|
@@ -1,69 +1,171 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fp = require('lodash/fp');
|
|
4
|
+
|
|
5
|
+
/* -------------------------------------------------------------------------------------------------
|
|
6
|
+
* Component Helper Functions
|
|
7
|
+
* -----------------------------------------------------------------------------------------------*/ /**
|
|
8
|
+
* Finds content types that contain the given component and have draft & publish enabled.
|
|
9
|
+
*/ const getParentSchemasForComponent = (componentSchema)=>{
|
|
10
|
+
return Object.values(strapi.contentTypes).filter((contentType)=>{
|
|
11
|
+
if (!contentType.options?.draftAndPublish) return false;
|
|
12
|
+
return Object.values(contentType.attributes).some((attr)=>{
|
|
13
|
+
return attr.type === 'component' && attr.component === componentSchema.uid || attr.type === 'dynamiczone' && attr.components?.includes(componentSchema.uid);
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Determines if a component relation should be propagated to a new document version
|
|
19
|
+
* when a document with draft and publish is updated.
|
|
20
|
+
*/ const shouldPropagateRelationToNewVersion = async (componentRelation, componentSchema, parentSchemasForComponent, trx)=>{
|
|
21
|
+
const componentId = componentRelation[`${componentSchema.modelName}_id`];
|
|
22
|
+
const parent = await strapi.db.findComponentParent(componentSchema, componentId, parentSchemasForComponent, {
|
|
23
|
+
trx
|
|
24
|
+
});
|
|
25
|
+
// Keep relation if component has no parent entry
|
|
26
|
+
if (!parent?.uid) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
const parentContentType = strapi.contentTypes[parent.uid];
|
|
30
|
+
// Keep relation if parent doesn't have draft & publish enabled
|
|
31
|
+
if (!parentContentType?.options?.draftAndPublish) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
// Discard relation if parent has draft & publish enabled
|
|
35
|
+
return false;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Filters component relations to only include those that should be propagated to new document versions.
|
|
39
|
+
* Only relations that are NOT linked to a draft & publish parent type are kept.
|
|
40
|
+
*/ const filterComponentRelations = async (relations, componentSchema, trx)=>{
|
|
41
|
+
// Exit if no relations to filter
|
|
42
|
+
if (relations.length === 0) {
|
|
43
|
+
return relations;
|
|
44
|
+
}
|
|
45
|
+
const componentParents = getParentSchemasForComponent(componentSchema);
|
|
46
|
+
// Exit if no draft & publish parent types exist
|
|
47
|
+
if (componentParents.length === 0) {
|
|
48
|
+
return relations;
|
|
49
|
+
}
|
|
50
|
+
const relationsToPropagate = [];
|
|
51
|
+
for (const relation of relations){
|
|
52
|
+
if (await shouldPropagateRelationToNewVersion(relation, componentSchema, componentParents, trx)) {
|
|
53
|
+
relationsToPropagate.push(relation);
|
|
38
54
|
}
|
|
39
|
-
}
|
|
40
55
|
}
|
|
41
|
-
|
|
42
|
-
|
|
56
|
+
return relationsToPropagate;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Loads lingering relations that need to be updated when overriding a published or draft entry.
|
|
60
|
+
* This is necessary because the relations are uni-directional and the target entry is not aware of the source entry.
|
|
61
|
+
* This is not the case for bi-directional relations, where the target entry is also linked to the source entry.
|
|
62
|
+
*/ const load = async (uid, { oldVersions, newVersions })=>{
|
|
63
|
+
const updates = [];
|
|
64
|
+
// Iterate all components and content types to find relations that need to be updated
|
|
65
|
+
await strapi.db.transaction(async ({ trx })=>{
|
|
66
|
+
const contentTypes = Object.values(strapi.contentTypes);
|
|
67
|
+
const components = Object.values(strapi.components);
|
|
68
|
+
for (const model of [
|
|
69
|
+
...contentTypes,
|
|
70
|
+
...components
|
|
71
|
+
]){
|
|
72
|
+
const dbModel = strapi.db.metadata.get(model.uid);
|
|
73
|
+
for (const attribute of Object.values(dbModel.attributes)){
|
|
74
|
+
/**
|
|
75
|
+
* Only consider unidirectional relations
|
|
76
|
+
*/ if (attribute.type !== 'relation' || attribute.target !== uid || attribute.inversedBy || attribute.mappedBy) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
// TODO: joinColumn relations
|
|
80
|
+
const joinTable = attribute.joinTable;
|
|
81
|
+
if (!joinTable) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const { name: sourceColumnName } = joinTable.joinColumn;
|
|
85
|
+
const { name: targetColumnName } = joinTable.inverseJoinColumn;
|
|
86
|
+
/**
|
|
87
|
+
* Load all relations that need to be updated
|
|
88
|
+
*/ // NOTE: when the model has draft and publish, we can assume relation are only draft to draft & published to published
|
|
89
|
+
const ids = oldVersions.map((entry)=>entry.id);
|
|
90
|
+
const oldVersionsRelations = await strapi.db.getConnection().select('*').from(joinTable.name).whereIn(targetColumnName, ids).transacting(trx);
|
|
91
|
+
if (oldVersionsRelations.length > 0) {
|
|
92
|
+
updates.push({
|
|
93
|
+
joinTable,
|
|
94
|
+
relations: oldVersionsRelations
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* if publishing
|
|
99
|
+
* if published version exists
|
|
100
|
+
* updated published versions links
|
|
101
|
+
* else
|
|
102
|
+
* create link to newly published version
|
|
103
|
+
*
|
|
104
|
+
* if discarding
|
|
105
|
+
* if published version link exists & not draft version link
|
|
106
|
+
* create link to new draft version
|
|
107
|
+
*/ if (!model.options?.draftAndPublish) {
|
|
108
|
+
const ids = newVersions.map((entry)=>entry.id);
|
|
109
|
+
// This is the step were we query the join table based on the id of the document
|
|
110
|
+
const newVersionsRelations = await strapi.db.getConnection().select('*').from(joinTable.name).whereIn(targetColumnName, ids).transacting(trx);
|
|
111
|
+
const filteredRelations = model.modelType === 'component' ? await filterComponentRelations(newVersionsRelations, model, trx) : newVersionsRelations;
|
|
112
|
+
if (filteredRelations.length > 0) {
|
|
113
|
+
// when publishing a draft that doesn't have a published version yet,
|
|
114
|
+
// copy the links to the draft over to the published version
|
|
115
|
+
// when discarding a published version, if no drafts exists
|
|
116
|
+
const discardToAdd = filteredRelations.filter((relation)=>{
|
|
117
|
+
const matchingOldVersion = oldVersionsRelations.find((oldRelation)=>{
|
|
118
|
+
return oldRelation[sourceColumnName] === relation[sourceColumnName];
|
|
119
|
+
});
|
|
120
|
+
return !matchingOldVersion;
|
|
121
|
+
}).map(fp.omit('id'));
|
|
122
|
+
updates.push({
|
|
123
|
+
joinTable,
|
|
124
|
+
relations: discardToAdd
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
return updates;
|
|
43
132
|
};
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
133
|
+
/**
|
|
134
|
+
* Updates uni directional relations to target the right entries when overriding published or draft entries.
|
|
135
|
+
*
|
|
136
|
+
* @param oldEntries The old entries that are being overridden
|
|
137
|
+
* @param newEntries The new entries that are overriding the old ones
|
|
138
|
+
* @param oldRelations The relations that were previously loaded with `load` @see load
|
|
139
|
+
*/ const sync = async (oldEntries, newEntries, oldRelations)=>{
|
|
140
|
+
/**
|
|
141
|
+
* Create a map of old entry ids to new entry ids
|
|
142
|
+
*
|
|
143
|
+
* Will be used to update the relation target ids
|
|
144
|
+
*/ const newEntryByLocale = fp.keyBy('locale', newEntries);
|
|
145
|
+
const oldEntriesMap = oldEntries.reduce((acc, entry)=>{
|
|
146
|
+
const newEntry = newEntryByLocale[entry.locale];
|
|
147
|
+
if (!newEntry) return acc;
|
|
148
|
+
acc[entry.id] = newEntry.id;
|
|
50
149
|
return acc;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
150
|
+
}, {});
|
|
151
|
+
await strapi.db.transaction(async ({ trx })=>{
|
|
152
|
+
// Iterate old relations that are deleted and insert the new ones
|
|
153
|
+
for (const { joinTable, relations } of oldRelations){
|
|
154
|
+
// Update old ids with the new ones
|
|
155
|
+
const column = joinTable.inverseJoinColumn.name;
|
|
156
|
+
const newRelations = relations.map((relation)=>{
|
|
157
|
+
const newId = oldEntriesMap[relation[column]];
|
|
158
|
+
return {
|
|
159
|
+
...relation,
|
|
160
|
+
[column]: newId
|
|
161
|
+
};
|
|
162
|
+
});
|
|
163
|
+
// Insert those relations into the join table
|
|
164
|
+
await trx.batchInsert(joinTable.name, newRelations, 1000);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
66
167
|
};
|
|
168
|
+
|
|
67
169
|
exports.load = load;
|
|
68
170
|
exports.sync = sync;
|
|
69
171
|
//# sourceMappingURL=unidirectional-relations.js.map
|
|
@@ -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 { 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":["ids","omit","keyBy"],"mappings":";;;AAeA,MAAM,OAAO,OAAO,KAAsB,EAAE,aAAa,kBAA+B;AACtF,QAAM,UAAU,CAAA;AAGhB,QAAM,OAAO,GAAG,YAAY,OAAO,EAAE,UAAU;AAC7C,UAAM,eAAe,OAAO,OAAO,OAAO,YAAY;AACtD,UAAM,aAAa,OAAO,OAAO,OAAO,UAAU;AAElD,eAAW,SAAS,CAAC,GAAG,cAAc,GAAG,UAAU,GAAG;AACpD,YAAM,UAAU,OAAO,GAAG,SAAS,IAAI,MAAM,GAAG;AAEhD,iBAAW,aAAa,OAAO,OAAO,QAAQ,UAAU,GAAU;AAK9D,YAAA,UAAU,SAAS,cACnB,UAAU,WAAW,OACrB,UAAU,cACV,UAAU,UACV;AACA;AAAA,QACF;AAGA,cAAM,YAAY,UAAU;AAC5B,YAAI,CAAC,WAAW;AACd;AAAA,QACF;AAEA,cAAM,EAAE,MAAM,qBAAqB,UAAU;AAC7C,cAAM,EAAE,MAAM,qBAAqB,UAAU;AAM7C,cAAM,MAAM,YAAY,IAAI,CAAC,UAAU,MAAM,EAAE;AAE/C,cAAM,uBAAuB,MAAM,OAAO,GACvC,gBACA,OAAO,GAAG,EACV,KAAK,UAAU,IAAI,EACnB,QAAQ,kBAAkB,GAAG,EAC7B,YAAY,GAAG;AAEd,YAAA,qBAAqB,SAAS,GAAG;AACnC,kBAAQ,KAAK,EAAE,WAAW,WAAW,qBAAsB,CAAA;AAAA,QAC7D;AAcI,YAAA,CAAC,MAAM,SAAS,iBAAiB;AACnC,gBAAMA,OAAM,YAAY,IAAI,CAAC,UAAU,MAAM,EAAE;AAE/C,gBAAM,uBAAuB,MAAM,OAAO,GACvC,gBACA,OAAO,GAAG,EACV,KAAK,UAAU,IAAI,EACnB,QAAQ,kBAAkBA,IAAG,EAC7B,YAAY,GAAG;AAEd,cAAA,qBAAqB,SAAS,GAAG;AAInC,kBAAM,eAAe,qBAClB,OAAO,CAAC,aAAa;AACpB,oBAAM,oBAAoB,qBAAqB,KAAK,CAAC,gBAAgB;AACnE,uBAAO,YAAY,gBAAgB,MAAM,SAAS,gBAAgB;AAAA,cAAA,CACnE;AAED,qBAAO,CAAC;AAAA,YACT,CAAA,EACA,IAAIC,QAAK,IAAI,CAAC;AAEjB,oBAAQ,KAAK,EAAE,WAAW,WAAW,aAAc,CAAA;AAAA,UACrD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EAAA,CACD;AAEM,SAAA;AACT;AASA,MAAM,OAAO,OACX,YACA,YACA,iBACG;AAMG,QAAA,mBAAmBC,GAAAA,MAAM,UAAU,UAAU;AACnD,QAAM,gBAAgB,WAAW;AAAA,IAC/B,CAAC,KAAK,UAAU;AACR,YAAA,WAAW,iBAAiB,MAAM,MAAM;AAC9C,UAAI,CAAC;AAAiB,eAAA;AAClB,UAAA,MAAM,EAAE,IAAI,SAAS;AAClB,aAAA;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EAAA;AAGH,QAAM,OAAO,GAAG,YAAY,OAAO,EAAE,UAAU;AAE7C,eAAW,EAAE,WAAW,UAAU,KAAK,cAAc;AAE7C,YAAA,SAAS,UAAU,kBAAkB;AAE3C,YAAM,eAAe,UAAU,IAAI,CAAC,aAAa;AAC/C,cAAM,QAAQ,cAAc,SAAS,MAAM,CAAC;AAC5C,eAAO,EAAE,GAAG,UAAU,CAAC,MAAM,GAAG,MAAM;AAAA,MAAA,CACvC;AAGD,YAAM,IAAI,YAAY,UAAU,MAAM,cAAc,GAAI;AAAA,IAC1D;AAAA,EAAA,CACD;AACH;;;"}
|
|
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\ninterface JoinTable {\n name: string;\n joinColumn: { name: string };\n inverseJoinColumn: { name: string };\n}\n\ninterface RelationUpdate {\n joinTable: JoinTable;\n relations: Record<string, any>[];\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Component Helper Functions\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * Finds content types that contain the given component and have draft & publish enabled.\n */\nconst getParentSchemasForComponent = (componentSchema: Schema.Component): Schema.ContentType[] => {\n return Object.values(strapi.contentTypes).filter((contentType: any) => {\n if (!contentType.options?.draftAndPublish) return false;\n\n return Object.values(contentType.attributes).some((attr: any) => {\n return (\n (attr.type === 'component' && attr.component === componentSchema.uid) ||\n (attr.type === 'dynamiczone' && attr.components?.includes(componentSchema.uid))\n );\n });\n });\n};\n\n/**\n * Determines if a component relation should be propagated to a new document version\n * when a document with draft and publish is updated.\n */\nconst shouldPropagateRelationToNewVersion = async (\n componentRelation: Record<string, any>,\n componentSchema: Schema.Component,\n parentSchemasForComponent: Schema.ContentType[],\n trx: any\n): Promise<boolean> => {\n const componentId = componentRelation[`${componentSchema.modelName}_id`];\n\n const parent = await strapi.db.findComponentParent(\n componentSchema,\n componentId,\n parentSchemasForComponent,\n { trx }\n );\n\n // Keep relation if component has no parent entry\n if (!parent?.uid) {\n return true;\n }\n\n const parentContentType = strapi.contentTypes[parent.uid as UID.ContentType];\n\n // Keep relation if parent doesn't have draft & publish enabled\n if (!parentContentType?.options?.draftAndPublish) {\n return true;\n }\n\n // Discard relation if parent has draft & publish enabled\n return false;\n};\n\n/**\n * Filters component relations to only include those that should be propagated to new document versions.\n * Only relations that are NOT linked to a draft & publish parent type are kept.\n */\nconst filterComponentRelations = async (\n relations: Record<string, any>[],\n componentSchema: Schema.Component,\n trx: any\n): Promise<Record<string, any>[]> => {\n // Exit if no relations to filter\n if (relations.length === 0) {\n return relations;\n }\n\n const componentParents = getParentSchemasForComponent(componentSchema);\n\n // Exit if no draft & publish parent types exist\n if (componentParents.length === 0) {\n return relations;\n }\n\n const relationsToPropagate = [];\n for (const relation of relations) {\n if (\n await shouldPropagateRelationToNewVersion(relation, componentSchema, componentParents, trx)\n ) {\n relationsToPropagate.push(relation);\n }\n }\n\n return relationsToPropagate;\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): 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 const filteredRelations =\n model.modelType === 'component'\n ? await filterComponentRelations(newVersionsRelations, model, trx)\n : newVersionsRelations;\n\n if (filteredRelations.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 = filteredRelations\n .filter((relation) => {\n const matchingOldVersion = oldVersionsRelations.find((oldRelation) => {\n return oldRelation[sourceColumnName] === relation[sourceColumnName];\n });\n\n return !matchingOldVersion;\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":["getParentSchemasForComponent","componentSchema","Object","values","strapi","contentTypes","filter","contentType","options","draftAndPublish","attributes","some","attr","type","component","uid","components","includes","shouldPropagateRelationToNewVersion","componentRelation","parentSchemasForComponent","trx","componentId","modelName","parent","db","findComponentParent","parentContentType","filterComponentRelations","relations","length","componentParents","relationsToPropagate","relation","push","load","oldVersions","newVersions","updates","transaction","model","dbModel","metadata","get","attribute","target","inversedBy","mappedBy","joinTable","name","sourceColumnName","joinColumn","targetColumnName","inverseJoinColumn","ids","map","entry","id","oldVersionsRelations","getConnection","select","from","whereIn","transacting","newVersionsRelations","filteredRelations","modelType","discardToAdd","matchingOldVersion","find","oldRelation","omit","sync","oldEntries","newEntries","oldRelations","newEntryByLocale","keyBy","oldEntriesMap","reduce","acc","newEntry","locale","column","newRelations","newId","batchInsert"],"mappings":"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"}
|
|
@@ -1,69 +1,168 @@
|
|
|
1
|
-
import { omit, keyBy } from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
});
|
|
32
|
-
return !matchingOldVerion;
|
|
33
|
-
}).map(omit("id"));
|
|
34
|
-
updates.push({ joinTable, relations: discardToAdd });
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
1
|
+
import { omit, keyBy } from 'lodash/fp';
|
|
2
|
+
|
|
3
|
+
/* -------------------------------------------------------------------------------------------------
|
|
4
|
+
* Component Helper Functions
|
|
5
|
+
* -----------------------------------------------------------------------------------------------*/ /**
|
|
6
|
+
* Finds content types that contain the given component and have draft & publish enabled.
|
|
7
|
+
*/ const getParentSchemasForComponent = (componentSchema)=>{
|
|
8
|
+
return Object.values(strapi.contentTypes).filter((contentType)=>{
|
|
9
|
+
if (!contentType.options?.draftAndPublish) return false;
|
|
10
|
+
return Object.values(contentType.attributes).some((attr)=>{
|
|
11
|
+
return attr.type === 'component' && attr.component === componentSchema.uid || attr.type === 'dynamiczone' && attr.components?.includes(componentSchema.uid);
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Determines if a component relation should be propagated to a new document version
|
|
17
|
+
* when a document with draft and publish is updated.
|
|
18
|
+
*/ const shouldPropagateRelationToNewVersion = async (componentRelation, componentSchema, parentSchemasForComponent, trx)=>{
|
|
19
|
+
const componentId = componentRelation[`${componentSchema.modelName}_id`];
|
|
20
|
+
const parent = await strapi.db.findComponentParent(componentSchema, componentId, parentSchemasForComponent, {
|
|
21
|
+
trx
|
|
22
|
+
});
|
|
23
|
+
// Keep relation if component has no parent entry
|
|
24
|
+
if (!parent?.uid) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
const parentContentType = strapi.contentTypes[parent.uid];
|
|
28
|
+
// Keep relation if parent doesn't have draft & publish enabled
|
|
29
|
+
if (!parentContentType?.options?.draftAndPublish) {
|
|
30
|
+
return true;
|
|
38
31
|
}
|
|
39
|
-
|
|
40
|
-
|
|
32
|
+
// Discard relation if parent has draft & publish enabled
|
|
33
|
+
return false;
|
|
41
34
|
};
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
return
|
|
49
|
-
acc[entry.id] = newEntry.id;
|
|
50
|
-
return acc;
|
|
51
|
-
},
|
|
52
|
-
{}
|
|
53
|
-
);
|
|
54
|
-
await strapi.db.transaction(async ({ trx }) => {
|
|
55
|
-
for (const { joinTable, relations } of oldRelations) {
|
|
56
|
-
const column = joinTable.inverseJoinColumn.name;
|
|
57
|
-
const newRelations = relations.map((relation) => {
|
|
58
|
-
const newId = oldEntriesMap[relation[column]];
|
|
59
|
-
return { ...relation, [column]: newId };
|
|
60
|
-
});
|
|
61
|
-
await trx.batchInsert(joinTable.name, newRelations, 1e3);
|
|
35
|
+
/**
|
|
36
|
+
* Filters component relations to only include those that should be propagated to new document versions.
|
|
37
|
+
* Only relations that are NOT linked to a draft & publish parent type are kept.
|
|
38
|
+
*/ const filterComponentRelations = async (relations, componentSchema, trx)=>{
|
|
39
|
+
// Exit if no relations to filter
|
|
40
|
+
if (relations.length === 0) {
|
|
41
|
+
return relations;
|
|
62
42
|
}
|
|
63
|
-
|
|
43
|
+
const componentParents = getParentSchemasForComponent(componentSchema);
|
|
44
|
+
// Exit if no draft & publish parent types exist
|
|
45
|
+
if (componentParents.length === 0) {
|
|
46
|
+
return relations;
|
|
47
|
+
}
|
|
48
|
+
const relationsToPropagate = [];
|
|
49
|
+
for (const relation of relations){
|
|
50
|
+
if (await shouldPropagateRelationToNewVersion(relation, componentSchema, componentParents, trx)) {
|
|
51
|
+
relationsToPropagate.push(relation);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return relationsToPropagate;
|
|
64
55
|
};
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Loads lingering relations that need to be updated when overriding a published or draft entry.
|
|
58
|
+
* This is necessary because the relations are uni-directional and the target entry is not aware of the source entry.
|
|
59
|
+
* This is not the case for bi-directional relations, where the target entry is also linked to the source entry.
|
|
60
|
+
*/ const load = async (uid, { oldVersions, newVersions })=>{
|
|
61
|
+
const updates = [];
|
|
62
|
+
// Iterate all components and content types to find relations that need to be updated
|
|
63
|
+
await strapi.db.transaction(async ({ trx })=>{
|
|
64
|
+
const contentTypes = Object.values(strapi.contentTypes);
|
|
65
|
+
const components = Object.values(strapi.components);
|
|
66
|
+
for (const model of [
|
|
67
|
+
...contentTypes,
|
|
68
|
+
...components
|
|
69
|
+
]){
|
|
70
|
+
const dbModel = strapi.db.metadata.get(model.uid);
|
|
71
|
+
for (const attribute of Object.values(dbModel.attributes)){
|
|
72
|
+
/**
|
|
73
|
+
* Only consider unidirectional relations
|
|
74
|
+
*/ if (attribute.type !== 'relation' || attribute.target !== uid || attribute.inversedBy || attribute.mappedBy) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
// TODO: joinColumn relations
|
|
78
|
+
const joinTable = attribute.joinTable;
|
|
79
|
+
if (!joinTable) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const { name: sourceColumnName } = joinTable.joinColumn;
|
|
83
|
+
const { name: targetColumnName } = joinTable.inverseJoinColumn;
|
|
84
|
+
/**
|
|
85
|
+
* Load all relations that need to be updated
|
|
86
|
+
*/ // NOTE: when the model has draft and publish, we can assume relation are only draft to draft & published to published
|
|
87
|
+
const ids = oldVersions.map((entry)=>entry.id);
|
|
88
|
+
const oldVersionsRelations = await strapi.db.getConnection().select('*').from(joinTable.name).whereIn(targetColumnName, ids).transacting(trx);
|
|
89
|
+
if (oldVersionsRelations.length > 0) {
|
|
90
|
+
updates.push({
|
|
91
|
+
joinTable,
|
|
92
|
+
relations: oldVersionsRelations
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* if publishing
|
|
97
|
+
* if published version exists
|
|
98
|
+
* updated published versions links
|
|
99
|
+
* else
|
|
100
|
+
* create link to newly published version
|
|
101
|
+
*
|
|
102
|
+
* if discarding
|
|
103
|
+
* if published version link exists & not draft version link
|
|
104
|
+
* create link to new draft version
|
|
105
|
+
*/ if (!model.options?.draftAndPublish) {
|
|
106
|
+
const ids = newVersions.map((entry)=>entry.id);
|
|
107
|
+
// This is the step were we query the join table based on the id of the document
|
|
108
|
+
const newVersionsRelations = await strapi.db.getConnection().select('*').from(joinTable.name).whereIn(targetColumnName, ids).transacting(trx);
|
|
109
|
+
const filteredRelations = model.modelType === 'component' ? await filterComponentRelations(newVersionsRelations, model, trx) : newVersionsRelations;
|
|
110
|
+
if (filteredRelations.length > 0) {
|
|
111
|
+
// when publishing a draft that doesn't have a published version yet,
|
|
112
|
+
// copy the links to the draft over to the published version
|
|
113
|
+
// when discarding a published version, if no drafts exists
|
|
114
|
+
const discardToAdd = filteredRelations.filter((relation)=>{
|
|
115
|
+
const matchingOldVersion = oldVersionsRelations.find((oldRelation)=>{
|
|
116
|
+
return oldRelation[sourceColumnName] === relation[sourceColumnName];
|
|
117
|
+
});
|
|
118
|
+
return !matchingOldVersion;
|
|
119
|
+
}).map(omit('id'));
|
|
120
|
+
updates.push({
|
|
121
|
+
joinTable,
|
|
122
|
+
relations: discardToAdd
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
return updates;
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Updates uni directional relations to target the right entries when overriding published or draft entries.
|
|
133
|
+
*
|
|
134
|
+
* @param oldEntries The old entries that are being overridden
|
|
135
|
+
* @param newEntries The new entries that are overriding the old ones
|
|
136
|
+
* @param oldRelations The relations that were previously loaded with `load` @see load
|
|
137
|
+
*/ const sync = async (oldEntries, newEntries, oldRelations)=>{
|
|
138
|
+
/**
|
|
139
|
+
* Create a map of old entry ids to new entry ids
|
|
140
|
+
*
|
|
141
|
+
* Will be used to update the relation target ids
|
|
142
|
+
*/ const newEntryByLocale = keyBy('locale', newEntries);
|
|
143
|
+
const oldEntriesMap = oldEntries.reduce((acc, entry)=>{
|
|
144
|
+
const newEntry = newEntryByLocale[entry.locale];
|
|
145
|
+
if (!newEntry) return acc;
|
|
146
|
+
acc[entry.id] = newEntry.id;
|
|
147
|
+
return acc;
|
|
148
|
+
}, {});
|
|
149
|
+
await strapi.db.transaction(async ({ trx })=>{
|
|
150
|
+
// Iterate old relations that are deleted and insert the new ones
|
|
151
|
+
for (const { joinTable, relations } of oldRelations){
|
|
152
|
+
// Update old ids with the new ones
|
|
153
|
+
const column = joinTable.inverseJoinColumn.name;
|
|
154
|
+
const newRelations = relations.map((relation)=>{
|
|
155
|
+
const newId = oldEntriesMap[relation[column]];
|
|
156
|
+
return {
|
|
157
|
+
...relation,
|
|
158
|
+
[column]: newId
|
|
159
|
+
};
|
|
160
|
+
});
|
|
161
|
+
// Insert those relations into the join table
|
|
162
|
+
await trx.batchInsert(joinTable.name, newRelations, 1000);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
68
165
|
};
|
|
166
|
+
|
|
167
|
+
export { load, sync };
|
|
69
168
|
//# sourceMappingURL=unidirectional-relations.mjs.map
|
|
@@ -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 { 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":["ids"],"mappings":";AAeA,MAAM,OAAO,OAAO,KAAsB,EAAE,aAAa,kBAA+B;AACtF,QAAM,UAAU,CAAA;AAGhB,QAAM,OAAO,GAAG,YAAY,OAAO,EAAE,UAAU;AAC7C,UAAM,eAAe,OAAO,OAAO,OAAO,YAAY;AACtD,UAAM,aAAa,OAAO,OAAO,OAAO,UAAU;AAElD,eAAW,SAAS,CAAC,GAAG,cAAc,GAAG,UAAU,GAAG;AACpD,YAAM,UAAU,OAAO,GAAG,SAAS,IAAI,MAAM,GAAG;AAEhD,iBAAW,aAAa,OAAO,OAAO,QAAQ,UAAU,GAAU;AAK9D,YAAA,UAAU,SAAS,cACnB,UAAU,WAAW,OACrB,UAAU,cACV,UAAU,UACV;AACA;AAAA,QACF;AAGA,cAAM,YAAY,UAAU;AAC5B,YAAI,CAAC,WAAW;AACd;AAAA,QACF;AAEA,cAAM,EAAE,MAAM,qBAAqB,UAAU;AAC7C,cAAM,EAAE,MAAM,qBAAqB,UAAU;AAM7C,cAAM,MAAM,YAAY,IAAI,CAAC,UAAU,MAAM,EAAE;AAE/C,cAAM,uBAAuB,MAAM,OAAO,GACvC,gBACA,OAAO,GAAG,EACV,KAAK,UAAU,IAAI,EACnB,QAAQ,kBAAkB,GAAG,EAC7B,YAAY,GAAG;AAEd,YAAA,qBAAqB,SAAS,GAAG;AACnC,kBAAQ,KAAK,EAAE,WAAW,WAAW,qBAAsB,CAAA;AAAA,QAC7D;AAcI,YAAA,CAAC,MAAM,SAAS,iBAAiB;AACnC,gBAAMA,OAAM,YAAY,IAAI,CAAC,UAAU,MAAM,EAAE;AAE/C,gBAAM,uBAAuB,MAAM,OAAO,GACvC,gBACA,OAAO,GAAG,EACV,KAAK,UAAU,IAAI,EACnB,QAAQ,kBAAkBA,IAAG,EAC7B,YAAY,GAAG;AAEd,cAAA,qBAAqB,SAAS,GAAG;AAInC,kBAAM,eAAe,qBAClB,OAAO,CAAC,aAAa;AACpB,oBAAM,oBAAoB,qBAAqB,KAAK,CAAC,gBAAgB;AACnE,uBAAO,YAAY,gBAAgB,MAAM,SAAS,gBAAgB;AAAA,cAAA,CACnE;AAED,qBAAO,CAAC;AAAA,YACT,CAAA,EACA,IAAI,KAAK,IAAI,CAAC;AAEjB,oBAAQ,KAAK,EAAE,WAAW,WAAW,aAAc,CAAA;AAAA,UACrD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EAAA,CACD;AAEM,SAAA;AACT;AASA,MAAM,OAAO,OACX,YACA,YACA,iBACG;AAMG,QAAA,mBAAmB,MAAM,UAAU,UAAU;AACnD,QAAM,gBAAgB,WAAW;AAAA,IAC/B,CAAC,KAAK,UAAU;AACR,YAAA,WAAW,iBAAiB,MAAM,MAAM;AAC9C,UAAI,CAAC;AAAiB,eAAA;AAClB,UAAA,MAAM,EAAE,IAAI,SAAS;AAClB,aAAA;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EAAA;AAGH,QAAM,OAAO,GAAG,YAAY,OAAO,EAAE,UAAU;AAE7C,eAAW,EAAE,WAAW,UAAU,KAAK,cAAc;AAE7C,YAAA,SAAS,UAAU,kBAAkB;AAE3C,YAAM,eAAe,UAAU,IAAI,CAAC,aAAa;AAC/C,cAAM,QAAQ,cAAc,SAAS,MAAM,CAAC;AAC5C,eAAO,EAAE,GAAG,UAAU,CAAC,MAAM,GAAG,MAAM;AAAA,MAAA,CACvC;AAGD,YAAM,IAAI,YAAY,UAAU,MAAM,cAAc,GAAI;AAAA,IAC1D;AAAA,EAAA,CACD;AACH;"}
|
|
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\ninterface JoinTable {\n name: string;\n joinColumn: { name: string };\n inverseJoinColumn: { name: string };\n}\n\ninterface RelationUpdate {\n joinTable: JoinTable;\n relations: Record<string, any>[];\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Component Helper Functions\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * Finds content types that contain the given component and have draft & publish enabled.\n */\nconst getParentSchemasForComponent = (componentSchema: Schema.Component): Schema.ContentType[] => {\n return Object.values(strapi.contentTypes).filter((contentType: any) => {\n if (!contentType.options?.draftAndPublish) return false;\n\n return Object.values(contentType.attributes).some((attr: any) => {\n return (\n (attr.type === 'component' && attr.component === componentSchema.uid) ||\n (attr.type === 'dynamiczone' && attr.components?.includes(componentSchema.uid))\n );\n });\n });\n};\n\n/**\n * Determines if a component relation should be propagated to a new document version\n * when a document with draft and publish is updated.\n */\nconst shouldPropagateRelationToNewVersion = async (\n componentRelation: Record<string, any>,\n componentSchema: Schema.Component,\n parentSchemasForComponent: Schema.ContentType[],\n trx: any\n): Promise<boolean> => {\n const componentId = componentRelation[`${componentSchema.modelName}_id`];\n\n const parent = await strapi.db.findComponentParent(\n componentSchema,\n componentId,\n parentSchemasForComponent,\n { trx }\n );\n\n // Keep relation if component has no parent entry\n if (!parent?.uid) {\n return true;\n }\n\n const parentContentType = strapi.contentTypes[parent.uid as UID.ContentType];\n\n // Keep relation if parent doesn't have draft & publish enabled\n if (!parentContentType?.options?.draftAndPublish) {\n return true;\n }\n\n // Discard relation if parent has draft & publish enabled\n return false;\n};\n\n/**\n * Filters component relations to only include those that should be propagated to new document versions.\n * Only relations that are NOT linked to a draft & publish parent type are kept.\n */\nconst filterComponentRelations = async (\n relations: Record<string, any>[],\n componentSchema: Schema.Component,\n trx: any\n): Promise<Record<string, any>[]> => {\n // Exit if no relations to filter\n if (relations.length === 0) {\n return relations;\n }\n\n const componentParents = getParentSchemasForComponent(componentSchema);\n\n // Exit if no draft & publish parent types exist\n if (componentParents.length === 0) {\n return relations;\n }\n\n const relationsToPropagate = [];\n for (const relation of relations) {\n if (\n await shouldPropagateRelationToNewVersion(relation, componentSchema, componentParents, trx)\n ) {\n relationsToPropagate.push(relation);\n }\n }\n\n return relationsToPropagate;\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): 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 const filteredRelations =\n model.modelType === 'component'\n ? await filterComponentRelations(newVersionsRelations, model, trx)\n : newVersionsRelations;\n\n if (filteredRelations.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 = filteredRelations\n .filter((relation) => {\n const matchingOldVersion = oldVersionsRelations.find((oldRelation) => {\n return oldRelation[sourceColumnName] === relation[sourceColumnName];\n });\n\n return !matchingOldVersion;\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":["getParentSchemasForComponent","componentSchema","Object","values","strapi","contentTypes","filter","contentType","options","draftAndPublish","attributes","some","attr","type","component","uid","components","includes","shouldPropagateRelationToNewVersion","componentRelation","parentSchemasForComponent","trx","componentId","modelName","parent","db","findComponentParent","parentContentType","filterComponentRelations","relations","length","componentParents","relationsToPropagate","relation","push","load","oldVersions","newVersions","updates","transaction","model","dbModel","metadata","get","attribute","target","inversedBy","mappedBy","joinTable","name","sourceColumnName","joinColumn","targetColumnName","inverseJoinColumn","ids","map","entry","id","oldVersionsRelations","getConnection","select","from","whereIn","transacting","newVersionsRelations","filteredRelations","modelType","discardToAdd","matchingOldVersion","find","oldRelation","omit","sync","oldEntries","newEntries","oldRelations","newEntryByLocale","keyBy","oldEntriesMap","reduce","acc","newEntry","locale","column","newRelations","newId","batchInsert"],"mappings":"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"}
|