@strapi/core 0.0.0-experimental.e9144fc8a193f9875a2c0832d689c14001c79f00 → 0.0.0-experimental.e99215433ba1d6e5497350812df274f426dbdba3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @strapi/core might be problematic. Click here for more details.
- package/dist/Strapi.d.ts +1 -0
- package/dist/Strapi.d.ts.map +1 -1
- package/dist/Strapi.js +476 -0
- package/dist/Strapi.js.map +1 -0
- package/dist/Strapi.mjs +455 -0
- package/dist/Strapi.mjs.map +1 -0
- package/dist/compile.js +27 -0
- package/dist/compile.js.map +1 -0
- package/dist/compile.mjs +25 -0
- package/dist/compile.mjs.map +1 -0
- package/dist/configuration/config-loader.js +119 -0
- package/dist/configuration/config-loader.js.map +1 -0
- package/dist/configuration/config-loader.mjs +117 -0
- package/dist/configuration/config-loader.mjs.map +1 -0
- package/dist/configuration/get-dirs.js +33 -0
- package/dist/configuration/get-dirs.js.map +1 -0
- package/dist/configuration/get-dirs.mjs +31 -0
- package/dist/configuration/get-dirs.mjs.map +1 -0
- package/dist/configuration/index.d.ts +1 -0
- package/dist/configuration/index.d.ts.map +1 -1
- package/dist/configuration/index.js +92 -0
- package/dist/configuration/index.js.map +1 -0
- package/dist/configuration/index.mjs +90 -0
- package/dist/configuration/index.mjs.map +1 -0
- package/dist/configuration/urls.d.ts.map +1 -1
- package/dist/configuration/urls.js +81 -0
- package/dist/configuration/urls.js.map +1 -0
- package/dist/configuration/urls.mjs +77 -0
- package/dist/configuration/urls.mjs.map +1 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -0
- package/dist/constants.mjs +4 -0
- package/dist/constants.mjs.map +1 -0
- package/dist/container.js +34 -0
- package/dist/container.js.map +1 -0
- package/dist/container.mjs +32 -0
- package/dist/container.mjs.map +1 -0
- package/dist/core-api/controller/collection-type.js +85 -0
- package/dist/core-api/controller/collection-type.js.map +1 -0
- package/dist/core-api/controller/collection-type.mjs +83 -0
- package/dist/core-api/controller/collection-type.mjs.map +1 -0
- package/dist/core-api/controller/index.d.ts.map +1 -1
- package/dist/core-api/controller/index.js +68 -0
- package/dist/core-api/controller/index.js.map +1 -0
- package/dist/core-api/controller/index.mjs +66 -0
- package/dist/core-api/controller/index.mjs.map +1 -0
- package/dist/core-api/controller/single-type.js +47 -0
- package/dist/core-api/controller/single-type.js.map +1 -0
- package/dist/core-api/controller/single-type.mjs +45 -0
- package/dist/core-api/controller/single-type.mjs.map +1 -0
- package/dist/core-api/controller/transform.d.ts +3 -2
- package/dist/core-api/controller/transform.d.ts.map +1 -1
- package/dist/core-api/controller/transform.js +95 -0
- package/dist/core-api/controller/transform.js.map +1 -0
- package/dist/core-api/controller/transform.mjs +93 -0
- package/dist/core-api/controller/transform.mjs.map +1 -0
- 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 +211 -0
- package/dist/core-api/routes/index.js.map +1 -0
- package/dist/core-api/routes/index.mjs +190 -0
- package/dist/core-api/routes/index.mjs.map +1 -0
- package/dist/core-api/routes/validation/attributes.d.ts +244 -0
- package/dist/core-api/routes/validation/attributes.d.ts.map +1 -0
- package/dist/core-api/routes/validation/attributes.js +560 -0
- package/dist/core-api/routes/validation/attributes.js.map +1 -0
- package/dist/core-api/routes/validation/attributes.mjs +521 -0
- package/dist/core-api/routes/validation/attributes.mjs.map +1 -0
- package/dist/core-api/routes/validation/common.d.ts +105 -0
- package/dist/core-api/routes/validation/common.d.ts.map +1 -0
- package/dist/core-api/routes/validation/common.js +116 -0
- package/dist/core-api/routes/validation/common.js.map +1 -0
- package/dist/core-api/routes/validation/common.mjs +95 -0
- package/dist/core-api/routes/validation/common.mjs.map +1 -0
- package/dist/core-api/routes/validation/component.d.ts +34 -0
- package/dist/core-api/routes/validation/component.d.ts.map +1 -0
- package/dist/core-api/routes/validation/component.js +45 -0
- package/dist/core-api/routes/validation/component.js.map +1 -0
- package/dist/core-api/routes/validation/component.mjs +43 -0
- package/dist/core-api/routes/validation/component.mjs.map +1 -0
- package/dist/core-api/routes/validation/constants.d.ts +8 -0
- package/dist/core-api/routes/validation/constants.d.ts.map +1 -0
- package/dist/core-api/routes/validation/constants.js +18 -0
- package/dist/core-api/routes/validation/constants.js.map +1 -0
- package/dist/core-api/routes/validation/constants.mjs +16 -0
- package/dist/core-api/routes/validation/constants.mjs.map +1 -0
- package/dist/core-api/routes/validation/content-type.d.ts +128 -0
- package/dist/core-api/routes/validation/content-type.d.ts.map +1 -0
- package/dist/core-api/routes/validation/content-type.js +201 -0
- package/dist/core-api/routes/validation/content-type.js.map +1 -0
- package/dist/core-api/routes/validation/content-type.mjs +180 -0
- package/dist/core-api/routes/validation/content-type.mjs.map +1 -0
- package/dist/core-api/routes/validation/index.d.ts +5 -0
- package/dist/core-api/routes/validation/index.d.ts.map +1 -0
- package/dist/core-api/routes/validation/mappers.d.ts +105 -0
- package/dist/core-api/routes/validation/mappers.d.ts.map +1 -0
- package/dist/core-api/routes/validation/mappers.js +273 -0
- package/dist/core-api/routes/validation/mappers.js.map +1 -0
- package/dist/core-api/routes/validation/mappers.mjs +249 -0
- package/dist/core-api/routes/validation/mappers.mjs.map +1 -0
- package/dist/core-api/routes/validation/utils.d.ts +47 -0
- package/dist/core-api/routes/validation/utils.d.ts.map +1 -0
- package/dist/core-api/routes/validation/utils.js +128 -0
- package/dist/core-api/routes/validation/utils.js.map +1 -0
- package/dist/core-api/routes/validation/utils.mjs +106 -0
- package/dist/core-api/routes/validation/utils.mjs.map +1 -0
- package/dist/core-api/service/collection-type.js +80 -0
- package/dist/core-api/service/collection-type.js.map +1 -0
- package/dist/core-api/service/collection-type.mjs +77 -0
- package/dist/core-api/service/collection-type.mjs.map +1 -0
- package/dist/core-api/service/core-service.js +13 -0
- package/dist/core-api/service/core-service.js.map +1 -0
- package/dist/core-api/service/core-service.mjs +11 -0
- package/dist/core-api/service/core-service.mjs.map +1 -0
- package/dist/core-api/service/index.js +16 -0
- package/dist/core-api/service/index.js.map +1 -0
- package/dist/core-api/service/index.mjs +14 -0
- package/dist/core-api/service/index.mjs.map +1 -0
- package/dist/core-api/service/pagination.js +78 -0
- package/dist/core-api/service/pagination.js.map +1 -0
- package/dist/core-api/service/pagination.mjs +73 -0
- package/dist/core-api/service/pagination.mjs.map +1 -0
- package/dist/core-api/service/single-type.js +50 -0
- package/dist/core-api/service/single-type.js.map +1 -0
- package/dist/core-api/service/single-type.mjs +47 -0
- package/dist/core-api/service/single-type.mjs.map +1 -0
- package/dist/domain/content-type/index.d.ts.map +1 -1
- package/dist/domain/content-type/index.js +122 -0
- package/dist/domain/content-type/index.js.map +1 -0
- package/dist/domain/content-type/index.mjs +119 -0
- package/dist/domain/content-type/index.mjs.map +1 -0
- package/dist/domain/content-type/validator.js +92 -0
- package/dist/domain/content-type/validator.js.map +1 -0
- package/dist/domain/content-type/validator.mjs +90 -0
- package/dist/domain/content-type/validator.mjs.map +1 -0
- package/dist/domain/module/index.d.ts.map +1 -1
- package/dist/domain/module/index.js +119 -0
- package/dist/domain/module/index.js.map +1 -0
- package/dist/domain/module/index.mjs +117 -0
- package/dist/domain/module/index.mjs.map +1 -0
- package/dist/domain/module/validation.js +30 -0
- package/dist/domain/module/validation.js.map +1 -0
- package/dist/domain/module/validation.mjs +28 -0
- package/dist/domain/module/validation.mjs.map +1 -0
- package/dist/ee/index.d.ts +7 -0
- package/dist/ee/index.d.ts.map +1 -1
- package/dist/ee/index.js +218 -0
- package/dist/ee/index.js.map +1 -0
- package/dist/ee/index.mjs +216 -0
- package/dist/ee/index.mjs.map +1 -0
- package/dist/ee/license.d.ts +3 -1
- package/dist/ee/license.d.ts.map +1 -1
- package/dist/ee/license.js +121 -0
- package/dist/ee/license.js.map +1 -0
- package/dist/ee/license.mjs +115 -0
- package/dist/ee/license.mjs.map +1 -0
- package/dist/factories.d.ts +3 -1
- package/dist/factories.d.ts.map +1 -1
- package/dist/factories.js +93 -0
- package/dist/factories.js.map +1 -0
- package/dist/factories.mjs +87 -0
- package/dist/factories.mjs.map +1 -0
- package/dist/index.js +19 -9943
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +17 -9920
- package/dist/index.mjs.map +1 -1
- package/dist/loaders/admin.d.ts.map +1 -1
- package/dist/loaders/admin.js +27 -0
- package/dist/loaders/admin.js.map +1 -0
- package/dist/loaders/admin.mjs +25 -0
- package/dist/loaders/admin.mjs.map +1 -0
- package/dist/loaders/apis.js +160 -0
- package/dist/loaders/apis.js.map +1 -0
- package/dist/loaders/apis.mjs +158 -0
- package/dist/loaders/apis.mjs.map +1 -0
- package/dist/loaders/components.js +37 -0
- package/dist/loaders/components.js.map +1 -0
- package/dist/loaders/components.mjs +35 -0
- package/dist/loaders/components.mjs.map +1 -0
- package/dist/loaders/index.js +26 -0
- package/dist/loaders/index.js.map +1 -0
- package/dist/loaders/index.mjs +24 -0
- package/dist/loaders/index.mjs.map +1 -0
- package/dist/loaders/middlewares.js +35 -0
- package/dist/loaders/middlewares.js.map +1 -0
- package/dist/loaders/middlewares.mjs +33 -0
- package/dist/loaders/middlewares.mjs.map +1 -0
- package/dist/loaders/plugins/get-enabled-plugins.js +136 -0
- package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -0
- package/dist/loaders/plugins/get-enabled-plugins.mjs +134 -0
- package/dist/loaders/plugins/get-enabled-plugins.mjs.map +1 -0
- package/dist/loaders/plugins/get-user-plugins-config.js +28 -0
- package/dist/loaders/plugins/get-user-plugins-config.js.map +1 -0
- package/dist/loaders/plugins/get-user-plugins-config.mjs +26 -0
- package/dist/loaders/plugins/get-user-plugins-config.mjs.map +1 -0
- package/dist/loaders/plugins/index.js +155 -0
- package/dist/loaders/plugins/index.js.map +1 -0
- package/dist/loaders/plugins/index.mjs +134 -0
- package/dist/loaders/plugins/index.mjs.map +1 -0
- package/dist/loaders/policies.js +29 -0
- package/dist/loaders/policies.js.map +1 -0
- package/dist/loaders/policies.mjs +27 -0
- package/dist/loaders/policies.mjs.map +1 -0
- package/dist/loaders/sanitizers.js +12 -0
- package/dist/loaders/sanitizers.js.map +1 -0
- package/dist/loaders/sanitizers.mjs +10 -0
- package/dist/loaders/sanitizers.mjs.map +1 -0
- package/dist/loaders/src-index.js +41 -0
- package/dist/loaders/src-index.js.map +1 -0
- package/dist/loaders/src-index.mjs +39 -0
- package/dist/loaders/src-index.mjs.map +1 -0
- package/dist/loaders/validators.js +11 -0
- package/dist/loaders/validators.js.map +1 -0
- package/dist/loaders/validators.mjs +9 -0
- package/dist/loaders/validators.mjs.map +1 -0
- package/dist/middlewares/body.js +69 -0
- package/dist/middlewares/body.js.map +1 -0
- package/dist/middlewares/body.mjs +67 -0
- package/dist/middlewares/body.mjs.map +1 -0
- package/dist/middlewares/compression.js +8 -0
- package/dist/middlewares/compression.js.map +1 -0
- package/dist/middlewares/compression.mjs +6 -0
- package/dist/middlewares/compression.mjs.map +1 -0
- package/dist/middlewares/cors.d.ts +9 -1
- package/dist/middlewares/cors.d.ts.map +1 -1
- package/dist/middlewares/cors.js +86 -0
- package/dist/middlewares/cors.js.map +1 -0
- package/dist/middlewares/cors.mjs +83 -0
- package/dist/middlewares/cors.mjs.map +1 -0
- package/dist/middlewares/errors.js +35 -0
- package/dist/middlewares/errors.js.map +1 -0
- package/dist/middlewares/errors.mjs +33 -0
- package/dist/middlewares/errors.mjs.map +1 -0
- package/dist/middlewares/favicon.js +32 -0
- package/dist/middlewares/favicon.js.map +1 -0
- package/dist/middlewares/favicon.mjs +30 -0
- package/dist/middlewares/favicon.mjs.map +1 -0
- package/dist/middlewares/index.js +36 -0
- package/dist/middlewares/index.js.map +1 -0
- package/dist/middlewares/index.mjs +34 -0
- package/dist/middlewares/index.mjs.map +1 -0
- package/dist/middlewares/ip.js +8 -0
- package/dist/middlewares/ip.js.map +1 -0
- package/dist/middlewares/ip.mjs +6 -0
- package/dist/middlewares/ip.mjs.map +1 -0
- package/dist/middlewares/logger.js +13 -0
- package/dist/middlewares/logger.js.map +1 -0
- package/dist/middlewares/logger.mjs +11 -0
- package/dist/middlewares/logger.mjs.map +1 -0
- package/dist/middlewares/powered-by.js +18 -0
- package/dist/middlewares/powered-by.js.map +1 -0
- package/dist/middlewares/powered-by.mjs +16 -0
- package/dist/middlewares/powered-by.mjs.map +1 -0
- package/dist/middlewares/public.js +38 -0
- package/dist/middlewares/public.js.map +1 -0
- package/dist/middlewares/public.mjs +36 -0
- package/dist/middlewares/public.mjs.map +1 -0
- package/dist/middlewares/query.js +43 -0
- package/dist/middlewares/query.js.map +1 -0
- package/dist/middlewares/query.mjs +41 -0
- package/dist/middlewares/query.mjs.map +1 -0
- package/dist/middlewares/response-time.js +13 -0
- package/dist/middlewares/response-time.js.map +1 -0
- package/dist/middlewares/response-time.mjs +11 -0
- package/dist/middlewares/response-time.mjs.map +1 -0
- package/dist/middlewares/responses.js +17 -0
- package/dist/middlewares/responses.js.map +1 -0
- package/dist/middlewares/responses.mjs +15 -0
- package/dist/middlewares/responses.mjs.map +1 -0
- package/dist/middlewares/security.d.ts.map +1 -1
- package/dist/middlewares/security.js +103 -0
- package/dist/middlewares/security.js.map +1 -0
- package/dist/middlewares/security.mjs +101 -0
- package/dist/middlewares/security.mjs.map +1 -0
- package/dist/middlewares/session.js +31 -0
- package/dist/middlewares/session.js.map +1 -0
- package/dist/middlewares/session.mjs +29 -0
- package/dist/middlewares/session.mjs.map +1 -0
- package/dist/migrations/database/5.0.0-discard-drafts.d.ts.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.js +277 -0
- package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -0
- package/dist/migrations/database/5.0.0-discard-drafts.mjs +274 -0
- package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -0
- package/dist/migrations/draft-publish.js +69 -0
- package/dist/migrations/draft-publish.js.map +1 -0
- package/dist/migrations/draft-publish.mjs +66 -0
- package/dist/migrations/draft-publish.mjs.map +1 -0
- 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 +71 -0
- package/dist/migrations/i18n.js.map +1 -0
- package/dist/migrations/i18n.mjs +68 -0
- package/dist/migrations/i18n.mjs.map +1 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +34 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/index.mjs +31 -0
- package/dist/migrations/index.mjs.map +1 -0
- package/dist/package.json.js +187 -0
- package/dist/package.json.js.map +1 -0
- package/dist/package.json.mjs +164 -0
- package/dist/package.json.mjs.map +1 -0
- package/dist/providers/admin.js +30 -0
- package/dist/providers/admin.js.map +1 -0
- package/dist/providers/admin.mjs +28 -0
- package/dist/providers/admin.mjs.map +1 -0
- package/dist/providers/coreStore.js +16 -0
- package/dist/providers/coreStore.js.map +1 -0
- package/dist/providers/coreStore.mjs +14 -0
- package/dist/providers/coreStore.mjs.map +1 -0
- package/dist/providers/cron.js +23 -0
- package/dist/providers/cron.js.map +1 -0
- package/dist/providers/cron.mjs +21 -0
- package/dist/providers/cron.mjs.map +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +22 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/index.mjs +20 -0
- package/dist/providers/index.mjs.map +1 -0
- package/dist/providers/provider.js +6 -0
- package/dist/providers/provider.js.map +1 -0
- package/dist/providers/provider.mjs +4 -0
- package/dist/providers/provider.mjs.map +1 -0
- package/dist/providers/registries.js +40 -0
- package/dist/providers/registries.js.map +1 -0
- package/dist/providers/registries.mjs +38 -0
- package/dist/providers/registries.mjs.map +1 -0
- package/dist/providers/session-manager.d.ts +3 -0
- package/dist/providers/session-manager.d.ts.map +1 -0
- package/dist/providers/session-manager.js +23 -0
- package/dist/providers/session-manager.js.map +1 -0
- package/dist/providers/session-manager.mjs +21 -0
- package/dist/providers/session-manager.mjs.map +1 -0
- package/dist/providers/telemetry.js +22 -0
- package/dist/providers/telemetry.js.map +1 -0
- package/dist/providers/telemetry.mjs +20 -0
- package/dist/providers/telemetry.mjs.map +1 -0
- package/dist/providers/webhooks.js +32 -0
- package/dist/providers/webhooks.js.map +1 -0
- package/dist/providers/webhooks.mjs +30 -0
- package/dist/providers/webhooks.mjs.map +1 -0
- package/dist/registries/apis.js +26 -0
- package/dist/registries/apis.js.map +1 -0
- package/dist/registries/apis.mjs +24 -0
- package/dist/registries/apis.mjs.map +1 -0
- package/dist/registries/components.js +43 -0
- package/dist/registries/components.js.map +1 -0
- package/dist/registries/components.mjs +41 -0
- package/dist/registries/components.mjs.map +1 -0
- package/dist/registries/content-types.js +65 -0
- package/dist/registries/content-types.js.map +1 -0
- package/dist/registries/content-types.mjs +63 -0
- package/dist/registries/content-types.mjs.map +1 -0
- package/dist/registries/controllers.js +79 -0
- package/dist/registries/controllers.js.map +1 -0
- package/dist/registries/controllers.mjs +77 -0
- package/dist/registries/controllers.mjs.map +1 -0
- package/dist/registries/custom-fields.js +81 -0
- package/dist/registries/custom-fields.js.map +1 -0
- package/dist/registries/custom-fields.mjs +79 -0
- package/dist/registries/custom-fields.mjs.map +1 -0
- package/dist/registries/hooks.js +55 -0
- package/dist/registries/hooks.js.map +1 -0
- package/dist/registries/hooks.mjs +53 -0
- package/dist/registries/hooks.mjs.map +1 -0
- package/dist/registries/middlewares.js +58 -0
- package/dist/registries/middlewares.js.map +1 -0
- package/dist/registries/middlewares.mjs +56 -0
- package/dist/registries/middlewares.mjs.map +1 -0
- package/dist/registries/models.js +17 -0
- package/dist/registries/models.js.map +1 -0
- package/dist/registries/models.mjs +15 -0
- package/dist/registries/models.mjs.map +1 -0
- package/dist/registries/modules.js +42 -0
- package/dist/registries/modules.js.map +1 -0
- package/dist/registries/modules.mjs +40 -0
- package/dist/registries/modules.mjs.map +1 -0
- package/dist/registries/namespace.js +28 -0
- package/dist/registries/namespace.js.map +1 -0
- package/dist/registries/namespace.mjs +24 -0
- package/dist/registries/namespace.mjs.map +1 -0
- package/dist/registries/plugins.js +26 -0
- package/dist/registries/plugins.js.map +1 -0
- package/dist/registries/plugins.mjs +24 -0
- package/dist/registries/plugins.mjs.map +1 -0
- package/dist/registries/policies.js +115 -0
- package/dist/registries/policies.js.map +1 -0
- package/dist/registries/policies.mjs +113 -0
- package/dist/registries/policies.mjs.map +1 -0
- package/dist/registries/sanitizers.js +26 -0
- package/dist/registries/sanitizers.js.map +1 -0
- package/dist/registries/sanitizers.mjs +24 -0
- package/dist/registries/sanitizers.mjs.map +1 -0
- package/dist/registries/services.js +80 -0
- package/dist/registries/services.js.map +1 -0
- package/dist/registries/services.mjs +78 -0
- package/dist/registries/services.mjs.map +1 -0
- package/dist/registries/validators.js +26 -0
- package/dist/registries/validators.js.map +1 -0
- package/dist/registries/validators.mjs +24 -0
- package/dist/registries/validators.mjs.map +1 -0
- package/dist/services/auth/index.js +81 -0
- package/dist/services/auth/index.js.map +1 -0
- package/dist/services/auth/index.mjs +79 -0
- package/dist/services/auth/index.mjs.map +1 -0
- package/dist/services/config.js +51 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/config.mjs +49 -0
- package/dist/services/config.mjs.map +1 -0
- package/dist/services/content-api/index.d.ts +1 -1
- package/dist/services/content-api/index.d.ts.map +1 -1
- package/dist/services/content-api/index.js +86 -0
- package/dist/services/content-api/index.js.map +1 -0
- package/dist/services/content-api/index.mjs +84 -0
- package/dist/services/content-api/index.mjs.map +1 -0
- package/dist/services/content-api/permissions/engine.js +10 -0
- package/dist/services/content-api/permissions/engine.js.map +1 -0
- package/dist/services/content-api/permissions/engine.mjs +8 -0
- package/dist/services/content-api/permissions/engine.mjs.map +1 -0
- package/dist/services/content-api/permissions/index.js +107 -0
- package/dist/services/content-api/permissions/index.js.map +1 -0
- package/dist/services/content-api/permissions/index.mjs +105 -0
- package/dist/services/content-api/permissions/index.mjs.map +1 -0
- package/dist/services/content-api/permissions/providers/action.js +19 -0
- package/dist/services/content-api/permissions/providers/action.js.map +1 -0
- package/dist/services/content-api/permissions/providers/action.mjs +17 -0
- package/dist/services/content-api/permissions/providers/action.mjs.map +1 -0
- package/dist/services/content-api/permissions/providers/condition.js +19 -0
- package/dist/services/content-api/permissions/providers/condition.js.map +1 -0
- package/dist/services/content-api/permissions/providers/condition.mjs +17 -0
- package/dist/services/content-api/permissions/providers/condition.mjs.map +1 -0
- package/dist/services/content-source-maps.d.ts +13 -0
- package/dist/services/content-source-maps.d.ts.map +1 -0
- package/dist/services/content-source-maps.js +108 -0
- package/dist/services/content-source-maps.js.map +1 -0
- package/dist/services/content-source-maps.mjs +106 -0
- package/dist/services/content-source-maps.mjs.map +1 -0
- package/dist/services/core-store.d.ts +2 -2
- package/dist/services/core-store.d.ts.map +1 -1
- package/dist/services/core-store.js +127 -0
- package/dist/services/core-store.js.map +1 -0
- package/dist/services/core-store.mjs +124 -0
- package/dist/services/core-store.mjs.map +1 -0
- package/dist/services/cron.js +77 -0
- package/dist/services/cron.js.map +1 -0
- package/dist/services/cron.mjs +75 -0
- package/dist/services/cron.mjs.map +1 -0
- package/dist/services/custom-fields.js +12 -0
- package/dist/services/custom-fields.js.map +1 -0
- package/dist/services/custom-fields.mjs +10 -0
- package/dist/services/custom-fields.mjs.map +1 -0
- package/dist/services/document-service/attributes/index.js +27 -0
- package/dist/services/document-service/attributes/index.js.map +1 -0
- package/dist/services/document-service/attributes/index.mjs +25 -0
- package/dist/services/document-service/attributes/index.mjs.map +1 -0
- package/dist/services/document-service/attributes/transforms.js +21 -0
- package/dist/services/document-service/attributes/transforms.js.map +1 -0
- package/dist/services/document-service/attributes/transforms.mjs +19 -0
- package/dist/services/document-service/attributes/transforms.mjs.map +1 -0
- package/dist/services/document-service/common.js +8 -0
- package/dist/services/document-service/common.js.map +1 -0
- package/dist/services/document-service/common.mjs +6 -0
- package/dist/services/document-service/common.mjs.map +1 -0
- package/dist/services/document-service/components.d.ts +31 -1
- package/dist/services/document-service/components.d.ts.map +1 -1
- package/dist/services/document-service/components.js +395 -0
- package/dist/services/document-service/components.js.map +1 -0
- package/dist/services/document-service/components.mjs +384 -0
- package/dist/services/document-service/components.mjs.map +1 -0
- package/dist/services/document-service/draft-and-publish.js +109 -0
- package/dist/services/document-service/draft-and-publish.js.map +1 -0
- package/dist/services/document-service/draft-and-publish.mjs +102 -0
- package/dist/services/document-service/draft-and-publish.mjs.map +1 -0
- package/dist/services/document-service/entries.d.ts.map +1 -1
- package/dist/services/document-service/entries.js +155 -0
- package/dist/services/document-service/entries.js.map +1 -0
- package/dist/services/document-service/entries.mjs +153 -0
- package/dist/services/document-service/entries.mjs.map +1 -0
- package/dist/services/document-service/events.js +59 -0
- package/dist/services/document-service/events.js.map +1 -0
- package/dist/services/document-service/events.mjs +57 -0
- package/dist/services/document-service/events.mjs.map +1 -0
- 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 +56 -0
- package/dist/services/document-service/index.js.map +1 -0
- package/dist/services/document-service/index.mjs +54 -0
- package/dist/services/document-service/index.mjs.map +1 -0
- package/dist/services/document-service/internationalization.d.ts +6 -1
- package/dist/services/document-service/internationalization.d.ts.map +1 -1
- package/dist/services/document-service/internationalization.js +111 -0
- package/dist/services/document-service/internationalization.js.map +1 -0
- package/dist/services/document-service/internationalization.mjs +105 -0
- package/dist/services/document-service/internationalization.mjs.map +1 -0
- package/dist/services/document-service/middlewares/errors.js +29 -0
- package/dist/services/document-service/middlewares/errors.js.map +1 -0
- package/dist/services/document-service/middlewares/errors.mjs +27 -0
- package/dist/services/document-service/middlewares/errors.mjs.map +1 -0
- package/dist/services/document-service/middlewares/middleware-manager.js +51 -0
- package/dist/services/document-service/middlewares/middleware-manager.js.map +1 -0
- package/dist/services/document-service/middlewares/middleware-manager.mjs +49 -0
- package/dist/services/document-service/middlewares/middleware-manager.mjs.map +1 -0
- package/dist/services/document-service/params.js +14 -0
- package/dist/services/document-service/params.js.map +1 -0
- package/dist/services/document-service/params.mjs +12 -0
- package/dist/services/document-service/params.mjs.map +1 -0
- package/dist/services/document-service/repository.d.ts.map +1 -1
- package/dist/services/document-service/repository.js +372 -0
- package/dist/services/document-service/repository.js.map +1 -0
- package/dist/services/document-service/repository.mjs +370 -0
- package/dist/services/document-service/repository.mjs.map +1 -0
- package/dist/services/document-service/transform/data.js +25 -0
- package/dist/services/document-service/transform/data.js.map +1 -0
- package/dist/services/document-service/transform/data.mjs +23 -0
- package/dist/services/document-service/transform/data.mjs.map +1 -0
- package/dist/services/document-service/transform/fields.js +33 -0
- package/dist/services/document-service/transform/fields.js.map +1 -0
- package/dist/services/document-service/transform/fields.mjs +31 -0
- package/dist/services/document-service/transform/fields.mjs.map +1 -0
- package/dist/services/document-service/transform/id-map.js +125 -0
- package/dist/services/document-service/transform/id-map.js.map +1 -0
- package/dist/services/document-service/transform/id-map.mjs +123 -0
- package/dist/services/document-service/transform/id-map.mjs.map +1 -0
- package/dist/services/document-service/transform/id-transform.js +41 -0
- package/dist/services/document-service/transform/id-transform.js.map +1 -0
- package/dist/services/document-service/transform/id-transform.mjs +39 -0
- package/dist/services/document-service/transform/id-transform.mjs.map +1 -0
- package/dist/services/document-service/transform/populate.js +26 -0
- package/dist/services/document-service/transform/populate.js.map +1 -0
- package/dist/services/document-service/transform/populate.mjs +24 -0
- package/dist/services/document-service/transform/populate.mjs.map +1 -0
- package/dist/services/document-service/transform/query.js +14 -0
- package/dist/services/document-service/transform/query.js.map +1 -0
- package/dist/services/document-service/transform/query.mjs +12 -0
- package/dist/services/document-service/transform/query.mjs.map +1 -0
- package/dist/services/document-service/transform/relations/extract/data-ids.js +80 -0
- package/dist/services/document-service/transform/relations/extract/data-ids.js.map +1 -0
- package/dist/services/document-service/transform/relations/extract/data-ids.mjs +78 -0
- package/dist/services/document-service/transform/relations/extract/data-ids.mjs.map +1 -0
- package/dist/services/document-service/transform/relations/transform/data-ids.js +110 -0
- package/dist/services/document-service/transform/relations/transform/data-ids.js.map +1 -0
- package/dist/services/document-service/transform/relations/transform/data-ids.mjs +108 -0
- package/dist/services/document-service/transform/relations/transform/data-ids.mjs.map +1 -0
- package/dist/services/document-service/transform/relations/transform/default-locale.js +50 -0
- package/dist/services/document-service/transform/relations/transform/default-locale.js.map +1 -0
- package/dist/services/document-service/transform/relations/transform/default-locale.mjs +48 -0
- package/dist/services/document-service/transform/relations/transform/default-locale.mjs.map +1 -0
- package/dist/services/document-service/transform/relations/utils/dp.js +56 -0
- package/dist/services/document-service/transform/relations/utils/dp.js.map +1 -0
- package/dist/services/document-service/transform/relations/utils/dp.mjs +54 -0
- package/dist/services/document-service/transform/relations/utils/dp.mjs.map +1 -0
- package/dist/services/document-service/transform/relations/utils/i18n.js +27 -0
- package/dist/services/document-service/transform/relations/utils/i18n.js.map +1 -0
- package/dist/services/document-service/transform/relations/utils/i18n.mjs +23 -0
- package/dist/services/document-service/transform/relations/utils/i18n.mjs.map +1 -0
- package/dist/services/document-service/transform/relations/utils/map-relation.js +130 -0
- package/dist/services/document-service/transform/relations/utils/map-relation.js.map +1 -0
- package/dist/services/document-service/transform/relations/utils/map-relation.mjs +127 -0
- package/dist/services/document-service/transform/relations/utils/map-relation.mjs.map +1 -0
- 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/clean-component-join-table.d.ts +7 -0
- package/dist/services/document-service/utils/clean-component-join-table.d.ts.map +1 -0
- package/dist/services/document-service/utils/populate.js +71 -0
- package/dist/services/document-service/utils/populate.js.map +1 -0
- package/dist/services/document-service/utils/populate.mjs +69 -0
- package/dist/services/document-service/utils/populate.mjs.map +1 -0
- package/dist/services/document-service/utils/unidirectional-relations.d.ts +19 -2
- package/dist/services/document-service/utils/unidirectional-relations.d.ts.map +1 -1
- package/dist/services/document-service/utils/unidirectional-relations.js +131 -0
- package/dist/services/document-service/utils/unidirectional-relations.js.map +1 -0
- package/dist/services/document-service/utils/unidirectional-relations.mjs +128 -0
- package/dist/services/document-service/utils/unidirectional-relations.mjs.map +1 -0
- package/dist/services/entity-service/index.js +238 -0
- package/dist/services/entity-service/index.js.map +1 -0
- package/dist/services/entity-service/index.mjs +236 -0
- package/dist/services/entity-service/index.mjs.map +1 -0
- package/dist/services/entity-validator/blocks-validator.js +160 -0
- package/dist/services/entity-validator/blocks-validator.js.map +1 -0
- package/dist/services/entity-validator/blocks-validator.mjs +158 -0
- package/dist/services/entity-validator/blocks-validator.mjs.map +1 -0
- package/dist/services/entity-validator/index.d.ts.map +1 -1
- package/dist/services/entity-validator/index.js +393 -0
- package/dist/services/entity-validator/index.js.map +1 -0
- package/dist/services/entity-validator/index.mjs +391 -0
- package/dist/services/entity-validator/index.mjs.map +1 -0
- 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 +302 -0
- package/dist/services/entity-validator/validators.js.map +1 -0
- package/dist/services/entity-validator/validators.mjs +293 -0
- package/dist/services/entity-validator/validators.mjs.map +1 -0
- package/dist/services/errors.js +76 -0
- package/dist/services/errors.js.map +1 -0
- package/dist/services/errors.mjs +72 -0
- package/dist/services/errors.mjs.map +1 -0
- package/dist/services/event-hub.js +85 -0
- package/dist/services/event-hub.js.map +1 -0
- package/dist/services/event-hub.mjs +83 -0
- package/dist/services/event-hub.mjs.map +1 -0
- package/dist/services/features.js +22 -0
- package/dist/services/features.js.map +1 -0
- package/dist/services/features.mjs +20 -0
- package/dist/services/features.mjs.map +1 -0
- package/dist/services/fs.js +52 -0
- package/dist/services/fs.js.map +1 -0
- package/dist/services/fs.mjs +50 -0
- package/dist/services/fs.mjs.map +1 -0
- package/dist/services/metrics/admin-user-hash.d.ts.map +1 -1
- package/dist/services/metrics/admin-user-hash.js +16 -0
- package/dist/services/metrics/admin-user-hash.js.map +1 -0
- package/dist/services/metrics/admin-user-hash.mjs +14 -0
- package/dist/services/metrics/admin-user-hash.mjs.map +1 -0
- 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 +53 -0
- package/dist/services/metrics/index.js.map +1 -0
- package/dist/services/metrics/index.mjs +51 -0
- package/dist/services/metrics/index.mjs.map +1 -0
- package/dist/services/metrics/is-truthy.js +16 -0
- package/dist/services/metrics/is-truthy.js.map +1 -0
- package/dist/services/metrics/is-truthy.mjs +14 -0
- package/dist/services/metrics/is-truthy.mjs.map +1 -0
- package/dist/services/metrics/middleware.d.ts +2 -1
- package/dist/services/metrics/middleware.d.ts.map +1 -1
- package/dist/services/metrics/middleware.js +40 -0
- package/dist/services/metrics/middleware.js.map +1 -0
- package/dist/services/metrics/middleware.mjs +38 -0
- package/dist/services/metrics/middleware.mjs.map +1 -0
- package/dist/services/metrics/rate-limiter.js +26 -0
- package/dist/services/metrics/rate-limiter.js.map +1 -0
- package/dist/services/metrics/rate-limiter.mjs +24 -0
- package/dist/services/metrics/rate-limiter.mjs.map +1 -0
- package/dist/services/metrics/sender.d.ts.map +1 -1
- package/dist/services/metrics/sender.js +86 -0
- package/dist/services/metrics/sender.js.map +1 -0
- package/dist/services/metrics/sender.mjs +84 -0
- package/dist/services/metrics/sender.mjs.map +1 -0
- package/dist/services/query-params.js +15 -0
- package/dist/services/query-params.js.map +1 -0
- package/dist/services/query-params.mjs +13 -0
- package/dist/services/query-params.mjs.map +1 -0
- package/dist/services/reloader.js +39 -0
- package/dist/services/reloader.js.map +1 -0
- package/dist/services/reloader.mjs +37 -0
- package/dist/services/reloader.mjs.map +1 -0
- package/dist/services/request-context.js +16 -0
- package/dist/services/request-context.js.map +1 -0
- package/dist/services/request-context.mjs +14 -0
- package/dist/services/request-context.mjs.map +1 -0
- package/dist/services/server/admin-api.js +14 -0
- package/dist/services/server/admin-api.js.map +1 -0
- package/dist/services/server/admin-api.mjs +12 -0
- package/dist/services/server/admin-api.mjs.map +1 -0
- package/dist/services/server/api.js +36 -0
- package/dist/services/server/api.js.map +1 -0
- package/dist/services/server/api.mjs +34 -0
- package/dist/services/server/api.mjs.map +1 -0
- package/dist/services/server/compose-endpoint.js +128 -0
- package/dist/services/server/compose-endpoint.js.map +1 -0
- package/dist/services/server/compose-endpoint.mjs +126 -0
- package/dist/services/server/compose-endpoint.mjs.map +1 -0
- package/dist/services/server/content-api.js +14 -0
- package/dist/services/server/content-api.js.map +1 -0
- package/dist/services/server/content-api.mjs +12 -0
- package/dist/services/server/content-api.mjs.map +1 -0
- package/dist/services/server/http-server.js +54 -0
- package/dist/services/server/http-server.js.map +1 -0
- package/dist/services/server/http-server.mjs +52 -0
- package/dist/services/server/http-server.mjs.map +1 -0
- package/dist/services/server/index.js +90 -0
- package/dist/services/server/index.js.map +1 -0
- package/dist/services/server/index.mjs +88 -0
- package/dist/services/server/index.mjs.map +1 -0
- package/dist/services/server/koa.js +54 -0
- package/dist/services/server/koa.js.map +1 -0
- package/dist/services/server/koa.mjs +52 -0
- package/dist/services/server/koa.mjs.map +1 -0
- package/dist/services/server/middleware.js +96 -0
- package/dist/services/server/middleware.js.map +1 -0
- package/dist/services/server/middleware.mjs +93 -0
- package/dist/services/server/middleware.mjs.map +1 -0
- package/dist/services/server/policy.js +27 -0
- package/dist/services/server/policy.js.map +1 -0
- package/dist/services/server/policy.mjs +25 -0
- package/dist/services/server/policy.mjs.map +1 -0
- package/dist/services/server/register-middlewares.js +79 -0
- package/dist/services/server/register-middlewares.js.map +1 -0
- package/dist/services/server/register-middlewares.mjs +77 -0
- package/dist/services/server/register-middlewares.mjs.map +1 -0
- package/dist/services/server/register-routes.js +119 -0
- package/dist/services/server/register-routes.js.map +1 -0
- package/dist/services/server/register-routes.mjs +117 -0
- package/dist/services/server/register-routes.mjs.map +1 -0
- 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 +110 -0
- package/dist/services/server/routing.js.map +1 -0
- package/dist/services/server/routing.mjs +107 -0
- package/dist/services/server/routing.mjs.map +1 -0
- package/dist/services/session-manager.d.ts +167 -0
- package/dist/services/session-manager.d.ts.map +1 -0
- package/dist/services/session-manager.js +529 -0
- package/dist/services/session-manager.js.map +1 -0
- package/dist/services/session-manager.mjs +526 -0
- package/dist/services/session-manager.mjs.map +1 -0
- package/dist/services/utils/conditional-fields.d.ts +3 -0
- package/dist/services/utils/conditional-fields.d.ts.map +1 -0
- package/dist/services/utils/conditional-fields.js +22 -0
- package/dist/services/utils/conditional-fields.js.map +1 -0
- package/dist/services/utils/conditional-fields.mjs +20 -0
- package/dist/services/utils/conditional-fields.mjs.map +1 -0
- package/dist/services/utils/dynamic-zones.js +16 -0
- package/dist/services/utils/dynamic-zones.js.map +1 -0
- package/dist/services/utils/dynamic-zones.mjs +14 -0
- package/dist/services/utils/dynamic-zones.mjs.map +1 -0
- package/dist/services/webhook-runner.js +135 -0
- package/dist/services/webhook-runner.js.map +1 -0
- package/dist/services/webhook-runner.mjs +133 -0
- package/dist/services/webhook-runner.mjs.map +1 -0
- package/dist/services/webhook-store.js +143 -0
- package/dist/services/webhook-store.js.map +1 -0
- package/dist/services/webhook-store.mjs +140 -0
- package/dist/services/webhook-store.mjs.map +1 -0
- package/dist/services/worker-queue.js +51 -0
- package/dist/services/worker-queue.js.map +1 -0
- package/dist/services/worker-queue.mjs +49 -0
- package/dist/services/worker-queue.mjs.map +1 -0
- package/dist/utils/convert-custom-field-type.js +21 -0
- package/dist/utils/convert-custom-field-type.js.map +1 -0
- package/dist/utils/convert-custom-field-type.mjs +19 -0
- package/dist/utils/convert-custom-field-type.mjs.map +1 -0
- package/dist/utils/cron.js +72 -0
- package/dist/utils/cron.js.map +1 -0
- package/dist/utils/cron.mjs +70 -0
- package/dist/utils/cron.mjs.map +1 -0
- package/dist/utils/fetch.d.ts +5 -1
- package/dist/utils/fetch.d.ts.map +1 -1
- package/dist/utils/fetch.js +31 -0
- package/dist/utils/fetch.js.map +1 -0
- package/dist/utils/fetch.mjs +29 -0
- package/dist/utils/fetch.mjs.map +1 -0
- package/dist/utils/filepath-to-prop-path.js +25 -0
- package/dist/utils/filepath-to-prop-path.js.map +1 -0
- package/dist/utils/filepath-to-prop-path.mjs +23 -0
- package/dist/utils/filepath-to-prop-path.mjs.map +1 -0
- package/dist/utils/is-initialized.js +25 -0
- package/dist/utils/is-initialized.js.map +1 -0
- package/dist/utils/is-initialized.mjs +23 -0
- package/dist/utils/is-initialized.mjs.map +1 -0
- package/dist/utils/lifecycles.js +10 -0
- package/dist/utils/lifecycles.js.map +1 -0
- package/dist/utils/lifecycles.mjs +8 -0
- package/dist/utils/lifecycles.mjs.map +1 -0
- package/dist/utils/load-config-file.js +47 -0
- package/dist/utils/load-config-file.js.map +1 -0
- package/dist/utils/load-config-file.mjs +45 -0
- package/dist/utils/load-config-file.mjs.map +1 -0
- package/dist/utils/load-files.js +44 -0
- package/dist/utils/load-files.js.map +1 -0
- package/dist/utils/load-files.mjs +42 -0
- package/dist/utils/load-files.mjs.map +1 -0
- package/dist/utils/open-browser.js +11 -0
- package/dist/utils/open-browser.js.map +1 -0
- package/dist/utils/open-browser.mjs +9 -0
- package/dist/utils/open-browser.mjs.map +1 -0
- package/dist/utils/resolve-working-dirs.js +26 -0
- package/dist/utils/resolve-working-dirs.js.map +1 -0
- package/dist/utils/resolve-working-dirs.mjs +24 -0
- package/dist/utils/resolve-working-dirs.mjs.map +1 -0
- package/dist/utils/signals.js +23 -0
- package/dist/utils/signals.js.map +1 -0
- package/dist/utils/signals.mjs +21 -0
- package/dist/utils/signals.mjs.map +1 -0
- package/dist/utils/startup-logger.js +110 -0
- package/dist/utils/startup-logger.js.map +1 -0
- package/dist/utils/startup-logger.mjs +108 -0
- package/dist/utils/startup-logger.mjs.map +1 -0
- 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 +377 -0
- package/dist/utils/transform-content-types-to-models.js.map +1 -0
- package/dist/utils/transform-content-types-to-models.mjs +365 -0
- package/dist/utils/transform-content-types-to-models.mjs.map +1 -0
- package/dist/utils/update-notifier/index.js +80 -0
- package/dist/utils/update-notifier/index.js.map +1 -0
- package/dist/utils/update-notifier/index.mjs +78 -0
- package/dist/utils/update-notifier/index.mjs.map +1 -0
- package/package.json +19 -14
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var strapiUtils = require('@strapi/utils');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Check if the model has draft and publish enabled.
|
|
7
|
+
*/ const hasDraftAndPublish = async (trx, meta)=>{
|
|
8
|
+
const hasTable = await trx.schema.hasTable(meta.tableName);
|
|
9
|
+
if (!hasTable) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const uid = meta.uid;
|
|
13
|
+
const model = strapi.getModel(uid);
|
|
14
|
+
const hasDP = strapiUtils.contentTypes.hasDraftAndPublish(model);
|
|
15
|
+
if (!hasDP) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
return true;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Copy all the published entries to draft entries, without it's components, dynamic zones or relations.
|
|
22
|
+
* This ensures all necessary draft's exist before copying it's relations.
|
|
23
|
+
*/ async function copyPublishedEntriesToDraft({ db, trx, uid }) {
|
|
24
|
+
// Extract all scalar attributes to use in the insert query
|
|
25
|
+
const meta = db.metadata.get(uid);
|
|
26
|
+
// Get scalar attributes that will be copied over the new draft
|
|
27
|
+
const scalarAttributes = Object.values(meta.attributes).reduce((acc, attribute)=>{
|
|
28
|
+
if ([
|
|
29
|
+
'id'
|
|
30
|
+
].includes(attribute.columnName)) {
|
|
31
|
+
return acc;
|
|
32
|
+
}
|
|
33
|
+
if (strapiUtils.contentTypes.isScalarAttribute(attribute)) {
|
|
34
|
+
acc.push(attribute.columnName);
|
|
35
|
+
}
|
|
36
|
+
return acc;
|
|
37
|
+
}, []);
|
|
38
|
+
/**
|
|
39
|
+
* Query to copy the published entries into draft entries.
|
|
40
|
+
*
|
|
41
|
+
* INSERT INTO tableName (columnName1, columnName2, columnName3, ...)
|
|
42
|
+
* SELECT columnName1, columnName2, columnName3, ...
|
|
43
|
+
* FROM tableName
|
|
44
|
+
*/ await trx// INSERT INTO tableName (columnName1, columnName2, columnName3, ...)
|
|
45
|
+
.into(trx.raw(`?? (${scalarAttributes.map(()=>`??`).join(', ')})`, [
|
|
46
|
+
meta.tableName,
|
|
47
|
+
...scalarAttributes
|
|
48
|
+
])).insert((subQb)=>{
|
|
49
|
+
// SELECT columnName1, columnName2, columnName3, ...
|
|
50
|
+
subQb.select(...scalarAttributes.map((att)=>{
|
|
51
|
+
// Override 'publishedAt' and 'updatedAt' attributes
|
|
52
|
+
if (att === 'published_at') {
|
|
53
|
+
return trx.raw('NULL as ??', 'published_at');
|
|
54
|
+
}
|
|
55
|
+
return att;
|
|
56
|
+
})).from(meta.tableName)// Only select entries that were published
|
|
57
|
+
.whereNotNull('published_at');
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Copy relations from published entries to draft entries using direct database queries.
|
|
62
|
+
* This replaces the need to call discardDraft for each entry.
|
|
63
|
+
*/ async function copyRelationsToDrafts({ db, trx, uid }) {
|
|
64
|
+
const meta = db.metadata.get(uid);
|
|
65
|
+
if (!meta) return;
|
|
66
|
+
// Get all published entries for this content type
|
|
67
|
+
const publishedEntries = await trx(meta.tableName).select([
|
|
68
|
+
'id',
|
|
69
|
+
'documentId',
|
|
70
|
+
'locale'
|
|
71
|
+
]).whereNotNull('published_at');
|
|
72
|
+
// Get all draft entries for this content type
|
|
73
|
+
const draftEntries = await trx(meta.tableName).select([
|
|
74
|
+
'id',
|
|
75
|
+
'documentId',
|
|
76
|
+
'locale'
|
|
77
|
+
]).whereNull('published_at');
|
|
78
|
+
if (publishedEntries.length === 0 || draftEntries.length === 0) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// Create mapping from documentId to draft entry ID (only for drafts created by migration)
|
|
82
|
+
const draftByDocumentId = new Map();
|
|
83
|
+
for (const draft of draftEntries){
|
|
84
|
+
if (draft.documentId) {
|
|
85
|
+
draftByDocumentId.set(draft.documentId, draft);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Create mapping from published entry ID to draft entry ID
|
|
89
|
+
const publishedToDraftMap = new Map();
|
|
90
|
+
for (const published of publishedEntries){
|
|
91
|
+
const draft = draftByDocumentId.get(published.documentId);
|
|
92
|
+
if (draft) {
|
|
93
|
+
publishedToDraftMap.set(published.id, draft.id);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (publishedToDraftMap.size === 0) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// Copy relations for this content type
|
|
100
|
+
await copyRelationsForContentType({
|
|
101
|
+
trx,
|
|
102
|
+
uid,
|
|
103
|
+
publishedToDraftMap,
|
|
104
|
+
publishedEntries
|
|
105
|
+
});
|
|
106
|
+
// Copy relations from other content types that target this content type
|
|
107
|
+
await copyRelationsFromOtherContentTypes({
|
|
108
|
+
trx,
|
|
109
|
+
uid,
|
|
110
|
+
publishedToDraftMap,
|
|
111
|
+
publishedEntries
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Copy relations within the same content type (self-referential relations)
|
|
116
|
+
*/ async function copyRelationsForContentType({ trx, uid, publishedToDraftMap }) {
|
|
117
|
+
const meta = strapi.db.metadata.get(uid);
|
|
118
|
+
if (!meta) return;
|
|
119
|
+
const publishedIds = Array.from(publishedToDraftMap.keys());
|
|
120
|
+
for (const attribute of Object.values(meta.attributes)){
|
|
121
|
+
if (attribute.type !== 'relation' || attribute.target !== uid) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const joinTable = attribute.joinTable;
|
|
125
|
+
if (!joinTable) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
const { name: sourceColumnName } = joinTable.joinColumn;
|
|
129
|
+
const { name: targetColumnName } = joinTable.inverseJoinColumn;
|
|
130
|
+
// Get all relations where the source is a published entry
|
|
131
|
+
const relations = await trx(joinTable.name).select('*').whereIn(sourceColumnName, publishedIds);
|
|
132
|
+
if (relations.length === 0) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
// Create new relations pointing to draft entries
|
|
136
|
+
const newRelations = relations.map((relation)=>{
|
|
137
|
+
const newSourceId = publishedToDraftMap.get(relation[sourceColumnName]);
|
|
138
|
+
const newTargetId = publishedToDraftMap.get(relation[targetColumnName]);
|
|
139
|
+
if (!newSourceId || !newTargetId) {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
...relation,
|
|
144
|
+
[sourceColumnName]: newSourceId,
|
|
145
|
+
[targetColumnName]: newTargetId
|
|
146
|
+
};
|
|
147
|
+
}).filter(Boolean);
|
|
148
|
+
if (newRelations.length > 0) {
|
|
149
|
+
await trx.batchInsert(joinTable.name, newRelations, 1000);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Copy relations from other content types that target this content type
|
|
155
|
+
*/ async function copyRelationsFromOtherContentTypes({ trx, uid, publishedToDraftMap }) {
|
|
156
|
+
const targetIds = Array.from(publishedToDraftMap.keys());
|
|
157
|
+
// Iterate through all content types and components to find relations targeting our content type
|
|
158
|
+
const contentTypes = Object.values(strapi.contentTypes);
|
|
159
|
+
const components = Object.values(strapi.components);
|
|
160
|
+
for (const model of [
|
|
161
|
+
...contentTypes,
|
|
162
|
+
...components
|
|
163
|
+
]){
|
|
164
|
+
const dbModel = strapi.db.metadata.get(model.uid);
|
|
165
|
+
if (!dbModel) continue;
|
|
166
|
+
for (const attribute of Object.values(dbModel.attributes)){
|
|
167
|
+
if (attribute.type !== 'relation' || attribute.target !== uid) {
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
const joinTable = attribute.joinTable;
|
|
171
|
+
if (!joinTable) {
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
const { name: targetColumnName } = joinTable.inverseJoinColumn;
|
|
175
|
+
// Get all relations where the target is a published entry of our content type
|
|
176
|
+
const relations = await trx(joinTable.name).select('*').whereIn(targetColumnName, targetIds);
|
|
177
|
+
if (relations.length === 0) {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
// Create new relations pointing to draft entries
|
|
181
|
+
const newRelations = relations.map((relation)=>{
|
|
182
|
+
const newTargetId = publishedToDraftMap.get(relation[targetColumnName]);
|
|
183
|
+
if (!newTargetId) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
...relation,
|
|
188
|
+
[targetColumnName]: newTargetId
|
|
189
|
+
};
|
|
190
|
+
}).filter(Boolean);
|
|
191
|
+
if (newRelations.length > 0) {
|
|
192
|
+
await trx.batchInsert(joinTable.name, newRelations, 1000);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* 2 pass migration to create the draft entries for all the published entries.
|
|
199
|
+
* And then copy relations directly using database queries.
|
|
200
|
+
*/ const migrateUp = async (trx, db)=>{
|
|
201
|
+
const dpModels = [];
|
|
202
|
+
for (const meta of db.metadata.values()){
|
|
203
|
+
const hasDP = await hasDraftAndPublish(trx, meta);
|
|
204
|
+
if (hasDP) {
|
|
205
|
+
dpModels.push(meta);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Create plain draft entries for all the entries that were published.
|
|
210
|
+
*/ for (const model of dpModels){
|
|
211
|
+
await copyPublishedEntriesToDraft({
|
|
212
|
+
db,
|
|
213
|
+
trx,
|
|
214
|
+
uid: model.uid
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Copy relations from published entries to draft entries using direct database queries.
|
|
219
|
+
* This is much more efficient than calling discardDraft for each entry.
|
|
220
|
+
*/ for (const model of dpModels){
|
|
221
|
+
await copyRelationsToDrafts({
|
|
222
|
+
db,
|
|
223
|
+
trx,
|
|
224
|
+
uid: model.uid
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
/**
|
|
229
|
+
* Load a batch of versions to discard.
|
|
230
|
+
*
|
|
231
|
+
* Versions with only a draft version will be ignored.
|
|
232
|
+
* Only versions with a published version (which always have a draft version) will be discarded.
|
|
233
|
+
*/ async function* getBatchToDiscard({ db, trx, uid, defaultBatchSize = 1000 }) {
|
|
234
|
+
const client = db.config.connection.client;
|
|
235
|
+
const isSQLite = typeof client === 'string' && [
|
|
236
|
+
'sqlite',
|
|
237
|
+
'sqlite3',
|
|
238
|
+
'better-sqlite3'
|
|
239
|
+
].includes(client);
|
|
240
|
+
// The SQLite documentation states that the maximum number of terms in a
|
|
241
|
+
// compound SELECT statement is 500 by default.
|
|
242
|
+
// See: https://www.sqlite.org/limits.html
|
|
243
|
+
// To ensure a successful migration, we limit the batch size to 500 for SQLite.
|
|
244
|
+
const batchSize = isSQLite ? Math.min(defaultBatchSize, 500) : defaultBatchSize;
|
|
245
|
+
let offset = 0;
|
|
246
|
+
let hasMore = true;
|
|
247
|
+
while(hasMore){
|
|
248
|
+
// Look for the published entries to discard
|
|
249
|
+
const batch = await db.queryBuilder(uid).select([
|
|
250
|
+
'id',
|
|
251
|
+
'documentId',
|
|
252
|
+
'locale'
|
|
253
|
+
]).where({
|
|
254
|
+
publishedAt: {
|
|
255
|
+
$ne: null
|
|
256
|
+
}
|
|
257
|
+
}).limit(batchSize).offset(offset).orderBy('id').transacting(trx).execute();
|
|
258
|
+
if (batch.length < batchSize) {
|
|
259
|
+
hasMore = false;
|
|
260
|
+
}
|
|
261
|
+
offset += batchSize;
|
|
262
|
+
yield batch;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
const discardDocumentDrafts = {
|
|
266
|
+
name: 'core::5.0.0-discard-drafts',
|
|
267
|
+
async up (trx, db) {
|
|
268
|
+
await migrateUp(trx, db);
|
|
269
|
+
},
|
|
270
|
+
async down () {
|
|
271
|
+
throw new Error('not implemented');
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
exports.discardDocumentDrafts = discardDocumentDrafts;
|
|
276
|
+
exports.getBatchToDiscard = getBatchToDiscard;
|
|
277
|
+
//# sourceMappingURL=5.0.0-discard-drafts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"5.0.0-discard-drafts.js","sources":["../../../src/migrations/database/5.0.0-discard-drafts.ts"],"sourcesContent":["/**\n * This migration is responsible for creating the draft counterpart for all the entries that were in a published state.\n *\n * In v4, entries could either be in a draft or published state, but not both at the same time.\n * In v5, we introduced the concept of document, and an entry can be in a draft or published state.\n *\n * This means the migration needs to create the draft counterpart if an entry was published.\n *\n * This migration performs the following steps:\n * 1. Creates draft entries for all published entries, without it's components, dynamic zones or relations.\n * 2. Using the document service, discard those same drafts to copy its relations.\n */\n\n/* eslint-disable no-continue */\nimport type { UID } from '@strapi/types';\nimport type { Database, Migration } from '@strapi/database';\nimport { contentTypes } from '@strapi/utils';\n\ntype DocumentVersion = { documentId: string; locale: string };\ntype Knex = Parameters<Migration['up']>[0];\n\n/**\n * Check if the model has draft and publish enabled.\n */\nconst hasDraftAndPublish = async (trx: Knex, meta: any) => {\n const hasTable = await trx.schema.hasTable(meta.tableName);\n\n if (!hasTable) {\n return false;\n }\n\n const uid = meta.uid as UID.ContentType;\n const model = strapi.getModel(uid);\n const hasDP = contentTypes.hasDraftAndPublish(model);\n if (!hasDP) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Copy all the published entries to draft entries, without it's components, dynamic zones or relations.\n * This ensures all necessary draft's exist before copying it's relations.\n */\nasync function copyPublishedEntriesToDraft({\n db,\n trx,\n uid,\n}: {\n db: Database;\n trx: Knex;\n uid: string;\n}) {\n // Extract all scalar attributes to use in the insert query\n const meta = db.metadata.get(uid);\n\n // Get scalar attributes that will be copied over the new draft\n const scalarAttributes = Object.values(meta.attributes).reduce((acc, attribute: any) => {\n if (['id'].includes(attribute.columnName)) {\n return acc;\n }\n\n if (contentTypes.isScalarAttribute(attribute)) {\n acc.push(attribute.columnName);\n }\n\n return acc;\n }, [] as string[]);\n\n /**\n * Query to copy the published entries into draft entries.\n *\n * INSERT INTO tableName (columnName1, columnName2, columnName3, ...)\n * SELECT columnName1, columnName2, columnName3, ...\n * FROM tableName\n */\n await trx\n // INSERT INTO tableName (columnName1, columnName2, columnName3, ...)\n .into(\n trx.raw(`?? (${scalarAttributes.map(() => `??`).join(', ')})`, [\n meta.tableName,\n ...scalarAttributes,\n ])\n )\n .insert((subQb: typeof trx) => {\n // SELECT columnName1, columnName2, columnName3, ...\n subQb\n .select(\n ...scalarAttributes.map((att: string) => {\n // Override 'publishedAt' and 'updatedAt' attributes\n if (att === 'published_at') {\n return trx.raw('NULL as ??', 'published_at');\n }\n\n return att;\n })\n )\n .from(meta.tableName)\n // Only select entries that were published\n .whereNotNull('published_at');\n });\n}\n\n/**\n * Copy relations from published entries to draft entries using direct database queries.\n * This replaces the need to call discardDraft for each entry.\n */\nasync function copyRelationsToDrafts({ db, trx, uid }: { db: Database; trx: Knex; uid: string }) {\n const meta = db.metadata.get(uid);\n if (!meta) return;\n\n // Get all published entries for this content type\n const publishedEntries = (await trx(meta.tableName)\n .select(['id', 'documentId', 'locale'])\n .whereNotNull('published_at')) as Array<{ id: number; documentId: string; locale: string }>;\n\n // Get all draft entries for this content type\n const draftEntries = (await trx(meta.tableName)\n .select(['id', 'documentId', 'locale'])\n .whereNull('published_at')) as Array<{ id: number; documentId: string; locale: string }>;\n\n if (publishedEntries.length === 0 || draftEntries.length === 0) {\n return;\n }\n\n // Create mapping from documentId to draft entry ID (only for drafts created by migration)\n const draftByDocumentId = new Map();\n for (const draft of draftEntries) {\n if (draft.documentId) {\n draftByDocumentId.set(draft.documentId, draft);\n }\n }\n\n // Create mapping from published entry ID to draft entry ID\n const publishedToDraftMap = new Map();\n for (const published of publishedEntries) {\n const draft = draftByDocumentId.get(published.documentId);\n if (draft) {\n publishedToDraftMap.set(published.id, draft.id);\n }\n }\n\n if (publishedToDraftMap.size === 0) {\n return;\n }\n\n // Copy relations for this content type\n await copyRelationsForContentType({\n trx,\n uid,\n publishedToDraftMap,\n publishedEntries,\n });\n\n // Copy relations from other content types that target this content type\n await copyRelationsFromOtherContentTypes({\n trx,\n uid,\n publishedToDraftMap,\n publishedEntries,\n });\n}\n\n/**\n * Copy relations within the same content type (self-referential relations)\n */\nasync function copyRelationsForContentType({\n trx,\n uid,\n publishedToDraftMap,\n}: {\n trx: Knex;\n uid: string;\n publishedToDraftMap: Map<number, number>;\n publishedEntries: Array<{ id: number; documentId: string; locale: string }>;\n}) {\n const meta = strapi.db.metadata.get(uid);\n if (!meta) return;\n\n const publishedIds = Array.from(publishedToDraftMap.keys());\n\n for (const attribute of Object.values(meta.attributes) as any) {\n if (attribute.type !== 'relation' || attribute.target !== uid) {\n continue;\n }\n\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 // Get all relations where the source is a published entry\n const relations = await trx(joinTable.name).select('*').whereIn(sourceColumnName, publishedIds);\n\n if (relations.length === 0) {\n continue;\n }\n\n // Create new relations pointing to draft entries\n const newRelations = relations\n .map((relation) => {\n const newSourceId = publishedToDraftMap.get(relation[sourceColumnName]);\n const newTargetId = publishedToDraftMap.get(relation[targetColumnName]);\n\n if (!newSourceId || !newTargetId) {\n return null;\n }\n\n return {\n ...relation,\n [sourceColumnName]: newSourceId,\n [targetColumnName]: newTargetId,\n };\n })\n .filter(Boolean);\n\n if (newRelations.length > 0) {\n await trx.batchInsert(joinTable.name, newRelations, 1000);\n }\n }\n}\n\n/**\n * Copy relations from other content types that target this content type\n */\nasync function copyRelationsFromOtherContentTypes({\n trx,\n uid,\n publishedToDraftMap,\n}: {\n trx: Knex;\n uid: string;\n publishedToDraftMap: Map<number, number>;\n publishedEntries: Array<{ id: number; documentId: string; locale: string }>;\n}) {\n const targetIds = Array.from(publishedToDraftMap.keys());\n\n // Iterate through all content types and components to find relations targeting our content type\n const contentTypes = Object.values(strapi.contentTypes) as any[];\n const components = Object.values(strapi.components) as any[];\n\n for (const model of [...contentTypes, ...components]) {\n const dbModel = strapi.db.metadata.get(model.uid);\n if (!dbModel) continue;\n\n for (const attribute of Object.values(dbModel.attributes) as any) {\n if (attribute.type !== 'relation' || attribute.target !== uid) {\n continue;\n }\n\n const joinTable = attribute.joinTable;\n if (!joinTable) {\n continue;\n }\n\n const { name: targetColumnName } = joinTable.inverseJoinColumn;\n\n // Get all relations where the target is a published entry of our content type\n const relations = await trx(joinTable.name).select('*').whereIn(targetColumnName, targetIds);\n\n if (relations.length === 0) {\n continue;\n }\n\n // Create new relations pointing to draft entries\n const newRelations = relations\n .map((relation) => {\n const newTargetId = publishedToDraftMap.get(relation[targetColumnName]);\n\n if (!newTargetId) {\n return null;\n }\n\n return {\n ...relation,\n [targetColumnName]: newTargetId,\n };\n })\n .filter(Boolean);\n\n if (newRelations.length > 0) {\n await trx.batchInsert(joinTable.name, newRelations, 1000);\n }\n }\n }\n}\n\n/**\n * 2 pass migration to create the draft entries for all the published entries.\n * And then copy relations directly using database queries.\n */\nconst migrateUp = async (trx: Knex, db: Database) => {\n const dpModels = [];\n for (const meta of db.metadata.values()) {\n const hasDP = await hasDraftAndPublish(trx, meta);\n if (hasDP) {\n dpModels.push(meta);\n }\n }\n\n /**\n * Create plain draft entries for all the entries that were published.\n */\n for (const model of dpModels) {\n await copyPublishedEntriesToDraft({ db, trx, uid: model.uid });\n }\n\n /**\n * Copy relations from published entries to draft entries using direct database queries.\n * This is much more efficient than calling discardDraft for each entry.\n */\n for (const model of dpModels) {\n await copyRelationsToDrafts({ db, trx, uid: model.uid });\n }\n};\n\n/**\n * Load a batch of versions to discard.\n *\n * Versions with only a draft version will be ignored.\n * Only versions with a published version (which always have a draft version) will be discarded.\n */\nexport async function* getBatchToDiscard({\n db,\n trx,\n uid,\n defaultBatchSize = 1000,\n}: {\n db: Database;\n trx: Knex;\n uid: string;\n defaultBatchSize?: number;\n}) {\n const client = db.config.connection.client;\n const isSQLite =\n typeof client === 'string' && ['sqlite', 'sqlite3', 'better-sqlite3'].includes(client);\n\n // The SQLite documentation states that the maximum number of terms in a\n // compound SELECT statement is 500 by default.\n // See: https://www.sqlite.org/limits.html\n // To ensure a successful migration, we limit the batch size to 500 for SQLite.\n const batchSize = isSQLite ? Math.min(defaultBatchSize, 500) : defaultBatchSize;\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n // Look for the published entries to discard\n const batch: DocumentVersion[] = await db\n .queryBuilder(uid)\n .select(['id', 'documentId', 'locale'])\n .where({ publishedAt: { $ne: null } })\n .limit(batchSize)\n .offset(offset)\n .orderBy('id')\n .transacting(trx)\n .execute();\n\n if (batch.length < batchSize) {\n hasMore = false;\n }\n\n offset += batchSize;\n yield batch;\n }\n}\n\nexport const discardDocumentDrafts: Migration = {\n name: 'core::5.0.0-discard-drafts',\n async up(trx, db) {\n await migrateUp(trx, db);\n },\n async down() {\n throw new Error('not implemented');\n },\n};\n"],"names":["hasDraftAndPublish","trx","meta","hasTable","schema","tableName","uid","model","strapi","getModel","hasDP","contentTypes","copyPublishedEntriesToDraft","db","metadata","get","scalarAttributes","Object","values","attributes","reduce","acc","attribute","includes","columnName","isScalarAttribute","push","into","raw","map","join","insert","subQb","select","att","from","whereNotNull","copyRelationsToDrafts","publishedEntries","draftEntries","whereNull","length","draftByDocumentId","Map","draft","documentId","set","publishedToDraftMap","published","id","size","copyRelationsForContentType","copyRelationsFromOtherContentTypes","publishedIds","Array","keys","type","target","joinTable","name","sourceColumnName","joinColumn","targetColumnName","inverseJoinColumn","relations","whereIn","newRelations","relation","newSourceId","newTargetId","filter","Boolean","batchInsert","targetIds","components","dbModel","migrateUp","dpModels","getBatchToDiscard","defaultBatchSize","client","config","connection","isSQLite","batchSize","Math","min","offset","hasMore","batch","queryBuilder","where","publishedAt","$ne","limit","orderBy","transacting","execute","discardDocumentDrafts","up","down","Error"],"mappings":";;;;AAqBA;;IAGA,MAAMA,kBAAqB,GAAA,OAAOC,GAAWC,EAAAA,IAAAA,GAAAA;IAC3C,MAAMC,QAAAA,GAAW,MAAMF,GAAIG,CAAAA,MAAM,CAACD,QAAQ,CAACD,KAAKG,SAAS,CAAA;AAEzD,IAAA,IAAI,CAACF,QAAU,EAAA;QACb,OAAO,KAAA;AACT;IAEA,MAAMG,GAAAA,GAAMJ,KAAKI,GAAG;IACpB,MAAMC,KAAAA,GAAQC,MAAOC,CAAAA,QAAQ,CAACH,GAAAA,CAAAA;IAC9B,MAAMI,KAAAA,GAAQC,wBAAaX,CAAAA,kBAAkB,CAACO,KAAAA,CAAAA;AAC9C,IAAA,IAAI,CAACG,KAAO,EAAA;QACV,OAAO,KAAA;AACT;IAEA,OAAO,IAAA;AACT,CAAA;AAEA;;;IAIA,eAAeE,4BAA4B,EACzCC,EAAE,EACFZ,GAAG,EACHK,GAAG,EAKJ,EAAA;;AAEC,IAAA,MAAMJ,IAAOW,GAAAA,EAAAA,CAAGC,QAAQ,CAACC,GAAG,CAACT,GAAAA,CAAAA;;IAG7B,MAAMU,gBAAAA,GAAmBC,MAAOC,CAAAA,MAAM,CAAChB,IAAAA,CAAKiB,UAAU,CAAEC,CAAAA,MAAM,CAAC,CAACC,GAAKC,EAAAA,SAAAA,GAAAA;QACnE,IAAI;AAAC,YAAA;AAAK,SAAA,CAACC,QAAQ,CAACD,SAAUE,CAAAA,UAAU,CAAG,EAAA;YACzC,OAAOH,GAAAA;AACT;QAEA,IAAIV,wBAAAA,CAAac,iBAAiB,CAACH,SAAY,CAAA,EAAA;YAC7CD,GAAIK,CAAAA,IAAI,CAACJ,SAAAA,CAAUE,UAAU,CAAA;AAC/B;QAEA,OAAOH,GAAAA;AACT,KAAA,EAAG,EAAE,CAAA;AAEL;;;;;;MAOA,MAAMpB,GACJ;KACC0B,IAAI,CACH1B,IAAI2B,GAAG,CAAC,CAAC,IAAI,EAAEZ,iBAAiBa,GAAG,CAAC,IAAM,CAAC,EAAE,CAAC,CAAEC,CAAAA,IAAI,CAAC,IAAM,CAAA,CAAA,CAAC,CAAC,EAAE;AAC7D5B,QAAAA,IAAAA,CAAKG,SAAS;AACXW,QAAAA,GAAAA;KACJ,CAEFe,CAAAA,CAAAA,MAAM,CAAC,CAACC,KAAAA,GAAAA;;AAEPA,QAAAA,KAAAA,CACGC,MAAM,CAAA,GACFjB,gBAAiBa,CAAAA,GAAG,CAAC,CAACK,GAAAA,GAAAA;;AAEvB,YAAA,IAAIA,QAAQ,cAAgB,EAAA;gBAC1B,OAAOjC,GAAAA,CAAI2B,GAAG,CAAC,YAAc,EAAA,cAAA,CAAA;AAC/B;YAEA,OAAOM,GAAAA;AACT,SAAA,CAAA,CAAA,CAEDC,IAAI,CAACjC,IAAKG,CAAAA,SAAS,CACpB;AACC+B,SAAAA,YAAY,CAAC,cAAA,CAAA;AAClB,KAAA,CAAA;AACJ;AAEA;;;IAIA,eAAeC,sBAAsB,EAAExB,EAAE,EAAEZ,GAAG,EAAEK,GAAG,EAA4C,EAAA;AAC7F,IAAA,MAAMJ,IAAOW,GAAAA,EAAAA,CAAGC,QAAQ,CAACC,GAAG,CAACT,GAAAA,CAAAA;AAC7B,IAAA,IAAI,CAACJ,IAAM,EAAA;;AAGX,IAAA,MAAMoC,mBAAoB,MAAMrC,GAAAA,CAAIC,KAAKG,SAAS,CAAA,CAC/C4B,MAAM,CAAC;AAAC,QAAA,IAAA;AAAM,QAAA,YAAA;AAAc,QAAA;AAAS,KAAA,CAAA,CACrCG,YAAY,CAAC,cAAA,CAAA;;AAGhB,IAAA,MAAMG,eAAgB,MAAMtC,GAAAA,CAAIC,KAAKG,SAAS,CAAA,CAC3C4B,MAAM,CAAC;AAAC,QAAA,IAAA;AAAM,QAAA,YAAA;AAAc,QAAA;AAAS,KAAA,CAAA,CACrCO,SAAS,CAAC,cAAA,CAAA;AAEb,IAAA,IAAIF,iBAAiBG,MAAM,KAAK,KAAKF,YAAaE,CAAAA,MAAM,KAAK,CAAG,EAAA;AAC9D,QAAA;AACF;;AAGA,IAAA,MAAMC,oBAAoB,IAAIC,GAAAA,EAAAA;IAC9B,KAAK,MAAMC,SAASL,YAAc,CAAA;QAChC,IAAIK,KAAAA,CAAMC,UAAU,EAAE;AACpBH,YAAAA,iBAAAA,CAAkBI,GAAG,CAACF,KAAMC,CAAAA,UAAU,EAAED,KAAAA,CAAAA;AAC1C;AACF;;AAGA,IAAA,MAAMG,sBAAsB,IAAIJ,GAAAA,EAAAA;IAChC,KAAK,MAAMK,aAAaV,gBAAkB,CAAA;AACxC,QAAA,MAAMM,KAAQF,GAAAA,iBAAAA,CAAkB3B,GAAG,CAACiC,UAAUH,UAAU,CAAA;AACxD,QAAA,IAAID,KAAO,EAAA;AACTG,YAAAA,mBAAAA,CAAoBD,GAAG,CAACE,SAAAA,CAAUC,EAAE,EAAEL,MAAMK,EAAE,CAAA;AAChD;AACF;IAEA,IAAIF,mBAAAA,CAAoBG,IAAI,KAAK,CAAG,EAAA;AAClC,QAAA;AACF;;AAGA,IAAA,MAAMC,2BAA4B,CAAA;AAChClD,QAAAA,GAAAA;AACAK,QAAAA,GAAAA;AACAyC,QAAAA,mBAAAA;AACAT,QAAAA;AACF,KAAA,CAAA;;AAGA,IAAA,MAAMc,kCAAmC,CAAA;AACvCnD,QAAAA,GAAAA;AACAK,QAAAA,GAAAA;AACAyC,QAAAA,mBAAAA;AACAT,QAAAA;AACF,KAAA,CAAA;AACF;AAEA;;IAGA,eAAea,4BAA4B,EACzClD,GAAG,EACHK,GAAG,EACHyC,mBAAmB,EAMpB,EAAA;AACC,IAAA,MAAM7C,OAAOM,MAAOK,CAAAA,EAAE,CAACC,QAAQ,CAACC,GAAG,CAACT,GAAAA,CAAAA;AACpC,IAAA,IAAI,CAACJ,IAAM,EAAA;AAEX,IAAA,MAAMmD,YAAeC,GAAAA,KAAAA,CAAMnB,IAAI,CAACY,oBAAoBQ,IAAI,EAAA,CAAA;AAExD,IAAA,KAAK,MAAMjC,SAAaL,IAAAA,MAAAA,CAAOC,MAAM,CAAChB,IAAAA,CAAKiB,UAAU,CAAU,CAAA;AAC7D,QAAA,IAAIG,UAAUkC,IAAI,KAAK,cAAclC,SAAUmC,CAAAA,MAAM,KAAKnD,GAAK,EAAA;AAC7D,YAAA;AACF;QAEA,MAAMoD,SAAAA,GAAYpC,UAAUoC,SAAS;AACrC,QAAA,IAAI,CAACA,SAAW,EAAA;AACd,YAAA;AACF;AAEA,QAAA,MAAM,EAAEC,IAAMC,EAAAA,gBAAgB,EAAE,GAAGF,UAAUG,UAAU;AACvD,QAAA,MAAM,EAAEF,IAAMG,EAAAA,gBAAgB,EAAE,GAAGJ,UAAUK,iBAAiB;;QAG9D,MAAMC,SAAAA,GAAY,MAAM/D,GAAAA,CAAIyD,SAAUC,CAAAA,IAAI,CAAE1B,CAAAA,MAAM,CAAC,GAAA,CAAA,CAAKgC,OAAO,CAACL,gBAAkBP,EAAAA,YAAAA,CAAAA;QAElF,IAAIW,SAAAA,CAAUvB,MAAM,KAAK,CAAG,EAAA;AAC1B,YAAA;AACF;;AAGA,QAAA,MAAMyB,YAAeF,GAAAA,SAAAA,CAClBnC,GAAG,CAAC,CAACsC,QAAAA,GAAAA;AACJ,YAAA,MAAMC,cAAcrB,mBAAoBhC,CAAAA,GAAG,CAACoD,QAAQ,CAACP,gBAAiB,CAAA,CAAA;AACtE,YAAA,MAAMS,cAActB,mBAAoBhC,CAAAA,GAAG,CAACoD,QAAQ,CAACL,gBAAiB,CAAA,CAAA;YAEtE,IAAI,CAACM,WAAe,IAAA,CAACC,WAAa,EAAA;gBAChC,OAAO,IAAA;AACT;YAEA,OAAO;AACL,gBAAA,GAAGF,QAAQ;AACX,gBAAA,CAACP,mBAAmBQ,WAAAA;AACpB,gBAAA,CAACN,mBAAmBO;AACtB,aAAA;AACF,SAAA,CAAA,CACCC,MAAM,CAACC,OAAAA,CAAAA;QAEV,IAAIL,YAAAA,CAAazB,MAAM,GAAG,CAAG,EAAA;AAC3B,YAAA,MAAMxC,IAAIuE,WAAW,CAACd,SAAUC,CAAAA,IAAI,EAAEO,YAAc,EAAA,IAAA,CAAA;AACtD;AACF;AACF;AAEA;;IAGA,eAAed,mCAAmC,EAChDnD,GAAG,EACHK,GAAG,EACHyC,mBAAmB,EAMpB,EAAA;AACC,IAAA,MAAM0B,SAAYnB,GAAAA,KAAAA,CAAMnB,IAAI,CAACY,oBAAoBQ,IAAI,EAAA,CAAA;;AAGrD,IAAA,MAAM5C,YAAeM,GAAAA,MAAAA,CAAOC,MAAM,CAACV,OAAOG,YAAY,CAAA;AACtD,IAAA,MAAM+D,UAAazD,GAAAA,MAAAA,CAAOC,MAAM,CAACV,OAAOkE,UAAU,CAAA;AAElD,IAAA,KAAK,MAAMnE,KAAS,IAAA;AAAII,QAAAA,GAAAA,YAAAA;AAAiB+D,QAAAA,GAAAA;KAAW,CAAE;QACpD,MAAMC,OAAAA,GAAUnE,OAAOK,EAAE,CAACC,QAAQ,CAACC,GAAG,CAACR,KAAAA,CAAMD,GAAG,CAAA;AAChD,QAAA,IAAI,CAACqE,OAAS,EAAA;AAEd,QAAA,KAAK,MAAMrD,SAAaL,IAAAA,MAAAA,CAAOC,MAAM,CAACyD,OAAAA,CAAQxD,UAAU,CAAU,CAAA;AAChE,YAAA,IAAIG,UAAUkC,IAAI,KAAK,cAAclC,SAAUmC,CAAAA,MAAM,KAAKnD,GAAK,EAAA;AAC7D,gBAAA;AACF;YAEA,MAAMoD,SAAAA,GAAYpC,UAAUoC,SAAS;AACrC,YAAA,IAAI,CAACA,SAAW,EAAA;AACd,gBAAA;AACF;AAEA,YAAA,MAAM,EAAEC,IAAMG,EAAAA,gBAAgB,EAAE,GAAGJ,UAAUK,iBAAiB;;YAG9D,MAAMC,SAAAA,GAAY,MAAM/D,GAAAA,CAAIyD,SAAUC,CAAAA,IAAI,CAAE1B,CAAAA,MAAM,CAAC,GAAA,CAAA,CAAKgC,OAAO,CAACH,gBAAkBW,EAAAA,SAAAA,CAAAA;YAElF,IAAIT,SAAAA,CAAUvB,MAAM,KAAK,CAAG,EAAA;AAC1B,gBAAA;AACF;;AAGA,YAAA,MAAMyB,YAAeF,GAAAA,SAAAA,CAClBnC,GAAG,CAAC,CAACsC,QAAAA,GAAAA;AACJ,gBAAA,MAAME,cAActB,mBAAoBhC,CAAAA,GAAG,CAACoD,QAAQ,CAACL,gBAAiB,CAAA,CAAA;AAEtE,gBAAA,IAAI,CAACO,WAAa,EAAA;oBAChB,OAAO,IAAA;AACT;gBAEA,OAAO;AACL,oBAAA,GAAGF,QAAQ;AACX,oBAAA,CAACL,mBAAmBO;AACtB,iBAAA;AACF,aAAA,CAAA,CACCC,MAAM,CAACC,OAAAA,CAAAA;YAEV,IAAIL,YAAAA,CAAazB,MAAM,GAAG,CAAG,EAAA;AAC3B,gBAAA,MAAMxC,IAAIuE,WAAW,CAACd,SAAUC,CAAAA,IAAI,EAAEO,YAAc,EAAA,IAAA,CAAA;AACtD;AACF;AACF;AACF;AAEA;;;IAIA,MAAMU,SAAY,GAAA,OAAO3E,GAAWY,EAAAA,EAAAA,GAAAA;AAClC,IAAA,MAAMgE,WAAW,EAAE;AACnB,IAAA,KAAK,MAAM3E,IAAQW,IAAAA,EAAAA,CAAGC,QAAQ,CAACI,MAAM,EAAI,CAAA;QACvC,MAAMR,KAAAA,GAAQ,MAAMV,kBAAAA,CAAmBC,GAAKC,EAAAA,IAAAA,CAAAA;AAC5C,QAAA,IAAIQ,KAAO,EAAA;AACTmE,YAAAA,QAAAA,CAASnD,IAAI,CAACxB,IAAAA,CAAAA;AAChB;AACF;AAEA;;MAGA,KAAK,MAAMK,KAAAA,IAASsE,QAAU,CAAA;AAC5B,QAAA,MAAMjE,2BAA4B,CAAA;AAAEC,YAAAA,EAAAA;AAAIZ,YAAAA,GAAAA;AAAKK,YAAAA,GAAAA,EAAKC,MAAMD;AAAI,SAAA,CAAA;AAC9D;AAEA;;;MAIA,KAAK,MAAMC,KAAAA,IAASsE,QAAU,CAAA;AAC5B,QAAA,MAAMxC,qBAAsB,CAAA;AAAExB,YAAAA,EAAAA;AAAIZ,YAAAA,GAAAA;AAAKK,YAAAA,GAAAA,EAAKC,MAAMD;AAAI,SAAA,CAAA;AACxD;AACF,CAAA;AAEA;;;;;AAKC,IACM,gBAAgBwE,iBAAkB,CAAA,EACvCjE,EAAE,EACFZ,GAAG,EACHK,GAAG,EACHyE,gBAAmB,GAAA,IAAI,EAMxB,EAAA;AACC,IAAA,MAAMC,SAASnE,EAAGoE,CAAAA,MAAM,CAACC,UAAU,CAACF,MAAM;IAC1C,MAAMG,QAAAA,GACJ,OAAOH,MAAAA,KAAW,QAAY,IAAA;AAAC,QAAA,QAAA;AAAU,QAAA,SAAA;AAAW,QAAA;AAAiB,KAAA,CAACzD,QAAQ,CAACyD,MAAAA,CAAAA;;;;;AAMjF,IAAA,MAAMI,YAAYD,QAAWE,GAAAA,IAAAA,CAAKC,GAAG,CAACP,kBAAkB,GAAOA,CAAAA,GAAAA,gBAAAA;AAC/D,IAAA,IAAIQ,MAAS,GAAA,CAAA;AACb,IAAA,IAAIC,OAAU,GAAA,IAAA;AAEd,IAAA,MAAOA,OAAS,CAAA;;AAEd,QAAA,MAAMC,QAA2B,MAAM5E,EAAAA,CACpC6E,YAAY,CAACpF,GAAAA,CAAAA,CACb2B,MAAM,CAAC;AAAC,YAAA,IAAA;AAAM,YAAA,YAAA;AAAc,YAAA;AAAS,SAAA,CAAA,CACrC0D,KAAK,CAAC;YAAEC,WAAa,EAAA;gBAAEC,GAAK,EAAA;AAAK;AAAE,SAAA,CAAA,CACnCC,KAAK,CAACV,SACNG,CAAAA,CAAAA,MAAM,CAACA,MAAAA,CAAAA,CACPQ,OAAO,CAAC,IACRC,CAAAA,CAAAA,WAAW,CAAC/F,GAAAA,CAAAA,CACZgG,OAAO,EAAA;QAEV,IAAIR,KAAAA,CAAMhD,MAAM,GAAG2C,SAAW,EAAA;YAC5BI,OAAU,GAAA,KAAA;AACZ;QAEAD,MAAUH,IAAAA,SAAAA;QACV,MAAMK,KAAAA;AACR;AACF;MAEaS,qBAAmC,GAAA;IAC9CvC,IAAM,EAAA,4BAAA;IACN,MAAMwC,EAAAA,CAAAA,CAAGlG,GAAG,EAAEY,EAAE,EAAA;AACd,QAAA,MAAM+D,UAAU3E,GAAKY,EAAAA,EAAAA,CAAAA;AACvB,KAAA;IACA,MAAMuF,IAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAM,IAAIC,KAAM,CAAA,iBAAA,CAAA;AAClB;AACF;;;;;"}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { contentTypes } from '@strapi/utils';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Check if the model has draft and publish enabled.
|
|
5
|
+
*/ const hasDraftAndPublish = async (trx, meta)=>{
|
|
6
|
+
const hasTable = await trx.schema.hasTable(meta.tableName);
|
|
7
|
+
if (!hasTable) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
const uid = meta.uid;
|
|
11
|
+
const model = strapi.getModel(uid);
|
|
12
|
+
const hasDP = contentTypes.hasDraftAndPublish(model);
|
|
13
|
+
if (!hasDP) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
return true;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Copy all the published entries to draft entries, without it's components, dynamic zones or relations.
|
|
20
|
+
* This ensures all necessary draft's exist before copying it's relations.
|
|
21
|
+
*/ async function copyPublishedEntriesToDraft({ db, trx, uid }) {
|
|
22
|
+
// Extract all scalar attributes to use in the insert query
|
|
23
|
+
const meta = db.metadata.get(uid);
|
|
24
|
+
// Get scalar attributes that will be copied over the new draft
|
|
25
|
+
const scalarAttributes = Object.values(meta.attributes).reduce((acc, attribute)=>{
|
|
26
|
+
if ([
|
|
27
|
+
'id'
|
|
28
|
+
].includes(attribute.columnName)) {
|
|
29
|
+
return acc;
|
|
30
|
+
}
|
|
31
|
+
if (contentTypes.isScalarAttribute(attribute)) {
|
|
32
|
+
acc.push(attribute.columnName);
|
|
33
|
+
}
|
|
34
|
+
return acc;
|
|
35
|
+
}, []);
|
|
36
|
+
/**
|
|
37
|
+
* Query to copy the published entries into draft entries.
|
|
38
|
+
*
|
|
39
|
+
* INSERT INTO tableName (columnName1, columnName2, columnName3, ...)
|
|
40
|
+
* SELECT columnName1, columnName2, columnName3, ...
|
|
41
|
+
* FROM tableName
|
|
42
|
+
*/ await trx// INSERT INTO tableName (columnName1, columnName2, columnName3, ...)
|
|
43
|
+
.into(trx.raw(`?? (${scalarAttributes.map(()=>`??`).join(', ')})`, [
|
|
44
|
+
meta.tableName,
|
|
45
|
+
...scalarAttributes
|
|
46
|
+
])).insert((subQb)=>{
|
|
47
|
+
// SELECT columnName1, columnName2, columnName3, ...
|
|
48
|
+
subQb.select(...scalarAttributes.map((att)=>{
|
|
49
|
+
// Override 'publishedAt' and 'updatedAt' attributes
|
|
50
|
+
if (att === 'published_at') {
|
|
51
|
+
return trx.raw('NULL as ??', 'published_at');
|
|
52
|
+
}
|
|
53
|
+
return att;
|
|
54
|
+
})).from(meta.tableName)// Only select entries that were published
|
|
55
|
+
.whereNotNull('published_at');
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Copy relations from published entries to draft entries using direct database queries.
|
|
60
|
+
* This replaces the need to call discardDraft for each entry.
|
|
61
|
+
*/ async function copyRelationsToDrafts({ db, trx, uid }) {
|
|
62
|
+
const meta = db.metadata.get(uid);
|
|
63
|
+
if (!meta) return;
|
|
64
|
+
// Get all published entries for this content type
|
|
65
|
+
const publishedEntries = await trx(meta.tableName).select([
|
|
66
|
+
'id',
|
|
67
|
+
'documentId',
|
|
68
|
+
'locale'
|
|
69
|
+
]).whereNotNull('published_at');
|
|
70
|
+
// Get all draft entries for this content type
|
|
71
|
+
const draftEntries = await trx(meta.tableName).select([
|
|
72
|
+
'id',
|
|
73
|
+
'documentId',
|
|
74
|
+
'locale'
|
|
75
|
+
]).whereNull('published_at');
|
|
76
|
+
if (publishedEntries.length === 0 || draftEntries.length === 0) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Create mapping from documentId to draft entry ID (only for drafts created by migration)
|
|
80
|
+
const draftByDocumentId = new Map();
|
|
81
|
+
for (const draft of draftEntries){
|
|
82
|
+
if (draft.documentId) {
|
|
83
|
+
draftByDocumentId.set(draft.documentId, draft);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Create mapping from published entry ID to draft entry ID
|
|
87
|
+
const publishedToDraftMap = new Map();
|
|
88
|
+
for (const published of publishedEntries){
|
|
89
|
+
const draft = draftByDocumentId.get(published.documentId);
|
|
90
|
+
if (draft) {
|
|
91
|
+
publishedToDraftMap.set(published.id, draft.id);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (publishedToDraftMap.size === 0) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
// Copy relations for this content type
|
|
98
|
+
await copyRelationsForContentType({
|
|
99
|
+
trx,
|
|
100
|
+
uid,
|
|
101
|
+
publishedToDraftMap,
|
|
102
|
+
publishedEntries
|
|
103
|
+
});
|
|
104
|
+
// Copy relations from other content types that target this content type
|
|
105
|
+
await copyRelationsFromOtherContentTypes({
|
|
106
|
+
trx,
|
|
107
|
+
uid,
|
|
108
|
+
publishedToDraftMap,
|
|
109
|
+
publishedEntries
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Copy relations within the same content type (self-referential relations)
|
|
114
|
+
*/ async function copyRelationsForContentType({ trx, uid, publishedToDraftMap }) {
|
|
115
|
+
const meta = strapi.db.metadata.get(uid);
|
|
116
|
+
if (!meta) return;
|
|
117
|
+
const publishedIds = Array.from(publishedToDraftMap.keys());
|
|
118
|
+
for (const attribute of Object.values(meta.attributes)){
|
|
119
|
+
if (attribute.type !== 'relation' || attribute.target !== uid) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const joinTable = attribute.joinTable;
|
|
123
|
+
if (!joinTable) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const { name: sourceColumnName } = joinTable.joinColumn;
|
|
127
|
+
const { name: targetColumnName } = joinTable.inverseJoinColumn;
|
|
128
|
+
// Get all relations where the source is a published entry
|
|
129
|
+
const relations = await trx(joinTable.name).select('*').whereIn(sourceColumnName, publishedIds);
|
|
130
|
+
if (relations.length === 0) {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
// Create new relations pointing to draft entries
|
|
134
|
+
const newRelations = relations.map((relation)=>{
|
|
135
|
+
const newSourceId = publishedToDraftMap.get(relation[sourceColumnName]);
|
|
136
|
+
const newTargetId = publishedToDraftMap.get(relation[targetColumnName]);
|
|
137
|
+
if (!newSourceId || !newTargetId) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
...relation,
|
|
142
|
+
[sourceColumnName]: newSourceId,
|
|
143
|
+
[targetColumnName]: newTargetId
|
|
144
|
+
};
|
|
145
|
+
}).filter(Boolean);
|
|
146
|
+
if (newRelations.length > 0) {
|
|
147
|
+
await trx.batchInsert(joinTable.name, newRelations, 1000);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Copy relations from other content types that target this content type
|
|
153
|
+
*/ async function copyRelationsFromOtherContentTypes({ trx, uid, publishedToDraftMap }) {
|
|
154
|
+
const targetIds = Array.from(publishedToDraftMap.keys());
|
|
155
|
+
// Iterate through all content types and components to find relations targeting our content type
|
|
156
|
+
const contentTypes = Object.values(strapi.contentTypes);
|
|
157
|
+
const components = Object.values(strapi.components);
|
|
158
|
+
for (const model of [
|
|
159
|
+
...contentTypes,
|
|
160
|
+
...components
|
|
161
|
+
]){
|
|
162
|
+
const dbModel = strapi.db.metadata.get(model.uid);
|
|
163
|
+
if (!dbModel) continue;
|
|
164
|
+
for (const attribute of Object.values(dbModel.attributes)){
|
|
165
|
+
if (attribute.type !== 'relation' || attribute.target !== uid) {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const joinTable = attribute.joinTable;
|
|
169
|
+
if (!joinTable) {
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
const { name: targetColumnName } = joinTable.inverseJoinColumn;
|
|
173
|
+
// Get all relations where the target is a published entry of our content type
|
|
174
|
+
const relations = await trx(joinTable.name).select('*').whereIn(targetColumnName, targetIds);
|
|
175
|
+
if (relations.length === 0) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
// Create new relations pointing to draft entries
|
|
179
|
+
const newRelations = relations.map((relation)=>{
|
|
180
|
+
const newTargetId = publishedToDraftMap.get(relation[targetColumnName]);
|
|
181
|
+
if (!newTargetId) {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
...relation,
|
|
186
|
+
[targetColumnName]: newTargetId
|
|
187
|
+
};
|
|
188
|
+
}).filter(Boolean);
|
|
189
|
+
if (newRelations.length > 0) {
|
|
190
|
+
await trx.batchInsert(joinTable.name, newRelations, 1000);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* 2 pass migration to create the draft entries for all the published entries.
|
|
197
|
+
* And then copy relations directly using database queries.
|
|
198
|
+
*/ const migrateUp = async (trx, db)=>{
|
|
199
|
+
const dpModels = [];
|
|
200
|
+
for (const meta of db.metadata.values()){
|
|
201
|
+
const hasDP = await hasDraftAndPublish(trx, meta);
|
|
202
|
+
if (hasDP) {
|
|
203
|
+
dpModels.push(meta);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Create plain draft entries for all the entries that were published.
|
|
208
|
+
*/ for (const model of dpModels){
|
|
209
|
+
await copyPublishedEntriesToDraft({
|
|
210
|
+
db,
|
|
211
|
+
trx,
|
|
212
|
+
uid: model.uid
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Copy relations from published entries to draft entries using direct database queries.
|
|
217
|
+
* This is much more efficient than calling discardDraft for each entry.
|
|
218
|
+
*/ for (const model of dpModels){
|
|
219
|
+
await copyRelationsToDrafts({
|
|
220
|
+
db,
|
|
221
|
+
trx,
|
|
222
|
+
uid: model.uid
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
/**
|
|
227
|
+
* Load a batch of versions to discard.
|
|
228
|
+
*
|
|
229
|
+
* Versions with only a draft version will be ignored.
|
|
230
|
+
* Only versions with a published version (which always have a draft version) will be discarded.
|
|
231
|
+
*/ async function* getBatchToDiscard({ db, trx, uid, defaultBatchSize = 1000 }) {
|
|
232
|
+
const client = db.config.connection.client;
|
|
233
|
+
const isSQLite = typeof client === 'string' && [
|
|
234
|
+
'sqlite',
|
|
235
|
+
'sqlite3',
|
|
236
|
+
'better-sqlite3'
|
|
237
|
+
].includes(client);
|
|
238
|
+
// The SQLite documentation states that the maximum number of terms in a
|
|
239
|
+
// compound SELECT statement is 500 by default.
|
|
240
|
+
// See: https://www.sqlite.org/limits.html
|
|
241
|
+
// To ensure a successful migration, we limit the batch size to 500 for SQLite.
|
|
242
|
+
const batchSize = isSQLite ? Math.min(defaultBatchSize, 500) : defaultBatchSize;
|
|
243
|
+
let offset = 0;
|
|
244
|
+
let hasMore = true;
|
|
245
|
+
while(hasMore){
|
|
246
|
+
// Look for the published entries to discard
|
|
247
|
+
const batch = await db.queryBuilder(uid).select([
|
|
248
|
+
'id',
|
|
249
|
+
'documentId',
|
|
250
|
+
'locale'
|
|
251
|
+
]).where({
|
|
252
|
+
publishedAt: {
|
|
253
|
+
$ne: null
|
|
254
|
+
}
|
|
255
|
+
}).limit(batchSize).offset(offset).orderBy('id').transacting(trx).execute();
|
|
256
|
+
if (batch.length < batchSize) {
|
|
257
|
+
hasMore = false;
|
|
258
|
+
}
|
|
259
|
+
offset += batchSize;
|
|
260
|
+
yield batch;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
const discardDocumentDrafts = {
|
|
264
|
+
name: 'core::5.0.0-discard-drafts',
|
|
265
|
+
async up (trx, db) {
|
|
266
|
+
await migrateUp(trx, db);
|
|
267
|
+
},
|
|
268
|
+
async down () {
|
|
269
|
+
throw new Error('not implemented');
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
export { discardDocumentDrafts, getBatchToDiscard };
|
|
274
|
+
//# sourceMappingURL=5.0.0-discard-drafts.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"5.0.0-discard-drafts.mjs","sources":["../../../src/migrations/database/5.0.0-discard-drafts.ts"],"sourcesContent":["/**\n * This migration is responsible for creating the draft counterpart for all the entries that were in a published state.\n *\n * In v4, entries could either be in a draft or published state, but not both at the same time.\n * In v5, we introduced the concept of document, and an entry can be in a draft or published state.\n *\n * This means the migration needs to create the draft counterpart if an entry was published.\n *\n * This migration performs the following steps:\n * 1. Creates draft entries for all published entries, without it's components, dynamic zones or relations.\n * 2. Using the document service, discard those same drafts to copy its relations.\n */\n\n/* eslint-disable no-continue */\nimport type { UID } from '@strapi/types';\nimport type { Database, Migration } from '@strapi/database';\nimport { contentTypes } from '@strapi/utils';\n\ntype DocumentVersion = { documentId: string; locale: string };\ntype Knex = Parameters<Migration['up']>[0];\n\n/**\n * Check if the model has draft and publish enabled.\n */\nconst hasDraftAndPublish = async (trx: Knex, meta: any) => {\n const hasTable = await trx.schema.hasTable(meta.tableName);\n\n if (!hasTable) {\n return false;\n }\n\n const uid = meta.uid as UID.ContentType;\n const model = strapi.getModel(uid);\n const hasDP = contentTypes.hasDraftAndPublish(model);\n if (!hasDP) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Copy all the published entries to draft entries, without it's components, dynamic zones or relations.\n * This ensures all necessary draft's exist before copying it's relations.\n */\nasync function copyPublishedEntriesToDraft({\n db,\n trx,\n uid,\n}: {\n db: Database;\n trx: Knex;\n uid: string;\n}) {\n // Extract all scalar attributes to use in the insert query\n const meta = db.metadata.get(uid);\n\n // Get scalar attributes that will be copied over the new draft\n const scalarAttributes = Object.values(meta.attributes).reduce((acc, attribute: any) => {\n if (['id'].includes(attribute.columnName)) {\n return acc;\n }\n\n if (contentTypes.isScalarAttribute(attribute)) {\n acc.push(attribute.columnName);\n }\n\n return acc;\n }, [] as string[]);\n\n /**\n * Query to copy the published entries into draft entries.\n *\n * INSERT INTO tableName (columnName1, columnName2, columnName3, ...)\n * SELECT columnName1, columnName2, columnName3, ...\n * FROM tableName\n */\n await trx\n // INSERT INTO tableName (columnName1, columnName2, columnName3, ...)\n .into(\n trx.raw(`?? (${scalarAttributes.map(() => `??`).join(', ')})`, [\n meta.tableName,\n ...scalarAttributes,\n ])\n )\n .insert((subQb: typeof trx) => {\n // SELECT columnName1, columnName2, columnName3, ...\n subQb\n .select(\n ...scalarAttributes.map((att: string) => {\n // Override 'publishedAt' and 'updatedAt' attributes\n if (att === 'published_at') {\n return trx.raw('NULL as ??', 'published_at');\n }\n\n return att;\n })\n )\n .from(meta.tableName)\n // Only select entries that were published\n .whereNotNull('published_at');\n });\n}\n\n/**\n * Copy relations from published entries to draft entries using direct database queries.\n * This replaces the need to call discardDraft for each entry.\n */\nasync function copyRelationsToDrafts({ db, trx, uid }: { db: Database; trx: Knex; uid: string }) {\n const meta = db.metadata.get(uid);\n if (!meta) return;\n\n // Get all published entries for this content type\n const publishedEntries = (await trx(meta.tableName)\n .select(['id', 'documentId', 'locale'])\n .whereNotNull('published_at')) as Array<{ id: number; documentId: string; locale: string }>;\n\n // Get all draft entries for this content type\n const draftEntries = (await trx(meta.tableName)\n .select(['id', 'documentId', 'locale'])\n .whereNull('published_at')) as Array<{ id: number; documentId: string; locale: string }>;\n\n if (publishedEntries.length === 0 || draftEntries.length === 0) {\n return;\n }\n\n // Create mapping from documentId to draft entry ID (only for drafts created by migration)\n const draftByDocumentId = new Map();\n for (const draft of draftEntries) {\n if (draft.documentId) {\n draftByDocumentId.set(draft.documentId, draft);\n }\n }\n\n // Create mapping from published entry ID to draft entry ID\n const publishedToDraftMap = new Map();\n for (const published of publishedEntries) {\n const draft = draftByDocumentId.get(published.documentId);\n if (draft) {\n publishedToDraftMap.set(published.id, draft.id);\n }\n }\n\n if (publishedToDraftMap.size === 0) {\n return;\n }\n\n // Copy relations for this content type\n await copyRelationsForContentType({\n trx,\n uid,\n publishedToDraftMap,\n publishedEntries,\n });\n\n // Copy relations from other content types that target this content type\n await copyRelationsFromOtherContentTypes({\n trx,\n uid,\n publishedToDraftMap,\n publishedEntries,\n });\n}\n\n/**\n * Copy relations within the same content type (self-referential relations)\n */\nasync function copyRelationsForContentType({\n trx,\n uid,\n publishedToDraftMap,\n}: {\n trx: Knex;\n uid: string;\n publishedToDraftMap: Map<number, number>;\n publishedEntries: Array<{ id: number; documentId: string; locale: string }>;\n}) {\n const meta = strapi.db.metadata.get(uid);\n if (!meta) return;\n\n const publishedIds = Array.from(publishedToDraftMap.keys());\n\n for (const attribute of Object.values(meta.attributes) as any) {\n if (attribute.type !== 'relation' || attribute.target !== uid) {\n continue;\n }\n\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 // Get all relations where the source is a published entry\n const relations = await trx(joinTable.name).select('*').whereIn(sourceColumnName, publishedIds);\n\n if (relations.length === 0) {\n continue;\n }\n\n // Create new relations pointing to draft entries\n const newRelations = relations\n .map((relation) => {\n const newSourceId = publishedToDraftMap.get(relation[sourceColumnName]);\n const newTargetId = publishedToDraftMap.get(relation[targetColumnName]);\n\n if (!newSourceId || !newTargetId) {\n return null;\n }\n\n return {\n ...relation,\n [sourceColumnName]: newSourceId,\n [targetColumnName]: newTargetId,\n };\n })\n .filter(Boolean);\n\n if (newRelations.length > 0) {\n await trx.batchInsert(joinTable.name, newRelations, 1000);\n }\n }\n}\n\n/**\n * Copy relations from other content types that target this content type\n */\nasync function copyRelationsFromOtherContentTypes({\n trx,\n uid,\n publishedToDraftMap,\n}: {\n trx: Knex;\n uid: string;\n publishedToDraftMap: Map<number, number>;\n publishedEntries: Array<{ id: number; documentId: string; locale: string }>;\n}) {\n const targetIds = Array.from(publishedToDraftMap.keys());\n\n // Iterate through all content types and components to find relations targeting our content type\n const contentTypes = Object.values(strapi.contentTypes) as any[];\n const components = Object.values(strapi.components) as any[];\n\n for (const model of [...contentTypes, ...components]) {\n const dbModel = strapi.db.metadata.get(model.uid);\n if (!dbModel) continue;\n\n for (const attribute of Object.values(dbModel.attributes) as any) {\n if (attribute.type !== 'relation' || attribute.target !== uid) {\n continue;\n }\n\n const joinTable = attribute.joinTable;\n if (!joinTable) {\n continue;\n }\n\n const { name: targetColumnName } = joinTable.inverseJoinColumn;\n\n // Get all relations where the target is a published entry of our content type\n const relations = await trx(joinTable.name).select('*').whereIn(targetColumnName, targetIds);\n\n if (relations.length === 0) {\n continue;\n }\n\n // Create new relations pointing to draft entries\n const newRelations = relations\n .map((relation) => {\n const newTargetId = publishedToDraftMap.get(relation[targetColumnName]);\n\n if (!newTargetId) {\n return null;\n }\n\n return {\n ...relation,\n [targetColumnName]: newTargetId,\n };\n })\n .filter(Boolean);\n\n if (newRelations.length > 0) {\n await trx.batchInsert(joinTable.name, newRelations, 1000);\n }\n }\n }\n}\n\n/**\n * 2 pass migration to create the draft entries for all the published entries.\n * And then copy relations directly using database queries.\n */\nconst migrateUp = async (trx: Knex, db: Database) => {\n const dpModels = [];\n for (const meta of db.metadata.values()) {\n const hasDP = await hasDraftAndPublish(trx, meta);\n if (hasDP) {\n dpModels.push(meta);\n }\n }\n\n /**\n * Create plain draft entries for all the entries that were published.\n */\n for (const model of dpModels) {\n await copyPublishedEntriesToDraft({ db, trx, uid: model.uid });\n }\n\n /**\n * Copy relations from published entries to draft entries using direct database queries.\n * This is much more efficient than calling discardDraft for each entry.\n */\n for (const model of dpModels) {\n await copyRelationsToDrafts({ db, trx, uid: model.uid });\n }\n};\n\n/**\n * Load a batch of versions to discard.\n *\n * Versions with only a draft version will be ignored.\n * Only versions with a published version (which always have a draft version) will be discarded.\n */\nexport async function* getBatchToDiscard({\n db,\n trx,\n uid,\n defaultBatchSize = 1000,\n}: {\n db: Database;\n trx: Knex;\n uid: string;\n defaultBatchSize?: number;\n}) {\n const client = db.config.connection.client;\n const isSQLite =\n typeof client === 'string' && ['sqlite', 'sqlite3', 'better-sqlite3'].includes(client);\n\n // The SQLite documentation states that the maximum number of terms in a\n // compound SELECT statement is 500 by default.\n // See: https://www.sqlite.org/limits.html\n // To ensure a successful migration, we limit the batch size to 500 for SQLite.\n const batchSize = isSQLite ? Math.min(defaultBatchSize, 500) : defaultBatchSize;\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n // Look for the published entries to discard\n const batch: DocumentVersion[] = await db\n .queryBuilder(uid)\n .select(['id', 'documentId', 'locale'])\n .where({ publishedAt: { $ne: null } })\n .limit(batchSize)\n .offset(offset)\n .orderBy('id')\n .transacting(trx)\n .execute();\n\n if (batch.length < batchSize) {\n hasMore = false;\n }\n\n offset += batchSize;\n yield batch;\n }\n}\n\nexport const discardDocumentDrafts: Migration = {\n name: 'core::5.0.0-discard-drafts',\n async up(trx, db) {\n await migrateUp(trx, db);\n },\n async down() {\n throw new Error('not implemented');\n },\n};\n"],"names":["hasDraftAndPublish","trx","meta","hasTable","schema","tableName","uid","model","strapi","getModel","hasDP","contentTypes","copyPublishedEntriesToDraft","db","metadata","get","scalarAttributes","Object","values","attributes","reduce","acc","attribute","includes","columnName","isScalarAttribute","push","into","raw","map","join","insert","subQb","select","att","from","whereNotNull","copyRelationsToDrafts","publishedEntries","draftEntries","whereNull","length","draftByDocumentId","Map","draft","documentId","set","publishedToDraftMap","published","id","size","copyRelationsForContentType","copyRelationsFromOtherContentTypes","publishedIds","Array","keys","type","target","joinTable","name","sourceColumnName","joinColumn","targetColumnName","inverseJoinColumn","relations","whereIn","newRelations","relation","newSourceId","newTargetId","filter","Boolean","batchInsert","targetIds","components","dbModel","migrateUp","dpModels","getBatchToDiscard","defaultBatchSize","client","config","connection","isSQLite","batchSize","Math","min","offset","hasMore","batch","queryBuilder","where","publishedAt","$ne","limit","orderBy","transacting","execute","discardDocumentDrafts","up","down","Error"],"mappings":"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"}
|